diff options
Diffstat (limited to 'drivers')
147 files changed, 1376 insertions, 1002 deletions
diff --git a/drivers/ata/ata_piix.c b/drivers/ata/ata_piix.c index 0458811010fd..9c07b88631be 100644 --- a/drivers/ata/ata_piix.c +++ b/drivers/ata/ata_piix.c | |||
@@ -578,6 +578,7 @@ static const struct ich_laptop ich_laptop[] = { | |||
578 | { 0x27DF, 0x0005, 0x0280 }, /* ICH7 on Acer 5602WLMi */ | 578 | { 0x27DF, 0x0005, 0x0280 }, /* ICH7 on Acer 5602WLMi */ |
579 | { 0x27DF, 0x1025, 0x0110 }, /* ICH7 on Acer 3682WLMi */ | 579 | { 0x27DF, 0x1025, 0x0110 }, /* ICH7 on Acer 3682WLMi */ |
580 | { 0x27DF, 0x1043, 0x1267 }, /* ICH7 on Asus W5F */ | 580 | { 0x27DF, 0x1043, 0x1267 }, /* ICH7 on Asus W5F */ |
581 | { 0x24CA, 0x1025, 0x0061 }, /* ICH4 on ACER Aspire 2023WLMi */ | ||
581 | /* end marker */ | 582 | /* end marker */ |
582 | { 0, } | 583 | { 0, } |
583 | }; | 584 | }; |
diff --git a/drivers/ata/libata-core.c b/drivers/ata/libata-core.c index a6de57e02047..3ca9c610c110 100644 --- a/drivers/ata/libata-core.c +++ b/drivers/ata/libata-core.c | |||
@@ -3022,7 +3022,7 @@ int ata_wait_ready(struct ata_port *ap, unsigned long deadline) | |||
3022 | 3022 | ||
3023 | if (!(status & ATA_BUSY)) | 3023 | if (!(status & ATA_BUSY)) |
3024 | return 0; | 3024 | return 0; |
3025 | if (status == 0xff) | 3025 | if (!ata_port_online(ap) && status == 0xff) |
3026 | return -ENODEV; | 3026 | return -ENODEV; |
3027 | if (time_after(now, deadline)) | 3027 | if (time_after(now, deadline)) |
3028 | return -EBUSY; | 3028 | return -EBUSY; |
@@ -3368,7 +3368,7 @@ int ata_std_prereset(struct ata_port *ap, unsigned long deadline) | |||
3368 | */ | 3368 | */ |
3369 | if (!(ap->flags & ATA_FLAG_SKIP_D2H_BSY) && !ata_port_offline(ap)) { | 3369 | if (!(ap->flags & ATA_FLAG_SKIP_D2H_BSY) && !ata_port_offline(ap)) { |
3370 | rc = ata_wait_ready(ap, deadline); | 3370 | rc = ata_wait_ready(ap, deadline); |
3371 | if (rc) { | 3371 | if (rc && rc != -ENODEV) { |
3372 | ata_port_printk(ap, KERN_WARNING, "device not ready " | 3372 | ata_port_printk(ap, KERN_WARNING, "device not ready " |
3373 | "(errno=%d), forcing hardreset\n", rc); | 3373 | "(errno=%d), forcing hardreset\n", rc); |
3374 | ehc->i.action |= ATA_EH_HARDRESET; | 3374 | ehc->i.action |= ATA_EH_HARDRESET; |
diff --git a/drivers/ata/libata-scsi.c b/drivers/ata/libata-scsi.c index 242c43eef807..b3900cfbd880 100644 --- a/drivers/ata/libata-scsi.c +++ b/drivers/ata/libata-scsi.c | |||
@@ -1050,14 +1050,15 @@ static unsigned int ata_scsi_flush_xlat(struct ata_queued_cmd *qc) | |||
1050 | static void scsi_6_lba_len(const u8 *cdb, u64 *plba, u32 *plen) | 1050 | static void scsi_6_lba_len(const u8 *cdb, u64 *plba, u32 *plen) |
1051 | { | 1051 | { |
1052 | u64 lba = 0; | 1052 | u64 lba = 0; |
1053 | u32 len = 0; | 1053 | u32 len; |
1054 | 1054 | ||
1055 | VPRINTK("six-byte command\n"); | 1055 | VPRINTK("six-byte command\n"); |
1056 | 1056 | ||
1057 | lba |= ((u64)(cdb[1] & 0x1f)) << 16; | ||
1057 | lba |= ((u64)cdb[2]) << 8; | 1058 | lba |= ((u64)cdb[2]) << 8; |
1058 | lba |= ((u64)cdb[3]); | 1059 | lba |= ((u64)cdb[3]); |
1059 | 1060 | ||
1060 | len |= ((u32)cdb[4]); | 1061 | len = cdb[4]; |
1061 | 1062 | ||
1062 | *plba = lba; | 1063 | *plba = lba; |
1063 | *plen = len; | 1064 | *plen = len; |
diff --git a/drivers/ata/pata_artop.c b/drivers/ata/pata_artop.c index 7b4810c171b7..03b6ddd2abd2 100644 --- a/drivers/ata/pata_artop.c +++ b/drivers/ata/pata_artop.c | |||
@@ -97,7 +97,7 @@ static int artop6260_pre_reset(struct ata_port *ap, unsigned long deadline) | |||
97 | * artop6260_cable_detect - identify cable type | 97 | * artop6260_cable_detect - identify cable type |
98 | * @ap: Port | 98 | * @ap: Port |
99 | * | 99 | * |
100 | * Identify the cable type for the ARTOp interface in question | 100 | * Identify the cable type for the ARTOP interface in question |
101 | */ | 101 | */ |
102 | 102 | ||
103 | static int artop6260_cable_detect(struct ata_port *ap) | 103 | static int artop6260_cable_detect(struct ata_port *ap) |
diff --git a/drivers/ata/pata_hpt37x.c b/drivers/ata/pata_hpt37x.c index a54c17433eef..6446735a46e0 100644 --- a/drivers/ata/pata_hpt37x.c +++ b/drivers/ata/pata_hpt37x.c | |||
@@ -26,7 +26,7 @@ | |||
26 | #include <linux/libata.h> | 26 | #include <linux/libata.h> |
27 | 27 | ||
28 | #define DRV_NAME "pata_hpt37x" | 28 | #define DRV_NAME "pata_hpt37x" |
29 | #define DRV_VERSION "0.6.5" | 29 | #define DRV_VERSION "0.6.6" |
30 | 30 | ||
31 | struct hpt_clock { | 31 | struct hpt_clock { |
32 | u8 xfer_speed; | 32 | u8 xfer_speed; |
@@ -931,15 +931,6 @@ static int hpt37x_init_one(struct pci_dev *dev, const struct pci_device_id *id) | |||
931 | .udma_mask = 0x7f, | 931 | .udma_mask = 0x7f, |
932 | .port_ops = &hpt372_port_ops | 932 | .port_ops = &hpt372_port_ops |
933 | }; | 933 | }; |
934 | /* HPT371, 372 and friends - UDMA100 at 50MHz clock */ | ||
935 | static const struct ata_port_info info_hpt372_50 = { | ||
936 | .sht = &hpt37x_sht, | ||
937 | .flags = ATA_FLAG_SLAVE_POSS|ATA_FLAG_SRST, | ||
938 | .pio_mask = 0x1f, | ||
939 | .mwdma_mask = 0x07, | ||
940 | .udma_mask = 0x3f, | ||
941 | .port_ops = &hpt372_port_ops | ||
942 | }; | ||
943 | /* HPT374 - UDMA133 */ | 934 | /* HPT374 - UDMA133 */ |
944 | static const struct ata_port_info info_hpt374 = { | 935 | static const struct ata_port_info info_hpt374 = { |
945 | .sht = &hpt37x_sht, | 936 | .sht = &hpt37x_sht, |
@@ -1098,17 +1089,21 @@ static int hpt37x_init_one(struct pci_dev *dev, const struct pci_device_id *id) | |||
1098 | * use a 50MHz DPLL by choice | 1089 | * use a 50MHz DPLL by choice |
1099 | */ | 1090 | */ |
1100 | unsigned int f_low, f_high; | 1091 | unsigned int f_low, f_high; |
1101 | int adjust; | 1092 | int dpll, adjust; |
1102 | 1093 | ||
1103 | clock_slot = 2; | 1094 | /* Compute DPLL */ |
1095 | dpll = 2; | ||
1104 | if (port->udma_mask & 0xE0) | 1096 | if (port->udma_mask & 0xE0) |
1105 | clock_slot = 3; | 1097 | dpll = 3; |
1106 | 1098 | ||
1107 | f_low = (MHz[clock_slot] * chip_table->base) / 192; | 1099 | f_low = (MHz[clock_slot] * 48) / MHz[dpll]; |
1108 | f_high = f_low + 2; | 1100 | f_high = f_low + 2; |
1101 | if (clock_slot > 1) | ||
1102 | f_high += 2; | ||
1109 | 1103 | ||
1110 | /* Select the DPLL clock. */ | 1104 | /* Select the DPLL clock. */ |
1111 | pci_write_config_byte(dev, 0x5b, 0x21); | 1105 | pci_write_config_byte(dev, 0x5b, 0x21); |
1106 | pci_write_config_dword(dev, 0x5C, (f_high << 16) | f_low); | ||
1112 | 1107 | ||
1113 | for(adjust = 0; adjust < 8; adjust++) { | 1108 | for(adjust = 0; adjust < 8; adjust++) { |
1114 | if (hpt37x_calibrate_dpll(dev)) | 1109 | if (hpt37x_calibrate_dpll(dev)) |
@@ -1124,12 +1119,12 @@ static int hpt37x_init_one(struct pci_dev *dev, const struct pci_device_id *id) | |||
1124 | printk(KERN_WARNING "hpt37x: DPLL did not stabilize.\n"); | 1119 | printk(KERN_WARNING "hpt37x: DPLL did not stabilize.\n"); |
1125 | return -ENODEV; | 1120 | return -ENODEV; |
1126 | } | 1121 | } |
1127 | if (clock_slot == 3) | 1122 | if (dpll == 3) |
1128 | private_data = (void *)hpt37x_timings_66; | 1123 | private_data = (void *)hpt37x_timings_66; |
1129 | else | 1124 | else |
1130 | private_data = (void *)hpt37x_timings_50; | 1125 | private_data = (void *)hpt37x_timings_50; |
1131 | 1126 | ||
1132 | printk(KERN_INFO "hpt37x: Bus clock %dMHz, using DPLL.\n", MHz[clock_slot]); | 1127 | printk(KERN_INFO "hpt37x: Bus clock %dMHz, using DPLL.\n", MHz[dpll]); |
1133 | } else { | 1128 | } else { |
1134 | private_data = (void *)chip_table->clocks[clock_slot]; | 1129 | private_data = (void *)chip_table->clocks[clock_slot]; |
1135 | /* | 1130 | /* |
diff --git a/drivers/ata/pata_hpt3x2n.c b/drivers/ata/pata_hpt3x2n.c index f25154aed75d..e947433cb37d 100644 --- a/drivers/ata/pata_hpt3x2n.c +++ b/drivers/ata/pata_hpt3x2n.c | |||
@@ -521,8 +521,8 @@ static int hpt3x2n_init_one(struct pci_dev *dev, const struct pci_device_id *id) | |||
521 | /* 371N if rev > 1 */ | 521 | /* 371N if rev > 1 */ |
522 | break; | 522 | break; |
523 | case PCI_DEVICE_ID_TTI_HPT372: | 523 | case PCI_DEVICE_ID_TTI_HPT372: |
524 | /* 372N if rev >= 1*/ | 524 | /* 372N if rev >= 2*/ |
525 | if (class_rev == 0) | 525 | if (class_rev < 2) |
526 | return -ENODEV; | 526 | return -ENODEV; |
527 | break; | 527 | break; |
528 | case PCI_DEVICE_ID_TTI_HPT302: | 528 | case PCI_DEVICE_ID_TTI_HPT302: |
diff --git a/drivers/ata/pata_it821x.c b/drivers/ata/pata_it821x.c index ff9a6fd36657..b3456d7a592c 100644 --- a/drivers/ata/pata_it821x.c +++ b/drivers/ata/pata_it821x.c | |||
@@ -1,5 +1,5 @@ | |||
1 | /* | 1 | /* |
2 | * ata-it821x.c - IT821x PATA for new ATA layer | 2 | * pata_it821x.c - IT821x PATA for new ATA layer |
3 | * (C) 2005 Red Hat Inc | 3 | * (C) 2005 Red Hat Inc |
4 | * Alan Cox <alan@redhat.com> | 4 | * Alan Cox <alan@redhat.com> |
5 | * | 5 | * |
@@ -65,7 +65,6 @@ | |||
65 | * | 65 | * |
66 | * TODO | 66 | * TODO |
67 | * - ATAPI and other speed filtering | 67 | * - ATAPI and other speed filtering |
68 | * - Command filter in smart mode | ||
69 | * - RAID configuration ioctls | 68 | * - RAID configuration ioctls |
70 | */ | 69 | */ |
71 | 70 | ||
diff --git a/drivers/ata/pata_scc.c b/drivers/ata/pata_scc.c index aa138d211b09..61502bc7bf1d 100644 --- a/drivers/ata/pata_scc.c +++ b/drivers/ata/pata_scc.c | |||
@@ -489,23 +489,26 @@ static unsigned int scc_devchk (struct ata_port *ap, | |||
489 | * Note: Original code is ata_bus_post_reset(). | 489 | * Note: Original code is ata_bus_post_reset(). |
490 | */ | 490 | */ |
491 | 491 | ||
492 | static void scc_bus_post_reset (struct ata_port *ap, unsigned int devmask) | 492 | static int scc_bus_post_reset(struct ata_port *ap, unsigned int devmask, |
493 | unsigned long deadline) | ||
493 | { | 494 | { |
494 | struct ata_ioports *ioaddr = &ap->ioaddr; | 495 | struct ata_ioports *ioaddr = &ap->ioaddr; |
495 | unsigned int dev0 = devmask & (1 << 0); | 496 | unsigned int dev0 = devmask & (1 << 0); |
496 | unsigned int dev1 = devmask & (1 << 1); | 497 | unsigned int dev1 = devmask & (1 << 1); |
497 | unsigned long timeout; | 498 | int rc; |
498 | 499 | ||
499 | /* if device 0 was found in ata_devchk, wait for its | 500 | /* if device 0 was found in ata_devchk, wait for its |
500 | * BSY bit to clear | 501 | * BSY bit to clear |
501 | */ | 502 | */ |
502 | if (dev0) | 503 | if (dev0) { |
503 | ata_busy_sleep(ap, ATA_TMOUT_BOOT_QUICK, ATA_TMOUT_BOOT); | 504 | rc = ata_wait_ready(ap, deadline); |
505 | if (rc && rc != -ENODEV) | ||
506 | return rc; | ||
507 | } | ||
504 | 508 | ||
505 | /* if device 1 was found in ata_devchk, wait for | 509 | /* if device 1 was found in ata_devchk, wait for |
506 | * register access, then wait for BSY to clear | 510 | * register access, then wait for BSY to clear |
507 | */ | 511 | */ |
508 | timeout = jiffies + ATA_TMOUT_BOOT; | ||
509 | while (dev1) { | 512 | while (dev1) { |
510 | u8 nsect, lbal; | 513 | u8 nsect, lbal; |
511 | 514 | ||
@@ -514,14 +517,15 @@ static void scc_bus_post_reset (struct ata_port *ap, unsigned int devmask) | |||
514 | lbal = in_be32(ioaddr->lbal_addr); | 517 | lbal = in_be32(ioaddr->lbal_addr); |
515 | if ((nsect == 1) && (lbal == 1)) | 518 | if ((nsect == 1) && (lbal == 1)) |
516 | break; | 519 | break; |
517 | if (time_after(jiffies, timeout)) { | 520 | if (time_after(jiffies, deadline)) |
518 | dev1 = 0; | 521 | return -EBUSY; |
519 | break; | ||
520 | } | ||
521 | msleep(50); /* give drive a breather */ | 522 | msleep(50); /* give drive a breather */ |
522 | } | 523 | } |
523 | if (dev1) | 524 | if (dev1) { |
524 | ata_busy_sleep(ap, ATA_TMOUT_BOOT_QUICK, ATA_TMOUT_BOOT); | 525 | rc = ata_wait_ready(ap, deadline); |
526 | if (rc && rc != -ENODEV) | ||
527 | return rc; | ||
528 | } | ||
525 | 529 | ||
526 | /* is all this really necessary? */ | 530 | /* is all this really necessary? */ |
527 | ap->ops->dev_select(ap, 0); | 531 | ap->ops->dev_select(ap, 0); |
@@ -529,6 +533,8 @@ static void scc_bus_post_reset (struct ata_port *ap, unsigned int devmask) | |||
529 | ap->ops->dev_select(ap, 1); | 533 | ap->ops->dev_select(ap, 1); |
530 | if (dev0) | 534 | if (dev0) |
531 | ap->ops->dev_select(ap, 0); | 535 | ap->ops->dev_select(ap, 0); |
536 | |||
537 | return 0; | ||
532 | } | 538 | } |
533 | 539 | ||
534 | /** | 540 | /** |
@@ -537,8 +543,8 @@ static void scc_bus_post_reset (struct ata_port *ap, unsigned int devmask) | |||
537 | * Note: Original code is ata_bus_softreset(). | 543 | * Note: Original code is ata_bus_softreset(). |
538 | */ | 544 | */ |
539 | 545 | ||
540 | static unsigned int scc_bus_softreset (struct ata_port *ap, | 546 | static unsigned int scc_bus_softreset(struct ata_port *ap, unsigned int devmask, |
541 | unsigned int devmask) | 547 | unsigned long deadline) |
542 | { | 548 | { |
543 | struct ata_ioports *ioaddr = &ap->ioaddr; | 549 | struct ata_ioports *ioaddr = &ap->ioaddr; |
544 | 550 | ||
@@ -570,7 +576,7 @@ static unsigned int scc_bus_softreset (struct ata_port *ap, | |||
570 | if (scc_check_status(ap) == 0xFF) | 576 | if (scc_check_status(ap) == 0xFF) |
571 | return 0; | 577 | return 0; |
572 | 578 | ||
573 | scc_bus_post_reset(ap, devmask); | 579 | scc_bus_post_reset(ap, devmask, deadline); |
574 | 580 | ||
575 | return 0; | 581 | return 0; |
576 | } | 582 | } |
@@ -579,11 +585,13 @@ static unsigned int scc_bus_softreset (struct ata_port *ap, | |||
579 | * scc_std_softreset - reset host port via ATA SRST | 585 | * scc_std_softreset - reset host port via ATA SRST |
580 | * @ap: port to reset | 586 | * @ap: port to reset |
581 | * @classes: resulting classes of attached devices | 587 | * @classes: resulting classes of attached devices |
588 | * @deadline: deadline jiffies for the operation | ||
582 | * | 589 | * |
583 | * Note: Original code is ata_std_softreset(). | 590 | * Note: Original code is ata_std_softreset(). |
584 | */ | 591 | */ |
585 | 592 | ||
586 | static int scc_std_softreset (struct ata_port *ap, unsigned int *classes) | 593 | static int scc_std_softreset (struct ata_port *ap, unsigned int *classes, |
594 | unsigned long deadline) | ||
587 | { | 595 | { |
588 | unsigned int slave_possible = ap->flags & ATA_FLAG_SLAVE_POSS; | 596 | unsigned int slave_possible = ap->flags & ATA_FLAG_SLAVE_POSS; |
589 | unsigned int devmask = 0, err_mask; | 597 | unsigned int devmask = 0, err_mask; |
@@ -607,7 +615,7 @@ static int scc_std_softreset (struct ata_port *ap, unsigned int *classes) | |||
607 | 615 | ||
608 | /* issue bus reset */ | 616 | /* issue bus reset */ |
609 | DPRINTK("about to softreset, devmask=%x\n", devmask); | 617 | DPRINTK("about to softreset, devmask=%x\n", devmask); |
610 | err_mask = scc_bus_softreset(ap, devmask); | 618 | err_mask = scc_bus_softreset(ap, devmask, deadline); |
611 | if (err_mask) { | 619 | if (err_mask) { |
612 | ata_port_printk(ap, KERN_ERR, "SRST failed (err_mask=0x%x)\n", | 620 | ata_port_printk(ap, KERN_ERR, "SRST failed (err_mask=0x%x)\n", |
613 | err_mask); | 621 | err_mask); |
@@ -676,10 +684,11 @@ static void scc_bmdma_stop (struct ata_queued_cmd *qc) | |||
676 | 684 | ||
677 | if (reg & INTSTS_BMSINT) { | 685 | if (reg & INTSTS_BMSINT) { |
678 | unsigned int classes; | 686 | unsigned int classes; |
687 | unsigned long deadline = jiffies + ATA_TMOUT_BOOT; | ||
679 | printk(KERN_WARNING "%s: Internal Bus Error\n", DRV_NAME); | 688 | printk(KERN_WARNING "%s: Internal Bus Error\n", DRV_NAME); |
680 | out_be32(bmid_base + SCC_DMA_INTST, INTSTS_BMSINT); | 689 | out_be32(bmid_base + SCC_DMA_INTST, INTSTS_BMSINT); |
681 | /* TBD: SW reset */ | 690 | /* TBD: SW reset */ |
682 | scc_std_softreset(ap, &classes); | 691 | scc_std_softreset(ap, &classes, deadline); |
683 | continue; | 692 | continue; |
684 | } | 693 | } |
685 | 694 | ||
@@ -862,9 +871,10 @@ static void scc_bmdma_freeze (struct ata_port *ap) | |||
862 | /** | 871 | /** |
863 | * scc_pata_prereset - prepare for reset | 872 | * scc_pata_prereset - prepare for reset |
864 | * @ap: ATA port to be reset | 873 | * @ap: ATA port to be reset |
874 | * @deadline: deadline jiffies for the operation | ||
865 | */ | 875 | */ |
866 | 876 | ||
867 | static int scc_pata_prereset (struct ata_port *ap, unsigned long deadline) | 877 | static int scc_pata_prereset(struct ata_port *ap, unsigned long deadline) |
868 | { | 878 | { |
869 | ap->cbl = ATA_CBL_PATA80; | 879 | ap->cbl = ATA_CBL_PATA80; |
870 | return ata_std_prereset(ap, deadline); | 880 | return ata_std_prereset(ap, deadline); |
diff --git a/drivers/ata/pata_sis.c b/drivers/ata/pata_sis.c index f2231267e011..ec3ae9375015 100644 --- a/drivers/ata/pata_sis.c +++ b/drivers/ata/pata_sis.c | |||
@@ -73,14 +73,14 @@ static int sis_short_ata40(struct pci_dev *dev) | |||
73 | } | 73 | } |
74 | 74 | ||
75 | /** | 75 | /** |
76 | * sis_port_base - return PCI configuration base for dev | 76 | * sis_old_port_base - return PCI configuration base for dev |
77 | * @adev: device | 77 | * @adev: device |
78 | * | 78 | * |
79 | * Returns the base of the PCI configuration registers for this port | 79 | * Returns the base of the PCI configuration registers for this port |
80 | * number. | 80 | * number. |
81 | */ | 81 | */ |
82 | 82 | ||
83 | static int sis_port_base(struct ata_device *adev) | 83 | static int sis_old_port_base(struct ata_device *adev) |
84 | { | 84 | { |
85 | return 0x40 + (4 * adev->ap->port_no) + (2 * adev->devno); | 85 | return 0x40 + (4 * adev->ap->port_no) + (2 * adev->devno); |
86 | } | 86 | } |
@@ -211,7 +211,7 @@ static void sis_set_fifo(struct ata_port *ap, struct ata_device *adev) | |||
211 | static void sis_old_set_piomode (struct ata_port *ap, struct ata_device *adev) | 211 | static void sis_old_set_piomode (struct ata_port *ap, struct ata_device *adev) |
212 | { | 212 | { |
213 | struct pci_dev *pdev = to_pci_dev(ap->host->dev); | 213 | struct pci_dev *pdev = to_pci_dev(ap->host->dev); |
214 | int port = sis_port_base(adev); | 214 | int port = sis_old_port_base(adev); |
215 | u8 t1, t2; | 215 | u8 t1, t2; |
216 | int speed = adev->pio_mode - XFER_PIO_0; | 216 | int speed = adev->pio_mode - XFER_PIO_0; |
217 | 217 | ||
@@ -248,7 +248,7 @@ static void sis_old_set_piomode (struct ata_port *ap, struct ata_device *adev) | |||
248 | static void sis_100_set_piomode (struct ata_port *ap, struct ata_device *adev) | 248 | static void sis_100_set_piomode (struct ata_port *ap, struct ata_device *adev) |
249 | { | 249 | { |
250 | struct pci_dev *pdev = to_pci_dev(ap->host->dev); | 250 | struct pci_dev *pdev = to_pci_dev(ap->host->dev); |
251 | int port = sis_port_base(adev); | 251 | int port = sis_old_port_base(adev); |
252 | int speed = adev->pio_mode - XFER_PIO_0; | 252 | int speed = adev->pio_mode - XFER_PIO_0; |
253 | 253 | ||
254 | const u8 actrec[] = { 0x00, 0x67, 0x44, 0x33, 0x31 }; | 254 | const u8 actrec[] = { 0x00, 0x67, 0x44, 0x33, 0x31 }; |
@@ -328,7 +328,7 @@ static void sis_old_set_dmamode (struct ata_port *ap, struct ata_device *adev) | |||
328 | { | 328 | { |
329 | struct pci_dev *pdev = to_pci_dev(ap->host->dev); | 329 | struct pci_dev *pdev = to_pci_dev(ap->host->dev); |
330 | int speed = adev->dma_mode - XFER_MW_DMA_0; | 330 | int speed = adev->dma_mode - XFER_MW_DMA_0; |
331 | int drive_pci = sis_port_base(adev); | 331 | int drive_pci = sis_old_port_base(adev); |
332 | u16 timing; | 332 | u16 timing; |
333 | 333 | ||
334 | const u16 mwdma_bits[] = { 0x707, 0x202, 0x202 }; | 334 | const u16 mwdma_bits[] = { 0x707, 0x202, 0x202 }; |
@@ -367,7 +367,7 @@ static void sis_66_set_dmamode (struct ata_port *ap, struct ata_device *adev) | |||
367 | { | 367 | { |
368 | struct pci_dev *pdev = to_pci_dev(ap->host->dev); | 368 | struct pci_dev *pdev = to_pci_dev(ap->host->dev); |
369 | int speed = adev->dma_mode - XFER_MW_DMA_0; | 369 | int speed = adev->dma_mode - XFER_MW_DMA_0; |
370 | int drive_pci = sis_port_base(adev); | 370 | int drive_pci = sis_old_port_base(adev); |
371 | u16 timing; | 371 | u16 timing; |
372 | 372 | ||
373 | const u16 mwdma_bits[] = { 0x707, 0x202, 0x202 }; | 373 | const u16 mwdma_bits[] = { 0x707, 0x202, 0x202 }; |
@@ -378,12 +378,12 @@ static void sis_66_set_dmamode (struct ata_port *ap, struct ata_device *adev) | |||
378 | if (adev->dma_mode < XFER_UDMA_0) { | 378 | if (adev->dma_mode < XFER_UDMA_0) { |
379 | /* bits 3-0 hold recovery timing bits 8-10 active timing and | 379 | /* bits 3-0 hold recovery timing bits 8-10 active timing and |
380 | the higer bits are dependant on the device, bit 15 udma */ | 380 | the higer bits are dependant on the device, bit 15 udma */ |
381 | timing &= ~ 0x870F; | 381 | timing &= ~0x870F; |
382 | timing |= mwdma_bits[speed]; | 382 | timing |= mwdma_bits[speed]; |
383 | } else { | 383 | } else { |
384 | /* Bit 15 is UDMA on/off, bit 12-14 are cycle time */ | 384 | /* Bit 15 is UDMA on/off, bit 12-14 are cycle time */ |
385 | speed = adev->dma_mode - XFER_UDMA_0; | 385 | speed = adev->dma_mode - XFER_UDMA_0; |
386 | timing &= ~0x6000; | 386 | timing &= ~0xF000; |
387 | timing |= udma_bits[speed]; | 387 | timing |= udma_bits[speed]; |
388 | } | 388 | } |
389 | pci_write_config_word(pdev, drive_pci, timing); | 389 | pci_write_config_word(pdev, drive_pci, timing); |
@@ -405,22 +405,22 @@ static void sis_100_set_dmamode (struct ata_port *ap, struct ata_device *adev) | |||
405 | { | 405 | { |
406 | struct pci_dev *pdev = to_pci_dev(ap->host->dev); | 406 | struct pci_dev *pdev = to_pci_dev(ap->host->dev); |
407 | int speed = adev->dma_mode - XFER_MW_DMA_0; | 407 | int speed = adev->dma_mode - XFER_MW_DMA_0; |
408 | int drive_pci = sis_port_base(adev); | 408 | int drive_pci = sis_old_port_base(adev); |
409 | u16 timing; | 409 | u8 timing; |
410 | 410 | ||
411 | const u16 udma_bits[] = { 0x8B00, 0x8700, 0x8500, 0x8300, 0x8200, 0x8100}; | 411 | const u8 udma_bits[] = { 0x8B, 0x87, 0x85, 0x83, 0x82, 0x81}; |
412 | 412 | ||
413 | pci_read_config_word(pdev, drive_pci, &timing); | 413 | pci_read_config_byte(pdev, drive_pci + 1, &timing); |
414 | 414 | ||
415 | if (adev->dma_mode < XFER_UDMA_0) { | 415 | if (adev->dma_mode < XFER_UDMA_0) { |
416 | /* NOT SUPPORTED YET: NEED DATA SHEET. DITTO IN OLD DRIVER */ | 416 | /* NOT SUPPORTED YET: NEED DATA SHEET. DITTO IN OLD DRIVER */ |
417 | } else { | 417 | } else { |
418 | /* Bit 15 is UDMA on/off, bit 12-14 are cycle time */ | 418 | /* Bit 7 is UDMA on/off, bit 0-3 are cycle time */ |
419 | speed = adev->dma_mode - XFER_UDMA_0; | 419 | speed = adev->dma_mode - XFER_UDMA_0; |
420 | timing &= ~0x0F00; | 420 | timing &= ~0x8F; |
421 | timing |= udma_bits[speed]; | 421 | timing |= udma_bits[speed]; |
422 | } | 422 | } |
423 | pci_write_config_word(pdev, drive_pci, timing); | 423 | pci_write_config_byte(pdev, drive_pci + 1, timing); |
424 | } | 424 | } |
425 | 425 | ||
426 | /** | 426 | /** |
@@ -440,22 +440,22 @@ static void sis_133_early_set_dmamode (struct ata_port *ap, struct ata_device *a | |||
440 | { | 440 | { |
441 | struct pci_dev *pdev = to_pci_dev(ap->host->dev); | 441 | struct pci_dev *pdev = to_pci_dev(ap->host->dev); |
442 | int speed = adev->dma_mode - XFER_MW_DMA_0; | 442 | int speed = adev->dma_mode - XFER_MW_DMA_0; |
443 | int drive_pci = sis_port_base(adev); | 443 | int drive_pci = sis_old_port_base(adev); |
444 | u16 timing; | 444 | u8 timing; |
445 | 445 | /* Low 4 bits are timing */ | |
446 | static const u16 udma_bits[] = { 0x8F00, 0x8A00, 0x8700, 0x8500, 0x8300, 0x8200, 0x8100}; | 446 | static const u8 udma_bits[] = { 0x8F, 0x8A, 0x87, 0x85, 0x83, 0x82, 0x81}; |
447 | 447 | ||
448 | pci_read_config_word(pdev, drive_pci, &timing); | 448 | pci_read_config_byte(pdev, drive_pci + 1, &timing); |
449 | 449 | ||
450 | if (adev->dma_mode < XFER_UDMA_0) { | 450 | if (adev->dma_mode < XFER_UDMA_0) { |
451 | /* NOT SUPPORTED YET: NEED DATA SHEET. DITTO IN OLD DRIVER */ | 451 | /* NOT SUPPORTED YET: NEED DATA SHEET. DITTO IN OLD DRIVER */ |
452 | } else { | 452 | } else { |
453 | /* Bit 15 is UDMA on/off, bit 12-14 are cycle time */ | 453 | /* Bit 7 is UDMA on/off, bit 0-3 are cycle time */ |
454 | speed = adev->dma_mode - XFER_UDMA_0; | 454 | speed = adev->dma_mode - XFER_UDMA_0; |
455 | timing &= ~0x0F00; | 455 | timing &= ~0x8F; |
456 | timing |= udma_bits[speed]; | 456 | timing |= udma_bits[speed]; |
457 | } | 457 | } |
458 | pci_write_config_word(pdev, drive_pci, timing); | 458 | pci_write_config_byte(pdev, drive_pci + 1, timing); |
459 | } | 459 | } |
460 | 460 | ||
461 | /** | 461 | /** |
diff --git a/drivers/ata/pata_via.c b/drivers/ata/pata_via.c index e4c71f76bd55..a8462f1e890b 100644 --- a/drivers/ata/pata_via.c +++ b/drivers/ata/pata_via.c | |||
@@ -60,6 +60,7 @@ | |||
60 | #include <linux/delay.h> | 60 | #include <linux/delay.h> |
61 | #include <scsi/scsi_host.h> | 61 | #include <scsi/scsi_host.h> |
62 | #include <linux/libata.h> | 62 | #include <linux/libata.h> |
63 | #include <linux/dmi.h> | ||
63 | 64 | ||
64 | #define DRV_NAME "pata_via" | 65 | #define DRV_NAME "pata_via" |
65 | #define DRV_VERSION "0.3.1" | 66 | #define DRV_VERSION "0.3.1" |
@@ -122,6 +123,31 @@ static const struct via_isa_bridge { | |||
122 | { NULL } | 123 | { NULL } |
123 | }; | 124 | }; |
124 | 125 | ||
126 | |||
127 | /* | ||
128 | * Cable special cases | ||
129 | */ | ||
130 | |||
131 | static struct dmi_system_id cable_dmi_table[] = { | ||
132 | { | ||
133 | .ident = "Acer Ferrari 3400", | ||
134 | .matches = { | ||
135 | DMI_MATCH(DMI_BOARD_VENDOR, "Acer,Inc."), | ||
136 | DMI_MATCH(DMI_BOARD_NAME, "Ferrari 3400"), | ||
137 | }, | ||
138 | }, | ||
139 | { } | ||
140 | }; | ||
141 | |||
142 | static int via_cable_override(struct pci_dev *pdev) | ||
143 | { | ||
144 | /* Systems by DMI */ | ||
145 | if (dmi_check_system(cable_dmi_table)) | ||
146 | return 1; | ||
147 | return 0; | ||
148 | } | ||
149 | |||
150 | |||
125 | /** | 151 | /** |
126 | * via_cable_detect - cable detection | 152 | * via_cable_detect - cable detection |
127 | * @ap: ATA port | 153 | * @ap: ATA port |
@@ -139,6 +165,9 @@ static int via_cable_detect(struct ata_port *ap) { | |||
139 | struct pci_dev *pdev = to_pci_dev(ap->host->dev); | 165 | struct pci_dev *pdev = to_pci_dev(ap->host->dev); |
140 | u32 ata66; | 166 | u32 ata66; |
141 | 167 | ||
168 | if (via_cable_override(pdev)) | ||
169 | return ATA_CBL_PATA40_SHORT; | ||
170 | |||
142 | /* Early chips are 40 wire */ | 171 | /* Early chips are 40 wire */ |
143 | if ((config->flags & VIA_UDMA) < VIA_UDMA_66) | 172 | if ((config->flags & VIA_UDMA) < VIA_UDMA_66) |
144 | return ATA_CBL_PATA40; | 173 | return ATA_CBL_PATA40; |
@@ -592,10 +621,11 @@ static int via_reinit_one(struct pci_dev *pdev) | |||
592 | #endif | 621 | #endif |
593 | 622 | ||
594 | static const struct pci_device_id via[] = { | 623 | static const struct pci_device_id via[] = { |
595 | { PCI_VDEVICE(VIA, PCI_DEVICE_ID_VIA_82C576_1), }, | 624 | { PCI_VDEVICE(VIA, 0x0571), }, |
596 | { PCI_VDEVICE(VIA, PCI_DEVICE_ID_VIA_82C586_1), }, | 625 | { PCI_VDEVICE(VIA, 0x0581), }, |
597 | { PCI_VDEVICE(VIA, PCI_DEVICE_ID_VIA_6410), }, | 626 | { PCI_VDEVICE(VIA, 0x1571), }, |
598 | { PCI_VDEVICE(VIA, PCI_DEVICE_ID_VIA_SATA_EIDE), }, | 627 | { PCI_VDEVICE(VIA, 0x3164), }, |
628 | { PCI_VDEVICE(VIA, 0x5324), }, | ||
599 | 629 | ||
600 | { }, | 630 | { }, |
601 | }; | 631 | }; |
diff --git a/drivers/ata/sata_mv.c b/drivers/ata/sata_mv.c index 705a020e1597..c957e6e54ba1 100644 --- a/drivers/ata/sata_mv.c +++ b/drivers/ata/sata_mv.c | |||
@@ -21,6 +21,50 @@ | |||
21 | * | 21 | * |
22 | */ | 22 | */ |
23 | 23 | ||
24 | /* | ||
25 | sata_mv TODO list: | ||
26 | |||
27 | 1) Needs a full errata audit for all chipsets. I implemented most | ||
28 | of the errata workarounds found in the Marvell vendor driver, but | ||
29 | I distinctly remember a couple workarounds (one related to PCI-X) | ||
30 | are still needed. | ||
31 | |||
32 | 2) Convert to LibATA new EH. Required for hotplug, NCQ, and sane | ||
33 | probing/error handling in general. MUST HAVE. | ||
34 | |||
35 | 3) Add hotplug support (easy, once new-EH support appears) | ||
36 | |||
37 | 4) Add NCQ support (easy to intermediate, once new-EH support appears) | ||
38 | |||
39 | 5) Investigate problems with PCI Message Signalled Interrupts (MSI). | ||
40 | |||
41 | 6) Add port multiplier support (intermediate) | ||
42 | |||
43 | 7) Test and verify 3.0 Gbps support | ||
44 | |||
45 | 8) Develop a low-power-consumption strategy, and implement it. | ||
46 | |||
47 | 9) [Experiment, low priority] See if ATAPI can be supported using | ||
48 | "unknown FIS" or "vendor-specific FIS" support, or something creative | ||
49 | like that. | ||
50 | |||
51 | 10) [Experiment, low priority] Investigate interrupt coalescing. | ||
52 | Quite often, especially with PCI Message Signalled Interrupts (MSI), | ||
53 | the overhead reduced by interrupt mitigation is quite often not | ||
54 | worth the latency cost. | ||
55 | |||
56 | 11) [Experiment, Marvell value added] Is it possible to use target | ||
57 | mode to cross-connect two Linux boxes with Marvell cards? If so, | ||
58 | creating LibATA target mode support would be very interesting. | ||
59 | |||
60 | Target mode, for those without docs, is the ability to directly | ||
61 | connect two SATA controllers. | ||
62 | |||
63 | 13) Verify that 7042 is fully supported. I only have a 6042. | ||
64 | |||
65 | */ | ||
66 | |||
67 | |||
24 | #include <linux/kernel.h> | 68 | #include <linux/kernel.h> |
25 | #include <linux/module.h> | 69 | #include <linux/module.h> |
26 | #include <linux/pci.h> | 70 | #include <linux/pci.h> |
diff --git a/drivers/ata/sata_promise.c b/drivers/ata/sata_promise.c index 3a7d9b5332af..2b924a69b365 100644 --- a/drivers/ata/sata_promise.c +++ b/drivers/ata/sata_promise.c | |||
@@ -297,7 +297,7 @@ static const struct ata_port_info pdc_port_info[] = { | |||
297 | 297 | ||
298 | /* board_2057x_pata */ | 298 | /* board_2057x_pata */ |
299 | { | 299 | { |
300 | .flags = PDC_COMMON_FLAGS | ATA_FLAG_SLAVE_POSS, | 300 | .flags = PDC_COMMON_FLAGS | ATA_FLAG_SLAVE_POSS | |
301 | PDC_FLAG_GEN_II, | 301 | PDC_FLAG_GEN_II, |
302 | .pio_mask = 0x1f, /* pio0-4 */ | 302 | .pio_mask = 0x1f, /* pio0-4 */ |
303 | .mwdma_mask = 0x07, /* mwdma0-2 */ | 303 | .mwdma_mask = 0x07, /* mwdma0-2 */ |
diff --git a/drivers/ata/sata_sis.c b/drivers/ata/sata_sis.c index 51d9251b0898..221099d1d08f 100644 --- a/drivers/ata/sata_sis.c +++ b/drivers/ata/sata_sis.c | |||
@@ -255,7 +255,7 @@ static int sis_init_one (struct pci_dev *pdev, const struct pci_device_id *ent) | |||
255 | { | 255 | { |
256 | static int printed_version; | 256 | static int printed_version; |
257 | struct ata_port_info pi = sis_port_info; | 257 | struct ata_port_info pi = sis_port_info; |
258 | const struct ata_port_info *ppi[] = { &pi, NULL }; | 258 | const struct ata_port_info *ppi[] = { &pi, &pi }; |
259 | struct ata_host *host; | 259 | struct ata_host *host; |
260 | u32 genctl, val; | 260 | u32 genctl, val; |
261 | u8 pmr; | 261 | u8 pmr; |
diff --git a/drivers/ata/sata_via.c b/drivers/ata/sata_via.c index 01bba26d8d1a..e8b90e7b42dd 100644 --- a/drivers/ata/sata_via.c +++ b/drivers/ata/sata_via.c | |||
@@ -85,6 +85,9 @@ static const struct pci_device_id svia_pci_tbl[] = { | |||
85 | { PCI_VDEVICE(VIA, 0x0591), vt6420 }, | 85 | { PCI_VDEVICE(VIA, 0x0591), vt6420 }, |
86 | { PCI_VDEVICE(VIA, 0x3149), vt6420 }, | 86 | { PCI_VDEVICE(VIA, 0x3149), vt6420 }, |
87 | { PCI_VDEVICE(VIA, 0x3249), vt6421 }, | 87 | { PCI_VDEVICE(VIA, 0x3249), vt6421 }, |
88 | { PCI_VDEVICE(VIA, 0x5287), vt6420 }, | ||
89 | { PCI_VDEVICE(VIA, 0x5372), vt6420 }, | ||
90 | { PCI_VDEVICE(VIA, 0x7372), vt6420 }, | ||
88 | 91 | ||
89 | { } /* terminate list */ | 92 | { } /* terminate list */ |
90 | }; | 93 | }; |
diff --git a/drivers/atm/idt77252.c b/drivers/atm/idt77252.c index 057efbc55d38..3800bc0cb2ef 100644 --- a/drivers/atm/idt77252.c +++ b/drivers/atm/idt77252.c | |||
@@ -47,7 +47,8 @@ static char const rcsid[] = | |||
47 | #include <linux/bitops.h> | 47 | #include <linux/bitops.h> |
48 | #include <linux/wait.h> | 48 | #include <linux/wait.h> |
49 | #include <linux/jiffies.h> | 49 | #include <linux/jiffies.h> |
50 | #include <asm/semaphore.h> | 50 | #include <linux/mutex.h> |
51 | |||
51 | #include <asm/io.h> | 52 | #include <asm/io.h> |
52 | #include <asm/uaccess.h> | 53 | #include <asm/uaccess.h> |
53 | #include <asm/atomic.h> | 54 | #include <asm/atomic.h> |
@@ -2435,7 +2436,7 @@ idt77252_open(struct atm_vcc *vcc) | |||
2435 | 2436 | ||
2436 | set_bit(ATM_VF_ADDR, &vcc->flags); | 2437 | set_bit(ATM_VF_ADDR, &vcc->flags); |
2437 | 2438 | ||
2438 | down(&card->mutex); | 2439 | mutex_lock(&card->mutex); |
2439 | 2440 | ||
2440 | OPRINTK("%s: opening vpi.vci: %d.%d\n", card->name, vpi, vci); | 2441 | OPRINTK("%s: opening vpi.vci: %d.%d\n", card->name, vpi, vci); |
2441 | 2442 | ||
@@ -2446,7 +2447,7 @@ idt77252_open(struct atm_vcc *vcc) | |||
2446 | break; | 2447 | break; |
2447 | default: | 2448 | default: |
2448 | printk("%s: Unsupported AAL: %d\n", card->name, vcc->qos.aal); | 2449 | printk("%s: Unsupported AAL: %d\n", card->name, vcc->qos.aal); |
2449 | up(&card->mutex); | 2450 | mutex_unlock(&card->mutex); |
2450 | return -EPROTONOSUPPORT; | 2451 | return -EPROTONOSUPPORT; |
2451 | } | 2452 | } |
2452 | 2453 | ||
@@ -2455,7 +2456,7 @@ idt77252_open(struct atm_vcc *vcc) | |||
2455 | card->vcs[index] = kzalloc(sizeof(struct vc_map), GFP_KERNEL); | 2456 | card->vcs[index] = kzalloc(sizeof(struct vc_map), GFP_KERNEL); |
2456 | if (!card->vcs[index]) { | 2457 | if (!card->vcs[index]) { |
2457 | printk("%s: can't alloc vc in open()\n", card->name); | 2458 | printk("%s: can't alloc vc in open()\n", card->name); |
2458 | up(&card->mutex); | 2459 | mutex_unlock(&card->mutex); |
2459 | return -ENOMEM; | 2460 | return -ENOMEM; |
2460 | } | 2461 | } |
2461 | card->vcs[index]->card = card; | 2462 | card->vcs[index]->card = card; |
@@ -2484,14 +2485,14 @@ idt77252_open(struct atm_vcc *vcc) | |||
2484 | if (inuse) { | 2485 | if (inuse) { |
2485 | printk("%s: %s vci already in use.\n", card->name, | 2486 | printk("%s: %s vci already in use.\n", card->name, |
2486 | inuse == 1 ? "tx" : inuse == 2 ? "rx" : "tx and rx"); | 2487 | inuse == 1 ? "tx" : inuse == 2 ? "rx" : "tx and rx"); |
2487 | up(&card->mutex); | 2488 | mutex_unlock(&card->mutex); |
2488 | return -EADDRINUSE; | 2489 | return -EADDRINUSE; |
2489 | } | 2490 | } |
2490 | 2491 | ||
2491 | if (vcc->qos.txtp.traffic_class != ATM_NONE) { | 2492 | if (vcc->qos.txtp.traffic_class != ATM_NONE) { |
2492 | error = idt77252_init_tx(card, vc, vcc, &vcc->qos); | 2493 | error = idt77252_init_tx(card, vc, vcc, &vcc->qos); |
2493 | if (error) { | 2494 | if (error) { |
2494 | up(&card->mutex); | 2495 | mutex_unlock(&card->mutex); |
2495 | return error; | 2496 | return error; |
2496 | } | 2497 | } |
2497 | } | 2498 | } |
@@ -2499,14 +2500,14 @@ idt77252_open(struct atm_vcc *vcc) | |||
2499 | if (vcc->qos.rxtp.traffic_class != ATM_NONE) { | 2500 | if (vcc->qos.rxtp.traffic_class != ATM_NONE) { |
2500 | error = idt77252_init_rx(card, vc, vcc, &vcc->qos); | 2501 | error = idt77252_init_rx(card, vc, vcc, &vcc->qos); |
2501 | if (error) { | 2502 | if (error) { |
2502 | up(&card->mutex); | 2503 | mutex_unlock(&card->mutex); |
2503 | return error; | 2504 | return error; |
2504 | } | 2505 | } |
2505 | } | 2506 | } |
2506 | 2507 | ||
2507 | set_bit(ATM_VF_READY, &vcc->flags); | 2508 | set_bit(ATM_VF_READY, &vcc->flags); |
2508 | 2509 | ||
2509 | up(&card->mutex); | 2510 | mutex_unlock(&card->mutex); |
2510 | return 0; | 2511 | return 0; |
2511 | } | 2512 | } |
2512 | 2513 | ||
@@ -2520,7 +2521,7 @@ idt77252_close(struct atm_vcc *vcc) | |||
2520 | unsigned long addr; | 2521 | unsigned long addr; |
2521 | unsigned long timeout; | 2522 | unsigned long timeout; |
2522 | 2523 | ||
2523 | down(&card->mutex); | 2524 | mutex_lock(&card->mutex); |
2524 | 2525 | ||
2525 | IPRINTK("%s: idt77252_close: vc = %d (%d.%d)\n", | 2526 | IPRINTK("%s: idt77252_close: vc = %d (%d.%d)\n", |
2526 | card->name, vc->index, vcc->vpi, vcc->vci); | 2527 | card->name, vc->index, vcc->vpi, vcc->vci); |
@@ -2591,7 +2592,7 @@ done: | |||
2591 | free_scq(card, vc->scq); | 2592 | free_scq(card, vc->scq); |
2592 | } | 2593 | } |
2593 | 2594 | ||
2594 | up(&card->mutex); | 2595 | mutex_unlock(&card->mutex); |
2595 | } | 2596 | } |
2596 | 2597 | ||
2597 | static int | 2598 | static int |
@@ -2602,7 +2603,7 @@ idt77252_change_qos(struct atm_vcc *vcc, struct atm_qos *qos, int flags) | |||
2602 | struct vc_map *vc = vcc->dev_data; | 2603 | struct vc_map *vc = vcc->dev_data; |
2603 | int error = 0; | 2604 | int error = 0; |
2604 | 2605 | ||
2605 | down(&card->mutex); | 2606 | mutex_lock(&card->mutex); |
2606 | 2607 | ||
2607 | if (qos->txtp.traffic_class != ATM_NONE) { | 2608 | if (qos->txtp.traffic_class != ATM_NONE) { |
2608 | if (!test_bit(VCF_TX, &vc->flags)) { | 2609 | if (!test_bit(VCF_TX, &vc->flags)) { |
@@ -2648,7 +2649,7 @@ idt77252_change_qos(struct atm_vcc *vcc, struct atm_qos *qos, int flags) | |||
2648 | set_bit(ATM_VF_HASQOS, &vcc->flags); | 2649 | set_bit(ATM_VF_HASQOS, &vcc->flags); |
2649 | 2650 | ||
2650 | out: | 2651 | out: |
2651 | up(&card->mutex); | 2652 | mutex_unlock(&card->mutex); |
2652 | return error; | 2653 | return error; |
2653 | } | 2654 | } |
2654 | 2655 | ||
@@ -3709,7 +3710,7 @@ idt77252_init_one(struct pci_dev *pcidev, const struct pci_device_id *id) | |||
3709 | membase = pci_resource_start(pcidev, 1); | 3710 | membase = pci_resource_start(pcidev, 1); |
3710 | srambase = pci_resource_start(pcidev, 2); | 3711 | srambase = pci_resource_start(pcidev, 2); |
3711 | 3712 | ||
3712 | init_MUTEX(&card->mutex); | 3713 | mutex_init(&card->mutex); |
3713 | spin_lock_init(&card->cmd_lock); | 3714 | spin_lock_init(&card->cmd_lock); |
3714 | spin_lock_init(&card->tst_lock); | 3715 | spin_lock_init(&card->tst_lock); |
3715 | 3716 | ||
diff --git a/drivers/atm/idt77252.h b/drivers/atm/idt77252.h index 544b39738291..6f2b4a5875fb 100644 --- a/drivers/atm/idt77252.h +++ b/drivers/atm/idt77252.h | |||
@@ -37,7 +37,7 @@ | |||
37 | #include <linux/ptrace.h> | 37 | #include <linux/ptrace.h> |
38 | #include <linux/skbuff.h> | 38 | #include <linux/skbuff.h> |
39 | #include <linux/workqueue.h> | 39 | #include <linux/workqueue.h> |
40 | 40 | #include <linux/mutex.h> | |
41 | 41 | ||
42 | /*****************************************************************************/ | 42 | /*****************************************************************************/ |
43 | /* */ | 43 | /* */ |
@@ -359,7 +359,7 @@ struct idt77252_dev | |||
359 | unsigned long srambase; /* SAR's sram base address */ | 359 | unsigned long srambase; /* SAR's sram base address */ |
360 | void __iomem *fbq[4]; /* FBQ fill addresses */ | 360 | void __iomem *fbq[4]; /* FBQ fill addresses */ |
361 | 361 | ||
362 | struct semaphore mutex; | 362 | struct mutex mutex; |
363 | spinlock_t cmd_lock; /* for r/w utility/sram */ | 363 | spinlock_t cmd_lock; /* for r/w utility/sram */ |
364 | 364 | ||
365 | unsigned long softstat; | 365 | unsigned long softstat; |
diff --git a/drivers/block/floppy.c b/drivers/block/floppy.c index 3587cb434371..fe088045dd08 100644 --- a/drivers/block/floppy.c +++ b/drivers/block/floppy.c | |||
@@ -670,7 +670,7 @@ static void __reschedule_timeout(int drive, const char *message, int marg) | |||
670 | if (drive == current_reqD) | 670 | if (drive == current_reqD) |
671 | drive = current_drive; | 671 | drive = current_drive; |
672 | del_timer(&fd_timeout); | 672 | del_timer(&fd_timeout); |
673 | if (drive < 0 || drive > N_DRIVE) { | 673 | if (drive < 0 || drive >= N_DRIVE) { |
674 | fd_timeout.expires = jiffies + 20UL * HZ; | 674 | fd_timeout.expires = jiffies + 20UL * HZ; |
675 | drive = 0; | 675 | drive = 0; |
676 | } else | 676 | } else |
diff --git a/drivers/bluetooth/hci_usb.c b/drivers/bluetooth/hci_usb.c index b0238b46dded..7e04dd69f609 100644 --- a/drivers/bluetooth/hci_usb.c +++ b/drivers/bluetooth/hci_usb.c | |||
@@ -115,11 +115,11 @@ static struct usb_device_id blacklist_ids[] = { | |||
115 | { USB_DEVICE(0x0a5c, 0x2009), .driver_info = HCI_BCM92035 }, | 115 | { USB_DEVICE(0x0a5c, 0x2009), .driver_info = HCI_BCM92035 }, |
116 | 116 | ||
117 | /* Broadcom BCM2045 */ | 117 | /* Broadcom BCM2045 */ |
118 | { USB_DEVICE(0x0a5c, 0x2101), .driver_info = HCI_WRONG_SCO_MTU }, | 118 | { USB_DEVICE(0x0a5c, 0x2101), .driver_info = HCI_RESET | HCI_WRONG_SCO_MTU }, |
119 | 119 | ||
120 | /* IBM/Lenovo ThinkPad with Broadcom chip */ | 120 | /* IBM/Lenovo ThinkPad with Broadcom chip */ |
121 | { USB_DEVICE(0x0a5c, 0x201e), .driver_info = HCI_WRONG_SCO_MTU }, | 121 | { USB_DEVICE(0x0a5c, 0x201e), .driver_info = HCI_RESET | HCI_WRONG_SCO_MTU }, |
122 | { USB_DEVICE(0x0a5c, 0x2110), .driver_info = HCI_WRONG_SCO_MTU }, | 122 | { USB_DEVICE(0x0a5c, 0x2110), .driver_info = HCI_RESET | HCI_WRONG_SCO_MTU }, |
123 | 123 | ||
124 | /* Targus ACB10US */ | 124 | /* Targus ACB10US */ |
125 | { USB_DEVICE(0x0a5c, 0x2100), .driver_info = HCI_RESET }, | 125 | { USB_DEVICE(0x0a5c, 0x2100), .driver_info = HCI_RESET }, |
@@ -128,17 +128,17 @@ static struct usb_device_id blacklist_ids[] = { | |||
128 | { USB_DEVICE(0x0a5c, 0x2111), .driver_info = HCI_RESET }, | 128 | { USB_DEVICE(0x0a5c, 0x2111), .driver_info = HCI_RESET }, |
129 | 129 | ||
130 | /* HP laptop with Broadcom chip */ | 130 | /* HP laptop with Broadcom chip */ |
131 | { USB_DEVICE(0x03f0, 0x171d), .driver_info = HCI_WRONG_SCO_MTU }, | 131 | { USB_DEVICE(0x03f0, 0x171d), .driver_info = HCI_RESET | HCI_WRONG_SCO_MTU }, |
132 | 132 | ||
133 | /* Dell laptop with Broadcom chip */ | 133 | /* Dell laptop with Broadcom chip */ |
134 | { USB_DEVICE(0x413c, 0x8126), .driver_info = HCI_WRONG_SCO_MTU }, | 134 | { USB_DEVICE(0x413c, 0x8126), .driver_info = HCI_RESET | HCI_WRONG_SCO_MTU }, |
135 | 135 | ||
136 | /* Microsoft Wireless Transceiver for Bluetooth 2.0 */ | 136 | /* Microsoft Wireless Transceiver for Bluetooth 2.0 */ |
137 | { USB_DEVICE(0x045e, 0x009c), .driver_info = HCI_RESET }, | 137 | { USB_DEVICE(0x045e, 0x009c), .driver_info = HCI_RESET }, |
138 | 138 | ||
139 | /* Kensington Bluetooth USB adapter */ | 139 | /* Kensington Bluetooth USB adapter */ |
140 | { USB_DEVICE(0x047d, 0x105d), .driver_info = HCI_RESET }, | 140 | { USB_DEVICE(0x047d, 0x105d), .driver_info = HCI_RESET }, |
141 | { USB_DEVICE(0x047d, 0x105e), .driver_info = HCI_WRONG_SCO_MTU }, | 141 | { USB_DEVICE(0x047d, 0x105e), .driver_info = HCI_RESET | HCI_WRONG_SCO_MTU }, |
142 | 142 | ||
143 | /* ISSC Bluetooth Adapter v3.1 */ | 143 | /* ISSC Bluetooth Adapter v3.1 */ |
144 | { USB_DEVICE(0x1131, 0x1001), .driver_info = HCI_RESET }, | 144 | { USB_DEVICE(0x1131, 0x1001), .driver_info = HCI_RESET }, |
@@ -148,8 +148,8 @@ static struct usb_device_id blacklist_ids[] = { | |||
148 | { USB_DEVICE(0x0400, 0x080a), .driver_info = HCI_BROKEN_ISOC }, | 148 | { USB_DEVICE(0x0400, 0x080a), .driver_info = HCI_BROKEN_ISOC }, |
149 | 149 | ||
150 | /* Belkin F8T012 and F8T013 devices */ | 150 | /* Belkin F8T012 and F8T013 devices */ |
151 | { USB_DEVICE(0x050d, 0x0012), .driver_info = HCI_WRONG_SCO_MTU }, | 151 | { USB_DEVICE(0x050d, 0x0012), .driver_info = HCI_RESET | HCI_WRONG_SCO_MTU }, |
152 | { USB_DEVICE(0x050d, 0x0013), .driver_info = HCI_WRONG_SCO_MTU }, | 152 | { USB_DEVICE(0x050d, 0x0013), .driver_info = HCI_RESET | HCI_WRONG_SCO_MTU }, |
153 | 153 | ||
154 | /* Digianswer devices */ | 154 | /* Digianswer devices */ |
155 | { USB_DEVICE(0x08fd, 0x0001), .driver_info = HCI_DIGIANSWER }, | 155 | { USB_DEVICE(0x08fd, 0x0001), .driver_info = HCI_DIGIANSWER }, |
diff --git a/drivers/char/Kconfig b/drivers/char/Kconfig index abcafac64738..ef683ebd367c 100644 --- a/drivers/char/Kconfig +++ b/drivers/char/Kconfig | |||
@@ -815,7 +815,7 @@ config SGI_IP27_RTC | |||
815 | 815 | ||
816 | config GEN_RTC | 816 | config GEN_RTC |
817 | tristate "Generic /dev/rtc emulation" | 817 | tristate "Generic /dev/rtc emulation" |
818 | depends on RTC!=y && !IA64 && !ARM && !M32R && !SPARC && !FRV && !S390 | 818 | depends on RTC!=y && !IA64 && !ARM && !M32R && !SPARC && !FRV && !S390 && !SUPERH |
819 | ---help--- | 819 | ---help--- |
820 | If you say Y here and create a character special file /dev/rtc with | 820 | If you say Y here and create a character special file /dev/rtc with |
821 | major number 10 and minor number 135 using mknod ("man mknod"), you | 821 | major number 10 and minor number 135 using mknod ("man mknod"), you |
diff --git a/drivers/char/cyclades.c b/drivers/char/cyclades.c index c72ee97d3892..ca376b92162c 100644 --- a/drivers/char/cyclades.c +++ b/drivers/char/cyclades.c | |||
@@ -1061,6 +1061,7 @@ static void cyy_intr_chip(struct cyclades_card *cinfo, int chip, | |||
1061 | 1061 | ||
1062 | if (data & info->ignore_status_mask) { | 1062 | if (data & info->ignore_status_mask) { |
1063 | info->icount.rx++; | 1063 | info->icount.rx++; |
1064 | spin_unlock(&cinfo->card_lock); | ||
1064 | return; | 1065 | return; |
1065 | } | 1066 | } |
1066 | if (tty_buffer_request_room(tty, 1)) { | 1067 | if (tty_buffer_request_room(tty, 1)) { |
diff --git a/drivers/crypto/geode-aes.c b/drivers/crypto/geode-aes.c index 6d3840e629de..6a86958b577f 100644 --- a/drivers/crypto/geode-aes.c +++ b/drivers/crypto/geode-aes.c | |||
@@ -102,10 +102,15 @@ geode_aes_crypt(struct geode_aes_op *op) | |||
102 | u32 flags = 0; | 102 | u32 flags = 0; |
103 | unsigned long iflags; | 103 | unsigned long iflags; |
104 | 104 | ||
105 | if (op->len == 0 || op->src == op->dst) | 105 | if (op->len == 0) |
106 | return 0; | 106 | return 0; |
107 | 107 | ||
108 | if (op->flags & AES_FLAGS_COHERENT) | 108 | /* If the source and destination is the same, then |
109 | * we need to turn on the coherent flags, otherwise | ||
110 | * we don't need to worry | ||
111 | */ | ||
112 | |||
113 | if (op->src == op->dst) | ||
109 | flags |= (AES_CTRL_DCA | AES_CTRL_SCA); | 114 | flags |= (AES_CTRL_DCA | AES_CTRL_SCA); |
110 | 115 | ||
111 | if (op->dir == AES_DIR_ENCRYPT) | 116 | if (op->dir == AES_DIR_ENCRYPT) |
@@ -120,7 +125,7 @@ geode_aes_crypt(struct geode_aes_op *op) | |||
120 | _writefield(AES_WRITEIV0_REG, op->iv); | 125 | _writefield(AES_WRITEIV0_REG, op->iv); |
121 | } | 126 | } |
122 | 127 | ||
123 | if (op->flags & AES_FLAGS_USRKEY) { | 128 | if (!(op->flags & AES_FLAGS_HIDDENKEY)) { |
124 | flags |= AES_CTRL_WRKEY; | 129 | flags |= AES_CTRL_WRKEY; |
125 | _writefield(AES_WRITEKEY0_REG, op->key); | 130 | _writefield(AES_WRITEKEY0_REG, op->key); |
126 | } | 131 | } |
@@ -289,6 +294,7 @@ static struct crypto_alg geode_cbc_alg = { | |||
289 | .setkey = geode_setkey, | 294 | .setkey = geode_setkey, |
290 | .encrypt = geode_cbc_encrypt, | 295 | .encrypt = geode_cbc_encrypt, |
291 | .decrypt = geode_cbc_decrypt, | 296 | .decrypt = geode_cbc_decrypt, |
297 | .ivsize = AES_IV_LENGTH, | ||
292 | } | 298 | } |
293 | } | 299 | } |
294 | }; | 300 | }; |
diff --git a/drivers/crypto/geode-aes.h b/drivers/crypto/geode-aes.h index 8003a36f3a83..f47968671ae7 100644 --- a/drivers/crypto/geode-aes.h +++ b/drivers/crypto/geode-aes.h | |||
@@ -20,8 +20,7 @@ | |||
20 | #define AES_DIR_DECRYPT 0 | 20 | #define AES_DIR_DECRYPT 0 |
21 | #define AES_DIR_ENCRYPT 1 | 21 | #define AES_DIR_ENCRYPT 1 |
22 | 22 | ||
23 | #define AES_FLAGS_USRKEY (1 << 0) | 23 | #define AES_FLAGS_HIDDENKEY (1 << 0) |
24 | #define AES_FLAGS_COHERENT (1 << 1) | ||
25 | 24 | ||
26 | struct geode_aes_op { | 25 | struct geode_aes_op { |
27 | 26 | ||
diff --git a/drivers/hwmon/applesmc.c b/drivers/hwmon/applesmc.c index 0c160675b3ac..366f4a1a2cb8 100644 --- a/drivers/hwmon/applesmc.c +++ b/drivers/hwmon/applesmc.c | |||
@@ -491,6 +491,12 @@ out: | |||
491 | 491 | ||
492 | /* Sysfs Files */ | 492 | /* Sysfs Files */ |
493 | 493 | ||
494 | static ssize_t applesmc_name_show(struct device *dev, | ||
495 | struct device_attribute *attr, char *buf) | ||
496 | { | ||
497 | return snprintf(buf, PAGE_SIZE, "applesmc\n"); | ||
498 | } | ||
499 | |||
494 | static ssize_t applesmc_position_show(struct device *dev, | 500 | static ssize_t applesmc_position_show(struct device *dev, |
495 | struct device_attribute *attr, char *buf) | 501 | struct device_attribute *attr, char *buf) |
496 | { | 502 | { |
@@ -913,6 +919,8 @@ static struct led_classdev applesmc_backlight = { | |||
913 | .brightness_set = applesmc_brightness_set, | 919 | .brightness_set = applesmc_brightness_set, |
914 | }; | 920 | }; |
915 | 921 | ||
922 | static DEVICE_ATTR(name, 0444, applesmc_name_show, NULL); | ||
923 | |||
916 | static DEVICE_ATTR(position, 0444, applesmc_position_show, NULL); | 924 | static DEVICE_ATTR(position, 0444, applesmc_position_show, NULL); |
917 | static DEVICE_ATTR(calibrate, 0644, | 925 | static DEVICE_ATTR(calibrate, 0644, |
918 | applesmc_calibrate_show, applesmc_calibrate_store); | 926 | applesmc_calibrate_show, applesmc_calibrate_store); |
@@ -1197,6 +1205,8 @@ static int __init applesmc_init(void) | |||
1197 | goto out_driver; | 1205 | goto out_driver; |
1198 | } | 1206 | } |
1199 | 1207 | ||
1208 | ret = sysfs_create_file(&pdev->dev.kobj, &dev_attr_name.attr); | ||
1209 | |||
1200 | /* Create key enumeration sysfs files */ | 1210 | /* Create key enumeration sysfs files */ |
1201 | ret = sysfs_create_group(&pdev->dev.kobj, &key_enumeration_group); | 1211 | ret = sysfs_create_group(&pdev->dev.kobj, &key_enumeration_group); |
1202 | if (ret) | 1212 | if (ret) |
diff --git a/drivers/i2c/busses/i2c-s3c2410.c b/drivers/i2c/busses/i2c-s3c2410.c index e68a96f589fd..e4540fcf6476 100644 --- a/drivers/i2c/busses/i2c-s3c2410.c +++ b/drivers/i2c/busses/i2c-s3c2410.c | |||
@@ -830,7 +830,8 @@ static int s3c24xx_i2c_probe(struct platform_device *pdev) | |||
830 | 830 | ||
831 | i2c->irq = res; | 831 | i2c->irq = res; |
832 | 832 | ||
833 | dev_dbg(&pdev->dev, "irq resource %p (%ld)\n", res, res->start); | 833 | dev_dbg(&pdev->dev, "irq resource %p (%lu)\n", res, |
834 | (unsigned long)res->start); | ||
834 | 835 | ||
835 | ret = i2c_add_adapter(&i2c->adap); | 836 | ret = i2c_add_adapter(&i2c->adap); |
836 | if (ret < 0) { | 837 | if (ret < 0) { |
diff --git a/drivers/i2c/busses/i2c-tiny-usb.c b/drivers/i2c/busses/i2c-tiny-usb.c index 907999049d50..cb9abe7565a7 100644 --- a/drivers/i2c/busses/i2c-tiny-usb.c +++ b/drivers/i2c/busses/i2c-tiny-usb.c | |||
@@ -208,7 +208,7 @@ static int i2c_tiny_usb_probe(struct usb_interface *interface, | |||
208 | dev->adapter.class = I2C_CLASS_HWMON; | 208 | dev->adapter.class = I2C_CLASS_HWMON; |
209 | dev->adapter.algo = &usb_algorithm; | 209 | dev->adapter.algo = &usb_algorithm; |
210 | dev->adapter.algo_data = dev; | 210 | dev->adapter.algo_data = dev; |
211 | snprintf(dev->adapter.name, I2C_NAME_SIZE, | 211 | snprintf(dev->adapter.name, sizeof(dev->adapter.name), |
212 | "i2c-tiny-usb at bus %03d device %03d", | 212 | "i2c-tiny-usb at bus %03d device %03d", |
213 | dev->usb_dev->bus->busnum, dev->usb_dev->devnum); | 213 | dev->usb_dev->bus->busnum, dev->usb_dev->devnum); |
214 | 214 | ||
diff --git a/drivers/i2c/i2c-core.c b/drivers/i2c/i2c-core.c index 64f8e56d300e..435925eba437 100644 --- a/drivers/i2c/i2c-core.c +++ b/drivers/i2c/i2c-core.c | |||
@@ -697,9 +697,10 @@ int i2c_attach_client(struct i2c_client *client) | |||
697 | if (client->driver) | 697 | if (client->driver) |
698 | client->dev.driver = &client->driver->driver; | 698 | client->dev.driver = &client->driver->driver; |
699 | 699 | ||
700 | if (client->driver && !is_newstyle_driver(client->driver)) | 700 | if (client->driver && !is_newstyle_driver(client->driver)) { |
701 | client->dev.release = i2c_client_release; | 701 | client->dev.release = i2c_client_release; |
702 | else | 702 | client->dev.uevent_suppress = 1; |
703 | } else | ||
703 | client->dev.release = i2c_client_dev_release; | 704 | client->dev.release = i2c_client_dev_release; |
704 | 705 | ||
705 | snprintf(&client->dev.bus_id[0], sizeof(client->dev.bus_id), | 706 | snprintf(&client->dev.bus_id[0], sizeof(client->dev.bus_id), |
diff --git a/drivers/ide/ide-dma.c b/drivers/ide/ide-dma.c index b77b7d138c49..ead141e2db9e 100644 --- a/drivers/ide/ide-dma.c +++ b/drivers/ide/ide-dma.c | |||
@@ -119,15 +119,17 @@ static const struct drive_list_entry drive_blacklist [] = { | |||
119 | { "HITACHI CDR-8335" , "ALL" }, | 119 | { "HITACHI CDR-8335" , "ALL" }, |
120 | { "HITACHI CDR-8435" , "ALL" }, | 120 | { "HITACHI CDR-8435" , "ALL" }, |
121 | { "Toshiba CD-ROM XM-6202B" , "ALL" }, | 121 | { "Toshiba CD-ROM XM-6202B" , "ALL" }, |
122 | { "TOSHIBA CD-ROM XM-1702BC", "ALL" }, | ||
122 | { "CD-532E-A" , "ALL" }, | 123 | { "CD-532E-A" , "ALL" }, |
123 | { "E-IDE CD-ROM CR-840", "ALL" }, | 124 | { "E-IDE CD-ROM CR-840", "ALL" }, |
124 | { "CD-ROM Drive/F5A", "ALL" }, | 125 | { "CD-ROM Drive/F5A", "ALL" }, |
125 | { "WPI CDD-820", "ALL" }, | 126 | { "WPI CDD-820", "ALL" }, |
126 | { "SAMSUNG CD-ROM SC-148C", "ALL" }, | 127 | { "SAMSUNG CD-ROM SC-148C", "ALL" }, |
127 | { "SAMSUNG CD-ROM SC", "ALL" }, | 128 | { "SAMSUNG CD-ROM SC", "ALL" }, |
128 | { "SanDisk SDP3B-64" , "ALL" }, | ||
129 | { "ATAPI CD-ROM DRIVE 40X MAXIMUM", "ALL" }, | 129 | { "ATAPI CD-ROM DRIVE 40X MAXIMUM", "ALL" }, |
130 | { "_NEC DV5800A", "ALL" }, | 130 | { "_NEC DV5800A", "ALL" }, |
131 | { "SAMSUNG CD-ROM SN-124", "N001" }, | ||
132 | { "Seagate STT20000A", "ALL" }, | ||
131 | { NULL , NULL } | 133 | { NULL , NULL } |
132 | 134 | ||
133 | }; | 135 | }; |
diff --git a/drivers/ide/ide-proc.c b/drivers/ide/ide-proc.c index d50bd996ff22..ea94c9aa1220 100644 --- a/drivers/ide/ide-proc.c +++ b/drivers/ide/ide-proc.c | |||
@@ -67,6 +67,8 @@ static int proc_ide_read_imodel | |||
67 | case ide_4drives: name = "4drives"; break; | 67 | case ide_4drives: name = "4drives"; break; |
68 | case ide_pmac: name = "mac-io"; break; | 68 | case ide_pmac: name = "mac-io"; break; |
69 | case ide_au1xxx: name = "au1xxx"; break; | 69 | case ide_au1xxx: name = "au1xxx"; break; |
70 | case ide_etrax100: name = "etrax100"; break; | ||
71 | case ide_acorn: name = "acorn"; break; | ||
70 | default: name = "(unknown)"; break; | 72 | default: name = "(unknown)"; break; |
71 | } | 73 | } |
72 | len = sprintf(page, "%s\n", name); | 74 | len = sprintf(page, "%s\n", name); |
diff --git a/drivers/ide/pci/atiixp.c b/drivers/ide/pci/atiixp.c index 0e52ad722a72..8ab33faf6f76 100644 --- a/drivers/ide/pci/atiixp.c +++ b/drivers/ide/pci/atiixp.c | |||
@@ -317,6 +317,7 @@ static struct pci_device_id atiixp_pci_tbl[] = { | |||
317 | { PCI_VENDOR_ID_ATI, PCI_DEVICE_ID_ATI_IXP300_IDE, PCI_ANY_ID, PCI_ANY_ID, 0, 0, 0}, | 317 | { PCI_VENDOR_ID_ATI, PCI_DEVICE_ID_ATI_IXP300_IDE, PCI_ANY_ID, PCI_ANY_ID, 0, 0, 0}, |
318 | { PCI_VENDOR_ID_ATI, PCI_DEVICE_ID_ATI_IXP400_IDE, PCI_ANY_ID, PCI_ANY_ID, 0, 0, 0}, | 318 | { PCI_VENDOR_ID_ATI, PCI_DEVICE_ID_ATI_IXP400_IDE, PCI_ANY_ID, PCI_ANY_ID, 0, 0, 0}, |
319 | { PCI_VENDOR_ID_ATI, PCI_DEVICE_ID_ATI_IXP600_IDE, PCI_ANY_ID, PCI_ANY_ID, 0, 0, 1}, | 319 | { PCI_VENDOR_ID_ATI, PCI_DEVICE_ID_ATI_IXP600_IDE, PCI_ANY_ID, PCI_ANY_ID, 0, 0, 1}, |
320 | { PCI_VENDOR_ID_ATI, PCI_DEVICE_ID_ATI_IXP700_IDE, PCI_ANY_ID, PCI_ANY_ID, 0, 0, 1}, | ||
320 | { 0, }, | 321 | { 0, }, |
321 | }; | 322 | }; |
322 | MODULE_DEVICE_TABLE(pci, atiixp_pci_tbl); | 323 | MODULE_DEVICE_TABLE(pci, atiixp_pci_tbl); |
diff --git a/drivers/ide/pci/serverworks.c b/drivers/ide/pci/serverworks.c index 6234f806c6b5..47bcd91c9b5f 100644 --- a/drivers/ide/pci/serverworks.c +++ b/drivers/ide/pci/serverworks.c | |||
@@ -158,6 +158,12 @@ static int svwks_tune_chipset (ide_drive_t *drive, u8 xferspeed) | |||
158 | pci_read_config_word(dev, 0x4A, &csb5_pio); | 158 | pci_read_config_word(dev, 0x4A, &csb5_pio); |
159 | pci_read_config_byte(dev, 0x54, &ultra_enable); | 159 | pci_read_config_byte(dev, 0x54, &ultra_enable); |
160 | 160 | ||
161 | /* If we are in RAID mode (eg AMI MegaIDE) then we can't it | ||
162 | turns out trust the firmware configuration */ | ||
163 | |||
164 | if ((dev->class >> 8) != PCI_CLASS_STORAGE_IDE) | ||
165 | goto oem_setup_failed; | ||
166 | |||
161 | /* Per Specified Design by OEM, and ASIC Architect */ | 167 | /* Per Specified Design by OEM, and ASIC Architect */ |
162 | if ((dev->device == PCI_DEVICE_ID_SERVERWORKS_CSB6IDE) || | 168 | if ((dev->device == PCI_DEVICE_ID_SERVERWORKS_CSB6IDE) || |
163 | (dev->device == PCI_DEVICE_ID_SERVERWORKS_CSB6IDE2)) { | 169 | (dev->device == PCI_DEVICE_ID_SERVERWORKS_CSB6IDE2)) { |
@@ -173,7 +179,7 @@ dma_pio: | |||
173 | ((dma_stat&(1<<(5+unit)))==(1<<(5+unit)))) { | 179 | ((dma_stat&(1<<(5+unit)))==(1<<(5+unit)))) { |
174 | u8 dmaspeed = dma_timing; | 180 | u8 dmaspeed = dma_timing; |
175 | 181 | ||
176 | dma_timing &= ~0xFF; | 182 | dma_timing &= ~0xFFU; |
177 | if ((dmaspeed & 0x20) == 0x20) | 183 | if ((dmaspeed & 0x20) == 0x20) |
178 | dmaspeed = XFER_MW_DMA_2; | 184 | dmaspeed = XFER_MW_DMA_2; |
179 | else if ((dmaspeed & 0x21) == 0x21) | 185 | else if ((dmaspeed & 0x21) == 0x21) |
@@ -187,7 +193,7 @@ dma_pio: | |||
187 | } else if (pio_timing) { | 193 | } else if (pio_timing) { |
188 | u8 piospeed = pio_timing; | 194 | u8 piospeed = pio_timing; |
189 | 195 | ||
190 | pio_timing &= ~0xFF; | 196 | pio_timing &= ~0xFFU; |
191 | if ((piospeed & 0x20) == 0x20) | 197 | if ((piospeed & 0x20) == 0x20) |
192 | piospeed = XFER_PIO_4; | 198 | piospeed = XFER_PIO_4; |
193 | else if ((piospeed & 0x22) == 0x22) | 199 | else if ((piospeed & 0x22) == 0x22) |
@@ -208,8 +214,8 @@ dma_pio: | |||
208 | 214 | ||
209 | oem_setup_failed: | 215 | oem_setup_failed: |
210 | 216 | ||
211 | pio_timing &= ~0xFF; | 217 | pio_timing &= ~0xFFU; |
212 | dma_timing &= ~0xFF; | 218 | dma_timing &= ~0xFFU; |
213 | ultra_timing &= ~(0x0F << (4*unit)); | 219 | ultra_timing &= ~(0x0F << (4*unit)); |
214 | ultra_enable &= ~(0x01 << drive->dn); | 220 | ultra_enable &= ~(0x01 << drive->dn); |
215 | csb5_pio &= ~(0x0F << (4*drive->dn)); | 221 | csb5_pio &= ~(0x0F << (4*drive->dn)); |
diff --git a/drivers/infiniband/hw/ehca/hcp_if.c b/drivers/infiniband/hw/ehca/hcp_if.c index 7f0beec74f70..5766ae3a2029 100644 --- a/drivers/infiniband/hw/ehca/hcp_if.c +++ b/drivers/infiniband/hw/ehca/hcp_if.c | |||
@@ -331,7 +331,7 @@ u64 hipz_h_alloc_resource_qp(const struct ipz_adapter_handle adapter_handle, | |||
331 | 0); | 331 | 0); |
332 | qp->ipz_qp_handle.handle = outs[0]; | 332 | qp->ipz_qp_handle.handle = outs[0]; |
333 | qp->real_qp_num = (u32)outs[1]; | 333 | qp->real_qp_num = (u32)outs[1]; |
334 | parms->act_nr_send_sges = | 334 | parms->act_nr_send_wqes = |
335 | (u16)EHCA_BMASK_GET(H_ALL_RES_QP_ACT_OUTST_SEND_WR, outs[2]); | 335 | (u16)EHCA_BMASK_GET(H_ALL_RES_QP_ACT_OUTST_SEND_WR, outs[2]); |
336 | parms->act_nr_recv_wqes = | 336 | parms->act_nr_recv_wqes = |
337 | (u16)EHCA_BMASK_GET(H_ALL_RES_QP_ACT_OUTST_RECV_WR, outs[2]); | 337 | (u16)EHCA_BMASK_GET(H_ALL_RES_QP_ACT_OUTST_RECV_WR, outs[2]); |
diff --git a/drivers/infiniband/hw/mlx4/qp.c b/drivers/infiniband/hw/mlx4/qp.c index a824bc5f79fd..dc137dec2308 100644 --- a/drivers/infiniband/hw/mlx4/qp.c +++ b/drivers/infiniband/hw/mlx4/qp.c | |||
@@ -270,9 +270,7 @@ static int create_qp_common(struct mlx4_ib_dev *dev, struct ib_pd *pd, | |||
270 | struct ib_qp_init_attr *init_attr, | 270 | struct ib_qp_init_attr *init_attr, |
271 | struct ib_udata *udata, int sqpn, struct mlx4_ib_qp *qp) | 271 | struct ib_udata *udata, int sqpn, struct mlx4_ib_qp *qp) |
272 | { | 272 | { |
273 | struct mlx4_wqe_ctrl_seg *ctrl; | ||
274 | int err; | 273 | int err; |
275 | int i; | ||
276 | 274 | ||
277 | mutex_init(&qp->mutex); | 275 | mutex_init(&qp->mutex); |
278 | spin_lock_init(&qp->sq.lock); | 276 | spin_lock_init(&qp->sq.lock); |
@@ -319,20 +317,24 @@ static int create_qp_common(struct mlx4_ib_dev *dev, struct ib_pd *pd, | |||
319 | if (err) | 317 | if (err) |
320 | goto err_mtt; | 318 | goto err_mtt; |
321 | 319 | ||
322 | err = mlx4_ib_db_map_user(to_mucontext(pd->uobject->context), | 320 | if (!init_attr->srq) { |
323 | ucmd.db_addr, &qp->db); | 321 | err = mlx4_ib_db_map_user(to_mucontext(pd->uobject->context), |
324 | if (err) | 322 | ucmd.db_addr, &qp->db); |
325 | goto err_mtt; | 323 | if (err) |
324 | goto err_mtt; | ||
325 | } | ||
326 | } else { | 326 | } else { |
327 | err = set_kernel_sq_size(dev, &init_attr->cap, init_attr->qp_type, qp); | 327 | err = set_kernel_sq_size(dev, &init_attr->cap, init_attr->qp_type, qp); |
328 | if (err) | 328 | if (err) |
329 | goto err; | 329 | goto err; |
330 | 330 | ||
331 | err = mlx4_ib_db_alloc(dev, &qp->db, 0); | 331 | if (!init_attr->srq) { |
332 | if (err) | 332 | err = mlx4_ib_db_alloc(dev, &qp->db, 0); |
333 | goto err; | 333 | if (err) |
334 | goto err; | ||
334 | 335 | ||
335 | *qp->db.db = 0; | 336 | *qp->db.db = 0; |
337 | } | ||
336 | 338 | ||
337 | if (mlx4_buf_alloc(dev->dev, qp->buf_size, PAGE_SIZE * 2, &qp->buf)) { | 339 | if (mlx4_buf_alloc(dev->dev, qp->buf_size, PAGE_SIZE * 2, &qp->buf)) { |
338 | err = -ENOMEM; | 340 | err = -ENOMEM; |
@@ -348,11 +350,6 @@ static int create_qp_common(struct mlx4_ib_dev *dev, struct ib_pd *pd, | |||
348 | if (err) | 350 | if (err) |
349 | goto err_mtt; | 351 | goto err_mtt; |
350 | 352 | ||
351 | for (i = 0; i < qp->sq.max; ++i) { | ||
352 | ctrl = get_send_wqe(qp, i); | ||
353 | ctrl->owner_opcode = cpu_to_be32(1 << 31); | ||
354 | } | ||
355 | |||
356 | qp->sq.wrid = kmalloc(qp->sq.max * sizeof (u64), GFP_KERNEL); | 353 | qp->sq.wrid = kmalloc(qp->sq.max * sizeof (u64), GFP_KERNEL); |
357 | qp->rq.wrid = kmalloc(qp->rq.max * sizeof (u64), GFP_KERNEL); | 354 | qp->rq.wrid = kmalloc(qp->rq.max * sizeof (u64), GFP_KERNEL); |
358 | 355 | ||
@@ -386,7 +383,7 @@ static int create_qp_common(struct mlx4_ib_dev *dev, struct ib_pd *pd, | |||
386 | return 0; | 383 | return 0; |
387 | 384 | ||
388 | err_wrid: | 385 | err_wrid: |
389 | if (pd->uobject) | 386 | if (pd->uobject && !init_attr->srq) |
390 | mlx4_ib_db_unmap_user(to_mucontext(pd->uobject->context), &qp->db); | 387 | mlx4_ib_db_unmap_user(to_mucontext(pd->uobject->context), &qp->db); |
391 | else { | 388 | else { |
392 | kfree(qp->sq.wrid); | 389 | kfree(qp->sq.wrid); |
@@ -403,7 +400,7 @@ err_buf: | |||
403 | mlx4_buf_free(dev->dev, qp->buf_size, &qp->buf); | 400 | mlx4_buf_free(dev->dev, qp->buf_size, &qp->buf); |
404 | 401 | ||
405 | err_db: | 402 | err_db: |
406 | if (!pd->uobject) | 403 | if (!pd->uobject && !init_attr->srq) |
407 | mlx4_ib_db_free(dev, &qp->db); | 404 | mlx4_ib_db_free(dev, &qp->db); |
408 | 405 | ||
409 | err: | 406 | err: |
@@ -481,14 +478,16 @@ static void destroy_qp_common(struct mlx4_ib_dev *dev, struct mlx4_ib_qp *qp, | |||
481 | mlx4_mtt_cleanup(dev->dev, &qp->mtt); | 478 | mlx4_mtt_cleanup(dev->dev, &qp->mtt); |
482 | 479 | ||
483 | if (is_user) { | 480 | if (is_user) { |
484 | mlx4_ib_db_unmap_user(to_mucontext(qp->ibqp.uobject->context), | 481 | if (!qp->ibqp.srq) |
485 | &qp->db); | 482 | mlx4_ib_db_unmap_user(to_mucontext(qp->ibqp.uobject->context), |
483 | &qp->db); | ||
486 | ib_umem_release(qp->umem); | 484 | ib_umem_release(qp->umem); |
487 | } else { | 485 | } else { |
488 | kfree(qp->sq.wrid); | 486 | kfree(qp->sq.wrid); |
489 | kfree(qp->rq.wrid); | 487 | kfree(qp->rq.wrid); |
490 | mlx4_buf_free(dev->dev, qp->buf_size, &qp->buf); | 488 | mlx4_buf_free(dev->dev, qp->buf_size, &qp->buf); |
491 | mlx4_ib_db_free(dev, &qp->db); | 489 | if (!qp->ibqp.srq) |
490 | mlx4_ib_db_free(dev, &qp->db); | ||
492 | } | 491 | } |
493 | } | 492 | } |
494 | 493 | ||
@@ -852,7 +851,7 @@ static int __mlx4_ib_modify_qp(struct ib_qp *ibqp, | |||
852 | if (ibqp->srq) | 851 | if (ibqp->srq) |
853 | context->srqn = cpu_to_be32(1 << 24 | to_msrq(ibqp->srq)->msrq.srqn); | 852 | context->srqn = cpu_to_be32(1 << 24 | to_msrq(ibqp->srq)->msrq.srqn); |
854 | 853 | ||
855 | if (cur_state == IB_QPS_RESET && new_state == IB_QPS_INIT) | 854 | if (!ibqp->srq && cur_state == IB_QPS_RESET && new_state == IB_QPS_INIT) |
856 | context->db_rec_addr = cpu_to_be64(qp->db.dma); | 855 | context->db_rec_addr = cpu_to_be64(qp->db.dma); |
857 | 856 | ||
858 | if (cur_state == IB_QPS_INIT && | 857 | if (cur_state == IB_QPS_INIT && |
@@ -872,6 +871,21 @@ static int __mlx4_ib_modify_qp(struct ib_qp *ibqp, | |||
872 | else | 871 | else |
873 | sqd_event = 0; | 872 | sqd_event = 0; |
874 | 873 | ||
874 | /* | ||
875 | * Before passing a kernel QP to the HW, make sure that the | ||
876 | * ownership bits of the send queue are set so that the | ||
877 | * hardware doesn't start processing stale work requests. | ||
878 | */ | ||
879 | if (!ibqp->uobject && cur_state == IB_QPS_RESET && new_state == IB_QPS_INIT) { | ||
880 | struct mlx4_wqe_ctrl_seg *ctrl; | ||
881 | int i; | ||
882 | |||
883 | for (i = 0; i < qp->sq.max; ++i) { | ||
884 | ctrl = get_send_wqe(qp, i); | ||
885 | ctrl->owner_opcode = cpu_to_be32(1 << 31); | ||
886 | } | ||
887 | } | ||
888 | |||
875 | err = mlx4_qp_modify(dev->dev, &qp->mtt, to_mlx4_state(cur_state), | 889 | err = mlx4_qp_modify(dev->dev, &qp->mtt, to_mlx4_state(cur_state), |
876 | to_mlx4_state(new_state), context, optpar, | 890 | to_mlx4_state(new_state), context, optpar, |
877 | sqd_event, &qp->mqp); | 891 | sqd_event, &qp->mqp); |
@@ -919,7 +933,8 @@ static int __mlx4_ib_modify_qp(struct ib_qp *ibqp, | |||
919 | qp->rq.tail = 0; | 933 | qp->rq.tail = 0; |
920 | qp->sq.head = 0; | 934 | qp->sq.head = 0; |
921 | qp->sq.tail = 0; | 935 | qp->sq.tail = 0; |
922 | *qp->db.db = 0; | 936 | if (!ibqp->srq) |
937 | *qp->db.db = 0; | ||
923 | } | 938 | } |
924 | 939 | ||
925 | out: | 940 | out: |
diff --git a/drivers/infiniband/ulp/ipoib/ipoib.h b/drivers/infiniband/ulp/ipoib/ipoib.h index a0b3782c7625..158759e28a5b 100644 --- a/drivers/infiniband/ulp/ipoib/ipoib.h +++ b/drivers/infiniband/ulp/ipoib/ipoib.h | |||
@@ -429,6 +429,7 @@ int ipoib_vlan_delete(struct net_device *pdev, unsigned short pkey); | |||
429 | 429 | ||
430 | void ipoib_pkey_poll(struct work_struct *work); | 430 | void ipoib_pkey_poll(struct work_struct *work); |
431 | int ipoib_pkey_dev_delay_open(struct net_device *dev); | 431 | int ipoib_pkey_dev_delay_open(struct net_device *dev); |
432 | void ipoib_drain_cq(struct net_device *dev); | ||
432 | 433 | ||
433 | #ifdef CONFIG_INFINIBAND_IPOIB_CM | 434 | #ifdef CONFIG_INFINIBAND_IPOIB_CM |
434 | 435 | ||
diff --git a/drivers/infiniband/ulp/ipoib/ipoib_cm.c b/drivers/infiniband/ulp/ipoib/ipoib_cm.c index ffec794b7913..f133b56fd978 100644 --- a/drivers/infiniband/ulp/ipoib/ipoib_cm.c +++ b/drivers/infiniband/ulp/ipoib/ipoib_cm.c | |||
@@ -713,7 +713,7 @@ void ipoib_cm_dev_stop(struct net_device *dev) | |||
713 | while (!list_empty(&priv->cm.rx_error_list) || | 713 | while (!list_empty(&priv->cm.rx_error_list) || |
714 | !list_empty(&priv->cm.rx_flush_list) || | 714 | !list_empty(&priv->cm.rx_flush_list) || |
715 | !list_empty(&priv->cm.rx_drain_list)) { | 715 | !list_empty(&priv->cm.rx_drain_list)) { |
716 | if (!time_after(jiffies, begin + 5 * HZ)) { | 716 | if (time_after(jiffies, begin + 5 * HZ)) { |
717 | ipoib_warn(priv, "RX drain timing out\n"); | 717 | ipoib_warn(priv, "RX drain timing out\n"); |
718 | 718 | ||
719 | /* | 719 | /* |
@@ -726,6 +726,7 @@ void ipoib_cm_dev_stop(struct net_device *dev) | |||
726 | } | 726 | } |
727 | spin_unlock_irq(&priv->lock); | 727 | spin_unlock_irq(&priv->lock); |
728 | msleep(1); | 728 | msleep(1); |
729 | ipoib_drain_cq(dev); | ||
729 | spin_lock_irq(&priv->lock); | 730 | spin_lock_irq(&priv->lock); |
730 | } | 731 | } |
731 | 732 | ||
diff --git a/drivers/infiniband/ulp/ipoib/ipoib_ib.c b/drivers/infiniband/ulp/ipoib/ipoib_ib.c index c1aad06eb4e9..8404f05b2b6e 100644 --- a/drivers/infiniband/ulp/ipoib/ipoib_ib.c +++ b/drivers/infiniband/ulp/ipoib/ipoib_ib.c | |||
@@ -550,13 +550,30 @@ static int recvs_pending(struct net_device *dev) | |||
550 | return pending; | 550 | return pending; |
551 | } | 551 | } |
552 | 552 | ||
553 | void ipoib_drain_cq(struct net_device *dev) | ||
554 | { | ||
555 | struct ipoib_dev_priv *priv = netdev_priv(dev); | ||
556 | int i, n; | ||
557 | do { | ||
558 | n = ib_poll_cq(priv->cq, IPOIB_NUM_WC, priv->ibwc); | ||
559 | for (i = 0; i < n; ++i) { | ||
560 | if (priv->ibwc[i].wr_id & IPOIB_CM_OP_SRQ) | ||
561 | ipoib_cm_handle_rx_wc(dev, priv->ibwc + i); | ||
562 | else if (priv->ibwc[i].wr_id & IPOIB_OP_RECV) | ||
563 | ipoib_ib_handle_rx_wc(dev, priv->ibwc + i); | ||
564 | else | ||
565 | ipoib_ib_handle_tx_wc(dev, priv->ibwc + i); | ||
566 | } | ||
567 | } while (n == IPOIB_NUM_WC); | ||
568 | } | ||
569 | |||
553 | int ipoib_ib_dev_stop(struct net_device *dev, int flush) | 570 | int ipoib_ib_dev_stop(struct net_device *dev, int flush) |
554 | { | 571 | { |
555 | struct ipoib_dev_priv *priv = netdev_priv(dev); | 572 | struct ipoib_dev_priv *priv = netdev_priv(dev); |
556 | struct ib_qp_attr qp_attr; | 573 | struct ib_qp_attr qp_attr; |
557 | unsigned long begin; | 574 | unsigned long begin; |
558 | struct ipoib_tx_buf *tx_req; | 575 | struct ipoib_tx_buf *tx_req; |
559 | int i, n; | 576 | int i; |
560 | 577 | ||
561 | clear_bit(IPOIB_FLAG_INITIALIZED, &priv->flags); | 578 | clear_bit(IPOIB_FLAG_INITIALIZED, &priv->flags); |
562 | netif_poll_disable(dev); | 579 | netif_poll_disable(dev); |
@@ -611,17 +628,7 @@ int ipoib_ib_dev_stop(struct net_device *dev, int flush) | |||
611 | goto timeout; | 628 | goto timeout; |
612 | } | 629 | } |
613 | 630 | ||
614 | do { | 631 | ipoib_drain_cq(dev); |
615 | n = ib_poll_cq(priv->cq, IPOIB_NUM_WC, priv->ibwc); | ||
616 | for (i = 0; i < n; ++i) { | ||
617 | if (priv->ibwc[i].wr_id & IPOIB_CM_OP_SRQ) | ||
618 | ipoib_cm_handle_rx_wc(dev, priv->ibwc + i); | ||
619 | else if (priv->ibwc[i].wr_id & IPOIB_OP_RECV) | ||
620 | ipoib_ib_handle_rx_wc(dev, priv->ibwc + i); | ||
621 | else | ||
622 | ipoib_ib_handle_tx_wc(dev, priv->ibwc + i); | ||
623 | } | ||
624 | } while (n == IPOIB_NUM_WC); | ||
625 | 632 | ||
626 | msleep(1); | 633 | msleep(1); |
627 | } | 634 | } |
diff --git a/drivers/input/joystick/iforce/iforce-main.c b/drivers/input/joystick/iforce/iforce-main.c index fb129c479a66..682244b1c042 100644 --- a/drivers/input/joystick/iforce/iforce-main.c +++ b/drivers/input/joystick/iforce/iforce-main.c | |||
@@ -370,10 +370,8 @@ int iforce_init_device(struct iforce *iforce) | |||
370 | 370 | ||
371 | /* | 371 | /* |
372 | * Disable spring, enable force feedback. | 372 | * Disable spring, enable force feedback. |
373 | * FIXME: We should use iforce_set_autocenter() et al here. | ||
374 | */ | 373 | */ |
375 | 374 | iforce_set_autocenter(input_dev, 0); | |
376 | iforce_send_packet(iforce, FF_CMD_AUTOCENTER, "\004\000"); | ||
377 | 375 | ||
378 | /* | 376 | /* |
379 | * Find appropriate device entry | 377 | * Find appropriate device entry |
diff --git a/drivers/input/joystick/iforce/iforce-packets.c b/drivers/input/joystick/iforce/iforce-packets.c index 21c4e13d3a50..3154ccd74000 100644 --- a/drivers/input/joystick/iforce/iforce-packets.c +++ b/drivers/input/joystick/iforce/iforce-packets.c | |||
@@ -246,6 +246,8 @@ void iforce_process_packet(struct iforce *iforce, u16 cmd, unsigned char *data) | |||
246 | 246 | ||
247 | int iforce_get_id_packet(struct iforce *iforce, char *packet) | 247 | int iforce_get_id_packet(struct iforce *iforce, char *packet) |
248 | { | 248 | { |
249 | int status; | ||
250 | |||
249 | switch (iforce->bus) { | 251 | switch (iforce->bus) { |
250 | 252 | ||
251 | case IFORCE_USB: | 253 | case IFORCE_USB: |
@@ -254,18 +256,22 @@ int iforce_get_id_packet(struct iforce *iforce, char *packet) | |||
254 | iforce->cr.bRequest = packet[0]; | 256 | iforce->cr.bRequest = packet[0]; |
255 | iforce->ctrl->dev = iforce->usbdev; | 257 | iforce->ctrl->dev = iforce->usbdev; |
256 | 258 | ||
257 | if (usb_submit_urb(iforce->ctrl, GFP_ATOMIC)) | 259 | status = usb_submit_urb(iforce->ctrl, GFP_ATOMIC); |
260 | if (status) { | ||
261 | err("usb_submit_urb failed %d", status); | ||
258 | return -1; | 262 | return -1; |
263 | } | ||
259 | 264 | ||
260 | wait_event_interruptible_timeout(iforce->wait, | 265 | wait_event_interruptible_timeout(iforce->wait, |
261 | iforce->ctrl->status != -EINPROGRESS, HZ); | 266 | iforce->ctrl->status != -EINPROGRESS, HZ); |
262 | 267 | ||
263 | if (iforce->ctrl->status) { | 268 | if (iforce->ctrl->status) { |
269 | dbg("iforce->ctrl->status = %d", iforce->ctrl->status); | ||
264 | usb_unlink_urb(iforce->ctrl); | 270 | usb_unlink_urb(iforce->ctrl); |
265 | return -1; | 271 | return -1; |
266 | } | 272 | } |
267 | #else | 273 | #else |
268 | err("iforce_get_id_packet: iforce->bus = USB!"); | 274 | dbg("iforce_get_id_packet: iforce->bus = USB!"); |
269 | #endif | 275 | #endif |
270 | break; | 276 | break; |
271 | 277 | ||
diff --git a/drivers/input/joystick/iforce/iforce-usb.c b/drivers/input/joystick/iforce/iforce-usb.c index 750099d8e3c6..1457b73850e7 100644 --- a/drivers/input/joystick/iforce/iforce-usb.c +++ b/drivers/input/joystick/iforce/iforce-usb.c | |||
@@ -65,6 +65,7 @@ void iforce_usb_xmit(struct iforce *iforce) | |||
65 | XMIT_INC(iforce->xmit.tail, n); | 65 | XMIT_INC(iforce->xmit.tail, n); |
66 | 66 | ||
67 | if ( (n=usb_submit_urb(iforce->out, GFP_ATOMIC)) ) { | 67 | if ( (n=usb_submit_urb(iforce->out, GFP_ATOMIC)) ) { |
68 | clear_bit(IFORCE_XMIT_RUNNING, iforce->xmit_flags); | ||
68 | warn("usb_submit_urb failed %d\n", n); | 69 | warn("usb_submit_urb failed %d\n", n); |
69 | } | 70 | } |
70 | 71 | ||
@@ -163,8 +164,8 @@ static int iforce_usb_probe(struct usb_interface *intf, | |||
163 | usb_fill_int_urb(iforce->irq, dev, usb_rcvintpipe(dev, epirq->bEndpointAddress), | 164 | usb_fill_int_urb(iforce->irq, dev, usb_rcvintpipe(dev, epirq->bEndpointAddress), |
164 | iforce->data, 16, iforce_usb_irq, iforce, epirq->bInterval); | 165 | iforce->data, 16, iforce_usb_irq, iforce, epirq->bInterval); |
165 | 166 | ||
166 | usb_fill_bulk_urb(iforce->out, dev, usb_sndbulkpipe(dev, epout->bEndpointAddress), | 167 | usb_fill_int_urb(iforce->out, dev, usb_sndintpipe(dev, epout->bEndpointAddress), |
167 | iforce + 1, 32, iforce_usb_out, iforce); | 168 | iforce + 1, 32, iforce_usb_out, iforce, epout->bInterval); |
168 | 169 | ||
169 | usb_fill_control_urb(iforce->ctrl, dev, usb_rcvctrlpipe(dev, 0), | 170 | usb_fill_control_urb(iforce->ctrl, dev, usb_rcvctrlpipe(dev, 0), |
170 | (void*) &iforce->cr, iforce->edata, 16, iforce_usb_ctrl, iforce); | 171 | (void*) &iforce->cr, iforce->edata, 16, iforce_usb_ctrl, iforce); |
diff --git a/drivers/input/misc/input-polldev.c b/drivers/input/misc/input-polldev.c index 1b2b9c9c5d88..b773d4c756a6 100644 --- a/drivers/input/misc/input-polldev.c +++ b/drivers/input/misc/input-polldev.c | |||
@@ -12,6 +12,11 @@ | |||
12 | #include <linux/mutex.h> | 12 | #include <linux/mutex.h> |
13 | #include <linux/input-polldev.h> | 13 | #include <linux/input-polldev.h> |
14 | 14 | ||
15 | MODULE_AUTHOR("Dmitry Torokhov <dtor@mail.ru>"); | ||
16 | MODULE_DESCRIPTION("Generic implementation of a polled input device"); | ||
17 | MODULE_LICENSE("GPL v2"); | ||
18 | MODULE_VERSION("0.1"); | ||
19 | |||
15 | static DEFINE_MUTEX(polldev_mutex); | 20 | static DEFINE_MUTEX(polldev_mutex); |
16 | static int polldev_users; | 21 | static int polldev_users; |
17 | static struct workqueue_struct *polldev_wq; | 22 | static struct workqueue_struct *polldev_wq; |
diff --git a/drivers/input/mouse/alps.c b/drivers/input/mouse/alps.c index cf3e4664e72b..2c5f11a4f6b4 100644 --- a/drivers/input/mouse/alps.c +++ b/drivers/input/mouse/alps.c | |||
@@ -251,11 +251,15 @@ static const struct alps_model_info *alps_get_model(struct psmouse *psmouse, int | |||
251 | 251 | ||
252 | dbg("E7 report: %2.2x %2.2x %2.2x", param[0], param[1], param[2]); | 252 | dbg("E7 report: %2.2x %2.2x %2.2x", param[0], param[1], param[2]); |
253 | 253 | ||
254 | for (i = 0; i < ARRAY_SIZE(rates) && param[2] != rates[i]; i++); | 254 | if (version) { |
255 | *version = (param[0] << 8) | (param[1] << 4) | i; | 255 | for (i = 0; i < ARRAY_SIZE(rates) && param[2] != rates[i]; i++) |
256 | /* empty */; | ||
257 | *version = (param[0] << 8) | (param[1] << 4) | i; | ||
258 | } | ||
256 | 259 | ||
257 | for (i = 0; i < ARRAY_SIZE(alps_model_data); i++) | 260 | for (i = 0; i < ARRAY_SIZE(alps_model_data); i++) |
258 | if (!memcmp(param, alps_model_data[i].signature, sizeof(alps_model_data[i].signature))) | 261 | if (!memcmp(param, alps_model_data[i].signature, |
262 | sizeof(alps_model_data[i].signature))) | ||
259 | return alps_model_data + i; | 263 | return alps_model_data + i; |
260 | 264 | ||
261 | return NULL; | 265 | return NULL; |
@@ -380,32 +384,46 @@ static int alps_poll(struct psmouse *psmouse) | |||
380 | return 0; | 384 | return 0; |
381 | } | 385 | } |
382 | 386 | ||
383 | static int alps_reconnect(struct psmouse *psmouse) | 387 | static int alps_hw_init(struct psmouse *psmouse, int *version) |
384 | { | 388 | { |
385 | struct alps_data *priv = psmouse->private; | 389 | struct alps_data *priv = psmouse->private; |
386 | int version; | ||
387 | |||
388 | psmouse_reset(psmouse); | ||
389 | 390 | ||
390 | if (!(priv->i = alps_get_model(psmouse, &version))) | 391 | priv->i = alps_get_model(psmouse, version); |
392 | if (!priv->i) | ||
391 | return -1; | 393 | return -1; |
392 | 394 | ||
393 | if ((priv->i->flags & ALPS_PASS) && alps_passthrough_mode(psmouse, 1)) | 395 | if ((priv->i->flags & ALPS_PASS) && alps_passthrough_mode(psmouse, 1)) |
394 | return -1; | 396 | return -1; |
395 | 397 | ||
396 | if (alps_tap_mode(psmouse, 1)) { | 398 | if (alps_tap_mode(psmouse, 1)) { |
397 | printk(KERN_WARNING "alps.c: Failed to reenable hardware tapping\n"); | 399 | printk(KERN_WARNING "alps.c: Failed to enable hardware tapping\n"); |
398 | return -1; | 400 | return -1; |
399 | } | 401 | } |
400 | 402 | ||
401 | if (alps_absolute_mode(psmouse)) { | 403 | if (alps_absolute_mode(psmouse)) { |
402 | printk(KERN_ERR "alps.c: Failed to reenable absolute mode\n"); | 404 | printk(KERN_ERR "alps.c: Failed to enable absolute mode\n"); |
403 | return -1; | 405 | return -1; |
404 | } | 406 | } |
405 | 407 | ||
406 | if ((priv->i->flags & ALPS_PASS) && alps_passthrough_mode(psmouse, 0)) | 408 | if ((priv->i->flags & ALPS_PASS) && alps_passthrough_mode(psmouse, 0)) |
407 | return -1; | 409 | return -1; |
408 | 410 | ||
411 | /* ALPS needs stream mode, otherwise it won't report any data */ | ||
412 | if (ps2_command(&psmouse->ps2dev, NULL, PSMOUSE_CMD_SETSTREAM)) { | ||
413 | printk(KERN_ERR "alps.c: Failed to enable stream mode\n"); | ||
414 | return -1; | ||
415 | } | ||
416 | |||
417 | return 0; | ||
418 | } | ||
419 | |||
420 | static int alps_reconnect(struct psmouse *psmouse) | ||
421 | { | ||
422 | psmouse_reset(psmouse); | ||
423 | |||
424 | if (alps_hw_init(psmouse, NULL)) | ||
425 | return -1; | ||
426 | |||
409 | return 0; | 427 | return 0; |
410 | } | 428 | } |
411 | 429 | ||
@@ -430,23 +448,9 @@ int alps_init(struct psmouse *psmouse) | |||
430 | goto init_fail; | 448 | goto init_fail; |
431 | 449 | ||
432 | priv->dev2 = dev2; | 450 | priv->dev2 = dev2; |
451 | psmouse->private = priv; | ||
433 | 452 | ||
434 | priv->i = alps_get_model(psmouse, &version); | 453 | if (alps_hw_init(psmouse, &version)) |
435 | if (!priv->i) | ||
436 | goto init_fail; | ||
437 | |||
438 | if ((priv->i->flags & ALPS_PASS) && alps_passthrough_mode(psmouse, 1)) | ||
439 | goto init_fail; | ||
440 | |||
441 | if (alps_tap_mode(psmouse, 1)) | ||
442 | printk(KERN_WARNING "alps.c: Failed to enable hardware tapping\n"); | ||
443 | |||
444 | if (alps_absolute_mode(psmouse)) { | ||
445 | printk(KERN_ERR "alps.c: Failed to enable absolute mode\n"); | ||
446 | goto init_fail; | ||
447 | } | ||
448 | |||
449 | if ((priv->i->flags & ALPS_PASS) && alps_passthrough_mode(psmouse, 0)) | ||
450 | goto init_fail; | 454 | goto init_fail; |
451 | 455 | ||
452 | dev1->evbit[LONG(EV_KEY)] |= BIT(EV_KEY); | 456 | dev1->evbit[LONG(EV_KEY)] |= BIT(EV_KEY); |
@@ -493,13 +497,13 @@ int alps_init(struct psmouse *psmouse) | |||
493 | /* We are having trouble resyncing ALPS touchpads so disable it for now */ | 497 | /* We are having trouble resyncing ALPS touchpads so disable it for now */ |
494 | psmouse->resync_time = 0; | 498 | psmouse->resync_time = 0; |
495 | 499 | ||
496 | psmouse->private = priv; | ||
497 | return 0; | 500 | return 0; |
498 | 501 | ||
499 | init_fail: | 502 | init_fail: |
500 | psmouse_reset(psmouse); | 503 | psmouse_reset(psmouse); |
501 | input_free_device(dev2); | 504 | input_free_device(dev2); |
502 | kfree(priv); | 505 | kfree(priv); |
506 | psmouse->private = NULL; | ||
503 | return -1; | 507 | return -1; |
504 | } | 508 | } |
505 | 509 | ||
diff --git a/drivers/input/mouse/logips2pp.c b/drivers/input/mouse/logips2pp.c index 9df74b72e6c4..0c5660d28caa 100644 --- a/drivers/input/mouse/logips2pp.c +++ b/drivers/input/mouse/logips2pp.c | |||
@@ -221,6 +221,7 @@ static const struct ps2pp_info *get_model_info(unsigned char model) | |||
221 | { 66, PS2PP_KIND_MX, /* MX3100 reciver */ | 221 | { 66, PS2PP_KIND_MX, /* MX3100 reciver */ |
222 | PS2PP_WHEEL | PS2PP_SIDE_BTN | PS2PP_TASK_BTN | | 222 | PS2PP_WHEEL | PS2PP_SIDE_BTN | PS2PP_TASK_BTN | |
223 | PS2PP_EXTRA_BTN | PS2PP_NAV_BTN | PS2PP_HWHEEL }, | 223 | PS2PP_EXTRA_BTN | PS2PP_NAV_BTN | PS2PP_HWHEEL }, |
224 | { 72, PS2PP_KIND_TRACKMAN, 0 }, /* T-CH11: TrackMan Marble */ | ||
224 | { 73, 0, PS2PP_SIDE_BTN }, | 225 | { 73, 0, PS2PP_SIDE_BTN }, |
225 | { 75, PS2PP_KIND_WHEEL, PS2PP_WHEEL }, | 226 | { 75, PS2PP_KIND_WHEEL, PS2PP_WHEEL }, |
226 | { 76, PS2PP_KIND_WHEEL, PS2PP_WHEEL }, | 227 | { 76, PS2PP_KIND_WHEEL, PS2PP_WHEEL }, |
diff --git a/drivers/input/touchscreen/Kconfig b/drivers/input/touchscreen/Kconfig index 4f091800bfeb..e5cca9bd0406 100644 --- a/drivers/input/touchscreen/Kconfig +++ b/drivers/input/touchscreen/Kconfig | |||
@@ -12,17 +12,17 @@ menuconfig INPUT_TOUCHSCREEN | |||
12 | if INPUT_TOUCHSCREEN | 12 | if INPUT_TOUCHSCREEN |
13 | 13 | ||
14 | config TOUCHSCREEN_ADS7846 | 14 | config TOUCHSCREEN_ADS7846 |
15 | tristate "ADS 7846/7843 based touchscreens" | 15 | tristate "ADS7846/TSC2046 and ADS7843 based touchscreens" |
16 | depends on SPI_MASTER | 16 | depends on SPI_MASTER |
17 | depends on HWMON = n || HWMON | 17 | depends on HWMON = n || HWMON |
18 | help | 18 | help |
19 | Say Y here if you have a touchscreen interface using the | 19 | Say Y here if you have a touchscreen interface using the |
20 | ADS7846 or ADS7843 controller, and your board-specific setup | 20 | ADS7846/TSC2046 or ADS7843 controller, and your board-specific |
21 | code includes that in its table of SPI devices. | 21 | setup code includes that in its table of SPI devices. |
22 | 22 | ||
23 | If HWMON is selected, and the driver is told the reference voltage | 23 | If HWMON is selected, and the driver is told the reference voltage |
24 | on your board, you will also get hwmon interfaces for the voltage | 24 | on your board, you will also get hwmon interfaces for the voltage |
25 | (and on ads7846, temperature) sensors of this chip. | 25 | (and on ads7846/tsc2046, temperature) sensors of this chip. |
26 | 26 | ||
27 | If unsure, say N (but it's safe to say "Y"). | 27 | If unsure, say N (but it's safe to say "Y"). |
28 | 28 | ||
diff --git a/drivers/input/touchscreen/ads7846.c b/drivers/input/touchscreen/ads7846.c index 693e3b2a65a3..1c9069cd3bae 100644 --- a/drivers/input/touchscreen/ads7846.c +++ b/drivers/input/touchscreen/ads7846.c | |||
@@ -39,6 +39,7 @@ | |||
39 | /* | 39 | /* |
40 | * This code has been heavily tested on a Nokia 770, and lightly | 40 | * This code has been heavily tested on a Nokia 770, and lightly |
41 | * tested on other ads7846 devices (OSK/Mistral, Lubbock). | 41 | * tested on other ads7846 devices (OSK/Mistral, Lubbock). |
42 | * TSC2046 is just newer ads7846 silicon. | ||
42 | * Support for ads7843 tested on Atmel at91sam926x-EK. | 43 | * Support for ads7843 tested on Atmel at91sam926x-EK. |
43 | * Support for ads7845 has only been stubbed in. | 44 | * Support for ads7845 has only been stubbed in. |
44 | * | 45 | * |
@@ -847,7 +848,7 @@ static int __devinit ads7846_probe(struct spi_device *spi) | |||
847 | * may not. So we stick to very-portable 8 bit words, both RX and TX. | 848 | * may not. So we stick to very-portable 8 bit words, both RX and TX. |
848 | */ | 849 | */ |
849 | spi->bits_per_word = 8; | 850 | spi->bits_per_word = 8; |
850 | spi->mode = SPI_MODE_1; | 851 | spi->mode = SPI_MODE_0; |
851 | err = spi_setup(spi); | 852 | err = spi_setup(spi); |
852 | if (err < 0) | 853 | if (err < 0) |
853 | return err; | 854 | return err; |
diff --git a/drivers/input/touchscreen/hp680_ts_input.c b/drivers/input/touchscreen/hp680_ts_input.c index 61c15024c2a0..1a15475aedfc 100644 --- a/drivers/input/touchscreen/hp680_ts_input.c +++ b/drivers/input/touchscreen/hp680_ts_input.c | |||
@@ -1,7 +1,6 @@ | |||
1 | #include <linux/input.h> | 1 | #include <linux/input.h> |
2 | #include <linux/module.h> | 2 | #include <linux/module.h> |
3 | #include <linux/init.h> | 3 | #include <linux/init.h> |
4 | |||
5 | #include <linux/interrupt.h> | 4 | #include <linux/interrupt.h> |
6 | #include <asm/io.h> | 5 | #include <asm/io.h> |
7 | #include <asm/delay.h> | 6 | #include <asm/delay.h> |
@@ -18,12 +17,12 @@ | |||
18 | #define PHDR 0xa400012e | 17 | #define PHDR 0xa400012e |
19 | #define SCPDR 0xa4000136 | 18 | #define SCPDR 0xa4000136 |
20 | 19 | ||
21 | static void do_softint(void *data); | 20 | static void do_softint(struct work_struct *work); |
22 | 21 | ||
23 | static struct input_dev *hp680_ts_dev; | 22 | static struct input_dev *hp680_ts_dev; |
24 | static DECLARE_WORK(work, do_softint); | 23 | static DECLARE_DELAYED_WORK(work, do_softint); |
25 | 24 | ||
26 | static void do_softint(void *data) | 25 | static void do_softint(struct work_struct *work) |
27 | { | 26 | { |
28 | int absx = 0, absy = 0; | 27 | int absx = 0, absy = 0; |
29 | u8 scpdr; | 28 | u8 scpdr; |
diff --git a/drivers/input/touchscreen/ucb1400_ts.c b/drivers/input/touchscreen/ucb1400_ts.c index 6582816a0477..f0cbcdb008ed 100644 --- a/drivers/input/touchscreen/ucb1400_ts.c +++ b/drivers/input/touchscreen/ucb1400_ts.c | |||
@@ -288,9 +288,9 @@ static int ucb1400_ts_thread(void *_ucb) | |||
288 | struct ucb1400 *ucb = _ucb; | 288 | struct ucb1400 *ucb = _ucb; |
289 | struct task_struct *tsk = current; | 289 | struct task_struct *tsk = current; |
290 | int valid = 0; | 290 | int valid = 0; |
291 | struct sched_param param = { .sched_priority = 1 }; | ||
291 | 292 | ||
292 | tsk->policy = SCHED_FIFO; | 293 | sched_setscheduler(tsk, SCHED_FIFO, ¶m); |
293 | tsk->rt_priority = 1; | ||
294 | 294 | ||
295 | while (!kthread_should_stop()) { | 295 | while (!kthread_should_stop()) { |
296 | unsigned int x, y, p; | 296 | unsigned int x, y, p; |
diff --git a/drivers/isdn/hardware/eicon/capifunc.c b/drivers/isdn/hardware/eicon/capifunc.c index ff284aeb8fbb..82edc1c1db7a 100644 --- a/drivers/isdn/hardware/eicon/capifunc.c +++ b/drivers/isdn/hardware/eicon/capifunc.c | |||
@@ -189,21 +189,21 @@ void *TransmitBufferSet(APPL * appl, dword ref) | |||
189 | { | 189 | { |
190 | appl->xbuffer_used[ref] = true; | 190 | appl->xbuffer_used[ref] = true; |
191 | DBG_PRV1(("%d:xbuf_used(%d)", appl->Id, ref + 1)) | 191 | DBG_PRV1(("%d:xbuf_used(%d)", appl->Id, ref + 1)) |
192 | return (void *) ref; | 192 | return (void *)(long)ref; |
193 | } | 193 | } |
194 | 194 | ||
195 | void *TransmitBufferGet(APPL * appl, void *p) | 195 | void *TransmitBufferGet(APPL * appl, void *p) |
196 | { | 196 | { |
197 | if (appl->xbuffer_internal[(dword) p]) | 197 | if (appl->xbuffer_internal[(dword)(long)p]) |
198 | return appl->xbuffer_internal[(dword) p]; | 198 | return appl->xbuffer_internal[(dword)(long)p]; |
199 | 199 | ||
200 | return appl->xbuffer_ptr[(dword) p]; | 200 | return appl->xbuffer_ptr[(dword)(long)p]; |
201 | } | 201 | } |
202 | 202 | ||
203 | void TransmitBufferFree(APPL * appl, void *p) | 203 | void TransmitBufferFree(APPL * appl, void *p) |
204 | { | 204 | { |
205 | appl->xbuffer_used[(dword) p] = false; | 205 | appl->xbuffer_used[(dword)(long)p] = false; |
206 | DBG_PRV1(("%d:xbuf_free(%d)", appl->Id, ((dword) p) + 1)) | 206 | DBG_PRV1(("%d:xbuf_free(%d)", appl->Id, ((dword)(long)p) + 1)) |
207 | } | 207 | } |
208 | 208 | ||
209 | void *ReceiveBufferGet(APPL * appl, int Num) | 209 | void *ReceiveBufferGet(APPL * appl, int Num) |
@@ -301,7 +301,7 @@ void sendf(APPL * appl, word command, dword Id, word Number, byte * format, ...) | |||
301 | /* if DATA_B3_IND, copy data too */ | 301 | /* if DATA_B3_IND, copy data too */ |
302 | if (command == _DATA_B3_I) { | 302 | if (command == _DATA_B3_I) { |
303 | dword data = GET_DWORD(&msg.info.data_b3_ind.Data); | 303 | dword data = GET_DWORD(&msg.info.data_b3_ind.Data); |
304 | memcpy(write + length, (void *) data, dlength); | 304 | memcpy(write + length, (void *)(long)data, dlength); |
305 | } | 305 | } |
306 | 306 | ||
307 | #ifndef DIVA_NO_DEBUGLIB | 307 | #ifndef DIVA_NO_DEBUGLIB |
@@ -318,7 +318,7 @@ void sendf(APPL * appl, word command, dword Id, word Number, byte * format, ...) | |||
318 | if (myDriverDebugHandle.dbgMask & DL_BLK) { | 318 | if (myDriverDebugHandle.dbgMask & DL_BLK) { |
319 | xlog("\x00\x02", &msg, 0x81, length); | 319 | xlog("\x00\x02", &msg, 0x81, length); |
320 | for (i = 0; i < dlength; i += 256) { | 320 | for (i = 0; i < dlength; i += 256) { |
321 | DBG_BLK((((char *) GET_DWORD(&msg.info.data_b3_ind.Data)) + i, | 321 | DBG_BLK((((char *)(long)GET_DWORD(&msg.info.data_b3_ind.Data)) + i, |
322 | ((dlength - i) < 256) ? (dlength - i) : 256)) | 322 | ((dlength - i) < 256) ? (dlength - i) : 256)) |
323 | if (!(myDriverDebugHandle.dbgMask & DL_PRV0)) | 323 | if (!(myDriverDebugHandle.dbgMask & DL_PRV0)) |
324 | break; /* not more if not explicitely requested */ | 324 | break; /* not more if not explicitely requested */ |
diff --git a/drivers/isdn/hardware/eicon/message.c b/drivers/isdn/hardware/eicon/message.c index 784232a144c8..ccd35d047ec8 100644 --- a/drivers/isdn/hardware/eicon/message.c +++ b/drivers/isdn/hardware/eicon/message.c | |||
@@ -1,4 +1,3 @@ | |||
1 | |||
2 | /* | 1 | /* |
3 | * | 2 | * |
4 | Copyright (c) Eicon Networks, 2002. | 3 | Copyright (c) Eicon Networks, 2002. |
@@ -533,7 +532,7 @@ word api_put(APPL * appl, CAPI_MSG * msg) | |||
533 | if (m->header.command == _DATA_B3_R) | 532 | if (m->header.command == _DATA_B3_R) |
534 | { | 533 | { |
535 | 534 | ||
536 | m->info.data_b3_req.Data = (dword)(TransmitBufferSet (appl, m->info.data_b3_req.Data)); | 535 | m->info.data_b3_req.Data = (dword)(long)(TransmitBufferSet (appl, m->info.data_b3_req.Data)); |
537 | 536 | ||
538 | } | 537 | } |
539 | 538 | ||
@@ -1032,7 +1031,7 @@ static void plci_free_msg_in_queue (PLCI *plci) | |||
1032 | { | 1031 | { |
1033 | 1032 | ||
1034 | TransmitBufferFree (plci->appl, | 1033 | TransmitBufferFree (plci->appl, |
1035 | (byte *)(((CAPI_MSG *)(&((byte *)(plci->msg_in_queue))[i]))->info.data_b3_req.Data)); | 1034 | (byte *)(long)(((CAPI_MSG *)(&((byte *)(plci->msg_in_queue))[i]))->info.data_b3_req.Data)); |
1036 | 1035 | ||
1037 | } | 1036 | } |
1038 | 1037 | ||
@@ -3118,7 +3117,7 @@ byte data_b3_req(dword Id, word Number, DIVA_CAPI_ADAPTER * a, PLCI * plci, | |||
3118 | && (((byte *)(parms[0].info)) < ((byte *)(plci->msg_in_queue)) + sizeof(plci->msg_in_queue))) | 3117 | && (((byte *)(parms[0].info)) < ((byte *)(plci->msg_in_queue)) + sizeof(plci->msg_in_queue))) |
3119 | { | 3118 | { |
3120 | 3119 | ||
3121 | data->P = (byte *)(*((dword *)(parms[0].info))); | 3120 | data->P = (byte *)(long)(*((dword *)(parms[0].info))); |
3122 | 3121 | ||
3123 | } | 3122 | } |
3124 | else | 3123 | else |
@@ -3151,7 +3150,7 @@ byte data_b3_req(dword Id, word Number, DIVA_CAPI_ADAPTER * a, PLCI * plci, | |||
3151 | && (((byte *)(parms[0].info)) < ((byte *)(plci->msg_in_queue)) + sizeof(plci->msg_in_queue))) | 3150 | && (((byte *)(parms[0].info)) < ((byte *)(plci->msg_in_queue)) + sizeof(plci->msg_in_queue))) |
3152 | { | 3151 | { |
3153 | 3152 | ||
3154 | TransmitBufferFree (appl, (byte *)(*((dword *)(parms[0].info)))); | 3153 | TransmitBufferFree (appl, (byte *)(long)(*((dword *)(parms[0].info)))); |
3155 | 3154 | ||
3156 | } | 3155 | } |
3157 | } | 3156 | } |
@@ -4057,7 +4056,7 @@ capi_callback_suffix: | |||
4057 | { | 4056 | { |
4058 | if (m->header.command == _DATA_B3_R) | 4057 | if (m->header.command == _DATA_B3_R) |
4059 | 4058 | ||
4060 | TransmitBufferFree (appl, (byte *)(m->info.data_b3_req.Data)); | 4059 | TransmitBufferFree (appl, (byte *)(long)(m->info.data_b3_req.Data)); |
4061 | 4060 | ||
4062 | dbug(1,dprintf("Error 0x%04x from msg(0x%04x)", i, m->header.command)); | 4061 | dbug(1,dprintf("Error 0x%04x from msg(0x%04x)", i, m->header.command)); |
4063 | break; | 4062 | break; |
@@ -7134,7 +7133,7 @@ void nl_ind(PLCI * plci) | |||
7134 | case N_UDATA: | 7133 | case N_UDATA: |
7135 | if (!(udata_forwarding_table[plci->NL.RBuffer->P[0] >> 5] & (1L << (plci->NL.RBuffer->P[0] & 0x1f)))) | 7134 | if (!(udata_forwarding_table[plci->NL.RBuffer->P[0] >> 5] & (1L << (plci->NL.RBuffer->P[0] & 0x1f)))) |
7136 | { | 7135 | { |
7137 | plci->RData[0].P = plci->internal_ind_buffer + (-((int)(plci->internal_ind_buffer)) & 3); | 7136 | plci->RData[0].P = plci->internal_ind_buffer + (-((int)(long)(plci->internal_ind_buffer)) & 3); |
7138 | plci->RData[0].PLength = INTERNAL_IND_BUFFER_SIZE; | 7137 | plci->RData[0].PLength = INTERNAL_IND_BUFFER_SIZE; |
7139 | plci->NL.R = plci->RData; | 7138 | plci->NL.R = plci->RData; |
7140 | plci->NL.RNum = 1; | 7139 | plci->NL.RNum = 1; |
diff --git a/drivers/isdn/hisax/config.c b/drivers/isdn/hisax/config.c index da4196f21e0f..8d53a7fd2671 100644 --- a/drivers/isdn/hisax/config.c +++ b/drivers/isdn/hisax/config.c | |||
@@ -1551,7 +1551,7 @@ int hisax_register(struct hisax_d_if *hisax_d_if, struct hisax_b_if *b_if[], | |||
1551 | if (retval == 0) { // yuck | 1551 | if (retval == 0) { // yuck |
1552 | cards[i].typ = 0; | 1552 | cards[i].typ = 0; |
1553 | nrcards--; | 1553 | nrcards--; |
1554 | return retval; | 1554 | return -EINVAL; |
1555 | } | 1555 | } |
1556 | cs = cards[i].cs; | 1556 | cs = cards[i].cs; |
1557 | hisax_d_if->cs = cs; | 1557 | hisax_d_if->cs = cs; |
diff --git a/drivers/isdn/hisax/hfc_usb.c b/drivers/isdn/hisax/hfc_usb.c index 1f18f1993387..b1a26e02df02 100644 --- a/drivers/isdn/hisax/hfc_usb.c +++ b/drivers/isdn/hisax/hfc_usb.c | |||
@@ -485,7 +485,6 @@ fill_isoc_urb(struct urb *urb, struct usb_device *dev, unsigned int pipe, | |||
485 | { | 485 | { |
486 | int k; | 486 | int k; |
487 | 487 | ||
488 | spin_lock_init(&urb->lock); | ||
489 | urb->dev = dev; | 488 | urb->dev = dev; |
490 | urb->pipe = pipe; | 489 | urb->pipe = pipe; |
491 | urb->complete = complete; | 490 | urb->complete = complete; |
@@ -578,16 +577,14 @@ stop_isoc_chain(usb_fifo * fifo) | |||
578 | "HFC-S USB: Stopping iso chain for fifo %i.%i", | 577 | "HFC-S USB: Stopping iso chain for fifo %i.%i", |
579 | fifo->fifonum, i); | 578 | fifo->fifonum, i); |
580 | #endif | 579 | #endif |
581 | usb_unlink_urb(fifo->iso[i].purb); | 580 | usb_kill_urb(fifo->iso[i].purb); |
582 | usb_free_urb(fifo->iso[i].purb); | 581 | usb_free_urb(fifo->iso[i].purb); |
583 | fifo->iso[i].purb = NULL; | 582 | fifo->iso[i].purb = NULL; |
584 | } | 583 | } |
585 | } | 584 | } |
586 | if (fifo->urb) { | 585 | usb_kill_urb(fifo->urb); |
587 | usb_unlink_urb(fifo->urb); | 586 | usb_free_urb(fifo->urb); |
588 | usb_free_urb(fifo->urb); | 587 | fifo->urb = NULL; |
589 | fifo->urb = NULL; | ||
590 | } | ||
591 | fifo->active = 0; | 588 | fifo->active = 0; |
592 | } | 589 | } |
593 | 590 | ||
@@ -1305,7 +1302,11 @@ usb_init(hfcusb_data * hfc) | |||
1305 | } | 1302 | } |
1306 | /* default Prot: EURO ISDN, should be a module_param */ | 1303 | /* default Prot: EURO ISDN, should be a module_param */ |
1307 | hfc->protocol = 2; | 1304 | hfc->protocol = 2; |
1308 | hisax_register(&hfc->d_if, p_b_if, "hfc_usb", hfc->protocol); | 1305 | i = hisax_register(&hfc->d_if, p_b_if, "hfc_usb", hfc->protocol); |
1306 | if (i) { | ||
1307 | printk(KERN_INFO "HFC-S USB: hisax_register -> %d\n", i); | ||
1308 | return i; | ||
1309 | } | ||
1309 | 1310 | ||
1310 | #ifdef CONFIG_HISAX_DEBUG | 1311 | #ifdef CONFIG_HISAX_DEBUG |
1311 | hfc_debug = debug; | 1312 | hfc_debug = debug; |
@@ -1626,11 +1627,9 @@ hfc_usb_probe(struct usb_interface *intf, const struct usb_device_id *id) | |||
1626 | #endif | 1627 | #endif |
1627 | /* init the chip and register the driver */ | 1628 | /* init the chip and register the driver */ |
1628 | if (usb_init(context)) { | 1629 | if (usb_init(context)) { |
1629 | if (context->ctrl_urb) { | 1630 | usb_kill_urb(context->ctrl_urb); |
1630 | usb_unlink_urb(context->ctrl_urb); | 1631 | usb_free_urb(context->ctrl_urb); |
1631 | usb_free_urb(context->ctrl_urb); | 1632 | context->ctrl_urb = NULL; |
1632 | context->ctrl_urb = NULL; | ||
1633 | } | ||
1634 | kfree(context); | 1633 | kfree(context); |
1635 | return (-EIO); | 1634 | return (-EIO); |
1636 | } | 1635 | } |
@@ -1682,21 +1681,15 @@ hfc_usb_disconnect(struct usb_interface | |||
1682 | i); | 1681 | i); |
1683 | #endif | 1682 | #endif |
1684 | } | 1683 | } |
1685 | if (context->fifos[i].urb) { | 1684 | usb_kill_urb(context->fifos[i].urb); |
1686 | usb_unlink_urb(context->fifos[i].urb); | 1685 | usb_free_urb(context->fifos[i].urb); |
1687 | usb_free_urb(context->fifos[i].urb); | 1686 | context->fifos[i].urb = NULL; |
1688 | context->fifos[i].urb = NULL; | ||
1689 | } | ||
1690 | } | 1687 | } |
1691 | context->fifos[i].active = 0; | 1688 | context->fifos[i].active = 0; |
1692 | } | 1689 | } |
1693 | /* wait for all URBS to terminate */ | 1690 | usb_kill_urb(context->ctrl_urb); |
1694 | mdelay(10); | 1691 | usb_free_urb(context->ctrl_urb); |
1695 | if (context->ctrl_urb) { | 1692 | context->ctrl_urb = NULL; |
1696 | usb_unlink_urb(context->ctrl_urb); | ||
1697 | usb_free_urb(context->ctrl_urb); | ||
1698 | context->ctrl_urb = NULL; | ||
1699 | } | ||
1700 | hisax_unregister(&context->d_if); | 1693 | hisax_unregister(&context->d_if); |
1701 | kfree(context); /* free our structure again */ | 1694 | kfree(context); /* free our structure again */ |
1702 | } /* hfc_usb_disconnect */ | 1695 | } /* hfc_usb_disconnect */ |
diff --git a/drivers/isdn/hisax/hisax_fcpcipnp.c b/drivers/isdn/hisax/hisax_fcpcipnp.c index 9e088fce8c3a..7993e01f9fc5 100644 --- a/drivers/isdn/hisax/hisax_fcpcipnp.c +++ b/drivers/isdn/hisax/hisax_fcpcipnp.c | |||
@@ -859,7 +859,11 @@ new_adapter(void) | |||
859 | for (i = 0; i < 2; i++) | 859 | for (i = 0; i < 2; i++) |
860 | b_if[i] = &adapter->bcs[i].b_if; | 860 | b_if[i] = &adapter->bcs[i].b_if; |
861 | 861 | ||
862 | hisax_register(&adapter->isac.hisax_d_if, b_if, "fcpcipnp", protocol); | 862 | if (hisax_register(&adapter->isac.hisax_d_if, b_if, "fcpcipnp", |
863 | protocol) != 0) { | ||
864 | kfree(adapter); | ||
865 | adapter = NULL; | ||
866 | } | ||
863 | 867 | ||
864 | return adapter; | 868 | return adapter; |
865 | } | 869 | } |
diff --git a/drivers/isdn/hisax/st5481_init.c b/drivers/isdn/hisax/st5481_init.c index bb3a28a53ff4..13751237bfcd 100644 --- a/drivers/isdn/hisax/st5481_init.c +++ b/drivers/isdn/hisax/st5481_init.c | |||
@@ -107,12 +107,17 @@ static int probe_st5481(struct usb_interface *intf, | |||
107 | for (i = 0; i < 2; i++) | 107 | for (i = 0; i < 2; i++) |
108 | b_if[i] = &adapter->bcs[i].b_if; | 108 | b_if[i] = &adapter->bcs[i].b_if; |
109 | 109 | ||
110 | hisax_register(&adapter->hisax_d_if, b_if, "st5481_usb", protocol); | 110 | if (hisax_register(&adapter->hisax_d_if, b_if, "st5481_usb", |
111 | protocol) != 0) | ||
112 | goto err_b1; | ||
113 | |||
111 | st5481_start(adapter); | 114 | st5481_start(adapter); |
112 | 115 | ||
113 | usb_set_intfdata(intf, adapter); | 116 | usb_set_intfdata(intf, adapter); |
114 | return 0; | 117 | return 0; |
115 | 118 | ||
119 | err_b1: | ||
120 | st5481_release_b(&adapter->bcs[1]); | ||
116 | err_b: | 121 | err_b: |
117 | st5481_release_b(&adapter->bcs[0]); | 122 | st5481_release_b(&adapter->bcs[0]); |
118 | err_d: | 123 | err_d: |
diff --git a/drivers/isdn/hisax/st5481_usb.c b/drivers/isdn/hisax/st5481_usb.c index ff1595122048..4ada66b8b679 100644 --- a/drivers/isdn/hisax/st5481_usb.c +++ b/drivers/isdn/hisax/st5481_usb.c | |||
@@ -407,7 +407,6 @@ fill_isoc_urb(struct urb *urb, struct usb_device *dev, | |||
407 | { | 407 | { |
408 | int k; | 408 | int k; |
409 | 409 | ||
410 | spin_lock_init(&urb->lock); | ||
411 | urb->dev=dev; | 410 | urb->dev=dev; |
412 | urb->pipe=pipe; | 411 | urb->pipe=pipe; |
413 | urb->interval = 1; | 412 | urb->interval = 1; |
diff --git a/drivers/macintosh/adbhid.c b/drivers/macintosh/adbhid.c index b77ef5187d6d..b46817f699f1 100644 --- a/drivers/macintosh/adbhid.c +++ b/drivers/macintosh/adbhid.c | |||
@@ -628,16 +628,16 @@ static void real_leds(unsigned char leds, int device) | |||
628 | */ | 628 | */ |
629 | static int adbhid_kbd_event(struct input_dev *dev, unsigned int type, unsigned int code, int value) | 629 | static int adbhid_kbd_event(struct input_dev *dev, unsigned int type, unsigned int code, int value) |
630 | { | 630 | { |
631 | struct adbhid *adbhid = dev->private; | 631 | struct adbhid *adbhid = input_get_drvdata(dev); |
632 | unsigned char leds; | 632 | unsigned char leds; |
633 | 633 | ||
634 | switch (type) { | 634 | switch (type) { |
635 | case EV_LED: | 635 | case EV_LED: |
636 | leds = (test_bit(LED_SCROLLL, dev->led) ? 4 : 0) | 636 | leds = (test_bit(LED_SCROLLL, dev->led) ? 4 : 0) | |
637 | | (test_bit(LED_NUML, dev->led) ? 1 : 0) | 637 | (test_bit(LED_NUML, dev->led) ? 1 : 0) | |
638 | | (test_bit(LED_CAPSL, dev->led) ? 2 : 0); | 638 | (test_bit(LED_CAPSL, dev->led) ? 2 : 0); |
639 | real_leds(leds, adbhid->id); | 639 | real_leds(leds, adbhid->id); |
640 | return 0; | 640 | return 0; |
641 | } | 641 | } |
642 | 642 | ||
643 | return -1; | 643 | return -1; |
@@ -649,7 +649,7 @@ adb_message_handler(struct notifier_block *this, unsigned long code, void *x) | |||
649 | switch (code) { | 649 | switch (code) { |
650 | case ADB_MSG_PRE_RESET: | 650 | case ADB_MSG_PRE_RESET: |
651 | case ADB_MSG_POWERDOWN: | 651 | case ADB_MSG_POWERDOWN: |
652 | /* Stop the repeat timer. Autopoll is already off at this point */ | 652 | /* Stop the repeat timer. Autopoll is already off at this point */ |
653 | { | 653 | { |
654 | int i; | 654 | int i; |
655 | for (i = 1; i < 16; i++) { | 655 | for (i = 1; i < 16; i++) { |
@@ -699,7 +699,7 @@ adbhid_input_register(int id, int default_id, int original_handler_id, | |||
699 | hid->current_handler_id = current_handler_id; | 699 | hid->current_handler_id = current_handler_id; |
700 | hid->mouse_kind = mouse_kind; | 700 | hid->mouse_kind = mouse_kind; |
701 | hid->flags = 0; | 701 | hid->flags = 0; |
702 | input_dev->private = hid; | 702 | input_set_drvdata(input_dev, hid); |
703 | input_dev->name = hid->name; | 703 | input_dev->name = hid->name; |
704 | input_dev->phys = hid->phys; | 704 | input_dev->phys = hid->phys; |
705 | input_dev->id.bustype = BUS_ADB; | 705 | input_dev->id.bustype = BUS_ADB; |
diff --git a/drivers/md/bitmap.c b/drivers/md/bitmap.c index 5a4a74c1097c..9620d452d030 100644 --- a/drivers/md/bitmap.c +++ b/drivers/md/bitmap.c | |||
@@ -255,19 +255,25 @@ static struct page *read_sb_page(mddev_t *mddev, long offset, unsigned long inde | |||
255 | 255 | ||
256 | } | 256 | } |
257 | 257 | ||
258 | static int write_sb_page(mddev_t *mddev, long offset, struct page *page, int wait) | 258 | static int write_sb_page(struct bitmap *bitmap, struct page *page, int wait) |
259 | { | 259 | { |
260 | mdk_rdev_t *rdev; | 260 | mdk_rdev_t *rdev; |
261 | struct list_head *tmp; | 261 | struct list_head *tmp; |
262 | mddev_t *mddev = bitmap->mddev; | ||
262 | 263 | ||
263 | ITERATE_RDEV(mddev, rdev, tmp) | 264 | ITERATE_RDEV(mddev, rdev, tmp) |
264 | if (test_bit(In_sync, &rdev->flags) | 265 | if (test_bit(In_sync, &rdev->flags) |
265 | && !test_bit(Faulty, &rdev->flags)) | 266 | && !test_bit(Faulty, &rdev->flags)) { |
267 | int size = PAGE_SIZE; | ||
268 | if (page->index == bitmap->file_pages-1) | ||
269 | size = roundup(bitmap->last_page_size, | ||
270 | bdev_hardsect_size(rdev->bdev)); | ||
266 | md_super_write(mddev, rdev, | 271 | md_super_write(mddev, rdev, |
267 | (rdev->sb_offset<<1) + offset | 272 | (rdev->sb_offset<<1) + bitmap->offset |
268 | + page->index * (PAGE_SIZE/512), | 273 | + page->index * (PAGE_SIZE/512), |
269 | PAGE_SIZE, | 274 | size, |
270 | page); | 275 | page); |
276 | } | ||
271 | 277 | ||
272 | if (wait) | 278 | if (wait) |
273 | md_super_wait(mddev); | 279 | md_super_wait(mddev); |
@@ -282,7 +288,7 @@ static int write_page(struct bitmap *bitmap, struct page *page, int wait) | |||
282 | struct buffer_head *bh; | 288 | struct buffer_head *bh; |
283 | 289 | ||
284 | if (bitmap->file == NULL) | 290 | if (bitmap->file == NULL) |
285 | return write_sb_page(bitmap->mddev, bitmap->offset, page, wait); | 291 | return write_sb_page(bitmap, page, wait); |
286 | 292 | ||
287 | bh = page_buffers(page); | 293 | bh = page_buffers(page); |
288 | 294 | ||
@@ -923,6 +929,7 @@ static int bitmap_init_from_disk(struct bitmap *bitmap, sector_t start) | |||
923 | } | 929 | } |
924 | 930 | ||
925 | bitmap->filemap[bitmap->file_pages++] = page; | 931 | bitmap->filemap[bitmap->file_pages++] = page; |
932 | bitmap->last_page_size = count; | ||
926 | } | 933 | } |
927 | paddr = kmap_atomic(page, KM_USER0); | 934 | paddr = kmap_atomic(page, KM_USER0); |
928 | if (bitmap->flags & BITMAP_HOSTENDIAN) | 935 | if (bitmap->flags & BITMAP_HOSTENDIAN) |
diff --git a/drivers/md/linear.c b/drivers/md/linear.c index d5ecd2d53046..192741083196 100644 --- a/drivers/md/linear.c +++ b/drivers/md/linear.c | |||
@@ -139,8 +139,6 @@ static linear_conf_t *linear_conf(mddev_t *mddev, int raid_disks) | |||
139 | if (!conf) | 139 | if (!conf) |
140 | return NULL; | 140 | return NULL; |
141 | 141 | ||
142 | mddev->private = conf; | ||
143 | |||
144 | cnt = 0; | 142 | cnt = 0; |
145 | conf->array_size = 0; | 143 | conf->array_size = 0; |
146 | 144 | ||
@@ -232,7 +230,7 @@ static linear_conf_t *linear_conf(mddev_t *mddev, int raid_disks) | |||
232 | * First calculate the device offsets. | 230 | * First calculate the device offsets. |
233 | */ | 231 | */ |
234 | conf->disks[0].offset = 0; | 232 | conf->disks[0].offset = 0; |
235 | for (i=1; i<mddev->raid_disks; i++) | 233 | for (i = 1; i < raid_disks; i++) |
236 | conf->disks[i].offset = | 234 | conf->disks[i].offset = |
237 | conf->disks[i-1].offset + | 235 | conf->disks[i-1].offset + |
238 | conf->disks[i-1].size; | 236 | conf->disks[i-1].size; |
@@ -244,7 +242,7 @@ static linear_conf_t *linear_conf(mddev_t *mddev, int raid_disks) | |||
244 | curr_offset < conf->array_size; | 242 | curr_offset < conf->array_size; |
245 | curr_offset += conf->hash_spacing) { | 243 | curr_offset += conf->hash_spacing) { |
246 | 244 | ||
247 | while (i < mddev->raid_disks-1 && | 245 | while (i < raid_disks-1 && |
248 | curr_offset >= conf->disks[i+1].offset) | 246 | curr_offset >= conf->disks[i+1].offset) |
249 | i++; | 247 | i++; |
250 | 248 | ||
@@ -299,9 +297,11 @@ static int linear_add(mddev_t *mddev, mdk_rdev_t *rdev) | |||
299 | */ | 297 | */ |
300 | linear_conf_t *newconf; | 298 | linear_conf_t *newconf; |
301 | 299 | ||
302 | if (rdev->raid_disk != mddev->raid_disks) | 300 | if (rdev->saved_raid_disk != mddev->raid_disks) |
303 | return -EINVAL; | 301 | return -EINVAL; |
304 | 302 | ||
303 | rdev->raid_disk = rdev->saved_raid_disk; | ||
304 | |||
305 | newconf = linear_conf(mddev,mddev->raid_disks+1); | 305 | newconf = linear_conf(mddev,mddev->raid_disks+1); |
306 | 306 | ||
307 | if (!newconf) | 307 | if (!newconf) |
diff --git a/drivers/md/md.c b/drivers/md/md.c index c10ce91b64e9..1c54f3c1cca7 100644 --- a/drivers/md/md.c +++ b/drivers/md/md.c | |||
@@ -1298,8 +1298,9 @@ static void super_1_sync(mddev_t *mddev, mdk_rdev_t *rdev) | |||
1298 | ITERATE_RDEV(mddev,rdev2,tmp) | 1298 | ITERATE_RDEV(mddev,rdev2,tmp) |
1299 | if (rdev2->desc_nr+1 > max_dev) | 1299 | if (rdev2->desc_nr+1 > max_dev) |
1300 | max_dev = rdev2->desc_nr+1; | 1300 | max_dev = rdev2->desc_nr+1; |
1301 | 1301 | ||
1302 | sb->max_dev = cpu_to_le32(max_dev); | 1302 | if (max_dev > le32_to_cpu(sb->max_dev)) |
1303 | sb->max_dev = cpu_to_le32(max_dev); | ||
1303 | for (i=0; i<max_dev;i++) | 1304 | for (i=0; i<max_dev;i++) |
1304 | sb->dev_roles[i] = cpu_to_le16(0xfffe); | 1305 | sb->dev_roles[i] = cpu_to_le16(0xfffe); |
1305 | 1306 | ||
@@ -1365,10 +1366,14 @@ static int bind_rdev_to_array(mdk_rdev_t * rdev, mddev_t * mddev) | |||
1365 | } | 1366 | } |
1366 | /* make sure rdev->size exceeds mddev->size */ | 1367 | /* make sure rdev->size exceeds mddev->size */ |
1367 | if (rdev->size && (mddev->size == 0 || rdev->size < mddev->size)) { | 1368 | if (rdev->size && (mddev->size == 0 || rdev->size < mddev->size)) { |
1368 | if (mddev->pers) | 1369 | if (mddev->pers) { |
1369 | /* Cannot change size, so fail */ | 1370 | /* Cannot change size, so fail |
1370 | return -ENOSPC; | 1371 | * If mddev->level <= 0, then we don't care |
1371 | else | 1372 | * about aligning sizes (e.g. linear) |
1373 | */ | ||
1374 | if (mddev->level > 0) | ||
1375 | return -ENOSPC; | ||
1376 | } else | ||
1372 | mddev->size = rdev->size; | 1377 | mddev->size = rdev->size; |
1373 | } | 1378 | } |
1374 | 1379 | ||
@@ -2142,6 +2147,9 @@ static void analyze_sbs(mddev_t * mddev) | |||
2142 | rdev->desc_nr = i++; | 2147 | rdev->desc_nr = i++; |
2143 | rdev->raid_disk = rdev->desc_nr; | 2148 | rdev->raid_disk = rdev->desc_nr; |
2144 | set_bit(In_sync, &rdev->flags); | 2149 | set_bit(In_sync, &rdev->flags); |
2150 | } else if (rdev->raid_disk >= mddev->raid_disks) { | ||
2151 | rdev->raid_disk = -1; | ||
2152 | clear_bit(In_sync, &rdev->flags); | ||
2145 | } | 2153 | } |
2146 | } | 2154 | } |
2147 | 2155 | ||
diff --git a/drivers/md/raid0.c b/drivers/md/raid0.c index dfe32149ad3a..2c404f73a377 100644 --- a/drivers/md/raid0.c +++ b/drivers/md/raid0.c | |||
@@ -415,7 +415,7 @@ static int raid0_make_request (request_queue_t *q, struct bio *bio) | |||
415 | raid0_conf_t *conf = mddev_to_conf(mddev); | 415 | raid0_conf_t *conf = mddev_to_conf(mddev); |
416 | struct strip_zone *zone; | 416 | struct strip_zone *zone; |
417 | mdk_rdev_t *tmp_dev; | 417 | mdk_rdev_t *tmp_dev; |
418 | unsigned long chunk; | 418 | sector_t chunk; |
419 | sector_t block, rsect; | 419 | sector_t block, rsect; |
420 | const int rw = bio_data_dir(bio); | 420 | const int rw = bio_data_dir(bio); |
421 | 421 | ||
@@ -470,7 +470,6 @@ static int raid0_make_request (request_queue_t *q, struct bio *bio) | |||
470 | 470 | ||
471 | sector_div(x, zone->nb_dev); | 471 | sector_div(x, zone->nb_dev); |
472 | chunk = x; | 472 | chunk = x; |
473 | BUG_ON(x != (sector_t)chunk); | ||
474 | 473 | ||
475 | x = block >> chunksize_bits; | 474 | x = block >> chunksize_bits; |
476 | tmp_dev = zone->dev[sector_div(x, zone->nb_dev)]; | 475 | tmp_dev = zone->dev[sector_div(x, zone->nb_dev)]; |
diff --git a/drivers/media/dvb/bt8xx/dst.c b/drivers/media/dvb/bt8xx/dst.c index 0393a3d19920..e908e3cf1e50 100644 --- a/drivers/media/dvb/bt8xx/dst.c +++ b/drivers/media/dvb/bt8xx/dst.c | |||
@@ -1721,9 +1721,6 @@ static void dst_release(struct dvb_frontend *fe) | |||
1721 | symbol_put(dst_ca_attach); | 1721 | symbol_put(dst_ca_attach); |
1722 | #endif | 1722 | #endif |
1723 | } | 1723 | } |
1724 | #ifdef CONFIG_DVB_CORE_ATTACH | ||
1725 | symbol_put(dst_attach); | ||
1726 | #endif | ||
1727 | kfree(state); | 1724 | kfree(state); |
1728 | } | 1725 | } |
1729 | 1726 | ||
diff --git a/drivers/media/dvb/dvb-core/dvbdev.c b/drivers/media/dvb/dvb-core/dvbdev.c index e23d8a0ea1d3..a9fa3337dd81 100644 --- a/drivers/media/dvb/dvb-core/dvbdev.c +++ b/drivers/media/dvb/dvb-core/dvbdev.c | |||
@@ -200,7 +200,7 @@ int dvb_register_device(struct dvb_adapter *adap, struct dvb_device **pdvbdev, | |||
200 | { | 200 | { |
201 | struct dvb_device *dvbdev; | 201 | struct dvb_device *dvbdev; |
202 | struct file_operations *dvbdevfops; | 202 | struct file_operations *dvbdevfops; |
203 | 203 | struct class_device *clsdev; | |
204 | int id; | 204 | int id; |
205 | 205 | ||
206 | mutex_lock(&dvbdev_register_lock); | 206 | mutex_lock(&dvbdev_register_lock); |
@@ -242,8 +242,15 @@ int dvb_register_device(struct dvb_adapter *adap, struct dvb_device **pdvbdev, | |||
242 | 242 | ||
243 | mutex_unlock(&dvbdev_register_lock); | 243 | mutex_unlock(&dvbdev_register_lock); |
244 | 244 | ||
245 | class_device_create(dvb_class, NULL, MKDEV(DVB_MAJOR, nums2minor(adap->num, type, id)), | 245 | clsdev = class_device_create(dvb_class, NULL, MKDEV(DVB_MAJOR, |
246 | adap->device, "dvb%d.%s%d", adap->num, dnames[type], id); | 246 | nums2minor(adap->num, type, id)), |
247 | adap->device, "dvb%d.%s%d", adap->num, | ||
248 | dnames[type], id); | ||
249 | if (IS_ERR(clsdev)) { | ||
250 | printk(KERN_ERR "%s: failed to create device dvb%d.%s%d (%ld)\n", | ||
251 | __FUNCTION__, adap->num, dnames[type], id, PTR_ERR(clsdev)); | ||
252 | return PTR_ERR(clsdev); | ||
253 | } | ||
247 | 254 | ||
248 | dprintk("DVB: register adapter%d/%s%d @ minor: %i (0x%02x)\n", | 255 | dprintk("DVB: register adapter%d/%s%d @ minor: %i (0x%02x)\n", |
249 | adap->num, dnames[type], id, nums2minor(adap->num, type, id), | 256 | adap->num, dnames[type], id, nums2minor(adap->num, type, id), |
@@ -431,7 +438,7 @@ static void __exit exit_dvbdev(void) | |||
431 | unregister_chrdev_region(MKDEV(DVB_MAJOR, 0), MAX_DVB_MINORS); | 438 | unregister_chrdev_region(MKDEV(DVB_MAJOR, 0), MAX_DVB_MINORS); |
432 | } | 439 | } |
433 | 440 | ||
434 | module_init(init_dvbdev); | 441 | subsys_initcall(init_dvbdev); |
435 | module_exit(exit_dvbdev); | 442 | module_exit(exit_dvbdev); |
436 | 443 | ||
437 | MODULE_DESCRIPTION("DVB Core Driver"); | 444 | MODULE_DESCRIPTION("DVB Core Driver"); |
diff --git a/drivers/media/video/cafe_ccic-regs.h b/drivers/media/video/cafe_ccic-regs.h index b2c22a0d6643..8e2a87cdc791 100644 --- a/drivers/media/video/cafe_ccic-regs.h +++ b/drivers/media/video/cafe_ccic-regs.h | |||
@@ -150,6 +150,12 @@ | |||
150 | #define REG_GL_IMASK 0x300c /* Interrupt mask register */ | 150 | #define REG_GL_IMASK 0x300c /* Interrupt mask register */ |
151 | #define GIMSK_CCIC_EN 0x00000004 /* CCIC Interrupt enable */ | 151 | #define GIMSK_CCIC_EN 0x00000004 /* CCIC Interrupt enable */ |
152 | 152 | ||
153 | #define REG_GL_FCR 0x3038 /* GPIO functional control register */ | ||
154 | #define GFCR_GPIO_ON 0x08 /* Camera GPIO enabled */ | ||
155 | #define REG_GL_GPIOR 0x315c /* GPIO register */ | ||
156 | #define GGPIO_OUT 0x80000 /* GPIO output */ | ||
157 | #define GGPIO_VAL 0x00008 /* Output pin value */ | ||
158 | |||
153 | #define REG_LEN REG_GL_IMASK + 4 | 159 | #define REG_LEN REG_GL_IMASK + 4 |
154 | 160 | ||
155 | 161 | ||
diff --git a/drivers/media/video/cafe_ccic.c b/drivers/media/video/cafe_ccic.c index 96254dbaf625..c08f650df423 100644 --- a/drivers/media/video/cafe_ccic.c +++ b/drivers/media/video/cafe_ccic.c | |||
@@ -775,6 +775,12 @@ static void cafe_ctlr_power_up(struct cafe_camera *cam) | |||
775 | spin_lock_irqsave(&cam->dev_lock, flags); | 775 | spin_lock_irqsave(&cam->dev_lock, flags); |
776 | cafe_reg_clear_bit(cam, REG_CTRL1, C1_PWRDWN); | 776 | cafe_reg_clear_bit(cam, REG_CTRL1, C1_PWRDWN); |
777 | /* | 777 | /* |
778 | * Part one of the sensor dance: turn the global | ||
779 | * GPIO signal on. | ||
780 | */ | ||
781 | cafe_reg_write(cam, REG_GL_FCR, GFCR_GPIO_ON); | ||
782 | cafe_reg_write(cam, REG_GL_GPIOR, GGPIO_OUT|GGPIO_VAL); | ||
783 | /* | ||
778 | * Put the sensor into operational mode (assumes OLPC-style | 784 | * Put the sensor into operational mode (assumes OLPC-style |
779 | * wiring). Control 0 is reset - set to 1 to operate. | 785 | * wiring). Control 0 is reset - set to 1 to operate. |
780 | * Control 1 is power down, set to 0 to operate. | 786 | * Control 1 is power down, set to 0 to operate. |
@@ -784,6 +790,7 @@ static void cafe_ctlr_power_up(struct cafe_camera *cam) | |||
784 | cafe_reg_write(cam, REG_GPR, GPR_C1EN|GPR_C0EN|GPR_C0); | 790 | cafe_reg_write(cam, REG_GPR, GPR_C1EN|GPR_C0EN|GPR_C0); |
785 | // mdelay(1); /* Enough? */ | 791 | // mdelay(1); /* Enough? */ |
786 | spin_unlock_irqrestore(&cam->dev_lock, flags); | 792 | spin_unlock_irqrestore(&cam->dev_lock, flags); |
793 | msleep(5); /* Just to be sure */ | ||
787 | } | 794 | } |
788 | 795 | ||
789 | static void cafe_ctlr_power_down(struct cafe_camera *cam) | 796 | static void cafe_ctlr_power_down(struct cafe_camera *cam) |
@@ -792,6 +799,8 @@ static void cafe_ctlr_power_down(struct cafe_camera *cam) | |||
792 | 799 | ||
793 | spin_lock_irqsave(&cam->dev_lock, flags); | 800 | spin_lock_irqsave(&cam->dev_lock, flags); |
794 | cafe_reg_write(cam, REG_GPR, GPR_C1EN|GPR_C0EN|GPR_C1); | 801 | cafe_reg_write(cam, REG_GPR, GPR_C1EN|GPR_C0EN|GPR_C1); |
802 | cafe_reg_write(cam, REG_GL_FCR, GFCR_GPIO_ON); | ||
803 | cafe_reg_write(cam, REG_GL_GPIOR, GGPIO_OUT); | ||
795 | cafe_reg_set_bit(cam, REG_CTRL1, C1_PWRDWN); | 804 | cafe_reg_set_bit(cam, REG_CTRL1, C1_PWRDWN); |
796 | spin_unlock_irqrestore(&cam->dev_lock, flags); | 805 | spin_unlock_irqrestore(&cam->dev_lock, flags); |
797 | } | 806 | } |
@@ -851,6 +860,7 @@ static int cafe_cam_init(struct cafe_camera *cam) | |||
851 | ret = 0; | 860 | ret = 0; |
852 | cam->state = S_IDLE; | 861 | cam->state = S_IDLE; |
853 | out: | 862 | out: |
863 | cafe_ctlr_power_down(cam); | ||
854 | mutex_unlock(&cam->s_mutex); | 864 | mutex_unlock(&cam->s_mutex); |
855 | return ret; | 865 | return ret; |
856 | } | 866 | } |
@@ -2103,10 +2113,16 @@ static int cafe_pci_probe(struct pci_dev *pdev, | |||
2103 | ret = request_irq(pdev->irq, cafe_irq, IRQF_SHARED, "cafe-ccic", cam); | 2113 | ret = request_irq(pdev->irq, cafe_irq, IRQF_SHARED, "cafe-ccic", cam); |
2104 | if (ret) | 2114 | if (ret) |
2105 | goto out_iounmap; | 2115 | goto out_iounmap; |
2116 | /* | ||
2117 | * Initialize the controller and leave it powered up. It will | ||
2118 | * stay that way until the sensor driver shows up. | ||
2119 | */ | ||
2106 | cafe_ctlr_init(cam); | 2120 | cafe_ctlr_init(cam); |
2107 | cafe_ctlr_power_up(cam); | 2121 | cafe_ctlr_power_up(cam); |
2108 | /* | 2122 | /* |
2109 | * Set up I2C/SMBUS communications | 2123 | * Set up I2C/SMBUS communications. We have to drop the mutex here |
2124 | * because the sensor could attach in this call chain, leading to | ||
2125 | * unsightly deadlocks. | ||
2110 | */ | 2126 | */ |
2111 | mutex_unlock(&cam->s_mutex); /* attach can deadlock */ | 2127 | mutex_unlock(&cam->s_mutex); /* attach can deadlock */ |
2112 | ret = cafe_smbus_setup(cam); | 2128 | ret = cafe_smbus_setup(cam); |
diff --git a/drivers/media/video/em28xx/Kconfig b/drivers/media/video/em28xx/Kconfig index 2c450bd05af5..5b6a40371602 100644 --- a/drivers/media/video/em28xx/Kconfig +++ b/drivers/media/video/em28xx/Kconfig | |||
@@ -1,7 +1,6 @@ | |||
1 | config VIDEO_EM28XX | 1 | config VIDEO_EM28XX |
2 | tristate "Empia EM2800/2820/2840 USB video capture support" | 2 | tristate "Empia EM2800/2820/2840 USB video capture support" |
3 | depends on VIDEO_V4L1 && I2C && PCI | 3 | depends on VIDEO_V4L1 && I2C |
4 | select VIDEO_BUF | ||
5 | select VIDEO_TUNER | 4 | select VIDEO_TUNER |
6 | select VIDEO_TVEEPROM | 5 | select VIDEO_TVEEPROM |
7 | select VIDEO_IR | 6 | select VIDEO_IR |
diff --git a/drivers/media/video/ivtv/Kconfig b/drivers/media/video/ivtv/Kconfig index 0cc98a0e2496..1aaeaa02f158 100644 --- a/drivers/media/video/ivtv/Kconfig +++ b/drivers/media/video/ivtv/Kconfig | |||
@@ -1,6 +1,6 @@ | |||
1 | config VIDEO_IVTV | 1 | config VIDEO_IVTV |
2 | tristate "Conexant cx23416/cx23415 MPEG encoder/decoder support" | 2 | tristate "Conexant cx23416/cx23415 MPEG encoder/decoder support" |
3 | depends on VIDEO_V4L1 && VIDEO_V4L2 && USB && I2C && EXPERIMENTAL && PCI | 3 | depends on VIDEO_V4L1 && VIDEO_V4L2 && PCI && I2C && EXPERIMENTAL |
4 | select FW_LOADER | 4 | select FW_LOADER |
5 | select VIDEO_TUNER | 5 | select VIDEO_TUNER |
6 | select VIDEO_TVEEPROM | 6 | select VIDEO_TVEEPROM |
diff --git a/drivers/media/video/ivtv/ivtv-driver.h b/drivers/media/video/ivtv/ivtv-driver.h index 9a412d6c6d06..552f04511ead 100644 --- a/drivers/media/video/ivtv/ivtv-driver.h +++ b/drivers/media/video/ivtv/ivtv-driver.h | |||
@@ -67,14 +67,6 @@ | |||
67 | 67 | ||
68 | #include <media/ivtv.h> | 68 | #include <media/ivtv.h> |
69 | 69 | ||
70 | #ifdef CONFIG_LIRC_I2C | ||
71 | # error "This driver is not compatible with the LIRC I2C kernel configuration option." | ||
72 | #endif /* CONFIG_LIRC_I2C */ | ||
73 | |||
74 | #ifndef CONFIG_PCI | ||
75 | # error "This driver requires kernel PCI support." | ||
76 | #endif /* CONFIG_PCI */ | ||
77 | |||
78 | #define IVTV_ENCODER_OFFSET 0x00000000 | 70 | #define IVTV_ENCODER_OFFSET 0x00000000 |
79 | #define IVTV_ENCODER_SIZE 0x00800000 /* Last half isn't needed 0x01000000 */ | 71 | #define IVTV_ENCODER_SIZE 0x00800000 /* Last half isn't needed 0x01000000 */ |
80 | 72 | ||
diff --git a/drivers/media/video/ivtv/ivtv-ioctl.c b/drivers/media/video/ivtv/ivtv-ioctl.c index 794a6a02f82f..1989ec1cb973 100644 --- a/drivers/media/video/ivtv/ivtv-ioctl.c +++ b/drivers/media/video/ivtv/ivtv-ioctl.c | |||
@@ -362,8 +362,6 @@ static int ivtv_get_fmt(struct ivtv *itv, int streamtype, struct v4l2_format *fm | |||
362 | case V4L2_BUF_TYPE_VIDEO_OUTPUT: | 362 | case V4L2_BUF_TYPE_VIDEO_OUTPUT: |
363 | if (!(itv->v4l2_cap & V4L2_CAP_VIDEO_OUTPUT)) | 363 | if (!(itv->v4l2_cap & V4L2_CAP_VIDEO_OUTPUT)) |
364 | return -EINVAL; | 364 | return -EINVAL; |
365 | fmt->fmt.pix.left = itv->main_rect.left; | ||
366 | fmt->fmt.pix.top = itv->main_rect.top; | ||
367 | fmt->fmt.pix.width = itv->main_rect.width; | 365 | fmt->fmt.pix.width = itv->main_rect.width; |
368 | fmt->fmt.pix.height = itv->main_rect.height; | 366 | fmt->fmt.pix.height = itv->main_rect.height; |
369 | fmt->fmt.pix.colorspace = V4L2_COLORSPACE_SMPTE170M; | 367 | fmt->fmt.pix.colorspace = V4L2_COLORSPACE_SMPTE170M; |
@@ -402,8 +400,6 @@ static int ivtv_get_fmt(struct ivtv *itv, int streamtype, struct v4l2_format *fm | |||
402 | break; | 400 | break; |
403 | 401 | ||
404 | case V4L2_BUF_TYPE_VIDEO_CAPTURE: | 402 | case V4L2_BUF_TYPE_VIDEO_CAPTURE: |
405 | fmt->fmt.pix.left = 0; | ||
406 | fmt->fmt.pix.top = 0; | ||
407 | fmt->fmt.pix.width = itv->params.width; | 403 | fmt->fmt.pix.width = itv->params.width; |
408 | fmt->fmt.pix.height = itv->params.height; | 404 | fmt->fmt.pix.height = itv->params.height; |
409 | fmt->fmt.pix.colorspace = V4L2_COLORSPACE_SMPTE170M; | 405 | fmt->fmt.pix.colorspace = V4L2_COLORSPACE_SMPTE170M; |
@@ -498,15 +494,13 @@ static int ivtv_try_or_set_fmt(struct ivtv *itv, int streamtype, | |||
498 | if (!(itv->v4l2_cap & V4L2_CAP_VIDEO_OUTPUT)) | 494 | if (!(itv->v4l2_cap & V4L2_CAP_VIDEO_OUTPUT)) |
499 | return -EINVAL; | 495 | return -EINVAL; |
500 | field = fmt->fmt.pix.field; | 496 | field = fmt->fmt.pix.field; |
501 | r.top = fmt->fmt.pix.top; | 497 | r.top = 0; |
502 | r.left = fmt->fmt.pix.left; | 498 | r.left = 0; |
503 | r.width = fmt->fmt.pix.width; | 499 | r.width = fmt->fmt.pix.width; |
504 | r.height = fmt->fmt.pix.height; | 500 | r.height = fmt->fmt.pix.height; |
505 | ivtv_get_fmt(itv, streamtype, fmt); | 501 | ivtv_get_fmt(itv, streamtype, fmt); |
506 | if (itv->output_mode != OUT_UDMA_YUV) { | 502 | if (itv->output_mode != OUT_UDMA_YUV) { |
507 | /* TODO: would setting the rect also be valid for this mode? */ | 503 | /* TODO: would setting the rect also be valid for this mode? */ |
508 | fmt->fmt.pix.top = r.top; | ||
509 | fmt->fmt.pix.left = r.left; | ||
510 | fmt->fmt.pix.width = r.width; | 504 | fmt->fmt.pix.width = r.width; |
511 | fmt->fmt.pix.height = r.height; | 505 | fmt->fmt.pix.height = r.height; |
512 | } | 506 | } |
@@ -1141,8 +1135,6 @@ int ivtv_v4l2_ioctls(struct ivtv *itv, struct file *filp, unsigned int cmd, void | |||
1141 | fb->fmt.pixelformat = itv->osd_pixelformat; | 1135 | fb->fmt.pixelformat = itv->osd_pixelformat; |
1142 | fb->fmt.width = itv->osd_rect.width; | 1136 | fb->fmt.width = itv->osd_rect.width; |
1143 | fb->fmt.height = itv->osd_rect.height; | 1137 | fb->fmt.height = itv->osd_rect.height; |
1144 | fb->fmt.left = itv->osd_rect.left; | ||
1145 | fb->fmt.top = itv->osd_rect.top; | ||
1146 | fb->base = (void *)itv->osd_video_pbase; | 1138 | fb->base = (void *)itv->osd_video_pbase; |
1147 | if (itv->osd_global_alpha_state) | 1139 | if (itv->osd_global_alpha_state) |
1148 | fb->flags |= V4L2_FBUF_FLAG_GLOBAL_ALPHA; | 1140 | fb->flags |= V4L2_FBUF_FLAG_GLOBAL_ALPHA; |
diff --git a/drivers/media/video/ov7670.c b/drivers/media/video/ov7670.c index 03bc369a9e49..3ceb8a6249dd 100644 --- a/drivers/media/video/ov7670.c +++ b/drivers/media/video/ov7670.c | |||
@@ -720,12 +720,22 @@ static int ov7670_s_fmt(struct i2c_client *c, struct v4l2_format *fmt) | |||
720 | struct ov7670_format_struct *ovfmt; | 720 | struct ov7670_format_struct *ovfmt; |
721 | struct ov7670_win_size *wsize; | 721 | struct ov7670_win_size *wsize; |
722 | struct ov7670_info *info = i2c_get_clientdata(c); | 722 | struct ov7670_info *info = i2c_get_clientdata(c); |
723 | unsigned char com7; | 723 | unsigned char com7, clkrc; |
724 | 724 | ||
725 | ret = ov7670_try_fmt(c, fmt, &ovfmt, &wsize); | 725 | ret = ov7670_try_fmt(c, fmt, &ovfmt, &wsize); |
726 | if (ret) | 726 | if (ret) |
727 | return ret; | 727 | return ret; |
728 | /* | 728 | /* |
729 | * HACK: if we're running rgb565 we need to grab then rewrite | ||
730 | * CLKRC. If we're *not*, however, then rewriting clkrc hoses | ||
731 | * the colors. | ||
732 | */ | ||
733 | if (fmt->fmt.pix.pixelformat == V4L2_PIX_FMT_RGB565) { | ||
734 | ret = ov7670_read(c, REG_CLKRC, &clkrc); | ||
735 | if (ret) | ||
736 | return ret; | ||
737 | } | ||
738 | /* | ||
729 | * COM7 is a pain in the ass, it doesn't like to be read then | 739 | * COM7 is a pain in the ass, it doesn't like to be read then |
730 | * quickly written afterward. But we have everything we need | 740 | * quickly written afterward. But we have everything we need |
731 | * to set it absolutely here, as long as the format-specific | 741 | * to set it absolutely here, as long as the format-specific |
@@ -744,7 +754,10 @@ static int ov7670_s_fmt(struct i2c_client *c, struct v4l2_format *fmt) | |||
744 | if (wsize->regs) | 754 | if (wsize->regs) |
745 | ret = ov7670_write_array(c, wsize->regs); | 755 | ret = ov7670_write_array(c, wsize->regs); |
746 | info->fmt = ovfmt; | 756 | info->fmt = ovfmt; |
747 | return 0; | 757 | |
758 | if (fmt->fmt.pix.pixelformat == V4L2_PIX_FMT_RGB565 && ret == 0) | ||
759 | ret = ov7670_write(c, REG_CLKRC, clkrc); | ||
760 | return ret; | ||
748 | } | 761 | } |
749 | 762 | ||
750 | /* | 763 | /* |
@@ -1267,7 +1280,9 @@ static int ov7670_attach(struct i2c_adapter *adapter) | |||
1267 | ret = ov7670_detect(client); | 1280 | ret = ov7670_detect(client); |
1268 | if (ret) | 1281 | if (ret) |
1269 | goto out_free_info; | 1282 | goto out_free_info; |
1270 | i2c_attach_client(client); | 1283 | ret = i2c_attach_client(client); |
1284 | if (ret) | ||
1285 | goto out_free_info; | ||
1271 | return 0; | 1286 | return 0; |
1272 | 1287 | ||
1273 | out_free_info: | 1288 | out_free_info: |
diff --git a/drivers/media/video/tuner-simple.c b/drivers/media/video/tuner-simple.c index 1b9b0742f753..c40b92ce1fad 100644 --- a/drivers/media/video/tuner-simple.c +++ b/drivers/media/video/tuner-simple.c | |||
@@ -205,9 +205,13 @@ static void default_set_tv_freq(struct i2c_client *c, unsigned int freq) | |||
205 | /* 0x01 -> ??? no change ??? */ | 205 | /* 0x01 -> ??? no change ??? */ |
206 | /* 0x02 -> PAL BDGHI / SECAM L */ | 206 | /* 0x02 -> PAL BDGHI / SECAM L */ |
207 | /* 0x04 -> ??? PAL others / SECAM others ??? */ | 207 | /* 0x04 -> ??? PAL others / SECAM others ??? */ |
208 | cb &= ~0x02; | 208 | cb &= ~0x03; |
209 | if (t->std & V4L2_STD_SECAM) | 209 | if (t->std & V4L2_STD_SECAM_L) //also valid for V4L2_STD_SECAM |
210 | cb |= 0x02; | 210 | cb |= PHILIPS_MF_SET_PAL_L; |
211 | else if (t->std & V4L2_STD_SECAM_LC) | ||
212 | cb |= PHILIPS_MF_SET_PAL_L2; | ||
213 | else /* V4L2_STD_B|V4L2_STD_GH */ | ||
214 | cb |= PHILIPS_MF_SET_BG; | ||
211 | break; | 215 | break; |
212 | 216 | ||
213 | case TUNER_TEMIC_4046FM5: | 217 | case TUNER_TEMIC_4046FM5: |
diff --git a/drivers/message/fusion/mptbase.h b/drivers/message/fusion/mptbase.h index d25d3be8fcd2..165f81d16d00 100644 --- a/drivers/message/fusion/mptbase.h +++ b/drivers/message/fusion/mptbase.h | |||
@@ -436,7 +436,7 @@ typedef struct _MPT_SAS_MGMT { | |||
436 | typedef struct _mpt_ioctl_events { | 436 | typedef struct _mpt_ioctl_events { |
437 | u32 event; /* Specified by define above */ | 437 | u32 event; /* Specified by define above */ |
438 | u32 eventContext; /* Index or counter */ | 438 | u32 eventContext; /* Index or counter */ |
439 | int data[2]; /* First 8 bytes of Event Data */ | 439 | u32 data[2]; /* First 8 bytes of Event Data */ |
440 | } MPT_IOCTL_EVENTS; | 440 | } MPT_IOCTL_EVENTS; |
441 | 441 | ||
442 | /* | 442 | /* |
diff --git a/drivers/message/fusion/mptscsih.c b/drivers/message/fusion/mptscsih.c index fa0f7761652a..3bd94f11e7d6 100644 --- a/drivers/message/fusion/mptscsih.c +++ b/drivers/message/fusion/mptscsih.c | |||
@@ -2463,11 +2463,11 @@ mptscsih_copy_sense_data(struct scsi_cmnd *sc, MPT_SCSI_HOST *hd, MPT_FRAME_HDR | |||
2463 | ioc->events[idx].event = MPI_EVENT_SCSI_DEVICE_STATUS_CHANGE; | 2463 | ioc->events[idx].event = MPI_EVENT_SCSI_DEVICE_STATUS_CHANGE; |
2464 | ioc->events[idx].eventContext = ioc->eventContext; | 2464 | ioc->events[idx].eventContext = ioc->eventContext; |
2465 | 2465 | ||
2466 | ioc->events[idx].data[0] = (pReq->LUN[1] << 24) || | 2466 | ioc->events[idx].data[0] = (pReq->LUN[1] << 24) | |
2467 | (MPI_EVENT_SCSI_DEV_STAT_RC_SMART_DATA << 16) || | 2467 | (MPI_EVENT_SCSI_DEV_STAT_RC_SMART_DATA << 16) | |
2468 | (sc->device->channel << 8) || sc->device->id; | 2468 | (sc->device->channel << 8) | sc->device->id; |
2469 | 2469 | ||
2470 | ioc->events[idx].data[1] = (sense_data[13] << 8) || sense_data[12]; | 2470 | ioc->events[idx].data[1] = (sense_data[13] << 8) | sense_data[12]; |
2471 | 2471 | ||
2472 | ioc->eventContext++; | 2472 | ioc->eventContext++; |
2473 | if (hd->ioc->pcidev->vendor == | 2473 | if (hd->ioc->pcidev->vendor == |
diff --git a/drivers/message/i2o/driver.c b/drivers/message/i2o/driver.c index d3235f213c89..e0d474b17433 100644 --- a/drivers/message/i2o/driver.c +++ b/drivers/message/i2o/driver.c | |||
@@ -123,8 +123,12 @@ int i2o_driver_register(struct i2o_driver *drv) | |||
123 | } | 123 | } |
124 | 124 | ||
125 | rc = driver_register(&drv->driver); | 125 | rc = driver_register(&drv->driver); |
126 | if (rc) | 126 | if (rc) { |
127 | destroy_workqueue(drv->event_queue); | 127 | if (drv->event) { |
128 | destroy_workqueue(drv->event_queue); | ||
129 | drv->event_queue = NULL; | ||
130 | } | ||
131 | } | ||
128 | 132 | ||
129 | return rc; | 133 | return rc; |
130 | }; | 134 | }; |
@@ -256,7 +260,7 @@ void i2o_driver_notify_controller_add_all(struct i2o_controller *c) | |||
256 | int i; | 260 | int i; |
257 | struct i2o_driver *drv; | 261 | struct i2o_driver *drv; |
258 | 262 | ||
259 | for (i = 0; i < I2O_MAX_DRIVERS; i++) { | 263 | for (i = 0; i < i2o_max_drivers; i++) { |
260 | drv = i2o_drivers[i]; | 264 | drv = i2o_drivers[i]; |
261 | 265 | ||
262 | if (drv) | 266 | if (drv) |
@@ -276,7 +280,7 @@ void i2o_driver_notify_controller_remove_all(struct i2o_controller *c) | |||
276 | int i; | 280 | int i; |
277 | struct i2o_driver *drv; | 281 | struct i2o_driver *drv; |
278 | 282 | ||
279 | for (i = 0; i < I2O_MAX_DRIVERS; i++) { | 283 | for (i = 0; i < i2o_max_drivers; i++) { |
280 | drv = i2o_drivers[i]; | 284 | drv = i2o_drivers[i]; |
281 | 285 | ||
282 | if (drv) | 286 | if (drv) |
@@ -295,7 +299,7 @@ void i2o_driver_notify_device_add_all(struct i2o_device *i2o_dev) | |||
295 | int i; | 299 | int i; |
296 | struct i2o_driver *drv; | 300 | struct i2o_driver *drv; |
297 | 301 | ||
298 | for (i = 0; i < I2O_MAX_DRIVERS; i++) { | 302 | for (i = 0; i < i2o_max_drivers; i++) { |
299 | drv = i2o_drivers[i]; | 303 | drv = i2o_drivers[i]; |
300 | 304 | ||
301 | if (drv) | 305 | if (drv) |
@@ -314,7 +318,7 @@ void i2o_driver_notify_device_remove_all(struct i2o_device *i2o_dev) | |||
314 | int i; | 318 | int i; |
315 | struct i2o_driver *drv; | 319 | struct i2o_driver *drv; |
316 | 320 | ||
317 | for (i = 0; i < I2O_MAX_DRIVERS; i++) { | 321 | for (i = 0; i < i2o_max_drivers; i++) { |
318 | drv = i2o_drivers[i]; | 322 | drv = i2o_drivers[i]; |
319 | 323 | ||
320 | if (drv) | 324 | if (drv) |
@@ -335,17 +339,15 @@ int __init i2o_driver_init(void) | |||
335 | 339 | ||
336 | spin_lock_init(&i2o_drivers_lock); | 340 | spin_lock_init(&i2o_drivers_lock); |
337 | 341 | ||
338 | if ((i2o_max_drivers < 2) || (i2o_max_drivers > 64) || | 342 | if ((i2o_max_drivers < 2) || (i2o_max_drivers > 64)) { |
339 | ((i2o_max_drivers ^ (i2o_max_drivers - 1)) != | 343 | osm_warn("max_drivers set to %d, but must be >=2 and <= 64\n", |
340 | (2 * i2o_max_drivers - 1))) { | 344 | i2o_max_drivers); |
341 | osm_warn("max_drivers set to %d, but must be >=2 and <= 64 and " | ||
342 | "a power of 2\n", i2o_max_drivers); | ||
343 | i2o_max_drivers = I2O_MAX_DRIVERS; | 345 | i2o_max_drivers = I2O_MAX_DRIVERS; |
344 | } | 346 | } |
345 | osm_info("max drivers = %d\n", i2o_max_drivers); | 347 | osm_info("max drivers = %d\n", i2o_max_drivers); |
346 | 348 | ||
347 | i2o_drivers = | 349 | i2o_drivers = |
348 | kzalloc(i2o_max_drivers * sizeof(*i2o_drivers), GFP_KERNEL); | 350 | kcalloc(i2o_max_drivers, sizeof(*i2o_drivers), GFP_KERNEL); |
349 | if (!i2o_drivers) | 351 | if (!i2o_drivers) |
350 | return -ENOMEM; | 352 | return -ENOMEM; |
351 | 353 | ||
diff --git a/drivers/mfd/ucb1x00-ts.c b/drivers/mfd/ucb1x00-ts.c index cb8c264eaff0..7772bd1d92b4 100644 --- a/drivers/mfd/ucb1x00-ts.c +++ b/drivers/mfd/ucb1x00-ts.c | |||
@@ -207,16 +207,7 @@ static int ucb1x00_thread(void *_ts) | |||
207 | struct ucb1x00_ts *ts = _ts; | 207 | struct ucb1x00_ts *ts = _ts; |
208 | struct task_struct *tsk = current; | 208 | struct task_struct *tsk = current; |
209 | DECLARE_WAITQUEUE(wait, tsk); | 209 | DECLARE_WAITQUEUE(wait, tsk); |
210 | int valid; | 210 | int valid = 0; |
211 | |||
212 | /* | ||
213 | * We could run as a real-time thread. However, thus far | ||
214 | * this doesn't seem to be necessary. | ||
215 | */ | ||
216 | // tsk->policy = SCHED_FIFO; | ||
217 | // tsk->rt_priority = 1; | ||
218 | |||
219 | valid = 0; | ||
220 | 211 | ||
221 | add_wait_queue(&ts->irq_wait, &wait); | 212 | add_wait_queue(&ts->irq_wait, &wait); |
222 | while (!kthread_should_stop()) { | 213 | while (!kthread_should_stop()) { |
diff --git a/drivers/misc/phantom.c b/drivers/misc/phantom.c index 35b139b0e5f2..5108b7c576df 100644 --- a/drivers/misc/phantom.c +++ b/drivers/misc/phantom.c | |||
@@ -47,6 +47,7 @@ struct phantom_device { | |||
47 | struct cdev cdev; | 47 | struct cdev cdev; |
48 | 48 | ||
49 | struct mutex open_lock; | 49 | struct mutex open_lock; |
50 | spinlock_t ioctl_lock; | ||
50 | }; | 51 | }; |
51 | 52 | ||
52 | static unsigned char phantom_devices[PHANTOM_MAX_MINORS]; | 53 | static unsigned char phantom_devices[PHANTOM_MAX_MINORS]; |
@@ -59,8 +60,11 @@ static int phantom_status(struct phantom_device *dev, unsigned long newstat) | |||
59 | atomic_set(&dev->counter, 0); | 60 | atomic_set(&dev->counter, 0); |
60 | iowrite32(PHN_CTL_IRQ, dev->iaddr + PHN_CONTROL); | 61 | iowrite32(PHN_CTL_IRQ, dev->iaddr + PHN_CONTROL); |
61 | iowrite32(0x43, dev->caddr + PHN_IRQCTL); | 62 | iowrite32(0x43, dev->caddr + PHN_IRQCTL); |
62 | } else if ((dev->status & PHB_RUNNING) && !(newstat & PHB_RUNNING)) | 63 | ioread32(dev->caddr + PHN_IRQCTL); /* PCI posting */ |
64 | } else if ((dev->status & PHB_RUNNING) && !(newstat & PHB_RUNNING)) { | ||
63 | iowrite32(0, dev->caddr + PHN_IRQCTL); | 65 | iowrite32(0, dev->caddr + PHN_IRQCTL); |
66 | ioread32(dev->caddr + PHN_IRQCTL); /* PCI posting */ | ||
67 | } | ||
64 | 68 | ||
65 | dev->status = newstat; | 69 | dev->status = newstat; |
66 | 70 | ||
@@ -71,8 +75,8 @@ static int phantom_status(struct phantom_device *dev, unsigned long newstat) | |||
71 | * File ops | 75 | * File ops |
72 | */ | 76 | */ |
73 | 77 | ||
74 | static int phantom_ioctl(struct inode *inode, struct file *file, u_int cmd, | 78 | static long phantom_ioctl(struct file *file, unsigned int cmd, |
75 | u_long arg) | 79 | unsigned long arg) |
76 | { | 80 | { |
77 | struct phantom_device *dev = file->private_data; | 81 | struct phantom_device *dev = file->private_data; |
78 | struct phm_regs rs; | 82 | struct phm_regs rs; |
@@ -92,24 +96,32 @@ static int phantom_ioctl(struct inode *inode, struct file *file, u_int cmd, | |||
92 | if (r.reg > 7) | 96 | if (r.reg > 7) |
93 | return -EINVAL; | 97 | return -EINVAL; |
94 | 98 | ||
99 | spin_lock(&dev->ioctl_lock); | ||
95 | if (r.reg == PHN_CONTROL && (r.value & PHN_CTL_IRQ) && | 100 | if (r.reg == PHN_CONTROL && (r.value & PHN_CTL_IRQ) && |
96 | phantom_status(dev, dev->status | PHB_RUNNING)) | 101 | phantom_status(dev, dev->status | PHB_RUNNING)){ |
102 | spin_unlock(&dev->ioctl_lock); | ||
97 | return -ENODEV; | 103 | return -ENODEV; |
104 | } | ||
98 | 105 | ||
99 | pr_debug("phantom: writing %x to %u\n", r.value, r.reg); | 106 | pr_debug("phantom: writing %x to %u\n", r.value, r.reg); |
100 | iowrite32(r.value, dev->iaddr + r.reg); | 107 | iowrite32(r.value, dev->iaddr + r.reg); |
108 | ioread32(dev->iaddr); /* PCI posting */ | ||
101 | 109 | ||
102 | if (r.reg == PHN_CONTROL && !(r.value & PHN_CTL_IRQ)) | 110 | if (r.reg == PHN_CONTROL && !(r.value & PHN_CTL_IRQ)) |
103 | phantom_status(dev, dev->status & ~PHB_RUNNING); | 111 | phantom_status(dev, dev->status & ~PHB_RUNNING); |
112 | spin_unlock(&dev->ioctl_lock); | ||
104 | break; | 113 | break; |
105 | case PHN_SET_REGS: | 114 | case PHN_SET_REGS: |
106 | if (copy_from_user(&rs, argp, sizeof(rs))) | 115 | if (copy_from_user(&rs, argp, sizeof(rs))) |
107 | return -EFAULT; | 116 | return -EFAULT; |
108 | 117 | ||
109 | pr_debug("phantom: SRS %u regs %x\n", rs.count, rs.mask); | 118 | pr_debug("phantom: SRS %u regs %x\n", rs.count, rs.mask); |
119 | spin_lock(&dev->ioctl_lock); | ||
110 | for (i = 0; i < min(rs.count, 8U); i++) | 120 | for (i = 0; i < min(rs.count, 8U); i++) |
111 | if ((1 << i) & rs.mask) | 121 | if ((1 << i) & rs.mask) |
112 | iowrite32(rs.values[i], dev->oaddr + i); | 122 | iowrite32(rs.values[i], dev->oaddr + i); |
123 | ioread32(dev->iaddr); /* PCI posting */ | ||
124 | spin_unlock(&dev->ioctl_lock); | ||
113 | break; | 125 | break; |
114 | case PHN_GET_REG: | 126 | case PHN_GET_REG: |
115 | if (copy_from_user(&r, argp, sizeof(r))) | 127 | if (copy_from_user(&r, argp, sizeof(r))) |
@@ -128,9 +140,11 @@ static int phantom_ioctl(struct inode *inode, struct file *file, u_int cmd, | |||
128 | return -EFAULT; | 140 | return -EFAULT; |
129 | 141 | ||
130 | pr_debug("phantom: GRS %u regs %x\n", rs.count, rs.mask); | 142 | pr_debug("phantom: GRS %u regs %x\n", rs.count, rs.mask); |
143 | spin_lock(&dev->ioctl_lock); | ||
131 | for (i = 0; i < min(rs.count, 8U); i++) | 144 | for (i = 0; i < min(rs.count, 8U); i++) |
132 | if ((1 << i) & rs.mask) | 145 | if ((1 << i) & rs.mask) |
133 | rs.values[i] = ioread32(dev->iaddr + i); | 146 | rs.values[i] = ioread32(dev->iaddr + i); |
147 | spin_unlock(&dev->ioctl_lock); | ||
134 | 148 | ||
135 | if (copy_to_user(argp, &rs, sizeof(rs))) | 149 | if (copy_to_user(argp, &rs, sizeof(rs))) |
136 | return -EFAULT; | 150 | return -EFAULT; |
@@ -199,7 +213,7 @@ static unsigned int phantom_poll(struct file *file, poll_table *wait) | |||
199 | static struct file_operations phantom_file_ops = { | 213 | static struct file_operations phantom_file_ops = { |
200 | .open = phantom_open, | 214 | .open = phantom_open, |
201 | .release = phantom_release, | 215 | .release = phantom_release, |
202 | .ioctl = phantom_ioctl, | 216 | .unlocked_ioctl = phantom_ioctl, |
203 | .poll = phantom_poll, | 217 | .poll = phantom_poll, |
204 | }; | 218 | }; |
205 | 219 | ||
@@ -212,6 +226,7 @@ static irqreturn_t phantom_isr(int irq, void *data) | |||
212 | 226 | ||
213 | iowrite32(0, dev->iaddr); | 227 | iowrite32(0, dev->iaddr); |
214 | iowrite32(0xc0, dev->iaddr); | 228 | iowrite32(0xc0, dev->iaddr); |
229 | ioread32(dev->iaddr); /* PCI posting */ | ||
215 | 230 | ||
216 | atomic_inc(&dev->counter); | 231 | atomic_inc(&dev->counter); |
217 | wake_up_interruptible(&dev->wait); | 232 | wake_up_interruptible(&dev->wait); |
@@ -282,11 +297,13 @@ static int __devinit phantom_probe(struct pci_dev *pdev, | |||
282 | } | 297 | } |
283 | 298 | ||
284 | mutex_init(&pht->open_lock); | 299 | mutex_init(&pht->open_lock); |
300 | spin_lock_init(&pht->ioctl_lock); | ||
285 | init_waitqueue_head(&pht->wait); | 301 | init_waitqueue_head(&pht->wait); |
286 | cdev_init(&pht->cdev, &phantom_file_ops); | 302 | cdev_init(&pht->cdev, &phantom_file_ops); |
287 | pht->cdev.owner = THIS_MODULE; | 303 | pht->cdev.owner = THIS_MODULE; |
288 | 304 | ||
289 | iowrite32(0, pht->caddr + PHN_IRQCTL); | 305 | iowrite32(0, pht->caddr + PHN_IRQCTL); |
306 | ioread32(pht->caddr + PHN_IRQCTL); /* PCI posting */ | ||
290 | retval = request_irq(pdev->irq, phantom_isr, | 307 | retval = request_irq(pdev->irq, phantom_isr, |
291 | IRQF_SHARED | IRQF_DISABLED, "phantom", pht); | 308 | IRQF_SHARED | IRQF_DISABLED, "phantom", pht); |
292 | if (retval) { | 309 | if (retval) { |
@@ -337,6 +354,7 @@ static void __devexit phantom_remove(struct pci_dev *pdev) | |||
337 | cdev_del(&pht->cdev); | 354 | cdev_del(&pht->cdev); |
338 | 355 | ||
339 | iowrite32(0, pht->caddr + PHN_IRQCTL); | 356 | iowrite32(0, pht->caddr + PHN_IRQCTL); |
357 | ioread32(pht->caddr + PHN_IRQCTL); /* PCI posting */ | ||
340 | free_irq(pdev->irq, pht); | 358 | free_irq(pdev->irq, pht); |
341 | 359 | ||
342 | pci_iounmap(pdev, pht->oaddr); | 360 | pci_iounmap(pdev, pht->oaddr); |
@@ -358,6 +376,7 @@ static int phantom_suspend(struct pci_dev *pdev, pm_message_t state) | |||
358 | struct phantom_device *dev = pci_get_drvdata(pdev); | 376 | struct phantom_device *dev = pci_get_drvdata(pdev); |
359 | 377 | ||
360 | iowrite32(0, dev->caddr + PHN_IRQCTL); | 378 | iowrite32(0, dev->caddr + PHN_IRQCTL); |
379 | ioread32(dev->caddr + PHN_IRQCTL); /* PCI posting */ | ||
361 | 380 | ||
362 | return 0; | 381 | return 0; |
363 | } | 382 | } |
diff --git a/drivers/mmc/card/block.c b/drivers/mmc/card/block.c index a7562f7fc0b3..540ff4bea54c 100644 --- a/drivers/mmc/card/block.c +++ b/drivers/mmc/card/block.c | |||
@@ -135,23 +135,6 @@ struct mmc_blk_request { | |||
135 | struct mmc_data data; | 135 | struct mmc_data data; |
136 | }; | 136 | }; |
137 | 137 | ||
138 | static int mmc_blk_prep_rq(struct mmc_queue *mq, struct request *req) | ||
139 | { | ||
140 | struct mmc_blk_data *md = mq->data; | ||
141 | int stat = BLKPREP_OK; | ||
142 | |||
143 | /* | ||
144 | * If we have no device, we haven't finished initialising. | ||
145 | */ | ||
146 | if (!md || !mq->card) { | ||
147 | printk(KERN_ERR "%s: killing request - no device/host\n", | ||
148 | req->rq_disk->disk_name); | ||
149 | stat = BLKPREP_KILL; | ||
150 | } | ||
151 | |||
152 | return stat; | ||
153 | } | ||
154 | |||
155 | static u32 mmc_sd_num_wr_blocks(struct mmc_card *card) | 138 | static u32 mmc_sd_num_wr_blocks(struct mmc_card *card) |
156 | { | 139 | { |
157 | int err; | 140 | int err; |
@@ -460,7 +443,6 @@ static struct mmc_blk_data *mmc_blk_alloc(struct mmc_card *card) | |||
460 | if (ret) | 443 | if (ret) |
461 | goto err_putdisk; | 444 | goto err_putdisk; |
462 | 445 | ||
463 | md->queue.prep_fn = mmc_blk_prep_rq; | ||
464 | md->queue.issue_fn = mmc_blk_issue_rq; | 446 | md->queue.issue_fn = mmc_blk_issue_rq; |
465 | md->queue.data = md; | 447 | md->queue.data = md; |
466 | 448 | ||
diff --git a/drivers/mmc/card/queue.c b/drivers/mmc/card/queue.c index 2e77963db334..dd97bc798409 100644 --- a/drivers/mmc/card/queue.c +++ b/drivers/mmc/card/queue.c | |||
@@ -20,40 +20,21 @@ | |||
20 | #define MMC_QUEUE_SUSPENDED (1 << 0) | 20 | #define MMC_QUEUE_SUSPENDED (1 << 0) |
21 | 21 | ||
22 | /* | 22 | /* |
23 | * Prepare a MMC request. Essentially, this means passing the | 23 | * Prepare a MMC request. This just filters out odd stuff. |
24 | * preparation off to the media driver. The media driver will | ||
25 | * create a mmc_io_request in req->special. | ||
26 | */ | 24 | */ |
27 | static int mmc_prep_request(struct request_queue *q, struct request *req) | 25 | static int mmc_prep_request(struct request_queue *q, struct request *req) |
28 | { | 26 | { |
29 | struct mmc_queue *mq = q->queuedata; | 27 | /* |
30 | int ret = BLKPREP_KILL; | 28 | * We only like normal block requests. |
31 | 29 | */ | |
32 | if (blk_special_request(req)) { | 30 | if (!blk_fs_request(req) && !blk_pc_request(req)) { |
33 | /* | ||
34 | * Special commands already have the command | ||
35 | * blocks already setup in req->special. | ||
36 | */ | ||
37 | BUG_ON(!req->special); | ||
38 | |||
39 | ret = BLKPREP_OK; | ||
40 | } else if (blk_fs_request(req) || blk_pc_request(req)) { | ||
41 | /* | ||
42 | * Block I/O requests need translating according | ||
43 | * to the protocol. | ||
44 | */ | ||
45 | ret = mq->prep_fn(mq, req); | ||
46 | } else { | ||
47 | /* | ||
48 | * Everything else is invalid. | ||
49 | */ | ||
50 | blk_dump_rq_flags(req, "MMC bad request"); | 31 | blk_dump_rq_flags(req, "MMC bad request"); |
32 | return BLKPREP_KILL; | ||
51 | } | 33 | } |
52 | 34 | ||
53 | if (ret == BLKPREP_OK) | 35 | req->cmd_flags |= REQ_DONTPREP; |
54 | req->cmd_flags |= REQ_DONTPREP; | ||
55 | 36 | ||
56 | return ret; | 37 | return BLKPREP_OK; |
57 | } | 38 | } |
58 | 39 | ||
59 | static int mmc_queue_thread(void *d) | 40 | static int mmc_queue_thread(void *d) |
diff --git a/drivers/mmc/card/queue.h b/drivers/mmc/card/queue.h index c9f139e764f6..1590b3f3f1f7 100644 --- a/drivers/mmc/card/queue.h +++ b/drivers/mmc/card/queue.h | |||
@@ -10,20 +10,12 @@ struct mmc_queue { | |||
10 | struct semaphore thread_sem; | 10 | struct semaphore thread_sem; |
11 | unsigned int flags; | 11 | unsigned int flags; |
12 | struct request *req; | 12 | struct request *req; |
13 | int (*prep_fn)(struct mmc_queue *, struct request *); | ||
14 | int (*issue_fn)(struct mmc_queue *, struct request *); | 13 | int (*issue_fn)(struct mmc_queue *, struct request *); |
15 | void *data; | 14 | void *data; |
16 | struct request_queue *queue; | 15 | struct request_queue *queue; |
17 | struct scatterlist *sg; | 16 | struct scatterlist *sg; |
18 | }; | 17 | }; |
19 | 18 | ||
20 | struct mmc_io_request { | ||
21 | struct request *rq; | ||
22 | int num; | ||
23 | struct mmc_command selcmd; /* mmc_queue private */ | ||
24 | struct mmc_command cmd[4]; /* max 4 commands */ | ||
25 | }; | ||
26 | |||
27 | extern int mmc_init_queue(struct mmc_queue *, struct mmc_card *, spinlock_t *); | 19 | extern int mmc_init_queue(struct mmc_queue *, struct mmc_card *, spinlock_t *); |
28 | extern void mmc_cleanup_queue(struct mmc_queue *); | 20 | extern void mmc_cleanup_queue(struct mmc_queue *); |
29 | extern void mmc_queue_suspend(struct mmc_queue *); | 21 | extern void mmc_queue_suspend(struct mmc_queue *); |
diff --git a/drivers/net/Kconfig b/drivers/net/Kconfig index 3b204bac1a1d..1798a9f9fb25 100644 --- a/drivers/net/Kconfig +++ b/drivers/net/Kconfig | |||
@@ -2218,7 +2218,7 @@ config SK98LIN | |||
2218 | 2218 | ||
2219 | config VIA_VELOCITY | 2219 | config VIA_VELOCITY |
2220 | tristate "VIA Velocity support" | 2220 | tristate "VIA Velocity support" |
2221 | depends on NET_PCI && PCI | 2221 | depends on PCI |
2222 | select CRC32 | 2222 | select CRC32 |
2223 | select CRC_CCITT | 2223 | select CRC_CCITT |
2224 | select MII | 2224 | select MII |
diff --git a/drivers/net/arcnet/Kconfig b/drivers/net/arcnet/Kconfig index 7284ccad0b91..4030274fe788 100644 --- a/drivers/net/arcnet/Kconfig +++ b/drivers/net/arcnet/Kconfig | |||
@@ -2,10 +2,8 @@ | |||
2 | # Arcnet configuration | 2 | # Arcnet configuration |
3 | # | 3 | # |
4 | 4 | ||
5 | menu "ARCnet devices" | 5 | menuconfig ARCNET |
6 | depends on NETDEVICES && (ISA || PCI) | 6 | depends on NETDEVICES && (ISA || PCI) |
7 | |||
8 | config ARCNET | ||
9 | tristate "ARCnet support" | 7 | tristate "ARCnet support" |
10 | ---help--- | 8 | ---help--- |
11 | If you have a network card of this type, say Y and check out the | 9 | If you have a network card of this type, say Y and check out the |
@@ -25,9 +23,10 @@ config ARCNET | |||
25 | <file:Documentation/networking/net-modules.txt>. The module will | 23 | <file:Documentation/networking/net-modules.txt>. The module will |
26 | be called arcnet. | 24 | be called arcnet. |
27 | 25 | ||
26 | if ARCNET | ||
27 | |||
28 | config ARCNET_1201 | 28 | config ARCNET_1201 |
29 | tristate "Enable standard ARCNet packet format (RFC 1201)" | 29 | tristate "Enable standard ARCNet packet format (RFC 1201)" |
30 | depends on ARCNET | ||
31 | help | 30 | help |
32 | This allows you to use RFC1201 with your ARCnet card via the virtual | 31 | This allows you to use RFC1201 with your ARCnet card via the virtual |
33 | arc0 device. You need to say Y here to communicate with | 32 | arc0 device. You need to say Y here to communicate with |
@@ -38,7 +37,6 @@ config ARCNET_1201 | |||
38 | 37 | ||
39 | config ARCNET_1051 | 38 | config ARCNET_1051 |
40 | tristate "Enable old ARCNet packet format (RFC 1051)" | 39 | tristate "Enable old ARCNet packet format (RFC 1051)" |
41 | depends on ARCNET | ||
42 | ---help--- | 40 | ---help--- |
43 | This allows you to use RFC1051 with your ARCnet card via the virtual | 41 | This allows you to use RFC1051 with your ARCnet card via the virtual |
44 | arc0s device. You only need arc0s if you want to talk to ARCnet | 42 | arc0s device. You only need arc0s if you want to talk to ARCnet |
@@ -53,7 +51,6 @@ config ARCNET_1051 | |||
53 | 51 | ||
54 | config ARCNET_RAW | 52 | config ARCNET_RAW |
55 | tristate "Enable raw mode packet interface" | 53 | tristate "Enable raw mode packet interface" |
56 | depends on ARCNET | ||
57 | help | 54 | help |
58 | ARCnet "raw mode" packet encapsulation, no soft headers. Unlikely | 55 | ARCnet "raw mode" packet encapsulation, no soft headers. Unlikely |
59 | to work unless talking to a copy of the same Linux arcnet driver, | 56 | to work unless talking to a copy of the same Linux arcnet driver, |
@@ -61,7 +58,6 @@ config ARCNET_RAW | |||
61 | 58 | ||
62 | config ARCNET_CAP | 59 | config ARCNET_CAP |
63 | tristate "Enable CAP mode packet interface" | 60 | tristate "Enable CAP mode packet interface" |
64 | depends on ARCNET | ||
65 | help | 61 | help |
66 | ARCnet "cap mode" packet encapsulation. Used to get the hardware | 62 | ARCnet "cap mode" packet encapsulation. Used to get the hardware |
67 | acknowledge back to userspace. After the initial protocol byte every | 63 | acknowledge back to userspace. After the initial protocol byte every |
@@ -80,7 +76,6 @@ config ARCNET_CAP | |||
80 | 76 | ||
81 | config ARCNET_COM90xx | 77 | config ARCNET_COM90xx |
82 | tristate "ARCnet COM90xx (normal) chipset driver" | 78 | tristate "ARCnet COM90xx (normal) chipset driver" |
83 | depends on ARCNET | ||
84 | help | 79 | help |
85 | This is the chipset driver for the standard COM90xx cards. If you | 80 | This is the chipset driver for the standard COM90xx cards. If you |
86 | have always used the old ARCnet driver without knowing what type of | 81 | have always used the old ARCnet driver without knowing what type of |
@@ -92,7 +87,6 @@ config ARCNET_COM90xx | |||
92 | 87 | ||
93 | config ARCNET_COM90xxIO | 88 | config ARCNET_COM90xxIO |
94 | tristate "ARCnet COM90xx (IO mapped) chipset driver" | 89 | tristate "ARCnet COM90xx (IO mapped) chipset driver" |
95 | depends on ARCNET | ||
96 | ---help--- | 90 | ---help--- |
97 | This is the chipset driver for the COM90xx cards, using them in | 91 | This is the chipset driver for the COM90xx cards, using them in |
98 | IO-mapped mode instead of memory-mapped mode. This is slower than | 92 | IO-mapped mode instead of memory-mapped mode. This is slower than |
@@ -105,7 +99,6 @@ config ARCNET_COM90xxIO | |||
105 | 99 | ||
106 | config ARCNET_RIM_I | 100 | config ARCNET_RIM_I |
107 | tristate "ARCnet COM90xx (RIM I) chipset driver" | 101 | tristate "ARCnet COM90xx (RIM I) chipset driver" |
108 | depends on ARCNET | ||
109 | ---help--- | 102 | ---help--- |
110 | This is yet another chipset driver for the COM90xx cards, but this | 103 | This is yet another chipset driver for the COM90xx cards, but this |
111 | time only using memory-mapped mode, and no IO ports at all. This | 104 | time only using memory-mapped mode, and no IO ports at all. This |
@@ -118,7 +111,6 @@ config ARCNET_RIM_I | |||
118 | 111 | ||
119 | config ARCNET_COM20020 | 112 | config ARCNET_COM20020 |
120 | tristate "ARCnet COM20020 chipset driver" | 113 | tristate "ARCnet COM20020 chipset driver" |
121 | depends on ARCNET | ||
122 | help | 114 | help |
123 | This is the driver for the new COM20020 chipset. It supports such | 115 | This is the driver for the new COM20020 chipset. It supports such |
124 | things as promiscuous mode, so packet sniffing is possible, and | 116 | things as promiscuous mode, so packet sniffing is possible, and |
@@ -136,5 +128,4 @@ config ARCNET_COM20020_PCI | |||
136 | tristate "Support for COM20020 on PCI" | 128 | tristate "Support for COM20020 on PCI" |
137 | depends on ARCNET_COM20020 && PCI | 129 | depends on ARCNET_COM20020 && PCI |
138 | 130 | ||
139 | endmenu | 131 | endif # ARCNET |
140 | |||
diff --git a/drivers/net/cassini.c b/drivers/net/cassini.c index 4aec747d9e43..9fe3a38883ee 100644 --- a/drivers/net/cassini.c +++ b/drivers/net/cassini.c | |||
@@ -4919,7 +4919,10 @@ static int __devinit cas_init_one(struct pci_dev *pdev, | |||
4919 | pci_cmd &= ~PCI_COMMAND_SERR; | 4919 | pci_cmd &= ~PCI_COMMAND_SERR; |
4920 | pci_cmd |= PCI_COMMAND_PARITY; | 4920 | pci_cmd |= PCI_COMMAND_PARITY; |
4921 | pci_write_config_word(pdev, PCI_COMMAND, pci_cmd); | 4921 | pci_write_config_word(pdev, PCI_COMMAND, pci_cmd); |
4922 | pci_set_mwi(pdev); | 4922 | if (pci_set_mwi(pdev)) |
4923 | printk(KERN_WARNING PFX "Could enable MWI for %s\n", | ||
4924 | pci_name(pdev)); | ||
4925 | |||
4923 | /* | 4926 | /* |
4924 | * On some architectures, the default cache line size set | 4927 | * On some architectures, the default cache line size set |
4925 | * by pci_set_mwi reduces perforamnce. We have to increase | 4928 | * by pci_set_mwi reduces perforamnce. We have to increase |
diff --git a/drivers/net/chelsio/suni1x10gexp_regs.h b/drivers/net/chelsio/suni1x10gexp_regs.h index 269d097dd927..d0f87d82566a 100644 --- a/drivers/net/chelsio/suni1x10gexp_regs.h +++ b/drivers/net/chelsio/suni1x10gexp_regs.h | |||
@@ -105,7 +105,7 @@ | |||
105 | #define mSUNI1x10GEXP_REG_RXXG_EXACT_MATCH_ADDR_LOW(filterId) (0x204A + mSUNI1x10GEXP_MAC_FILTER_OFFSET(filterId)) | 105 | #define mSUNI1x10GEXP_REG_RXXG_EXACT_MATCH_ADDR_LOW(filterId) (0x204A + mSUNI1x10GEXP_MAC_FILTER_OFFSET(filterId)) |
106 | #define mSUNI1x10GEXP_REG_RXXG_EXACT_MATCH_ADDR_MID(filterId) (0x204B + mSUNI1x10GEXP_MAC_FILTER_OFFSET(filterId)) | 106 | #define mSUNI1x10GEXP_REG_RXXG_EXACT_MATCH_ADDR_MID(filterId) (0x204B + mSUNI1x10GEXP_MAC_FILTER_OFFSET(filterId)) |
107 | #define mSUNI1x10GEXP_REG_RXXG_EXACT_MATCH_ADDR_HIGH(filterId)(0x204C + mSUNI1x10GEXP_MAC_FILTER_OFFSET(filterId)) | 107 | #define mSUNI1x10GEXP_REG_RXXG_EXACT_MATCH_ADDR_HIGH(filterId)(0x204C + mSUNI1x10GEXP_MAC_FILTER_OFFSET(filterId)) |
108 | #define mSUNI1x10GEXP_REG_RXXG_EXACT_MATCH_VID(filterId) (0x2062 + mSUNI1x10GEXP_MAC_VID_FILTER_OFFSET(filterId) | 108 | #define mSUNI1x10GEXP_REG_RXXG_EXACT_MATCH_VID(filterId) (0x2062 + mSUNI1x10GEXP_MAC_VID_FILTER_OFFSET(filterId)) |
109 | #define SUNI1x10GEXP_REG_RXXG_EXACT_MATCH_ADDR_0_LOW 0x204A | 109 | #define SUNI1x10GEXP_REG_RXXG_EXACT_MATCH_ADDR_0_LOW 0x204A |
110 | #define SUNI1x10GEXP_REG_RXXG_EXACT_MATCH_ADDR_0_MID 0x204B | 110 | #define SUNI1x10GEXP_REG_RXXG_EXACT_MATCH_ADDR_0_MID 0x204B |
111 | #define SUNI1x10GEXP_REG_RXXG_EXACT_MATCH_ADDR_0_HIGH 0x204C | 111 | #define SUNI1x10GEXP_REG_RXXG_EXACT_MATCH_ADDR_0_HIGH 0x204C |
diff --git a/drivers/net/forcedeth.c b/drivers/net/forcedeth.c index 7a018027fcc0..4154fd000746 100644 --- a/drivers/net/forcedeth.c +++ b/drivers/net/forcedeth.c | |||
@@ -195,7 +195,7 @@ enum { | |||
195 | #define NVREG_IRQ_TX_FORCED 0x0100 | 195 | #define NVREG_IRQ_TX_FORCED 0x0100 |
196 | #define NVREG_IRQ_RECOVER_ERROR 0x8000 | 196 | #define NVREG_IRQ_RECOVER_ERROR 0x8000 |
197 | #define NVREG_IRQMASK_THROUGHPUT 0x00df | 197 | #define NVREG_IRQMASK_THROUGHPUT 0x00df |
198 | #define NVREG_IRQMASK_CPU 0x0040 | 198 | #define NVREG_IRQMASK_CPU 0x0060 |
199 | #define NVREG_IRQ_TX_ALL (NVREG_IRQ_TX_ERR|NVREG_IRQ_TX_OK|NVREG_IRQ_TX_FORCED) | 199 | #define NVREG_IRQ_TX_ALL (NVREG_IRQ_TX_ERR|NVREG_IRQ_TX_OK|NVREG_IRQ_TX_FORCED) |
200 | #define NVREG_IRQ_RX_ALL (NVREG_IRQ_RX_ERROR|NVREG_IRQ_RX|NVREG_IRQ_RX_NOBUF|NVREG_IRQ_RX_FORCED) | 200 | #define NVREG_IRQ_RX_ALL (NVREG_IRQ_RX_ERROR|NVREG_IRQ_RX|NVREG_IRQ_RX_NOBUF|NVREG_IRQ_RX_FORCED) |
201 | #define NVREG_IRQ_OTHER (NVREG_IRQ_TIMER|NVREG_IRQ_LINK|NVREG_IRQ_RECOVER_ERROR) | 201 | #define NVREG_IRQ_OTHER (NVREG_IRQ_TIMER|NVREG_IRQ_LINK|NVREG_IRQ_RECOVER_ERROR) |
diff --git a/drivers/net/meth.c b/drivers/net/meth.c index 0343ea12b299..92b403bf38b0 100644 --- a/drivers/net/meth.c +++ b/drivers/net/meth.c | |||
@@ -8,15 +8,16 @@ | |||
8 | * as published by the Free Software Foundation; either version | 8 | * as published by the Free Software Foundation; either version |
9 | * 2 of the License, or (at your option) any later version. | 9 | * 2 of the License, or (at your option) any later version. |
10 | */ | 10 | */ |
11 | #include <linux/module.h> | ||
12 | #include <linux/init.h> | ||
13 | |||
14 | #include <linux/kernel.h> /* printk() */ | ||
15 | #include <linux/delay.h> | 11 | #include <linux/delay.h> |
12 | #include <linux/dma-mapping.h> | ||
13 | #include <linux/init.h> | ||
14 | #include <linux/kernel.h> | ||
15 | #include <linux/module.h> | ||
16 | #include <linux/platform_device.h> | ||
16 | #include <linux/slab.h> | 17 | #include <linux/slab.h> |
17 | #include <linux/errno.h> /* error codes */ | 18 | #include <linux/errno.h> |
18 | #include <linux/types.h> /* size_t */ | 19 | #include <linux/types.h> |
19 | #include <linux/interrupt.h> /* mark_bh */ | 20 | #include <linux/interrupt.h> |
20 | 21 | ||
21 | #include <linux/in.h> | 22 | #include <linux/in.h> |
22 | #include <linux/in6.h> | 23 | #include <linux/in6.h> |
@@ -33,7 +34,6 @@ | |||
33 | 34 | ||
34 | #include <asm/io.h> | 35 | #include <asm/io.h> |
35 | #include <asm/scatterlist.h> | 36 | #include <asm/scatterlist.h> |
36 | #include <linux/dma-mapping.h> | ||
37 | 37 | ||
38 | #include "meth.h" | 38 | #include "meth.h" |
39 | 39 | ||
@@ -51,8 +51,6 @@ | |||
51 | 51 | ||
52 | 52 | ||
53 | static const char *meth_str="SGI O2 Fast Ethernet"; | 53 | static const char *meth_str="SGI O2 Fast Ethernet"; |
54 | MODULE_AUTHOR("Ilya Volynets <ilya@theIlya.com>"); | ||
55 | MODULE_DESCRIPTION("SGI O2 Builtin Fast Ethernet driver"); | ||
56 | 54 | ||
57 | #define HAVE_TX_TIMEOUT | 55 | #define HAVE_TX_TIMEOUT |
58 | /* The maximum time waited (in jiffies) before assuming a Tx failed. (400ms) */ | 56 | /* The maximum time waited (in jiffies) before assuming a Tx failed. (400ms) */ |
@@ -784,15 +782,15 @@ static struct net_device_stats *meth_stats(struct net_device *dev) | |||
784 | /* | 782 | /* |
785 | * The init function. | 783 | * The init function. |
786 | */ | 784 | */ |
787 | static struct net_device *meth_init(void) | 785 | static int __init meth_probe(struct platform_device *pdev) |
788 | { | 786 | { |
789 | struct net_device *dev; | 787 | struct net_device *dev; |
790 | struct meth_private *priv; | 788 | struct meth_private *priv; |
791 | int ret; | 789 | int err; |
792 | 790 | ||
793 | dev = alloc_etherdev(sizeof(struct meth_private)); | 791 | dev = alloc_etherdev(sizeof(struct meth_private)); |
794 | if (!dev) | 792 | if (!dev) |
795 | return ERR_PTR(-ENOMEM); | 793 | return -ENOMEM; |
796 | 794 | ||
797 | dev->open = meth_open; | 795 | dev->open = meth_open; |
798 | dev->stop = meth_release; | 796 | dev->stop = meth_release; |
@@ -808,11 +806,12 @@ static struct net_device *meth_init(void) | |||
808 | 806 | ||
809 | priv = netdev_priv(dev); | 807 | priv = netdev_priv(dev); |
810 | spin_lock_init(&priv->meth_lock); | 808 | spin_lock_init(&priv->meth_lock); |
809 | SET_NETDEV_DEV(dev, &pdev->dev); | ||
811 | 810 | ||
812 | ret = register_netdev(dev); | 811 | err = register_netdev(dev); |
813 | if (ret) { | 812 | if (err) { |
814 | free_netdev(dev); | 813 | free_netdev(dev); |
815 | return ERR_PTR(ret); | 814 | return err; |
816 | } | 815 | } |
817 | 816 | ||
818 | printk(KERN_INFO "%s: SGI MACE Ethernet rev. %d\n", | 817 | printk(KERN_INFO "%s: SGI MACE Ethernet rev. %d\n", |
@@ -820,21 +819,44 @@ static struct net_device *meth_init(void) | |||
820 | return 0; | 819 | return 0; |
821 | } | 820 | } |
822 | 821 | ||
823 | static struct net_device *meth_dev; | 822 | static int __exit meth_remove(struct platform_device *pdev) |
823 | { | ||
824 | struct net_device *dev = platform_get_drvdata(pdev); | ||
825 | |||
826 | unregister_netdev(dev); | ||
827 | free_netdev(dev); | ||
828 | platform_set_drvdata(pdev, NULL); | ||
829 | |||
830 | return 0; | ||
831 | } | ||
832 | |||
833 | static struct platform_driver meth_driver = { | ||
834 | .probe = meth_probe, | ||
835 | .remove = __devexit_p(meth_remove), | ||
836 | .driver = { | ||
837 | .name = "meth", | ||
838 | } | ||
839 | }; | ||
824 | 840 | ||
825 | static int __init meth_init_module(void) | 841 | static int __init meth_init_module(void) |
826 | { | 842 | { |
827 | meth_dev = meth_init(); | 843 | int err; |
828 | if (IS_ERR(meth_dev)) | 844 | |
829 | return PTR_ERR(meth_dev); | 845 | err = platform_driver_register(&meth_driver); |
830 | return 0; | 846 | if (err) |
847 | printk(KERN_ERR "Driver registration failed\n"); | ||
848 | |||
849 | return err; | ||
831 | } | 850 | } |
832 | 851 | ||
833 | static void __exit meth_exit_module(void) | 852 | static void __exit meth_exit_module(void) |
834 | { | 853 | { |
835 | unregister_netdev(meth_dev); | 854 | platform_driver_unregister(&meth_driver); |
836 | free_netdev(meth_dev); | ||
837 | } | 855 | } |
838 | 856 | ||
839 | module_init(meth_init_module); | 857 | module_init(meth_init_module); |
840 | module_exit(meth_exit_module); | 858 | module_exit(meth_exit_module); |
859 | |||
860 | MODULE_AUTHOR("Ilya Volynets <ilya@theIlya.com>"); | ||
861 | MODULE_DESCRIPTION("SGI O2 Builtin Fast Ethernet driver"); | ||
862 | MODULE_LICENSE("GPL"); | ||
diff --git a/drivers/net/phy/fixed.c b/drivers/net/phy/fixed.c index 68c99b4c5255..bb966911a137 100644 --- a/drivers/net/phy/fixed.c +++ b/drivers/net/phy/fixed.c | |||
@@ -89,6 +89,7 @@ EXPORT_SYMBOL(fixed_mdio_set_link_update); | |||
89 | /*----------------------------------------------------------------------------- | 89 | /*----------------------------------------------------------------------------- |
90 | * This is used for updating internal mii regs from the status | 90 | * This is used for updating internal mii regs from the status |
91 | *-----------------------------------------------------------------------------*/ | 91 | *-----------------------------------------------------------------------------*/ |
92 | #if defined(CONFIG_FIXED_MII_100_FDX) || defined(CONFIG_FIXED_MII_10_FDX) | ||
92 | static int fixed_mdio_update_regs(struct fixed_info *fixed) | 93 | static int fixed_mdio_update_regs(struct fixed_info *fixed) |
93 | { | 94 | { |
94 | u16 *regs = fixed->regs; | 95 | u16 *regs = fixed->regs; |
@@ -165,6 +166,7 @@ static int fixed_mii_reset(struct mii_bus *bus) | |||
165 | /*nothing here - no way/need to reset it*/ | 166 | /*nothing here - no way/need to reset it*/ |
166 | return 0; | 167 | return 0; |
167 | } | 168 | } |
169 | #endif | ||
168 | 170 | ||
169 | static int fixed_config_aneg(struct phy_device *phydev) | 171 | static int fixed_config_aneg(struct phy_device *phydev) |
170 | { | 172 | { |
@@ -194,6 +196,7 @@ static struct phy_driver fixed_mdio_driver = { | |||
194 | * number is used to create multiple fixed PHYs, so that several devices can | 196 | * number is used to create multiple fixed PHYs, so that several devices can |
195 | * utilize them simultaneously. | 197 | * utilize them simultaneously. |
196 | *-----------------------------------------------------------------------------*/ | 198 | *-----------------------------------------------------------------------------*/ |
199 | #if defined(CONFIG_FIXED_MII_100_FDX) || defined(CONFIG_FIXED_MII_10_FDX) | ||
197 | static int fixed_mdio_register_device(int number, int speed, int duplex) | 200 | static int fixed_mdio_register_device(int number, int speed, int duplex) |
198 | { | 201 | { |
199 | struct mii_bus *new_bus; | 202 | struct mii_bus *new_bus; |
@@ -301,6 +304,7 @@ device_create_fail: | |||
301 | 304 | ||
302 | return err; | 305 | return err; |
303 | } | 306 | } |
307 | #endif | ||
304 | 308 | ||
305 | 309 | ||
306 | MODULE_DESCRIPTION("Fixed PHY device & driver for PAL"); | 310 | MODULE_DESCRIPTION("Fixed PHY device & driver for PAL"); |
diff --git a/drivers/net/spider_net.c b/drivers/net/spider_net.c index c3964c3d89d9..ef84d7c757a0 100644 --- a/drivers/net/spider_net.c +++ b/drivers/net/spider_net.c | |||
@@ -1014,12 +1014,12 @@ spider_net_pass_skb_up(struct spider_net_descr *descr, | |||
1014 | */ | 1014 | */ |
1015 | } | 1015 | } |
1016 | 1016 | ||
1017 | /* pass skb up to stack */ | ||
1018 | netif_receive_skb(skb); | ||
1019 | |||
1020 | /* update netdevice statistics */ | 1017 | /* update netdevice statistics */ |
1021 | card->netdev_stats.rx_packets++; | 1018 | card->netdev_stats.rx_packets++; |
1022 | card->netdev_stats.rx_bytes += skb->len; | 1019 | card->netdev_stats.rx_bytes += skb->len; |
1020 | |||
1021 | /* pass skb up to stack */ | ||
1022 | netif_receive_skb(skb); | ||
1023 | } | 1023 | } |
1024 | 1024 | ||
1025 | #ifdef DEBUG | 1025 | #ifdef DEBUG |
diff --git a/drivers/net/tokenring/Kconfig b/drivers/net/tokenring/Kconfig index 99c4c1922f19..e6b2e06493e7 100644 --- a/drivers/net/tokenring/Kconfig +++ b/drivers/net/tokenring/Kconfig | |||
@@ -2,12 +2,10 @@ | |||
2 | # Token Ring driver configuration | 2 | # Token Ring driver configuration |
3 | # | 3 | # |
4 | 4 | ||
5 | menu "Token Ring devices" | ||
6 | depends on NETDEVICES && !UML | ||
7 | |||
8 | # So far, we only have PCI, ISA, and MCA token ring devices | 5 | # So far, we only have PCI, ISA, and MCA token ring devices |
9 | config TR | 6 | menuconfig TR |
10 | bool "Token Ring driver support" | 7 | bool "Token Ring driver support" |
8 | depends on NETDEVICES && !UML | ||
11 | depends on (PCI || ISA || MCA || CCW) | 9 | depends on (PCI || ISA || MCA || CCW) |
12 | select LLC | 10 | select LLC |
13 | help | 11 | help |
@@ -20,9 +18,11 @@ config TR | |||
20 | from <http://www.tldp.org/docs.html#howto>. Most people can | 18 | from <http://www.tldp.org/docs.html#howto>. Most people can |
21 | say N here. | 19 | say N here. |
22 | 20 | ||
21 | if TR | ||
22 | |||
23 | config IBMTR | 23 | config IBMTR |
24 | tristate "IBM Tropic chipset based adapter support" | 24 | tristate "IBM Tropic chipset based adapter support" |
25 | depends on TR && (ISA || MCA) | 25 | depends on ISA || MCA |
26 | ---help--- | 26 | ---help--- |
27 | This is support for all IBM Token Ring cards that don't use DMA. If | 27 | This is support for all IBM Token Ring cards that don't use DMA. If |
28 | you have such a beast, say Y and read the Token-Ring mini-HOWTO, | 28 | you have such a beast, say Y and read the Token-Ring mini-HOWTO, |
@@ -36,7 +36,7 @@ config IBMTR | |||
36 | 36 | ||
37 | config IBMOL | 37 | config IBMOL |
38 | tristate "IBM Olympic chipset PCI adapter support" | 38 | tristate "IBM Olympic chipset PCI adapter support" |
39 | depends on TR && PCI | 39 | depends on PCI |
40 | ---help--- | 40 | ---help--- |
41 | This is support for all non-Lanstreamer IBM PCI Token Ring Cards. | 41 | This is support for all non-Lanstreamer IBM PCI Token Ring Cards. |
42 | Specifically this is all IBM PCI, PCI Wake On Lan, PCI II, PCI II | 42 | Specifically this is all IBM PCI, PCI Wake On Lan, PCI II, PCI II |
@@ -54,7 +54,7 @@ config IBMOL | |||
54 | 54 | ||
55 | config IBMLS | 55 | config IBMLS |
56 | tristate "IBM Lanstreamer chipset PCI adapter support" | 56 | tristate "IBM Lanstreamer chipset PCI adapter support" |
57 | depends on TR && PCI && !64BIT | 57 | depends on PCI && !64BIT |
58 | help | 58 | help |
59 | This is support for IBM Lanstreamer PCI Token Ring Cards. | 59 | This is support for IBM Lanstreamer PCI Token Ring Cards. |
60 | 60 | ||
@@ -66,7 +66,7 @@ config IBMLS | |||
66 | 66 | ||
67 | config 3C359 | 67 | config 3C359 |
68 | tristate "3Com 3C359 Token Link Velocity XL adapter support" | 68 | tristate "3Com 3C359 Token Link Velocity XL adapter support" |
69 | depends on TR && PCI | 69 | depends on PCI |
70 | ---help--- | 70 | ---help--- |
71 | This is support for the 3Com PCI Velocity XL cards, specifically | 71 | This is support for the 3Com PCI Velocity XL cards, specifically |
72 | the 3Com 3C359, please note this is not for the 3C339 cards, you | 72 | the 3Com 3C359, please note this is not for the 3C339 cards, you |
@@ -84,7 +84,7 @@ config 3C359 | |||
84 | 84 | ||
85 | config TMS380TR | 85 | config TMS380TR |
86 | tristate "Generic TMS380 Token Ring ISA/PCI adapter support" | 86 | tristate "Generic TMS380 Token Ring ISA/PCI adapter support" |
87 | depends on TR && (PCI || ISA && ISA_DMA_API || MCA) | 87 | depends on PCI || ISA && ISA_DMA_API || MCA |
88 | select FW_LOADER | 88 | select FW_LOADER |
89 | ---help--- | 89 | ---help--- |
90 | This driver provides generic support for token ring adapters | 90 | This driver provides generic support for token ring adapters |
@@ -108,7 +108,7 @@ config TMS380TR | |||
108 | 108 | ||
109 | config TMSPCI | 109 | config TMSPCI |
110 | tristate "Generic TMS380 PCI support" | 110 | tristate "Generic TMS380 PCI support" |
111 | depends on TR && TMS380TR && PCI | 111 | depends on TMS380TR && PCI |
112 | ---help--- | 112 | ---help--- |
113 | This tms380 module supports generic TMS380-based PCI cards. | 113 | This tms380 module supports generic TMS380-based PCI cards. |
114 | 114 | ||
@@ -123,7 +123,7 @@ config TMSPCI | |||
123 | 123 | ||
124 | config SKISA | 124 | config SKISA |
125 | tristate "SysKonnect TR4/16 ISA support" | 125 | tristate "SysKonnect TR4/16 ISA support" |
126 | depends on TR && TMS380TR && ISA | 126 | depends on TMS380TR && ISA |
127 | help | 127 | help |
128 | This tms380 module supports SysKonnect TR4/16 ISA cards. | 128 | This tms380 module supports SysKonnect TR4/16 ISA cards. |
129 | 129 | ||
@@ -135,7 +135,7 @@ config SKISA | |||
135 | 135 | ||
136 | config PROTEON | 136 | config PROTEON |
137 | tristate "Proteon ISA support" | 137 | tristate "Proteon ISA support" |
138 | depends on TR && TMS380TR && ISA | 138 | depends on TMS380TR && ISA |
139 | help | 139 | help |
140 | This tms380 module supports Proteon ISA cards. | 140 | This tms380 module supports Proteon ISA cards. |
141 | 141 | ||
@@ -148,7 +148,7 @@ config PROTEON | |||
148 | 148 | ||
149 | config ABYSS | 149 | config ABYSS |
150 | tristate "Madge Smart 16/4 PCI Mk2 support" | 150 | tristate "Madge Smart 16/4 PCI Mk2 support" |
151 | depends on TR && TMS380TR && PCI | 151 | depends on TMS380TR && PCI |
152 | help | 152 | help |
153 | This tms380 module supports the Madge Smart 16/4 PCI Mk2 | 153 | This tms380 module supports the Madge Smart 16/4 PCI Mk2 |
154 | cards (51-02). | 154 | cards (51-02). |
@@ -158,7 +158,7 @@ config ABYSS | |||
158 | 158 | ||
159 | config MADGEMC | 159 | config MADGEMC |
160 | tristate "Madge Smart 16/4 Ringnode MicroChannel" | 160 | tristate "Madge Smart 16/4 Ringnode MicroChannel" |
161 | depends on TR && TMS380TR && MCA | 161 | depends on TMS380TR && MCA |
162 | help | 162 | help |
163 | This tms380 module supports the Madge Smart 16/4 MC16 and MC32 | 163 | This tms380 module supports the Madge Smart 16/4 MC16 and MC32 |
164 | MicroChannel adapters. | 164 | MicroChannel adapters. |
@@ -168,7 +168,7 @@ config MADGEMC | |||
168 | 168 | ||
169 | config SMCTR | 169 | config SMCTR |
170 | tristate "SMC ISA/MCA adapter support" | 170 | tristate "SMC ISA/MCA adapter support" |
171 | depends on TR && (ISA || MCA_LEGACY) && (BROKEN || !64BIT) | 171 | depends on (ISA || MCA_LEGACY) && (BROKEN || !64BIT) |
172 | ---help--- | 172 | ---help--- |
173 | This is support for the ISA and MCA SMC Token Ring cards, | 173 | This is support for the ISA and MCA SMC Token Ring cards, |
174 | specifically SMC TokenCard Elite (8115T) and SMC TokenCard Elite/A | 174 | specifically SMC TokenCard Elite (8115T) and SMC TokenCard Elite/A |
@@ -182,5 +182,4 @@ config SMCTR | |||
182 | To compile this driver as a module, choose M here: the module will be | 182 | To compile this driver as a module, choose M here: the module will be |
183 | called smctr. | 183 | called smctr. |
184 | 184 | ||
185 | endmenu | 185 | endif # TR |
186 | |||
diff --git a/drivers/net/ucc_geth.c b/drivers/net/ucc_geth.c index c2ccbd098f53..18b731bb4da1 100644 --- a/drivers/net/ucc_geth.c +++ b/drivers/net/ucc_geth.c | |||
@@ -23,11 +23,8 @@ | |||
23 | #include <linux/skbuff.h> | 23 | #include <linux/skbuff.h> |
24 | #include <linux/spinlock.h> | 24 | #include <linux/spinlock.h> |
25 | #include <linux/mm.h> | 25 | #include <linux/mm.h> |
26 | #include <linux/ethtool.h> | ||
27 | #include <linux/delay.h> | ||
28 | #include <linux/dma-mapping.h> | 26 | #include <linux/dma-mapping.h> |
29 | #include <linux/fsl_devices.h> | 27 | #include <linux/fsl_devices.h> |
30 | #include <linux/ethtool.h> | ||
31 | #include <linux/mii.h> | 28 | #include <linux/mii.h> |
32 | #include <linux/phy.h> | 29 | #include <linux/phy.h> |
33 | #include <linux/workqueue.h> | 30 | #include <linux/workqueue.h> |
diff --git a/drivers/net/ucc_geth_mii.c b/drivers/net/ucc_geth_mii.c index f96966d4bcc2..7bcb82f50cf7 100644 --- a/drivers/net/ucc_geth_mii.c +++ b/drivers/net/ucc_geth_mii.c | |||
@@ -260,8 +260,6 @@ static struct of_device_id uec_mdio_match[] = { | |||
260 | {}, | 260 | {}, |
261 | }; | 261 | }; |
262 | 262 | ||
263 | MODULE_DEVICE_TABLE(of, uec_mdio_match); | ||
264 | |||
265 | static struct of_platform_driver uec_mdio_driver = { | 263 | static struct of_platform_driver uec_mdio_driver = { |
266 | .name = DRV_NAME, | 264 | .name = DRV_NAME, |
267 | .probe = uec_mdio_probe, | 265 | .probe = uec_mdio_probe, |
diff --git a/drivers/net/usb/asix.c b/drivers/net/usb/asix.c index d5ef97bc4d01..6d95cacd5284 100644 --- a/drivers/net/usb/asix.c +++ b/drivers/net/usb/asix.c | |||
@@ -1458,6 +1458,10 @@ static const struct usb_device_id products [] = { | |||
1458 | // IO-DATA ETG-US2 | 1458 | // IO-DATA ETG-US2 |
1459 | USB_DEVICE (0x04bb, 0x0930), | 1459 | USB_DEVICE (0x04bb, 0x0930), |
1460 | .driver_info = (unsigned long) &ax88178_info, | 1460 | .driver_info = (unsigned long) &ax88178_info, |
1461 | }, { | ||
1462 | // Belkin F5D5055 | ||
1463 | USB_DEVICE(0x050d, 0x5055), | ||
1464 | .driver_info = (unsigned long) &ax88178_info, | ||
1461 | }, | 1465 | }, |
1462 | { }, // END | 1466 | { }, // END |
1463 | }; | 1467 | }; |
diff --git a/drivers/net/usb/cdc_ether.c b/drivers/net/usb/cdc_ether.c index 5a21f06bf8a5..675ac99a79c6 100644 --- a/drivers/net/usb/cdc_ether.c +++ b/drivers/net/usb/cdc_ether.c | |||
@@ -91,6 +91,22 @@ int usbnet_generic_cdc_bind(struct usbnet *dev, struct usb_interface *intf) | |||
91 | "CDC descriptors on config\n"); | 91 | "CDC descriptors on config\n"); |
92 | } | 92 | } |
93 | 93 | ||
94 | /* Maybe CDC descriptors are after the endpoint? This bug has | ||
95 | * been seen on some 2Wire Inc RNDIS-ish products. | ||
96 | */ | ||
97 | if (len == 0) { | ||
98 | struct usb_host_endpoint *hep; | ||
99 | |||
100 | hep = intf->cur_altsetting->endpoint; | ||
101 | if (hep) { | ||
102 | buf = hep->extra; | ||
103 | len = hep->extralen; | ||
104 | } | ||
105 | if (len) | ||
106 | dev_dbg(&intf->dev, | ||
107 | "CDC descriptors on endpoint\n"); | ||
108 | } | ||
109 | |||
94 | /* this assumes that if there's a non-RNDIS vendor variant | 110 | /* this assumes that if there's a non-RNDIS vendor variant |
95 | * of cdc-acm, it'll fail RNDIS requests cleanly. | 111 | * of cdc-acm, it'll fail RNDIS requests cleanly. |
96 | */ | 112 | */ |
diff --git a/drivers/net/usb/rndis_host.c b/drivers/net/usb/rndis_host.c index 980e4aaa97aa..cd991a0f75bb 100644 --- a/drivers/net/usb/rndis_host.c +++ b/drivers/net/usb/rndis_host.c | |||
@@ -515,6 +515,7 @@ static int rndis_bind(struct usbnet *dev, struct usb_interface *intf) | |||
515 | dev_err(&intf->dev, | 515 | dev_err(&intf->dev, |
516 | "dev can't take %u byte packets (max %u)\n", | 516 | "dev can't take %u byte packets (max %u)\n", |
517 | dev->hard_mtu, tmp); | 517 | dev->hard_mtu, tmp); |
518 | retval = -EINVAL; | ||
518 | goto fail_and_release; | 519 | goto fail_and_release; |
519 | } | 520 | } |
520 | 521 | ||
diff --git a/drivers/net/usb/usbnet.c b/drivers/net/usb/usbnet.c index f9cd42d058b0..5b16d9a1269a 100644 --- a/drivers/net/usb/usbnet.c +++ b/drivers/net/usb/usbnet.c | |||
@@ -1252,20 +1252,23 @@ EXPORT_SYMBOL_GPL(usbnet_probe); | |||
1252 | 1252 | ||
1253 | /*-------------------------------------------------------------------------*/ | 1253 | /*-------------------------------------------------------------------------*/ |
1254 | 1254 | ||
1255 | /* FIXME these suspend/resume methods assume non-CDC style | 1255 | /* |
1256 | * devices, with only one interface. | 1256 | * suspend the whole driver as soon as the first interface is suspended |
1257 | * resume only when the last interface is resumed | ||
1257 | */ | 1258 | */ |
1258 | 1259 | ||
1259 | int usbnet_suspend (struct usb_interface *intf, pm_message_t message) | 1260 | int usbnet_suspend (struct usb_interface *intf, pm_message_t message) |
1260 | { | 1261 | { |
1261 | struct usbnet *dev = usb_get_intfdata(intf); | 1262 | struct usbnet *dev = usb_get_intfdata(intf); |
1262 | 1263 | ||
1263 | /* accelerate emptying of the rx and queues, to avoid | 1264 | if (!dev->suspend_count++) { |
1264 | * having everything error out. | 1265 | /* accelerate emptying of the rx and queues, to avoid |
1265 | */ | 1266 | * having everything error out. |
1266 | netif_device_detach (dev->net); | 1267 | */ |
1267 | (void) unlink_urbs (dev, &dev->rxq); | 1268 | netif_device_detach (dev->net); |
1268 | (void) unlink_urbs (dev, &dev->txq); | 1269 | (void) unlink_urbs (dev, &dev->rxq); |
1270 | (void) unlink_urbs (dev, &dev->txq); | ||
1271 | } | ||
1269 | return 0; | 1272 | return 0; |
1270 | } | 1273 | } |
1271 | EXPORT_SYMBOL_GPL(usbnet_suspend); | 1274 | EXPORT_SYMBOL_GPL(usbnet_suspend); |
@@ -1274,8 +1277,10 @@ int usbnet_resume (struct usb_interface *intf) | |||
1274 | { | 1277 | { |
1275 | struct usbnet *dev = usb_get_intfdata(intf); | 1278 | struct usbnet *dev = usb_get_intfdata(intf); |
1276 | 1279 | ||
1277 | netif_device_attach (dev->net); | 1280 | if (!--dev->suspend_count) { |
1278 | tasklet_schedule (&dev->bh); | 1281 | netif_device_attach (dev->net); |
1282 | tasklet_schedule (&dev->bh); | ||
1283 | } | ||
1279 | return 0; | 1284 | return 0; |
1280 | } | 1285 | } |
1281 | EXPORT_SYMBOL_GPL(usbnet_resume); | 1286 | EXPORT_SYMBOL_GPL(usbnet_resume); |
diff --git a/drivers/net/usb/usbnet.h b/drivers/net/usb/usbnet.h index 82db5a8e528e..a3f8b9e7bc00 100644 --- a/drivers/net/usb/usbnet.h +++ b/drivers/net/usb/usbnet.h | |||
@@ -32,6 +32,7 @@ struct usbnet { | |||
32 | const char *driver_name; | 32 | const char *driver_name; |
33 | wait_queue_head_t *wait; | 33 | wait_queue_head_t *wait; |
34 | struct mutex phy_mutex; | 34 | struct mutex phy_mutex; |
35 | unsigned char suspend_count; | ||
35 | 36 | ||
36 | /* i/o info: pipes etc */ | 37 | /* i/o info: pipes etc */ |
37 | unsigned in, out; | 38 | unsigned in, out; |
diff --git a/drivers/net/wireless/libertas/decl.h b/drivers/net/wireless/libertas/decl.h index 606bdd002be7..dfe27642322c 100644 --- a/drivers/net/wireless/libertas/decl.h +++ b/drivers/net/wireless/libertas/decl.h | |||
@@ -46,7 +46,7 @@ u32 libertas_index_to_data_rate(u8 index); | |||
46 | u8 libertas_data_rate_to_index(u32 rate); | 46 | u8 libertas_data_rate_to_index(u32 rate); |
47 | void libertas_get_fwversion(wlan_adapter * adapter, char *fwversion, int maxlen); | 47 | void libertas_get_fwversion(wlan_adapter * adapter, char *fwversion, int maxlen); |
48 | 48 | ||
49 | int libertas_upload_rx_packet(wlan_private * priv, struct sk_buff *skb); | 49 | void libertas_upload_rx_packet(wlan_private * priv, struct sk_buff *skb); |
50 | 50 | ||
51 | /** The proc fs interface */ | 51 | /** The proc fs interface */ |
52 | int libertas_process_rx_command(wlan_private * priv); | 52 | int libertas_process_rx_command(wlan_private * priv); |
diff --git a/drivers/net/wireless/libertas/fw.c b/drivers/net/wireless/libertas/fw.c index 441123c85e62..5c63c9b1659c 100644 --- a/drivers/net/wireless/libertas/fw.c +++ b/drivers/net/wireless/libertas/fw.c | |||
@@ -333,18 +333,22 @@ static void command_timer_fn(unsigned long data) | |||
333 | unsigned long flags; | 333 | unsigned long flags; |
334 | 334 | ||
335 | ptempnode = adapter->cur_cmd; | 335 | ptempnode = adapter->cur_cmd; |
336 | if (ptempnode == NULL) { | ||
337 | lbs_pr_debug(1, "PTempnode Empty\n"); | ||
338 | return; | ||
339 | } | ||
340 | |||
336 | cmd = (struct cmd_ds_command *)ptempnode->bufvirtualaddr; | 341 | cmd = (struct cmd_ds_command *)ptempnode->bufvirtualaddr; |
342 | if (!cmd) { | ||
343 | lbs_pr_debug(1, "cmd is NULL\n"); | ||
344 | return; | ||
345 | } | ||
337 | 346 | ||
338 | lbs_pr_info("command_timer_fn fired (%x)\n", cmd->command); | 347 | lbs_pr_info("command_timer_fn fired (%x)\n", cmd->command); |
339 | 348 | ||
340 | if (!adapter->fw_ready) | 349 | if (!adapter->fw_ready) |
341 | return; | 350 | return; |
342 | 351 | ||
343 | if (ptempnode == NULL) { | ||
344 | lbs_pr_debug(1, "PTempnode Empty\n"); | ||
345 | return; | ||
346 | } | ||
347 | |||
348 | spin_lock_irqsave(&adapter->driver_lock, flags); | 352 | spin_lock_irqsave(&adapter->driver_lock, flags); |
349 | adapter->cur_cmd = NULL; | 353 | adapter->cur_cmd = NULL; |
350 | spin_unlock_irqrestore(&adapter->driver_lock, flags); | 354 | spin_unlock_irqrestore(&adapter->driver_lock, flags); |
diff --git a/drivers/net/wireless/libertas/rx.c b/drivers/net/wireless/libertas/rx.c index d17924f764e5..96619a32951b 100644 --- a/drivers/net/wireless/libertas/rx.c +++ b/drivers/net/wireless/libertas/rx.c | |||
@@ -136,7 +136,7 @@ static void wlan_compute_rssi(wlan_private * priv, struct rxpd *p_rx_pd) | |||
136 | LEAVE(); | 136 | LEAVE(); |
137 | } | 137 | } |
138 | 138 | ||
139 | int libertas_upload_rx_packet(wlan_private * priv, struct sk_buff *skb) | 139 | void libertas_upload_rx_packet(wlan_private * priv, struct sk_buff *skb) |
140 | { | 140 | { |
141 | lbs_pr_debug(1, "skb->data=%p\n", skb->data); | 141 | lbs_pr_debug(1, "skb->data=%p\n", skb->data); |
142 | 142 | ||
@@ -148,8 +148,6 @@ int libertas_upload_rx_packet(wlan_private * priv, struct sk_buff *skb) | |||
148 | skb->ip_summed = CHECKSUM_UNNECESSARY; | 148 | skb->ip_summed = CHECKSUM_UNNECESSARY; |
149 | 149 | ||
150 | netif_rx(skb); | 150 | netif_rx(skb); |
151 | |||
152 | return 0; | ||
153 | } | 151 | } |
154 | 152 | ||
155 | /** | 153 | /** |
@@ -269,15 +267,11 @@ int libertas_process_rxed_packet(wlan_private * priv, struct sk_buff *skb) | |||
269 | wlan_compute_rssi(priv, p_rx_pd); | 267 | wlan_compute_rssi(priv, p_rx_pd); |
270 | 268 | ||
271 | lbs_pr_debug(1, "RX Data: size of actual packet = %d\n", skb->len); | 269 | lbs_pr_debug(1, "RX Data: size of actual packet = %d\n", skb->len); |
272 | if (libertas_upload_rx_packet(priv, skb)) { | ||
273 | lbs_pr_debug(1, "RX error: libertas_upload_rx_packet" | ||
274 | " returns failure\n"); | ||
275 | ret = -1; | ||
276 | goto done; | ||
277 | } | ||
278 | priv->stats.rx_bytes += skb->len; | 270 | priv->stats.rx_bytes += skb->len; |
279 | priv->stats.rx_packets++; | 271 | priv->stats.rx_packets++; |
280 | 272 | ||
273 | libertas_upload_rx_packet(priv, skb); | ||
274 | |||
281 | ret = 0; | 275 | ret = 0; |
282 | done: | 276 | done: |
283 | LEAVE(); | 277 | LEAVE(); |
@@ -438,22 +432,14 @@ static int process_rxed_802_11_packet(wlan_private * priv, struct sk_buff *skb) | |||
438 | wlan_compute_rssi(priv, prxpd); | 432 | wlan_compute_rssi(priv, prxpd); |
439 | 433 | ||
440 | lbs_pr_debug(1, "RX Data: size of actual packet = %d\n", skb->len); | 434 | lbs_pr_debug(1, "RX Data: size of actual packet = %d\n", skb->len); |
441 | |||
442 | if (libertas_upload_rx_packet(priv, skb)) { | ||
443 | lbs_pr_debug(1, "RX error: libertas_upload_rx_packet " | ||
444 | "returns failure\n"); | ||
445 | ret = -1; | ||
446 | goto done; | ||
447 | } | ||
448 | |||
449 | priv->stats.rx_bytes += skb->len; | 435 | priv->stats.rx_bytes += skb->len; |
450 | priv->stats.rx_packets++; | 436 | priv->stats.rx_packets++; |
451 | 437 | ||
438 | libertas_upload_rx_packet(priv, skb); | ||
439 | |||
452 | ret = 0; | 440 | ret = 0; |
453 | done: | 441 | done: |
454 | LEAVE(); | 442 | LEAVE(); |
455 | 443 | ||
456 | skb->protocol = __constant_htons(0x0019); /* ETH_P_80211_RAW */ | ||
457 | |||
458 | return (ret); | 444 | return (ret); |
459 | } | 445 | } |
diff --git a/drivers/s390/scsi/zfcp_aux.c b/drivers/s390/scsi/zfcp_aux.c index ddff40c4212c..821cde65e369 100644 --- a/drivers/s390/scsi/zfcp_aux.c +++ b/drivers/s390/scsi/zfcp_aux.c | |||
@@ -1127,6 +1127,7 @@ zfcp_adapter_dequeue(struct zfcp_adapter *adapter) | |||
1127 | int retval = 0; | 1127 | int retval = 0; |
1128 | unsigned long flags; | 1128 | unsigned long flags; |
1129 | 1129 | ||
1130 | zfcp_adapter_scsi_unregister(adapter); | ||
1130 | device_unregister(&adapter->generic_services); | 1131 | device_unregister(&adapter->generic_services); |
1131 | zfcp_sysfs_adapter_remove_files(&adapter->ccw_device->dev); | 1132 | zfcp_sysfs_adapter_remove_files(&adapter->ccw_device->dev); |
1132 | dev_set_drvdata(&adapter->ccw_device->dev, NULL); | 1133 | dev_set_drvdata(&adapter->ccw_device->dev, NULL); |
diff --git a/drivers/s390/scsi/zfcp_ccw.c b/drivers/s390/scsi/zfcp_ccw.c index 81680efa1721..1c8f71a59855 100644 --- a/drivers/s390/scsi/zfcp_ccw.c +++ b/drivers/s390/scsi/zfcp_ccw.c | |||
@@ -189,9 +189,7 @@ zfcp_ccw_set_online(struct ccw_device *ccw_device) | |||
189 | * @ccw_device: pointer to belonging ccw device | 189 | * @ccw_device: pointer to belonging ccw device |
190 | * | 190 | * |
191 | * This function gets called by the common i/o layer and sets an adapter | 191 | * This function gets called by the common i/o layer and sets an adapter |
192 | * into state offline. Setting an fcp device offline means that it will be | 192 | * into state offline. |
193 | * unregistered from the SCSI stack and that the adapter will be shut down | ||
194 | * asynchronously. | ||
195 | */ | 193 | */ |
196 | static int | 194 | static int |
197 | zfcp_ccw_set_offline(struct ccw_device *ccw_device) | 195 | zfcp_ccw_set_offline(struct ccw_device *ccw_device) |
@@ -202,7 +200,6 @@ zfcp_ccw_set_offline(struct ccw_device *ccw_device) | |||
202 | adapter = dev_get_drvdata(&ccw_device->dev); | 200 | adapter = dev_get_drvdata(&ccw_device->dev); |
203 | zfcp_erp_adapter_shutdown(adapter, 0); | 201 | zfcp_erp_adapter_shutdown(adapter, 0); |
204 | zfcp_erp_wait(adapter); | 202 | zfcp_erp_wait(adapter); |
205 | zfcp_adapter_scsi_unregister(adapter); | ||
206 | zfcp_erp_thread_kill(adapter); | 203 | zfcp_erp_thread_kill(adapter); |
207 | zfcp_adapter_debug_unregister(adapter); | 204 | zfcp_adapter_debug_unregister(adapter); |
208 | up(&zfcp_data.config_sema); | 205 | up(&zfcp_data.config_sema); |
diff --git a/drivers/s390/scsi/zfcp_fsf.c b/drivers/s390/scsi/zfcp_fsf.c index a8b02542ac2d..0eb31e162b15 100644 --- a/drivers/s390/scsi/zfcp_fsf.c +++ b/drivers/s390/scsi/zfcp_fsf.c | |||
@@ -156,44 +156,30 @@ zfcp_fsf_req_free(struct zfcp_fsf_req *fsf_req) | |||
156 | kfree(fsf_req); | 156 | kfree(fsf_req); |
157 | } | 157 | } |
158 | 158 | ||
159 | /** | 159 | /* |
160 | * zfcp_fsf_req_dismiss - dismiss a single fsf request | 160 | * Never ever call this without shutting down the adapter first. |
161 | */ | 161 | * Otherwise the adapter would continue using and corrupting s390 storage. |
162 | static void zfcp_fsf_req_dismiss(struct zfcp_adapter *adapter, | 162 | * Included BUG_ON() call to ensure this is done. |
163 | struct zfcp_fsf_req *fsf_req, | 163 | * ERP is supposed to be the only user of this function. |
164 | unsigned int counter) | ||
165 | { | ||
166 | u64 dbg_tmp[2]; | ||
167 | |||
168 | dbg_tmp[0] = (u64) atomic_read(&adapter->reqs_active); | ||
169 | dbg_tmp[1] = (u64) counter; | ||
170 | debug_event(adapter->erp_dbf, 4, (void *) dbg_tmp, 16); | ||
171 | list_del(&fsf_req->list); | ||
172 | fsf_req->status |= ZFCP_STATUS_FSFREQ_DISMISSED; | ||
173 | zfcp_fsf_req_complete(fsf_req); | ||
174 | } | ||
175 | |||
176 | /** | ||
177 | * zfcp_fsf_req_dismiss_all - dismiss all remaining fsf requests | ||
178 | */ | 164 | */ |
179 | void zfcp_fsf_req_dismiss_all(struct zfcp_adapter *adapter) | 165 | void zfcp_fsf_req_dismiss_all(struct zfcp_adapter *adapter) |
180 | { | 166 | { |
181 | struct zfcp_fsf_req *request, *tmp; | 167 | struct zfcp_fsf_req *fsf_req, *tmp; |
182 | unsigned long flags; | 168 | unsigned long flags; |
183 | LIST_HEAD(remove_queue); | 169 | LIST_HEAD(remove_queue); |
184 | unsigned int i, counter; | 170 | unsigned int i; |
185 | 171 | ||
172 | BUG_ON(atomic_test_mask(ZFCP_STATUS_ADAPTER_QDIOUP, &adapter->status)); | ||
186 | spin_lock_irqsave(&adapter->req_list_lock, flags); | 173 | spin_lock_irqsave(&adapter->req_list_lock, flags); |
187 | atomic_set(&adapter->reqs_active, 0); | 174 | atomic_set(&adapter->reqs_active, 0); |
188 | for (i=0; i<REQUEST_LIST_SIZE; i++) | 175 | for (i = 0; i < REQUEST_LIST_SIZE; i++) |
189 | list_splice_init(&adapter->req_list[i], &remove_queue); | 176 | list_splice_init(&adapter->req_list[i], &remove_queue); |
190 | |||
191 | spin_unlock_irqrestore(&adapter->req_list_lock, flags); | 177 | spin_unlock_irqrestore(&adapter->req_list_lock, flags); |
192 | 178 | ||
193 | counter = 0; | 179 | list_for_each_entry_safe(fsf_req, tmp, &remove_queue, list) { |
194 | list_for_each_entry_safe(request, tmp, &remove_queue, list) { | 180 | list_del(&fsf_req->list); |
195 | zfcp_fsf_req_dismiss(adapter, request, counter); | 181 | fsf_req->status |= ZFCP_STATUS_FSFREQ_DISMISSED; |
196 | counter++; | 182 | zfcp_fsf_req_complete(fsf_req); |
197 | } | 183 | } |
198 | } | 184 | } |
199 | 185 | ||
diff --git a/drivers/s390/scsi/zfcp_scsi.c b/drivers/s390/scsi/zfcp_scsi.c index 16e2d64658af..0acf6db0a08d 100644 --- a/drivers/s390/scsi/zfcp_scsi.c +++ b/drivers/s390/scsi/zfcp_scsi.c | |||
@@ -569,6 +569,9 @@ zfcp_adapter_scsi_register(struct zfcp_adapter *adapter) | |||
569 | int retval = 0; | 569 | int retval = 0; |
570 | static unsigned int unique_id = 0; | 570 | static unsigned int unique_id = 0; |
571 | 571 | ||
572 | if (adapter->scsi_host) | ||
573 | goto out; | ||
574 | |||
572 | /* register adapter as SCSI host with mid layer of SCSI stack */ | 575 | /* register adapter as SCSI host with mid layer of SCSI stack */ |
573 | adapter->scsi_host = scsi_host_alloc(&zfcp_data.scsi_host_template, | 576 | adapter->scsi_host = scsi_host_alloc(&zfcp_data.scsi_host_template, |
574 | sizeof (struct zfcp_adapter *)); | 577 | sizeof (struct zfcp_adapter *)); |
diff --git a/drivers/scsi/aacraid/aachba.c b/drivers/scsi/aacraid/aachba.c index 1e82c69b36b0..8dcfe4ec35c2 100644 --- a/drivers/scsi/aacraid/aachba.c +++ b/drivers/scsi/aacraid/aachba.c | |||
@@ -146,7 +146,7 @@ static char *aac_get_status_string(u32 status); | |||
146 | static int nondasd = -1; | 146 | static int nondasd = -1; |
147 | static int dacmode = -1; | 147 | static int dacmode = -1; |
148 | 148 | ||
149 | static int commit = -1; | 149 | int aac_commit = -1; |
150 | int startup_timeout = 180; | 150 | int startup_timeout = 180; |
151 | int aif_timeout = 120; | 151 | int aif_timeout = 120; |
152 | 152 | ||
@@ -154,7 +154,7 @@ module_param(nondasd, int, S_IRUGO|S_IWUSR); | |||
154 | MODULE_PARM_DESC(nondasd, "Control scanning of hba for nondasd devices. 0=off, 1=on"); | 154 | MODULE_PARM_DESC(nondasd, "Control scanning of hba for nondasd devices. 0=off, 1=on"); |
155 | module_param(dacmode, int, S_IRUGO|S_IWUSR); | 155 | module_param(dacmode, int, S_IRUGO|S_IWUSR); |
156 | MODULE_PARM_DESC(dacmode, "Control whether dma addressing is using 64 bit DAC. 0=off, 1=on"); | 156 | MODULE_PARM_DESC(dacmode, "Control whether dma addressing is using 64 bit DAC. 0=off, 1=on"); |
157 | module_param(commit, int, S_IRUGO|S_IWUSR); | 157 | module_param_named(commit, aac_commit, int, S_IRUGO|S_IWUSR); |
158 | MODULE_PARM_DESC(commit, "Control whether a COMMIT_CONFIG is issued to the adapter for foreign arrays.\nThis is typically needed in systems that do not have a BIOS. 0=off, 1=on"); | 158 | MODULE_PARM_DESC(commit, "Control whether a COMMIT_CONFIG is issued to the adapter for foreign arrays.\nThis is typically needed in systems that do not have a BIOS. 0=off, 1=on"); |
159 | module_param(startup_timeout, int, S_IRUGO|S_IWUSR); | 159 | module_param(startup_timeout, int, S_IRUGO|S_IWUSR); |
160 | MODULE_PARM_DESC(startup_timeout, "The duration of time in seconds to wait for adapter to have it's kernel up and\nrunning. This is typically adjusted for large systems that do not have a BIOS."); | 160 | MODULE_PARM_DESC(startup_timeout, "The duration of time in seconds to wait for adapter to have it's kernel up and\nrunning. This is typically adjusted for large systems that do not have a BIOS."); |
@@ -173,6 +173,9 @@ int expose_physicals = -1; | |||
173 | module_param(expose_physicals, int, S_IRUGO|S_IWUSR); | 173 | module_param(expose_physicals, int, S_IRUGO|S_IWUSR); |
174 | MODULE_PARM_DESC(expose_physicals, "Expose physical components of the arrays. -1=protect 0=off, 1=on"); | 174 | MODULE_PARM_DESC(expose_physicals, "Expose physical components of the arrays. -1=protect 0=off, 1=on"); |
175 | 175 | ||
176 | int aac_reset_devices = 0; | ||
177 | module_param_named(reset_devices, aac_reset_devices, int, S_IRUGO|S_IWUSR); | ||
178 | MODULE_PARM_DESC(reset_devices, "Force an adapter reset at initialization."); | ||
176 | 179 | ||
177 | static inline int aac_valid_context(struct scsi_cmnd *scsicmd, | 180 | static inline int aac_valid_context(struct scsi_cmnd *scsicmd, |
178 | struct fib *fibptr) { | 181 | struct fib *fibptr) { |
@@ -246,7 +249,7 @@ int aac_get_config_status(struct aac_dev *dev, int commit_flag) | |||
246 | aac_fib_complete(fibptr); | 249 | aac_fib_complete(fibptr); |
247 | /* Send a CT_COMMIT_CONFIG to enable discovery of devices */ | 250 | /* Send a CT_COMMIT_CONFIG to enable discovery of devices */ |
248 | if (status >= 0) { | 251 | if (status >= 0) { |
249 | if ((commit == 1) || commit_flag) { | 252 | if ((aac_commit == 1) || commit_flag) { |
250 | struct aac_commit_config * dinfo; | 253 | struct aac_commit_config * dinfo; |
251 | aac_fib_init(fibptr); | 254 | aac_fib_init(fibptr); |
252 | dinfo = (struct aac_commit_config *) fib_data(fibptr); | 255 | dinfo = (struct aac_commit_config *) fib_data(fibptr); |
@@ -261,7 +264,7 @@ int aac_get_config_status(struct aac_dev *dev, int commit_flag) | |||
261 | 1, 1, | 264 | 1, 1, |
262 | NULL, NULL); | 265 | NULL, NULL); |
263 | aac_fib_complete(fibptr); | 266 | aac_fib_complete(fibptr); |
264 | } else if (commit == 0) { | 267 | } else if (aac_commit == 0) { |
265 | printk(KERN_WARNING | 268 | printk(KERN_WARNING |
266 | "aac_get_config_status: Foreign device configurations are being ignored\n"); | 269 | "aac_get_config_status: Foreign device configurations are being ignored\n"); |
267 | } | 270 | } |
@@ -340,7 +343,7 @@ int aac_get_containers(struct aac_dev *dev) | |||
340 | static void aac_internal_transfer(struct scsi_cmnd *scsicmd, void *data, unsigned int offset, unsigned int len) | 343 | static void aac_internal_transfer(struct scsi_cmnd *scsicmd, void *data, unsigned int offset, unsigned int len) |
341 | { | 344 | { |
342 | void *buf; | 345 | void *buf; |
343 | unsigned int transfer_len; | 346 | int transfer_len; |
344 | struct scatterlist *sg = scsicmd->request_buffer; | 347 | struct scatterlist *sg = scsicmd->request_buffer; |
345 | 348 | ||
346 | if (scsicmd->use_sg) { | 349 | if (scsicmd->use_sg) { |
@@ -351,7 +354,7 @@ static void aac_internal_transfer(struct scsi_cmnd *scsicmd, void *data, unsigne | |||
351 | transfer_len = min(scsicmd->request_bufflen, len + offset); | 354 | transfer_len = min(scsicmd->request_bufflen, len + offset); |
352 | } | 355 | } |
353 | transfer_len -= offset; | 356 | transfer_len -= offset; |
354 | if (buf && transfer_len) | 357 | if (buf && transfer_len > 0) |
355 | memcpy(buf + offset, data, transfer_len); | 358 | memcpy(buf + offset, data, transfer_len); |
356 | 359 | ||
357 | if (scsicmd->use_sg) | 360 | if (scsicmd->use_sg) |
diff --git a/drivers/scsi/aacraid/aacraid.h b/drivers/scsi/aacraid/aacraid.h index 45ca3e801619..c81edf36913f 100644 --- a/drivers/scsi/aacraid/aacraid.h +++ b/drivers/scsi/aacraid/aacraid.h | |||
@@ -1823,9 +1823,12 @@ int aac_send_shutdown(struct aac_dev *dev); | |||
1823 | int aac_probe_container(struct aac_dev *dev, int cid); | 1823 | int aac_probe_container(struct aac_dev *dev, int cid); |
1824 | int _aac_rx_init(struct aac_dev *dev); | 1824 | int _aac_rx_init(struct aac_dev *dev); |
1825 | int aac_rx_select_comm(struct aac_dev *dev, int comm); | 1825 | int aac_rx_select_comm(struct aac_dev *dev, int comm); |
1826 | int aac_rx_deliver_producer(struct fib * fib); | ||
1826 | extern int numacb; | 1827 | extern int numacb; |
1827 | extern int acbsize; | 1828 | extern int acbsize; |
1828 | extern char aac_driver_version[]; | 1829 | extern char aac_driver_version[]; |
1829 | extern int startup_timeout; | 1830 | extern int startup_timeout; |
1830 | extern int aif_timeout; | 1831 | extern int aif_timeout; |
1831 | extern int expose_physicals; | 1832 | extern int expose_physicals; |
1833 | extern int aac_reset_devices; | ||
1834 | extern int aac_commit; | ||
diff --git a/drivers/scsi/aacraid/rx.c b/drivers/scsi/aacraid/rx.c index 291cd14f4e98..ae978a373c56 100644 --- a/drivers/scsi/aacraid/rx.c +++ b/drivers/scsi/aacraid/rx.c | |||
@@ -378,7 +378,7 @@ static int aac_rx_check_health(struct aac_dev *dev) | |||
378 | * | 378 | * |
379 | * Will send a fib, returning 0 if successful. | 379 | * Will send a fib, returning 0 if successful. |
380 | */ | 380 | */ |
381 | static int aac_rx_deliver_producer(struct fib * fib) | 381 | int aac_rx_deliver_producer(struct fib * fib) |
382 | { | 382 | { |
383 | struct aac_dev *dev = fib->dev; | 383 | struct aac_dev *dev = fib->dev; |
384 | struct aac_queue *q = &dev->queues->queue[AdapNormCmdQueue]; | 384 | struct aac_queue *q = &dev->queues->queue[AdapNormCmdQueue]; |
@@ -488,6 +488,8 @@ static int aac_rx_restart_adapter(struct aac_dev *dev, int bled) | |||
488 | return -EINVAL; | 488 | return -EINVAL; |
489 | if (rx_readl(dev, MUnit.OMRx[0]) & KERNEL_PANIC) | 489 | if (rx_readl(dev, MUnit.OMRx[0]) & KERNEL_PANIC) |
490 | return -ENODEV; | 490 | return -ENODEV; |
491 | if (startup_timeout < 300) | ||
492 | startup_timeout = 300; | ||
491 | return 0; | 493 | return 0; |
492 | } | 494 | } |
493 | 495 | ||
@@ -542,7 +544,7 @@ int _aac_rx_init(struct aac_dev *dev) | |||
542 | dev->a_ops.adapter_sync_cmd = rx_sync_cmd; | 544 | dev->a_ops.adapter_sync_cmd = rx_sync_cmd; |
543 | dev->a_ops.adapter_enable_int = aac_rx_disable_interrupt; | 545 | dev->a_ops.adapter_enable_int = aac_rx_disable_interrupt; |
544 | dev->OIMR = status = rx_readb (dev, MUnit.OIMR); | 546 | dev->OIMR = status = rx_readb (dev, MUnit.OIMR); |
545 | if ((((status & 0x0c) != 0x0c) || reset_devices) && | 547 | if ((((status & 0x0c) != 0x0c) || aac_reset_devices || reset_devices) && |
546 | !aac_rx_restart_adapter(dev, 0)) | 548 | !aac_rx_restart_adapter(dev, 0)) |
547 | ++restart; | 549 | ++restart; |
548 | /* | 550 | /* |
@@ -594,6 +596,8 @@ int _aac_rx_init(struct aac_dev *dev) | |||
594 | } | 596 | } |
595 | msleep(1); | 597 | msleep(1); |
596 | } | 598 | } |
599 | if (restart) | ||
600 | aac_commit = 1; | ||
597 | /* | 601 | /* |
598 | * Fill in the common function dispatch table. | 602 | * Fill in the common function dispatch table. |
599 | */ | 603 | */ |
diff --git a/drivers/scsi/aacraid/sa.c b/drivers/scsi/aacraid/sa.c index f4b5e9742ab0..85b91bc578c9 100644 --- a/drivers/scsi/aacraid/sa.c +++ b/drivers/scsi/aacraid/sa.c | |||
@@ -5,7 +5,7 @@ | |||
5 | * based on the old aacraid driver that is.. | 5 | * based on the old aacraid driver that is.. |
6 | * Adaptec aacraid device driver for Linux. | 6 | * Adaptec aacraid device driver for Linux. |
7 | * | 7 | * |
8 | * Copyright (c) 2000 Adaptec, Inc. (aacraid@adaptec.com) | 8 | * Copyright (c) 2000-2007 Adaptec, Inc. (aacraid@adaptec.com) |
9 | * | 9 | * |
10 | * This program is free software; you can redistribute it and/or modify | 10 | * This program is free software; you can redistribute it and/or modify |
11 | * it under the terms of the GNU General Public License as published by | 11 | * it under the terms of the GNU General Public License as published by |
@@ -257,6 +257,11 @@ static void aac_sa_start_adapter(struct aac_dev *dev) | |||
257 | NULL, NULL, NULL, NULL, NULL); | 257 | NULL, NULL, NULL, NULL, NULL); |
258 | } | 258 | } |
259 | 259 | ||
260 | static int aac_sa_restart_adapter(struct aac_dev *dev, int bled) | ||
261 | { | ||
262 | return -EINVAL; | ||
263 | } | ||
264 | |||
260 | /** | 265 | /** |
261 | * aac_sa_check_health | 266 | * aac_sa_check_health |
262 | * @dev: device to check if healthy | 267 | * @dev: device to check if healthy |
@@ -366,7 +371,9 @@ int aac_sa_init(struct aac_dev *dev) | |||
366 | dev->a_ops.adapter_notify = aac_sa_notify_adapter; | 371 | dev->a_ops.adapter_notify = aac_sa_notify_adapter; |
367 | dev->a_ops.adapter_sync_cmd = sa_sync_cmd; | 372 | dev->a_ops.adapter_sync_cmd = sa_sync_cmd; |
368 | dev->a_ops.adapter_check_health = aac_sa_check_health; | 373 | dev->a_ops.adapter_check_health = aac_sa_check_health; |
374 | dev->a_ops.adapter_restart = aac_sa_restart_adapter; | ||
369 | dev->a_ops.adapter_intr = aac_sa_intr; | 375 | dev->a_ops.adapter_intr = aac_sa_intr; |
376 | dev->a_ops.adapter_deliver = aac_rx_deliver_producer; | ||
370 | dev->a_ops.adapter_ioremap = aac_sa_ioremap; | 377 | dev->a_ops.adapter_ioremap = aac_sa_ioremap; |
371 | 378 | ||
372 | /* | 379 | /* |
diff --git a/drivers/scsi/aic7xxx/aicasm/aicasm_gram.y b/drivers/scsi/aic7xxx/aicasm/aicasm_gram.y index c328596def3c..6066998ed562 100644 --- a/drivers/scsi/aic7xxx/aicasm/aicasm_gram.y +++ b/drivers/scsi/aic7xxx/aicasm/aicasm_gram.y | |||
@@ -106,6 +106,7 @@ static void make_expression(expression_t *immed, int value); | |||
106 | static void add_conditional(symbol_t *symbol); | 106 | static void add_conditional(symbol_t *symbol); |
107 | static void add_version(const char *verstring); | 107 | static void add_version(const char *verstring); |
108 | static int is_download_const(expression_t *immed); | 108 | static int is_download_const(expression_t *immed); |
109 | void yyerror(const char *string); | ||
109 | 110 | ||
110 | #define SRAM_SYMNAME "SRAM_BASE" | 111 | #define SRAM_SYMNAME "SRAM_BASE" |
111 | #define SCB_SYMNAME "SCB_BASE" | 112 | #define SCB_SYMNAME "SCB_BASE" |
diff --git a/drivers/scsi/aic7xxx/aicasm/aicasm_macro_gram.y b/drivers/scsi/aic7xxx/aicasm/aicasm_macro_gram.y index 439f760b34b5..ff46aa6801bf 100644 --- a/drivers/scsi/aic7xxx/aicasm/aicasm_macro_gram.y +++ b/drivers/scsi/aic7xxx/aicasm/aicasm_macro_gram.y | |||
@@ -65,6 +65,7 @@ | |||
65 | static symbol_t *macro_symbol; | 65 | static symbol_t *macro_symbol; |
66 | 66 | ||
67 | static void add_macro_arg(const char *argtext, int position); | 67 | static void add_macro_arg(const char *argtext, int position); |
68 | void mmerror(const char *string); | ||
68 | 69 | ||
69 | %} | 70 | %} |
70 | 71 | ||
diff --git a/drivers/scsi/aic94xx/aic94xx_tmf.c b/drivers/scsi/aic94xx/aic94xx_tmf.c index 9a14a6d97275..c0d0b7d7a8ce 100644 --- a/drivers/scsi/aic94xx/aic94xx_tmf.c +++ b/drivers/scsi/aic94xx/aic94xx_tmf.c | |||
@@ -290,6 +290,7 @@ static void asd_tmf_tasklet_complete(struct asd_ascb *ascb, | |||
290 | static inline int asd_clear_nexus(struct sas_task *task) | 290 | static inline int asd_clear_nexus(struct sas_task *task) |
291 | { | 291 | { |
292 | int res = TMF_RESP_FUNC_FAILED; | 292 | int res = TMF_RESP_FUNC_FAILED; |
293 | int leftover; | ||
293 | struct asd_ascb *tascb = task->lldd_task; | 294 | struct asd_ascb *tascb = task->lldd_task; |
294 | unsigned long flags; | 295 | unsigned long flags; |
295 | 296 | ||
@@ -298,10 +299,12 @@ static inline int asd_clear_nexus(struct sas_task *task) | |||
298 | res = asd_clear_nexus_tag(task); | 299 | res = asd_clear_nexus_tag(task); |
299 | else | 300 | else |
300 | res = asd_clear_nexus_index(task); | 301 | res = asd_clear_nexus_index(task); |
301 | wait_for_completion_timeout(&tascb->completion, | 302 | leftover = wait_for_completion_timeout(&tascb->completion, |
302 | AIC94XX_SCB_TIMEOUT); | 303 | AIC94XX_SCB_TIMEOUT); |
303 | ASD_DPRINTK("came back from clear nexus\n"); | 304 | ASD_DPRINTK("came back from clear nexus\n"); |
304 | spin_lock_irqsave(&task->task_state_lock, flags); | 305 | spin_lock_irqsave(&task->task_state_lock, flags); |
306 | if (leftover < 1) | ||
307 | res = TMF_RESP_FUNC_FAILED; | ||
305 | if (task->task_state_flags & SAS_TASK_STATE_DONE) | 308 | if (task->task_state_flags & SAS_TASK_STATE_DONE) |
306 | res = TMF_RESP_FUNC_COMPLETE; | 309 | res = TMF_RESP_FUNC_COMPLETE; |
307 | spin_unlock_irqrestore(&task->task_state_lock, flags); | 310 | spin_unlock_irqrestore(&task->task_state_lock, flags); |
@@ -350,6 +353,7 @@ int asd_abort_task(struct sas_task *task) | |||
350 | unsigned long flags; | 353 | unsigned long flags; |
351 | struct asd_ascb *ascb = NULL; | 354 | struct asd_ascb *ascb = NULL; |
352 | struct scb *scb; | 355 | struct scb *scb; |
356 | int leftover; | ||
353 | 357 | ||
354 | spin_lock_irqsave(&task->task_state_lock, flags); | 358 | spin_lock_irqsave(&task->task_state_lock, flags); |
355 | if (task->task_state_flags & SAS_TASK_STATE_DONE) { | 359 | if (task->task_state_flags & SAS_TASK_STATE_DONE) { |
@@ -455,9 +459,11 @@ int asd_abort_task(struct sas_task *task) | |||
455 | break; | 459 | break; |
456 | case TF_TMF_TASK_DONE + 0xFF00: /* done but not reported yet */ | 460 | case TF_TMF_TASK_DONE + 0xFF00: /* done but not reported yet */ |
457 | res = TMF_RESP_FUNC_FAILED; | 461 | res = TMF_RESP_FUNC_FAILED; |
458 | wait_for_completion_timeout(&tascb->completion, | 462 | leftover = wait_for_completion_timeout(&tascb->completion, |
459 | AIC94XX_SCB_TIMEOUT); | 463 | AIC94XX_SCB_TIMEOUT); |
460 | spin_lock_irqsave(&task->task_state_lock, flags); | 464 | spin_lock_irqsave(&task->task_state_lock, flags); |
465 | if (leftover < 1) | ||
466 | res = TMF_RESP_FUNC_FAILED; | ||
461 | if (task->task_state_flags & SAS_TASK_STATE_DONE) | 467 | if (task->task_state_flags & SAS_TASK_STATE_DONE) |
462 | res = TMF_RESP_FUNC_COMPLETE; | 468 | res = TMF_RESP_FUNC_COMPLETE; |
463 | spin_unlock_irqrestore(&task->task_state_lock, flags); | 469 | spin_unlock_irqrestore(&task->task_state_lock, flags); |
diff --git a/drivers/scsi/ipr.c b/drivers/scsi/ipr.c index 4baa79e68679..fa6ff295e568 100644 --- a/drivers/scsi/ipr.c +++ b/drivers/scsi/ipr.c | |||
@@ -3954,6 +3954,13 @@ static int __ipr_eh_dev_reset(struct scsi_cmnd * scsi_cmd) | |||
3954 | spin_unlock_irq(scsi_cmd->device->host->host_lock); | 3954 | spin_unlock_irq(scsi_cmd->device->host->host_lock); |
3955 | ata_do_eh(ap, NULL, NULL, ipr_sata_reset, NULL); | 3955 | ata_do_eh(ap, NULL, NULL, ipr_sata_reset, NULL); |
3956 | spin_lock_irq(scsi_cmd->device->host->host_lock); | 3956 | spin_lock_irq(scsi_cmd->device->host->host_lock); |
3957 | |||
3958 | list_for_each_entry(ipr_cmd, &ioa_cfg->pending_q, queue) { | ||
3959 | if (ipr_cmd->ioarcb.res_handle == res->cfgte.res_handle) { | ||
3960 | rc = -EIO; | ||
3961 | break; | ||
3962 | } | ||
3963 | } | ||
3957 | } else | 3964 | } else |
3958 | rc = ipr_device_reset(ioa_cfg, res); | 3965 | rc = ipr_device_reset(ioa_cfg, res); |
3959 | res->resetting_device = 0; | 3966 | res->resetting_device = 0; |
diff --git a/drivers/scsi/libsrp.c b/drivers/scsi/libsrp.c index 5631c199a8eb..732446e63963 100644 --- a/drivers/scsi/libsrp.c +++ b/drivers/scsi/libsrp.c | |||
@@ -254,6 +254,7 @@ static int srp_indirect_data(struct scsi_cmnd *sc, struct srp_cmd *cmd, | |||
254 | 254 | ||
255 | sg_init_one(&dummy, md, id->table_desc.len); | 255 | sg_init_one(&dummy, md, id->table_desc.len); |
256 | sg_dma_address(&dummy) = token; | 256 | sg_dma_address(&dummy) = token; |
257 | sg_dma_len(&dummy) = id->table_desc.len; | ||
257 | err = rdma_io(sc, &dummy, 1, &id->table_desc, 1, DMA_TO_DEVICE, | 258 | err = rdma_io(sc, &dummy, 1, &id->table_desc, 1, DMA_TO_DEVICE, |
258 | id->table_desc.len); | 259 | id->table_desc.len); |
259 | if (err) { | 260 | if (err) { |
diff --git a/drivers/scsi/megaraid/megaraid_sas.c b/drivers/scsi/megaraid/megaraid_sas.c index 7a812677ff8a..e2cf12ef3688 100644 --- a/drivers/scsi/megaraid/megaraid_sas.c +++ b/drivers/scsi/megaraid/megaraid_sas.c | |||
@@ -10,7 +10,7 @@ | |||
10 | * 2 of the License, or (at your option) any later version. | 10 | * 2 of the License, or (at your option) any later version. |
11 | * | 11 | * |
12 | * FILE : megaraid_sas.c | 12 | * FILE : megaraid_sas.c |
13 | * Version : v00.00.03.10-rc1 | 13 | * Version : v00.00.03.10-rc5 |
14 | * | 14 | * |
15 | * Authors: | 15 | * Authors: |
16 | * (email-id : megaraidlinux@lsi.com) | 16 | * (email-id : megaraidlinux@lsi.com) |
@@ -886,6 +886,7 @@ megasas_queue_command(struct scsi_cmnd *scmd, void (*done) (struct scsi_cmnd *)) | |||
886 | goto out_return_cmd; | 886 | goto out_return_cmd; |
887 | 887 | ||
888 | cmd->scmd = scmd; | 888 | cmd->scmd = scmd; |
889 | scmd->SCp.ptr = (char *)cmd; | ||
889 | 890 | ||
890 | /* | 891 | /* |
891 | * Issue the command to the FW | 892 | * Issue the command to the FW |
@@ -919,7 +920,7 @@ static int megasas_slave_configure(struct scsi_device *sdev) | |||
919 | * The RAID firmware may require extended timeouts. | 920 | * The RAID firmware may require extended timeouts. |
920 | */ | 921 | */ |
921 | if (sdev->channel >= MEGASAS_MAX_PD_CHANNELS) | 922 | if (sdev->channel >= MEGASAS_MAX_PD_CHANNELS) |
922 | sdev->timeout = 90 * HZ; | 923 | sdev->timeout = MEGASAS_DEFAULT_CMD_TIMEOUT * HZ; |
923 | return 0; | 924 | return 0; |
924 | } | 925 | } |
925 | 926 | ||
@@ -981,8 +982,8 @@ static int megasas_generic_reset(struct scsi_cmnd *scmd) | |||
981 | 982 | ||
982 | instance = (struct megasas_instance *)scmd->device->host->hostdata; | 983 | instance = (struct megasas_instance *)scmd->device->host->hostdata; |
983 | 984 | ||
984 | scmd_printk(KERN_NOTICE, scmd, "megasas: RESET -%ld cmd=%x\n", | 985 | scmd_printk(KERN_NOTICE, scmd, "megasas: RESET -%ld cmd=%x retries=%x\n", |
985 | scmd->serial_number, scmd->cmnd[0]); | 986 | scmd->serial_number, scmd->cmnd[0], scmd->retries); |
986 | 987 | ||
987 | if (instance->hw_crit_error) { | 988 | if (instance->hw_crit_error) { |
988 | printk(KERN_ERR "megasas: cannot recover from previous reset " | 989 | printk(KERN_ERR "megasas: cannot recover from previous reset " |
@@ -1000,6 +1001,39 @@ static int megasas_generic_reset(struct scsi_cmnd *scmd) | |||
1000 | } | 1001 | } |
1001 | 1002 | ||
1002 | /** | 1003 | /** |
1004 | * megasas_reset_timer - quiesce the adapter if required | ||
1005 | * @scmd: scsi cmnd | ||
1006 | * | ||
1007 | * Sets the FW busy flag and reduces the host->can_queue if the | ||
1008 | * cmd has not been completed within the timeout period. | ||
1009 | */ | ||
1010 | static enum | ||
1011 | scsi_eh_timer_return megasas_reset_timer(struct scsi_cmnd *scmd) | ||
1012 | { | ||
1013 | struct megasas_cmd *cmd = (struct megasas_cmd *)scmd->SCp.ptr; | ||
1014 | struct megasas_instance *instance; | ||
1015 | unsigned long flags; | ||
1016 | |||
1017 | if (time_after(jiffies, scmd->jiffies_at_alloc + | ||
1018 | (MEGASAS_DEFAULT_CMD_TIMEOUT * 2) * HZ)) { | ||
1019 | return EH_NOT_HANDLED; | ||
1020 | } | ||
1021 | |||
1022 | instance = cmd->instance; | ||
1023 | if (!(instance->flag & MEGASAS_FW_BUSY)) { | ||
1024 | /* FW is busy, throttle IO */ | ||
1025 | spin_lock_irqsave(instance->host->host_lock, flags); | ||
1026 | |||
1027 | instance->host->can_queue = 16; | ||
1028 | instance->last_time = jiffies; | ||
1029 | instance->flag |= MEGASAS_FW_BUSY; | ||
1030 | |||
1031 | spin_unlock_irqrestore(instance->host->host_lock, flags); | ||
1032 | } | ||
1033 | return EH_RESET_TIMER; | ||
1034 | } | ||
1035 | |||
1036 | /** | ||
1003 | * megasas_reset_device - Device reset handler entry point | 1037 | * megasas_reset_device - Device reset handler entry point |
1004 | */ | 1038 | */ |
1005 | static int megasas_reset_device(struct scsi_cmnd *scmd) | 1039 | static int megasas_reset_device(struct scsi_cmnd *scmd) |
@@ -1112,6 +1146,7 @@ static struct scsi_host_template megasas_template = { | |||
1112 | .eh_device_reset_handler = megasas_reset_device, | 1146 | .eh_device_reset_handler = megasas_reset_device, |
1113 | .eh_bus_reset_handler = megasas_reset_bus_host, | 1147 | .eh_bus_reset_handler = megasas_reset_bus_host, |
1114 | .eh_host_reset_handler = megasas_reset_bus_host, | 1148 | .eh_host_reset_handler = megasas_reset_bus_host, |
1149 | .eh_timed_out = megasas_reset_timer, | ||
1115 | .bios_param = megasas_bios_param, | 1150 | .bios_param = megasas_bios_param, |
1116 | .use_clustering = ENABLE_CLUSTERING, | 1151 | .use_clustering = ENABLE_CLUSTERING, |
1117 | }; | 1152 | }; |
@@ -1215,9 +1250,8 @@ megasas_complete_cmd(struct megasas_instance *instance, struct megasas_cmd *cmd, | |||
1215 | int exception = 0; | 1250 | int exception = 0; |
1216 | struct megasas_header *hdr = &cmd->frame->hdr; | 1251 | struct megasas_header *hdr = &cmd->frame->hdr; |
1217 | 1252 | ||
1218 | if (cmd->scmd) { | 1253 | if (cmd->scmd) |
1219 | cmd->scmd->SCp.ptr = (char *)0; | 1254 | cmd->scmd->SCp.ptr = NULL; |
1220 | } | ||
1221 | 1255 | ||
1222 | switch (hdr->cmd) { | 1256 | switch (hdr->cmd) { |
1223 | 1257 | ||
@@ -1806,6 +1840,7 @@ static void megasas_complete_cmd_dpc(unsigned long instance_addr) | |||
1806 | u32 context; | 1840 | u32 context; |
1807 | struct megasas_cmd *cmd; | 1841 | struct megasas_cmd *cmd; |
1808 | struct megasas_instance *instance = (struct megasas_instance *)instance_addr; | 1842 | struct megasas_instance *instance = (struct megasas_instance *)instance_addr; |
1843 | unsigned long flags; | ||
1809 | 1844 | ||
1810 | /* If we have already declared adapter dead, donot complete cmds */ | 1845 | /* If we have already declared adapter dead, donot complete cmds */ |
1811 | if (instance->hw_crit_error) | 1846 | if (instance->hw_crit_error) |
@@ -1828,6 +1863,22 @@ static void megasas_complete_cmd_dpc(unsigned long instance_addr) | |||
1828 | } | 1863 | } |
1829 | 1864 | ||
1830 | *instance->consumer = producer; | 1865 | *instance->consumer = producer; |
1866 | |||
1867 | /* | ||
1868 | * Check if we can restore can_queue | ||
1869 | */ | ||
1870 | if (instance->flag & MEGASAS_FW_BUSY | ||
1871 | && time_after(jiffies, instance->last_time + 5 * HZ) | ||
1872 | && atomic_read(&instance->fw_outstanding) < 17) { | ||
1873 | |||
1874 | spin_lock_irqsave(instance->host->host_lock, flags); | ||
1875 | instance->flag &= ~MEGASAS_FW_BUSY; | ||
1876 | instance->host->can_queue = | ||
1877 | instance->max_fw_cmds - MEGASAS_INT_CMDS; | ||
1878 | |||
1879 | spin_unlock_irqrestore(instance->host->host_lock, flags); | ||
1880 | } | ||
1881 | |||
1831 | } | 1882 | } |
1832 | 1883 | ||
1833 | /** | 1884 | /** |
@@ -2398,6 +2449,8 @@ megasas_probe_one(struct pci_dev *pdev, const struct pci_device_id *id) | |||
2398 | instance->init_id = MEGASAS_DEFAULT_INIT_ID; | 2449 | instance->init_id = MEGASAS_DEFAULT_INIT_ID; |
2399 | 2450 | ||
2400 | megasas_dbg_lvl = 0; | 2451 | megasas_dbg_lvl = 0; |
2452 | instance->flag = 0; | ||
2453 | instance->last_time = 0; | ||
2401 | 2454 | ||
2402 | /* | 2455 | /* |
2403 | * Initialize MFI Firmware | 2456 | * Initialize MFI Firmware |
diff --git a/drivers/scsi/megaraid/megaraid_sas.h b/drivers/scsi/megaraid/megaraid_sas.h index e862992ee377..4dffc918a414 100644 --- a/drivers/scsi/megaraid/megaraid_sas.h +++ b/drivers/scsi/megaraid/megaraid_sas.h | |||
@@ -18,9 +18,9 @@ | |||
18 | /* | 18 | /* |
19 | * MegaRAID SAS Driver meta data | 19 | * MegaRAID SAS Driver meta data |
20 | */ | 20 | */ |
21 | #define MEGASAS_VERSION "00.00.03.10-rc1" | 21 | #define MEGASAS_VERSION "00.00.03.10-rc5" |
22 | #define MEGASAS_RELDATE "Feb 14, 2007" | 22 | #define MEGASAS_RELDATE "May 17, 2007" |
23 | #define MEGASAS_EXT_VERSION "Wed Feb 14 10:14:25 PST 2007" | 23 | #define MEGASAS_EXT_VERSION "Thu May 17 10:09:32 PDT 2007" |
24 | 24 | ||
25 | /* | 25 | /* |
26 | * Device IDs | 26 | * Device IDs |
@@ -539,6 +539,8 @@ struct megasas_ctrl_info { | |||
539 | 539 | ||
540 | #define MEGASAS_DBG_LVL 1 | 540 | #define MEGASAS_DBG_LVL 1 |
541 | 541 | ||
542 | #define MEGASAS_FW_BUSY 1 | ||
543 | |||
542 | /* | 544 | /* |
543 | * When SCSI mid-layer calls driver's reset routine, driver waits for | 545 | * When SCSI mid-layer calls driver's reset routine, driver waits for |
544 | * MEGASAS_RESET_WAIT_TIME seconds for all outstanding IO to complete. Note | 546 | * MEGASAS_RESET_WAIT_TIME seconds for all outstanding IO to complete. Note |
@@ -549,8 +551,8 @@ struct megasas_ctrl_info { | |||
549 | #define MEGASAS_RESET_WAIT_TIME 180 | 551 | #define MEGASAS_RESET_WAIT_TIME 180 |
550 | #define MEGASAS_INTERNAL_CMD_WAIT_TIME 180 | 552 | #define MEGASAS_INTERNAL_CMD_WAIT_TIME 180 |
551 | #define MEGASAS_RESET_NOTICE_INTERVAL 5 | 553 | #define MEGASAS_RESET_NOTICE_INTERVAL 5 |
552 | |||
553 | #define MEGASAS_IOCTL_CMD 0 | 554 | #define MEGASAS_IOCTL_CMD 0 |
555 | #define MEGASAS_DEFAULT_CMD_TIMEOUT 90 | ||
554 | 556 | ||
555 | /* | 557 | /* |
556 | * FW reports the maximum of number of commands that it can accept (maximum | 558 | * FW reports the maximum of number of commands that it can accept (maximum |
@@ -1073,7 +1075,6 @@ struct megasas_instance { | |||
1073 | struct megasas_register_set __iomem *reg_set; | 1075 | struct megasas_register_set __iomem *reg_set; |
1074 | 1076 | ||
1075 | s8 init_id; | 1077 | s8 init_id; |
1076 | u8 reserved[3]; | ||
1077 | 1078 | ||
1078 | u16 max_num_sge; | 1079 | u16 max_num_sge; |
1079 | u16 max_fw_cmds; | 1080 | u16 max_fw_cmds; |
@@ -1104,6 +1105,9 @@ struct megasas_instance { | |||
1104 | 1105 | ||
1105 | struct megasas_instance_template *instancet; | 1106 | struct megasas_instance_template *instancet; |
1106 | struct tasklet_struct isr_tasklet; | 1107 | struct tasklet_struct isr_tasklet; |
1108 | |||
1109 | u8 flag; | ||
1110 | unsigned long last_time; | ||
1107 | }; | 1111 | }; |
1108 | 1112 | ||
1109 | #define MEGASAS_IS_LOGICAL(scp) \ | 1113 | #define MEGASAS_IS_LOGICAL(scp) \ |
diff --git a/drivers/scsi/scsi_devinfo.c b/drivers/scsi/scsi_devinfo.c index ce63044b1ec8..18dd5cc4d7c6 100644 --- a/drivers/scsi/scsi_devinfo.c +++ b/drivers/scsi/scsi_devinfo.c | |||
@@ -209,6 +209,7 @@ static struct { | |||
209 | {"PIONEER", "CD-ROM DRM-602X", NULL, BLIST_FORCELUN | BLIST_SINGLELUN}, | 209 | {"PIONEER", "CD-ROM DRM-602X", NULL, BLIST_FORCELUN | BLIST_SINGLELUN}, |
210 | {"PIONEER", "CD-ROM DRM-604X", NULL, BLIST_FORCELUN | BLIST_SINGLELUN}, | 210 | {"PIONEER", "CD-ROM DRM-604X", NULL, BLIST_FORCELUN | BLIST_SINGLELUN}, |
211 | {"PIONEER", "CD-ROM DRM-624X", NULL, BLIST_FORCELUN | BLIST_SINGLELUN}, | 211 | {"PIONEER", "CD-ROM DRM-624X", NULL, BLIST_FORCELUN | BLIST_SINGLELUN}, |
212 | {"Promise", "", NULL, BLIST_SPARSELUN}, | ||
212 | {"REGAL", "CDC-4X", NULL, BLIST_MAX5LUN | BLIST_SINGLELUN}, | 213 | {"REGAL", "CDC-4X", NULL, BLIST_MAX5LUN | BLIST_SINGLELUN}, |
213 | {"SanDisk", "ImageMate CF-SD1", NULL, BLIST_FORCELUN}, | 214 | {"SanDisk", "ImageMate CF-SD1", NULL, BLIST_FORCELUN}, |
214 | {"SEAGATE", "ST34555N", "0930", BLIST_NOTQ}, /* Chokes on tagged INQUIRY */ | 215 | {"SEAGATE", "ST34555N", "0930", BLIST_NOTQ}, /* Chokes on tagged INQUIRY */ |
diff --git a/drivers/scsi/sd.c b/drivers/scsi/sd.c index 00e46662296f..3d8c9cb24f91 100644 --- a/drivers/scsi/sd.c +++ b/drivers/scsi/sd.c | |||
@@ -1789,7 +1789,7 @@ static void sd_shutdown(struct device *dev) | |||
1789 | static int sd_suspend(struct device *dev, pm_message_t mesg) | 1789 | static int sd_suspend(struct device *dev, pm_message_t mesg) |
1790 | { | 1790 | { |
1791 | struct scsi_disk *sdkp = scsi_disk_get_from_dev(dev); | 1791 | struct scsi_disk *sdkp = scsi_disk_get_from_dev(dev); |
1792 | int ret; | 1792 | int ret = 0; |
1793 | 1793 | ||
1794 | if (!sdkp) | 1794 | if (!sdkp) |
1795 | return 0; /* this can happen */ | 1795 | return 0; /* this can happen */ |
@@ -1798,30 +1798,34 @@ static int sd_suspend(struct device *dev, pm_message_t mesg) | |||
1798 | sd_printk(KERN_NOTICE, sdkp, "Synchronizing SCSI cache\n"); | 1798 | sd_printk(KERN_NOTICE, sdkp, "Synchronizing SCSI cache\n"); |
1799 | ret = sd_sync_cache(sdkp); | 1799 | ret = sd_sync_cache(sdkp); |
1800 | if (ret) | 1800 | if (ret) |
1801 | return ret; | 1801 | goto done; |
1802 | } | 1802 | } |
1803 | 1803 | ||
1804 | if (mesg.event == PM_EVENT_SUSPEND && | 1804 | if (mesg.event == PM_EVENT_SUSPEND && |
1805 | sdkp->device->manage_start_stop) { | 1805 | sdkp->device->manage_start_stop) { |
1806 | sd_printk(KERN_NOTICE, sdkp, "Stopping disk\n"); | 1806 | sd_printk(KERN_NOTICE, sdkp, "Stopping disk\n"); |
1807 | ret = sd_start_stop_device(sdkp, 0); | 1807 | ret = sd_start_stop_device(sdkp, 0); |
1808 | if (ret) | ||
1809 | return ret; | ||
1810 | } | 1808 | } |
1811 | 1809 | ||
1812 | return 0; | 1810 | done: |
1811 | scsi_disk_put(sdkp); | ||
1812 | return ret; | ||
1813 | } | 1813 | } |
1814 | 1814 | ||
1815 | static int sd_resume(struct device *dev) | 1815 | static int sd_resume(struct device *dev) |
1816 | { | 1816 | { |
1817 | struct scsi_disk *sdkp = scsi_disk_get_from_dev(dev); | 1817 | struct scsi_disk *sdkp = scsi_disk_get_from_dev(dev); |
1818 | int ret = 0; | ||
1818 | 1819 | ||
1819 | if (!sdkp->device->manage_start_stop) | 1820 | if (!sdkp->device->manage_start_stop) |
1820 | return 0; | 1821 | goto done; |
1821 | 1822 | ||
1822 | sd_printk(KERN_NOTICE, sdkp, "Starting disk\n"); | 1823 | sd_printk(KERN_NOTICE, sdkp, "Starting disk\n"); |
1824 | ret = sd_start_stop_device(sdkp, 1); | ||
1823 | 1825 | ||
1824 | return sd_start_stop_device(sdkp, 1); | 1826 | done: |
1827 | scsi_disk_put(sdkp); | ||
1828 | return ret; | ||
1825 | } | 1829 | } |
1826 | 1830 | ||
1827 | /** | 1831 | /** |
diff --git a/drivers/scsi/stex.c b/drivers/scsi/stex.c index 69be1324b114..9ac83abc4028 100644 --- a/drivers/scsi/stex.c +++ b/drivers/scsi/stex.c | |||
@@ -32,11 +32,12 @@ | |||
32 | #include <scsi/scsi_cmnd.h> | 32 | #include <scsi/scsi_cmnd.h> |
33 | #include <scsi/scsi_host.h> | 33 | #include <scsi/scsi_host.h> |
34 | #include <scsi/scsi_tcq.h> | 34 | #include <scsi/scsi_tcq.h> |
35 | #include <scsi/scsi_dbg.h> | ||
35 | 36 | ||
36 | #define DRV_NAME "stex" | 37 | #define DRV_NAME "stex" |
37 | #define ST_DRIVER_VERSION "3.1.0.1" | 38 | #define ST_DRIVER_VERSION "3.6.0000.1" |
38 | #define ST_VER_MAJOR 3 | 39 | #define ST_VER_MAJOR 3 |
39 | #define ST_VER_MINOR 1 | 40 | #define ST_VER_MINOR 6 |
40 | #define ST_OEM 0 | 41 | #define ST_OEM 0 |
41 | #define ST_BUILD_VER 1 | 42 | #define ST_BUILD_VER 1 |
42 | 43 | ||
@@ -113,10 +114,6 @@ enum { | |||
113 | SG_CF_64B = 0x40, /* 64 bit item */ | 114 | SG_CF_64B = 0x40, /* 64 bit item */ |
114 | SG_CF_HOST = 0x20, /* sg in host memory */ | 115 | SG_CF_HOST = 0x20, /* sg in host memory */ |
115 | 116 | ||
116 | ST_MAX_ARRAY_SUPPORTED = 16, | ||
117 | ST_MAX_TARGET_NUM = (ST_MAX_ARRAY_SUPPORTED+1), | ||
118 | ST_MAX_LUN_PER_TARGET = 16, | ||
119 | |||
120 | st_shasta = 0, | 117 | st_shasta = 0, |
121 | st_vsc = 1, | 118 | st_vsc = 1, |
122 | st_vsc1 = 2, | 119 | st_vsc1 = 2, |
@@ -586,7 +583,7 @@ stex_queuecommand(struct scsi_cmnd *cmd, void (* done)(struct scsi_cmnd *)) | |||
586 | u16 tag; | 583 | u16 tag; |
587 | host = cmd->device->host; | 584 | host = cmd->device->host; |
588 | id = cmd->device->id; | 585 | id = cmd->device->id; |
589 | lun = cmd->device->channel; /* firmware lun issue work around */ | 586 | lun = cmd->device->lun; |
590 | hba = (struct st_hba *) &host->hostdata[0]; | 587 | hba = (struct st_hba *) &host->hostdata[0]; |
591 | 588 | ||
592 | switch (cmd->cmnd[0]) { | 589 | switch (cmd->cmnd[0]) { |
@@ -605,8 +602,26 @@ stex_queuecommand(struct scsi_cmnd *cmd, void (* done)(struct scsi_cmnd *)) | |||
605 | stex_invalid_field(cmd, done); | 602 | stex_invalid_field(cmd, done); |
606 | return 0; | 603 | return 0; |
607 | } | 604 | } |
605 | case REPORT_LUNS: | ||
606 | /* | ||
607 | * The shasta firmware does not report actual luns in the | ||
608 | * target, so fail the command to force sequential lun scan. | ||
609 | * Also, the console device does not support this command. | ||
610 | */ | ||
611 | if (hba->cardtype == st_shasta || id == host->max_id - 1) { | ||
612 | stex_invalid_field(cmd, done); | ||
613 | return 0; | ||
614 | } | ||
615 | break; | ||
616 | case TEST_UNIT_READY: | ||
617 | if (id == host->max_id - 1) { | ||
618 | cmd->result = DID_OK << 16 | COMMAND_COMPLETE << 8; | ||
619 | done(cmd); | ||
620 | return 0; | ||
621 | } | ||
622 | break; | ||
608 | case INQUIRY: | 623 | case INQUIRY: |
609 | if (id != ST_MAX_ARRAY_SUPPORTED) | 624 | if (id != host->max_id - 1) |
610 | break; | 625 | break; |
611 | if (lun == 0 && (cmd->cmnd[1] & INQUIRY_EVPD) == 0) { | 626 | if (lun == 0 && (cmd->cmnd[1] & INQUIRY_EVPD) == 0) { |
612 | stex_direct_copy(cmd, console_inq_page, | 627 | stex_direct_copy(cmd, console_inq_page, |
@@ -624,7 +639,7 @@ stex_queuecommand(struct scsi_cmnd *cmd, void (* done)(struct scsi_cmnd *)) | |||
624 | ver.oem = ST_OEM; | 639 | ver.oem = ST_OEM; |
625 | ver.build = ST_BUILD_VER; | 640 | ver.build = ST_BUILD_VER; |
626 | ver.signature[0] = PASSTHRU_SIGNATURE; | 641 | ver.signature[0] = PASSTHRU_SIGNATURE; |
627 | ver.console_id = ST_MAX_ARRAY_SUPPORTED; | 642 | ver.console_id = host->max_id - 1; |
628 | ver.host_no = hba->host->host_no; | 643 | ver.host_no = hba->host->host_no; |
629 | cmd->result = stex_direct_copy(cmd, &ver, sizeof(ver)) ? | 644 | cmd->result = stex_direct_copy(cmd, &ver, sizeof(ver)) ? |
630 | DID_OK << 16 | COMMAND_COMPLETE << 8 : | 645 | DID_OK << 16 | COMMAND_COMPLETE << 8 : |
@@ -645,13 +660,8 @@ stex_queuecommand(struct scsi_cmnd *cmd, void (* done)(struct scsi_cmnd *)) | |||
645 | 660 | ||
646 | req = stex_alloc_req(hba); | 661 | req = stex_alloc_req(hba); |
647 | 662 | ||
648 | if (hba->cardtype == st_yosemite) { | 663 | req->lun = lun; |
649 | req->lun = lun * (ST_MAX_TARGET_NUM - 1) + id; | 664 | req->target = id; |
650 | req->target = 0; | ||
651 | } else { | ||
652 | req->lun = lun; | ||
653 | req->target = id; | ||
654 | } | ||
655 | 665 | ||
656 | /* cdb */ | 666 | /* cdb */ |
657 | memcpy(req->cdb, cmd->cmnd, STEX_CDB_LENGTH); | 667 | memcpy(req->cdb, cmd->cmnd, STEX_CDB_LENGTH); |
@@ -767,18 +777,6 @@ static void stex_ys_commands(struct st_hba *hba, | |||
767 | ccb->srb_status = SRB_STATUS_SELECTION_TIMEOUT; | 777 | ccb->srb_status = SRB_STATUS_SELECTION_TIMEOUT; |
768 | else | 778 | else |
769 | ccb->srb_status = SRB_STATUS_SUCCESS; | 779 | ccb->srb_status = SRB_STATUS_SUCCESS; |
770 | } else if (ccb->cmd->cmnd[0] == REPORT_LUNS) { | ||
771 | u8 *report_lun_data = (u8 *)hba->copy_buffer; | ||
772 | |||
773 | count = STEX_EXTRA_SIZE; | ||
774 | stex_internal_copy(ccb->cmd, report_lun_data, | ||
775 | &count, ccb->sg_count, ST_FROM_CMD); | ||
776 | if (report_lun_data[2] || report_lun_data[3]) { | ||
777 | report_lun_data[2] = 0x00; | ||
778 | report_lun_data[3] = 0x08; | ||
779 | stex_internal_copy(ccb->cmd, report_lun_data, | ||
780 | &count, ccb->sg_count, ST_TO_CMD); | ||
781 | } | ||
782 | } | 780 | } |
783 | } | 781 | } |
784 | 782 | ||
@@ -995,6 +993,11 @@ static int stex_abort(struct scsi_cmnd *cmd) | |||
995 | u32 data; | 993 | u32 data; |
996 | int result = SUCCESS; | 994 | int result = SUCCESS; |
997 | unsigned long flags; | 995 | unsigned long flags; |
996 | |||
997 | printk(KERN_INFO DRV_NAME | ||
998 | "(%s): aborting command\n", pci_name(hba->pdev)); | ||
999 | scsi_print_command(cmd); | ||
1000 | |||
998 | base = hba->mmio_base; | 1001 | base = hba->mmio_base; |
999 | spin_lock_irqsave(host->host_lock, flags); | 1002 | spin_lock_irqsave(host->host_lock, flags); |
1000 | if (tag < host->can_queue && hba->ccb[tag].cmd == cmd) | 1003 | if (tag < host->can_queue && hba->ccb[tag].cmd == cmd) |
@@ -1051,7 +1054,12 @@ static void stex_hard_reset(struct st_hba *hba) | |||
1051 | pci_read_config_byte(bus->self, PCI_BRIDGE_CONTROL, &pci_bctl); | 1054 | pci_read_config_byte(bus->self, PCI_BRIDGE_CONTROL, &pci_bctl); |
1052 | pci_bctl |= PCI_BRIDGE_CTL_BUS_RESET; | 1055 | pci_bctl |= PCI_BRIDGE_CTL_BUS_RESET; |
1053 | pci_write_config_byte(bus->self, PCI_BRIDGE_CONTROL, pci_bctl); | 1056 | pci_write_config_byte(bus->self, PCI_BRIDGE_CONTROL, pci_bctl); |
1054 | msleep(1); | 1057 | |
1058 | /* | ||
1059 | * 1 ms may be enough for 8-port controllers. But 16-port controllers | ||
1060 | * require more time to finish bus reset. Use 100 ms here for safety | ||
1061 | */ | ||
1062 | msleep(100); | ||
1055 | pci_bctl &= ~PCI_BRIDGE_CTL_BUS_RESET; | 1063 | pci_bctl &= ~PCI_BRIDGE_CTL_BUS_RESET; |
1056 | pci_write_config_byte(bus->self, PCI_BRIDGE_CONTROL, pci_bctl); | 1064 | pci_write_config_byte(bus->self, PCI_BRIDGE_CONTROL, pci_bctl); |
1057 | 1065 | ||
@@ -1075,6 +1083,10 @@ static int stex_reset(struct scsi_cmnd *cmd) | |||
1075 | unsigned long before; | 1083 | unsigned long before; |
1076 | hba = (struct st_hba *) &cmd->device->host->hostdata[0]; | 1084 | hba = (struct st_hba *) &cmd->device->host->hostdata[0]; |
1077 | 1085 | ||
1086 | printk(KERN_INFO DRV_NAME | ||
1087 | "(%s): resetting host\n", pci_name(hba->pdev)); | ||
1088 | scsi_print_command(cmd); | ||
1089 | |||
1078 | hba->mu_status = MU_STATE_RESETTING; | 1090 | hba->mu_status = MU_STATE_RESETTING; |
1079 | 1091 | ||
1080 | if (hba->cardtype == st_shasta) | 1092 | if (hba->cardtype == st_shasta) |
@@ -1194,7 +1206,7 @@ stex_probe(struct pci_dev *pdev, const struct pci_device_id *id) | |||
1194 | goto out_scsi_host_put; | 1206 | goto out_scsi_host_put; |
1195 | } | 1207 | } |
1196 | 1208 | ||
1197 | hba->mmio_base = ioremap(pci_resource_start(pdev, 0), | 1209 | hba->mmio_base = ioremap_nocache(pci_resource_start(pdev, 0), |
1198 | pci_resource_len(pdev, 0)); | 1210 | pci_resource_len(pdev, 0)); |
1199 | if ( !hba->mmio_base) { | 1211 | if ( !hba->mmio_base) { |
1200 | printk(KERN_ERR DRV_NAME "(%s): memory map failed\n", | 1212 | printk(KERN_ERR DRV_NAME "(%s): memory map failed\n", |
@@ -1229,12 +1241,18 @@ stex_probe(struct pci_dev *pdev, const struct pci_device_id *id) | |||
1229 | hba->copy_buffer = hba->dma_mem + MU_BUFFER_SIZE; | 1241 | hba->copy_buffer = hba->dma_mem + MU_BUFFER_SIZE; |
1230 | hba->mu_status = MU_STATE_STARTING; | 1242 | hba->mu_status = MU_STATE_STARTING; |
1231 | 1243 | ||
1232 | /* firmware uses id/lun pair for a logical drive, but lun would be | 1244 | if (hba->cardtype == st_shasta) { |
1233 | always 0 if CONFIG_SCSI_MULTI_LUN not configured, so we use | 1245 | host->max_lun = 8; |
1234 | channel to map lun here */ | 1246 | host->max_id = 16 + 1; |
1235 | host->max_channel = ST_MAX_LUN_PER_TARGET - 1; | 1247 | } else if (hba->cardtype == st_yosemite) { |
1236 | host->max_id = ST_MAX_TARGET_NUM; | 1248 | host->max_lun = 128; |
1237 | host->max_lun = 1; | 1249 | host->max_id = 1 + 1; |
1250 | } else { | ||
1251 | /* st_vsc and st_vsc1 */ | ||
1252 | host->max_lun = 1; | ||
1253 | host->max_id = 128 + 1; | ||
1254 | } | ||
1255 | host->max_channel = 0; | ||
1238 | host->unique_id = host->host_no; | 1256 | host->unique_id = host->host_no; |
1239 | host->max_cmd_len = STEX_CDB_LENGTH; | 1257 | host->max_cmd_len = STEX_CDB_LENGTH; |
1240 | 1258 | ||
diff --git a/drivers/spi/mpc52xx_psc_spi.c b/drivers/spi/mpc52xx_psc_spi.c index 052359fc41ee..11f36bef3057 100644 --- a/drivers/spi/mpc52xx_psc_spi.c +++ b/drivers/spi/mpc52xx_psc_spi.c | |||
@@ -329,8 +329,8 @@ static int mpc52xx_psc_spi_port_config(int psc_id, struct mpc52xx_psc_spi *mps) | |||
329 | int ret = 0; | 329 | int ret = 0; |
330 | 330 | ||
331 | #if defined(CONFIG_PPC_MERGE) | 331 | #if defined(CONFIG_PPC_MERGE) |
332 | cdm = mpc52xx_find_and_map("mpc52xx-cdm"); | 332 | cdm = mpc52xx_find_and_map("mpc5200-cdm"); |
333 | gpio = mpc52xx_find_and_map("mpc52xx-gpio"); | 333 | gpio = mpc52xx_find_and_map("mpc5200-gpio"); |
334 | #else | 334 | #else |
335 | cdm = ioremap(MPC52xx_PA(MPC52xx_CDM_OFFSET), MPC52xx_CDM_SIZE); | 335 | cdm = ioremap(MPC52xx_PA(MPC52xx_CDM_OFFSET), MPC52xx_CDM_SIZE); |
336 | gpio = ioremap(MPC52xx_PA(MPC52xx_GPIO_OFFSET), MPC52xx_GPIO_SIZE); | 336 | gpio = ioremap(MPC52xx_PA(MPC52xx_GPIO_OFFSET), MPC52xx_GPIO_SIZE); |
@@ -445,9 +445,6 @@ static int __init mpc52xx_psc_spi_do_probe(struct device *dev, u32 regaddr, | |||
445 | struct spi_master *master; | 445 | struct spi_master *master; |
446 | int ret; | 446 | int ret; |
447 | 447 | ||
448 | if (pdata == NULL) | ||
449 | return -ENODEV; | ||
450 | |||
451 | master = spi_alloc_master(dev, sizeof *mps); | 448 | master = spi_alloc_master(dev, sizeof *mps); |
452 | if (master == NULL) | 449 | if (master == NULL) |
453 | return -ENOMEM; | 450 | return -ENOMEM; |
@@ -594,17 +591,17 @@ static int __init mpc52xx_psc_spi_of_probe(struct of_device *op, | |||
594 | } | 591 | } |
595 | regaddr64 = of_translate_address(op->node, regaddr_p); | 592 | regaddr64 = of_translate_address(op->node, regaddr_p); |
596 | 593 | ||
594 | /* get PSC id (1..6, used by port_config) */ | ||
597 | if (op->dev.platform_data == NULL) { | 595 | if (op->dev.platform_data == NULL) { |
598 | struct device_node *np; | 596 | const u32 *psc_nump; |
599 | int i = 0; | ||
600 | 597 | ||
601 | for_each_node_by_type(np, "spi") { | 598 | psc_nump = of_get_property(op->node, "cell-index", NULL); |
602 | if (of_find_device_by_node(np) == op) { | 599 | if (!psc_nump || *psc_nump > 5) { |
603 | id = i; | 600 | printk(KERN_ERR "mpc52xx_psc_spi: Device node %s has invalid " |
604 | break; | 601 | "cell-index property\n", op->node->full_name); |
605 | } | 602 | return -EINVAL; |
606 | i++; | ||
607 | } | 603 | } |
604 | id = *psc_nump + 1; | ||
608 | } | 605 | } |
609 | 606 | ||
610 | return mpc52xx_psc_spi_do_probe(&op->dev, (u32)regaddr64, (u32)size64, | 607 | return mpc52xx_psc_spi_do_probe(&op->dev, (u32)regaddr64, (u32)size64, |
@@ -617,7 +614,7 @@ static int __exit mpc52xx_psc_spi_of_remove(struct of_device *op) | |||
617 | } | 614 | } |
618 | 615 | ||
619 | static struct of_device_id mpc52xx_psc_spi_of_match[] = { | 616 | static struct of_device_id mpc52xx_psc_spi_of_match[] = { |
620 | { .type = "spi", .compatible = "mpc52xx-psc-spi", }, | 617 | { .type = "spi", .compatible = "mpc5200-psc-spi", }, |
621 | {}, | 618 | {}, |
622 | }; | 619 | }; |
623 | 620 | ||
diff --git a/drivers/spi/omap_uwire.c b/drivers/spi/omap_uwire.c index 96f62b2df300..95183e1df525 100644 --- a/drivers/spi/omap_uwire.c +++ b/drivers/spi/omap_uwire.c | |||
@@ -358,11 +358,11 @@ static int uwire_setup_transfer(struct spi_device *spi, struct spi_transfer *t) | |||
358 | switch (spi->mode & (SPI_CPOL | SPI_CPHA)) { | 358 | switch (spi->mode & (SPI_CPOL | SPI_CPHA)) { |
359 | case SPI_MODE_0: | 359 | case SPI_MODE_0: |
360 | case SPI_MODE_3: | 360 | case SPI_MODE_3: |
361 | flags |= UWIRE_WRITE_RISING_EDGE | UWIRE_READ_FALLING_EDGE; | 361 | flags |= UWIRE_WRITE_FALLING_EDGE | UWIRE_READ_RISING_EDGE; |
362 | break; | 362 | break; |
363 | case SPI_MODE_1: | 363 | case SPI_MODE_1: |
364 | case SPI_MODE_2: | 364 | case SPI_MODE_2: |
365 | flags |= UWIRE_WRITE_FALLING_EDGE | UWIRE_READ_RISING_EDGE; | 365 | flags |= UWIRE_WRITE_RISING_EDGE | UWIRE_READ_FALLING_EDGE; |
366 | break; | 366 | break; |
367 | } | 367 | } |
368 | 368 | ||
diff --git a/drivers/spi/spidev.c b/drivers/spi/spidev.c index 225d6b2f82dd..d04242aee40d 100644 --- a/drivers/spi/spidev.c +++ b/drivers/spi/spidev.c | |||
@@ -168,6 +168,12 @@ static int spidev_message(struct spidev_data *spidev, | |||
168 | n--, k_tmp++, u_tmp++) { | 168 | n--, k_tmp++, u_tmp++) { |
169 | k_tmp->len = u_tmp->len; | 169 | k_tmp->len = u_tmp->len; |
170 | 170 | ||
171 | total += k_tmp->len; | ||
172 | if (total > bufsiz) { | ||
173 | status = -EMSGSIZE; | ||
174 | goto done; | ||
175 | } | ||
176 | |||
171 | if (u_tmp->rx_buf) { | 177 | if (u_tmp->rx_buf) { |
172 | k_tmp->rx_buf = buf; | 178 | k_tmp->rx_buf = buf; |
173 | if (!access_ok(VERIFY_WRITE, u_tmp->rx_buf, u_tmp->len)) | 179 | if (!access_ok(VERIFY_WRITE, u_tmp->rx_buf, u_tmp->len)) |
@@ -179,12 +185,6 @@ static int spidev_message(struct spidev_data *spidev, | |||
179 | u_tmp->len)) | 185 | u_tmp->len)) |
180 | goto done; | 186 | goto done; |
181 | } | 187 | } |
182 | |||
183 | total += k_tmp->len; | ||
184 | if (total > bufsiz) { | ||
185 | status = -EMSGSIZE; | ||
186 | goto done; | ||
187 | } | ||
188 | buf += k_tmp->len; | 188 | buf += k_tmp->len; |
189 | 189 | ||
190 | k_tmp->cs_change = !!u_tmp->cs_change; | 190 | k_tmp->cs_change = !!u_tmp->cs_change; |
@@ -364,6 +364,7 @@ spidev_ioctl(struct inode *inode, struct file *filp, | |||
364 | break; | 364 | break; |
365 | } | 365 | } |
366 | if (__copy_from_user(ioc, (void __user *)arg, tmp)) { | 366 | if (__copy_from_user(ioc, (void __user *)arg, tmp)) { |
367 | kfree(ioc); | ||
367 | retval = -EFAULT; | 368 | retval = -EFAULT; |
368 | break; | 369 | break; |
369 | } | 370 | } |
diff --git a/drivers/usb/class/usblp.c b/drivers/usb/class/usblp.c index 15e740e3a5c4..7b1edfe46b28 100644 --- a/drivers/usb/class/usblp.c +++ b/drivers/usb/class/usblp.c | |||
@@ -1003,7 +1003,7 @@ abort: | |||
1003 | usblp->writebuf, usblp->writeurb->transfer_dma); | 1003 | usblp->writebuf, usblp->writeurb->transfer_dma); |
1004 | if (usblp->readbuf) | 1004 | if (usblp->readbuf) |
1005 | usb_buffer_free (usblp->dev, USBLP_BUF_SIZE, | 1005 | usb_buffer_free (usblp->dev, USBLP_BUF_SIZE, |
1006 | usblp->readbuf, usblp->writeurb->transfer_dma); | 1006 | usblp->readbuf, usblp->readurb->transfer_dma); |
1007 | kfree(usblp->statusbuf); | 1007 | kfree(usblp->statusbuf); |
1008 | kfree(usblp->device_id_string); | 1008 | kfree(usblp->device_id_string); |
1009 | usb_free_urb(usblp->writeurb); | 1009 | usb_free_urb(usblp->writeurb); |
diff --git a/drivers/usb/core/config.c b/drivers/usb/core/config.c index bfb3731d42db..2d4fd530e5e4 100644 --- a/drivers/usb/core/config.c +++ b/drivers/usb/core/config.c | |||
@@ -185,10 +185,12 @@ static int usb_parse_interface(struct device *ddev, int cfgno, | |||
185 | num_ep = USB_MAXENDPOINTS; | 185 | num_ep = USB_MAXENDPOINTS; |
186 | } | 186 | } |
187 | 187 | ||
188 | len = sizeof(struct usb_host_endpoint) * num_ep; | 188 | if (num_ep > 0) { /* Can't allocate 0 bytes */ |
189 | alt->endpoint = kzalloc(len, GFP_KERNEL); | 189 | len = sizeof(struct usb_host_endpoint) * num_ep; |
190 | if (!alt->endpoint) | 190 | alt->endpoint = kzalloc(len, GFP_KERNEL); |
191 | return -ENOMEM; | 191 | if (!alt->endpoint) |
192 | return -ENOMEM; | ||
193 | } | ||
192 | 194 | ||
193 | /* Parse all the endpoint descriptors */ | 195 | /* Parse all the endpoint descriptors */ |
194 | n = 0; | 196 | n = 0; |
diff --git a/drivers/usb/core/driver.c b/drivers/usb/core/driver.c index b9f7f90aef82..2619986e5300 100644 --- a/drivers/usb/core/driver.c +++ b/drivers/usb/core/driver.c | |||
@@ -983,7 +983,10 @@ static int autosuspend_check(struct usb_device *udev) | |||
983 | 983 | ||
984 | #else | 984 | #else |
985 | 985 | ||
986 | #define autosuspend_check(udev) 0 | 986 | static inline int autosuspend_check(struct usb_device *udev) |
987 | { | ||
988 | return 0; | ||
989 | } | ||
987 | 990 | ||
988 | #endif /* CONFIG_USB_SUSPEND */ | 991 | #endif /* CONFIG_USB_SUSPEND */ |
989 | 992 | ||
@@ -1041,7 +1044,6 @@ static int usb_suspend_both(struct usb_device *udev, pm_message_t msg) | |||
1041 | if (status < 0) | 1044 | if (status < 0) |
1042 | goto done; | 1045 | goto done; |
1043 | } | 1046 | } |
1044 | cancel_delayed_work(&udev->autosuspend); | ||
1045 | 1047 | ||
1046 | /* Suspend all the interfaces and then udev itself */ | 1048 | /* Suspend all the interfaces and then udev itself */ |
1047 | if (udev->actconfig) { | 1049 | if (udev->actconfig) { |
@@ -1062,9 +1064,16 @@ static int usb_suspend_both(struct usb_device *udev, pm_message_t msg) | |||
1062 | usb_resume_interface(intf); | 1064 | usb_resume_interface(intf); |
1063 | } | 1065 | } |
1064 | 1066 | ||
1067 | /* Try another autosuspend when the interfaces aren't busy */ | ||
1068 | if (udev->auto_pm) | ||
1069 | autosuspend_check(udev); | ||
1070 | |||
1065 | /* If the suspend succeeded, propagate it up the tree */ | 1071 | /* If the suspend succeeded, propagate it up the tree */ |
1066 | } else if (parent) | 1072 | } else { |
1067 | usb_autosuspend_device(parent); | 1073 | cancel_delayed_work(&udev->autosuspend); |
1074 | if (parent) | ||
1075 | usb_autosuspend_device(parent); | ||
1076 | } | ||
1068 | 1077 | ||
1069 | done: | 1078 | done: |
1070 | // dev_dbg(&udev->dev, "%s: status %d\n", __FUNCTION__, status); | 1079 | // dev_dbg(&udev->dev, "%s: status %d\n", __FUNCTION__, status); |
@@ -1475,6 +1484,7 @@ int usb_external_resume_device(struct usb_device *udev) | |||
1475 | usb_pm_lock(udev); | 1484 | usb_pm_lock(udev); |
1476 | udev->auto_pm = 0; | 1485 | udev->auto_pm = 0; |
1477 | status = usb_resume_both(udev); | 1486 | status = usb_resume_both(udev); |
1487 | udev->last_busy = jiffies; | ||
1478 | usb_pm_unlock(udev); | 1488 | usb_pm_unlock(udev); |
1479 | 1489 | ||
1480 | /* Now that the device is awake, we can start trying to autosuspend | 1490 | /* Now that the device is awake, we can start trying to autosuspend |
diff --git a/drivers/usb/core/hcd.c b/drivers/usb/core/hcd.c index 40cf882293e6..8969e42434b9 100644 --- a/drivers/usb/core/hcd.c +++ b/drivers/usb/core/hcd.c | |||
@@ -1018,8 +1018,8 @@ done: | |||
1018 | atomic_dec (&urb->use_count); | 1018 | atomic_dec (&urb->use_count); |
1019 | if (urb->reject) | 1019 | if (urb->reject) |
1020 | wake_up (&usb_kill_urb_queue); | 1020 | wake_up (&usb_kill_urb_queue); |
1021 | usb_put_urb (urb); | ||
1022 | usbmon_urb_submit_error(&hcd->self, urb, status); | 1021 | usbmon_urb_submit_error(&hcd->self, urb, status); |
1022 | usb_put_urb (urb); | ||
1023 | } | 1023 | } |
1024 | return status; | 1024 | return status; |
1025 | } | 1025 | } |
@@ -1175,10 +1175,6 @@ void usb_hcd_endpoint_disable (struct usb_device *udev, | |||
1175 | struct urb *urb; | 1175 | struct urb *urb; |
1176 | 1176 | ||
1177 | hcd = bus_to_hcd(udev->bus); | 1177 | hcd = bus_to_hcd(udev->bus); |
1178 | |||
1179 | WARN_ON (!HC_IS_RUNNING (hcd->state) && hcd->state != HC_STATE_HALT && | ||
1180 | udev->state != USB_STATE_NOTATTACHED); | ||
1181 | |||
1182 | local_irq_disable (); | 1178 | local_irq_disable (); |
1183 | 1179 | ||
1184 | /* ep is already gone from udev->ep_{in,out}[]; no more submits */ | 1180 | /* ep is already gone from udev->ep_{in,out}[]; no more submits */ |
@@ -1685,7 +1681,7 @@ void usb_remove_hcd(struct usb_hcd *hcd) | |||
1685 | spin_unlock_irq (&hcd_root_hub_lock); | 1681 | spin_unlock_irq (&hcd_root_hub_lock); |
1686 | 1682 | ||
1687 | #ifdef CONFIG_PM | 1683 | #ifdef CONFIG_PM |
1688 | flush_workqueue(ksuspend_usb_wq); | 1684 | cancel_work_sync(&hcd->wakeup_work); |
1689 | #endif | 1685 | #endif |
1690 | 1686 | ||
1691 | mutex_lock(&usb_bus_list_lock); | 1687 | mutex_lock(&usb_bus_list_lock); |
diff --git a/drivers/usb/core/hub.c b/drivers/usb/core/hub.c index f6b74a678de5..24f10a19dbdb 100644 --- a/drivers/usb/core/hub.c +++ b/drivers/usb/core/hub.c | |||
@@ -1158,6 +1158,30 @@ static void release_address(struct usb_device *udev) | |||
1158 | } | 1158 | } |
1159 | } | 1159 | } |
1160 | 1160 | ||
1161 | #ifdef CONFIG_USB_SUSPEND | ||
1162 | |||
1163 | static void usb_stop_pm(struct usb_device *udev) | ||
1164 | { | ||
1165 | /* Synchronize with the ksuspend thread to prevent any more | ||
1166 | * autosuspend requests from being submitted, and decrement | ||
1167 | * the parent's count of unsuspended children. | ||
1168 | */ | ||
1169 | usb_pm_lock(udev); | ||
1170 | if (udev->parent && !udev->discon_suspended) | ||
1171 | usb_autosuspend_device(udev->parent); | ||
1172 | usb_pm_unlock(udev); | ||
1173 | |||
1174 | /* Stop any autosuspend requests already submitted */ | ||
1175 | cancel_rearming_delayed_work(&udev->autosuspend); | ||
1176 | } | ||
1177 | |||
1178 | #else | ||
1179 | |||
1180 | static inline void usb_stop_pm(struct usb_device *udev) | ||
1181 | { } | ||
1182 | |||
1183 | #endif | ||
1184 | |||
1161 | /** | 1185 | /** |
1162 | * usb_disconnect - disconnect a device (usbcore-internal) | 1186 | * usb_disconnect - disconnect a device (usbcore-internal) |
1163 | * @pdev: pointer to device being disconnected | 1187 | * @pdev: pointer to device being disconnected |
@@ -1224,13 +1248,7 @@ void usb_disconnect(struct usb_device **pdev) | |||
1224 | *pdev = NULL; | 1248 | *pdev = NULL; |
1225 | spin_unlock_irq(&device_state_lock); | 1249 | spin_unlock_irq(&device_state_lock); |
1226 | 1250 | ||
1227 | /* Decrement the parent's count of unsuspended children */ | 1251 | usb_stop_pm(udev); |
1228 | if (udev->parent) { | ||
1229 | usb_pm_lock(udev); | ||
1230 | if (!udev->discon_suspended) | ||
1231 | usb_autosuspend_device(udev->parent); | ||
1232 | usb_pm_unlock(udev); | ||
1233 | } | ||
1234 | 1252 | ||
1235 | put_device(&udev->dev); | 1253 | put_device(&udev->dev); |
1236 | } | 1254 | } |
@@ -2201,14 +2219,9 @@ hub_port_init (struct usb_hub *hub, struct usb_device *udev, int port1, | |||
2201 | continue; | 2219 | continue; |
2202 | } | 2220 | } |
2203 | 2221 | ||
2204 | /* Use a short timeout the first time through, | 2222 | /* Retry on all errors; some devices are flakey. |
2205 | * so that recalcitrant full-speed devices with | 2223 | * 255 is for WUSB devices, we actually need to use |
2206 | * 8- or 16-byte ep0-maxpackets won't slow things | 2224 | * 512 (WUSB1.0[4.8.1]). |
2207 | * down tremendously by NAKing the unexpectedly | ||
2208 | * early status stage. Also, retry on all errors; | ||
2209 | * some devices are flakey. | ||
2210 | * 255 is for WUSB devices, we actually need to use 512. | ||
2211 | * WUSB1.0[4.8.1]. | ||
2212 | */ | 2225 | */ |
2213 | for (j = 0; j < 3; ++j) { | 2226 | for (j = 0; j < 3; ++j) { |
2214 | buf->bMaxPacketSize0 = 0; | 2227 | buf->bMaxPacketSize0 = 0; |
@@ -2216,7 +2229,7 @@ hub_port_init (struct usb_hub *hub, struct usb_device *udev, int port1, | |||
2216 | USB_REQ_GET_DESCRIPTOR, USB_DIR_IN, | 2229 | USB_REQ_GET_DESCRIPTOR, USB_DIR_IN, |
2217 | USB_DT_DEVICE << 8, 0, | 2230 | USB_DT_DEVICE << 8, 0, |
2218 | buf, GET_DESCRIPTOR_BUFSIZE, | 2231 | buf, GET_DESCRIPTOR_BUFSIZE, |
2219 | (i ? USB_CTRL_GET_TIMEOUT : 1000)); | 2232 | USB_CTRL_GET_TIMEOUT); |
2220 | switch (buf->bMaxPacketSize0) { | 2233 | switch (buf->bMaxPacketSize0) { |
2221 | case 8: case 16: case 32: case 64: case 255: | 2234 | case 8: case 16: case 32: case 64: case 255: |
2222 | if (buf->bDescriptorType == | 2235 | if (buf->bDescriptorType == |
@@ -2426,10 +2439,10 @@ static void hub_port_connect_change(struct usb_hub *hub, int port1, | |||
2426 | 2439 | ||
2427 | if (portchange & USB_PORT_STAT_C_CONNECTION) { | 2440 | if (portchange & USB_PORT_STAT_C_CONNECTION) { |
2428 | status = hub_port_debounce(hub, port1); | 2441 | status = hub_port_debounce(hub, port1); |
2429 | if (status < 0 && printk_ratelimit()) { | 2442 | if (status < 0) { |
2430 | dev_err (hub_dev, | 2443 | if (printk_ratelimit()) |
2431 | "connect-debounce failed, port %d disabled\n", | 2444 | dev_err (hub_dev, "connect-debounce failed, " |
2432 | port1); | 2445 | "port %d disabled\n", port1); |
2433 | goto done; | 2446 | goto done; |
2434 | } | 2447 | } |
2435 | portstatus = status; | 2448 | portstatus = status; |
diff --git a/drivers/usb/core/message.c b/drivers/usb/core/message.c index b7434787db5f..f9fed34bf7d8 100644 --- a/drivers/usb/core/message.c +++ b/drivers/usb/core/message.c | |||
@@ -221,15 +221,10 @@ int usb_bulk_msg(struct usb_device *usb_dev, unsigned int pipe, | |||
221 | 221 | ||
222 | if ((ep->desc.bmAttributes & USB_ENDPOINT_XFERTYPE_MASK) == | 222 | if ((ep->desc.bmAttributes & USB_ENDPOINT_XFERTYPE_MASK) == |
223 | USB_ENDPOINT_XFER_INT) { | 223 | USB_ENDPOINT_XFER_INT) { |
224 | int interval; | ||
225 | |||
226 | if (usb_dev->speed == USB_SPEED_HIGH) | ||
227 | interval = 1 << min(15, ep->desc.bInterval - 1); | ||
228 | else | ||
229 | interval = ep->desc.bInterval; | ||
230 | pipe = (pipe & ~(3 << 30)) | (PIPE_INTERRUPT << 30); | 224 | pipe = (pipe & ~(3 << 30)) | (PIPE_INTERRUPT << 30); |
231 | usb_fill_int_urb(urb, usb_dev, pipe, data, len, | 225 | usb_fill_int_urb(urb, usb_dev, pipe, data, len, |
232 | usb_api_blocking_completion, NULL, interval); | 226 | usb_api_blocking_completion, NULL, |
227 | ep->desc.bInterval); | ||
233 | } else | 228 | } else |
234 | usb_fill_bulk_urb(urb, usb_dev, pipe, data, len, | 229 | usb_fill_bulk_urb(urb, usb_dev, pipe, data, len, |
235 | usb_api_blocking_completion, NULL); | 230 | usb_api_blocking_completion, NULL); |
diff --git a/drivers/usb/core/sysfs.c b/drivers/usb/core/sysfs.c index e7c982377488..be37c863fdfb 100644 --- a/drivers/usb/core/sysfs.c +++ b/drivers/usb/core/sysfs.c | |||
@@ -232,12 +232,15 @@ set_level(struct device *dev, struct device_attribute *attr, | |||
232 | int len = count; | 232 | int len = count; |
233 | char *cp; | 233 | char *cp; |
234 | int rc = 0; | 234 | int rc = 0; |
235 | int old_autosuspend_disabled, old_autoresume_disabled; | ||
235 | 236 | ||
236 | cp = memchr(buf, '\n', count); | 237 | cp = memchr(buf, '\n', count); |
237 | if (cp) | 238 | if (cp) |
238 | len = cp - buf; | 239 | len = cp - buf; |
239 | 240 | ||
240 | usb_lock_device(udev); | 241 | usb_lock_device(udev); |
242 | old_autosuspend_disabled = udev->autosuspend_disabled; | ||
243 | old_autoresume_disabled = udev->autoresume_disabled; | ||
241 | 244 | ||
242 | /* Setting the flags without calling usb_pm_lock is a subject to | 245 | /* Setting the flags without calling usb_pm_lock is a subject to |
243 | * races, but who cares... | 246 | * races, but who cares... |
@@ -263,6 +266,10 @@ set_level(struct device *dev, struct device_attribute *attr, | |||
263 | } else | 266 | } else |
264 | rc = -EINVAL; | 267 | rc = -EINVAL; |
265 | 268 | ||
269 | if (rc) { | ||
270 | udev->autosuspend_disabled = old_autosuspend_disabled; | ||
271 | udev->autoresume_disabled = old_autoresume_disabled; | ||
272 | } | ||
266 | usb_unlock_device(udev); | 273 | usb_unlock_device(udev); |
267 | return (rc < 0 ? rc : count); | 274 | return (rc < 0 ? rc : count); |
268 | } | 275 | } |
diff --git a/drivers/usb/core/usb.c b/drivers/usb/core/usb.c index 18ddc5e67e39..4a6299bd0047 100644 --- a/drivers/usb/core/usb.c +++ b/drivers/usb/core/usb.c | |||
@@ -184,10 +184,6 @@ static void usb_release_dev(struct device *dev) | |||
184 | 184 | ||
185 | udev = to_usb_device(dev); | 185 | udev = to_usb_device(dev); |
186 | 186 | ||
187 | #ifdef CONFIG_USB_SUSPEND | ||
188 | cancel_delayed_work(&udev->autosuspend); | ||
189 | flush_workqueue(ksuspend_usb_wq); | ||
190 | #endif | ||
191 | usb_destroy_configuration(udev); | 187 | usb_destroy_configuration(udev); |
192 | usb_put_hcd(bus_to_hcd(udev->bus)); | 188 | usb_put_hcd(bus_to_hcd(udev->bus)); |
193 | kfree(udev->product); | 189 | kfree(udev->product); |
@@ -205,7 +201,11 @@ struct device_type usb_device_type = { | |||
205 | 201 | ||
206 | static int ksuspend_usb_init(void) | 202 | static int ksuspend_usb_init(void) |
207 | { | 203 | { |
208 | ksuspend_usb_wq = create_singlethread_workqueue("ksuspend_usbd"); | 204 | /* This workqueue is supposed to be both freezable and |
205 | * singlethreaded. Its job doesn't justify running on more | ||
206 | * than one CPU. | ||
207 | */ | ||
208 | ksuspend_usb_wq = create_freezeable_workqueue("ksuspend_usbd"); | ||
209 | if (!ksuspend_usb_wq) | 209 | if (!ksuspend_usb_wq) |
210 | return -ENOMEM; | 210 | return -ENOMEM; |
211 | return 0; | 211 | return 0; |
diff --git a/drivers/usb/gadget/fsl_usb2_udc.c b/drivers/usb/gadget/fsl_usb2_udc.c index 157054ea3978..3ca2b3159f00 100644 --- a/drivers/usb/gadget/fsl_usb2_udc.c +++ b/drivers/usb/gadget/fsl_usb2_udc.c | |||
@@ -228,13 +228,15 @@ static int dr_controller_setup(struct fsl_udc *udc) | |||
228 | 228 | ||
229 | /* Config PHY interface */ | 229 | /* Config PHY interface */ |
230 | portctrl = fsl_readl(&dr_regs->portsc1); | 230 | portctrl = fsl_readl(&dr_regs->portsc1); |
231 | portctrl &= ~PORTSCX_PHY_TYPE_SEL; | 231 | portctrl &= ~(PORTSCX_PHY_TYPE_SEL & PORTSCX_PORT_WIDTH); |
232 | switch (udc->phy_mode) { | 232 | switch (udc->phy_mode) { |
233 | case FSL_USB2_PHY_ULPI: | 233 | case FSL_USB2_PHY_ULPI: |
234 | portctrl |= PORTSCX_PTS_ULPI; | 234 | portctrl |= PORTSCX_PTS_ULPI; |
235 | break; | 235 | break; |
236 | case FSL_USB2_PHY_UTMI: | ||
237 | case FSL_USB2_PHY_UTMI_WIDE: | 236 | case FSL_USB2_PHY_UTMI_WIDE: |
237 | portctrl |= PORTSCX_PTW_16BIT; | ||
238 | /* fall through */ | ||
239 | case FSL_USB2_PHY_UTMI: | ||
238 | portctrl |= PORTSCX_PTS_UTMI; | 240 | portctrl |= PORTSCX_PTS_UTMI; |
239 | break; | 241 | break; |
240 | case FSL_USB2_PHY_SERIAL: | 242 | case FSL_USB2_PHY_SERIAL: |
@@ -625,7 +627,7 @@ static void fsl_free_buffer(struct usb_ep *_ep, void *buf, | |||
625 | struct fsl_ep *ep; | 627 | struct fsl_ep *ep; |
626 | 628 | ||
627 | if (!_ep) | 629 | if (!_ep) |
628 | return NULL; | 630 | return; |
629 | 631 | ||
630 | ep = container_of(_ep, struct fsl_ep, ep); | 632 | ep = container_of(_ep, struct fsl_ep, ep); |
631 | 633 | ||
diff --git a/drivers/usb/host/ehci-fsl.c b/drivers/usb/host/ehci-fsl.c index a52480505f78..c7a7c590426f 100644 --- a/drivers/usb/host/ehci-fsl.c +++ b/drivers/usb/host/ehci-fsl.c | |||
@@ -193,6 +193,19 @@ static void mpc83xx_usb_setup(struct usb_hcd *hcd) | |||
193 | out_be32(non_ehci + FSL_SOC_USB_CTRL, 0x00000004); | 193 | out_be32(non_ehci + FSL_SOC_USB_CTRL, 0x00000004); |
194 | out_be32(non_ehci + FSL_SOC_USB_SNOOP1, 0x0000001b); | 194 | out_be32(non_ehci + FSL_SOC_USB_SNOOP1, 0x0000001b); |
195 | 195 | ||
196 | #if defined(CONFIG_PPC32) && !defined(CONFIG_NOT_COHERENT_CACHE) | ||
197 | /* | ||
198 | * Turn on cache snooping hardware, since some PowerPC platforms | ||
199 | * wholly rely on hardware to deal with cache coherent | ||
200 | */ | ||
201 | |||
202 | /* Setup Snooping for all the 4GB space */ | ||
203 | /* SNOOP1 starts from 0x0, size 2G */ | ||
204 | out_be32(non_ehci + FSL_SOC_USB_SNOOP1, 0x0 | SNOOP_SIZE_2GB); | ||
205 | /* SNOOP2 starts from 0x80000000, size 2G */ | ||
206 | out_be32(non_ehci + FSL_SOC_USB_SNOOP2, 0x80000000 | SNOOP_SIZE_2GB); | ||
207 | #endif | ||
208 | |||
196 | if (pdata->operating_mode == FSL_USB2_DR_HOST) | 209 | if (pdata->operating_mode == FSL_USB2_DR_HOST) |
197 | mpc83xx_setup_phy(ehci, pdata->phy_mode, 0); | 210 | mpc83xx_setup_phy(ehci, pdata->phy_mode, 0); |
198 | 211 | ||
diff --git a/drivers/usb/host/ehci-fsl.h b/drivers/usb/host/ehci-fsl.h index f28736a917e4..b5e59db53347 100644 --- a/drivers/usb/host/ehci-fsl.h +++ b/drivers/usb/host/ehci-fsl.h | |||
@@ -34,4 +34,5 @@ | |||
34 | #define FSL_SOC_USB_PRICTRL 0x40c /* NOTE: big-endian */ | 34 | #define FSL_SOC_USB_PRICTRL 0x40c /* NOTE: big-endian */ |
35 | #define FSL_SOC_USB_SICTRL 0x410 /* NOTE: big-endian */ | 35 | #define FSL_SOC_USB_SICTRL 0x410 /* NOTE: big-endian */ |
36 | #define FSL_SOC_USB_CTRL 0x500 /* NOTE: big-endian */ | 36 | #define FSL_SOC_USB_CTRL 0x500 /* NOTE: big-endian */ |
37 | #define SNOOP_SIZE_2GB 0x1e | ||
37 | #endif /* _EHCI_FSL_H */ | 38 | #endif /* _EHCI_FSL_H */ |
diff --git a/drivers/usb/host/ohci-pci.c b/drivers/usb/host/ohci-pci.c index 79705609fd0c..ca62cb583221 100644 --- a/drivers/usb/host/ohci-pci.c +++ b/drivers/usb/host/ohci-pci.c | |||
@@ -137,7 +137,7 @@ static const struct pci_device_id ohci_pci_quirks[] = { | |||
137 | /* Toshiba portege 4000 */ | 137 | /* Toshiba portege 4000 */ |
138 | .vendor = PCI_VENDOR_ID_AL, | 138 | .vendor = PCI_VENDOR_ID_AL, |
139 | .device = 0x5237, | 139 | .device = 0x5237, |
140 | .subvendor = PCI_VENDOR_ID_TOSHIBA_2, | 140 | .subvendor = PCI_VENDOR_ID_TOSHIBA, |
141 | .subdevice = 0x0004, | 141 | .subdevice = 0x0004, |
142 | .driver_data = (unsigned long) broken_suspend, | 142 | .driver_data = (unsigned long) broken_suspend, |
143 | }, | 143 | }, |
diff --git a/drivers/usb/host/pci-quirks.c b/drivers/usb/host/pci-quirks.c index 20861650905e..c225159ca3d3 100644 --- a/drivers/usb/host/pci-quirks.c +++ b/drivers/usb/host/pci-quirks.c | |||
@@ -44,6 +44,7 @@ | |||
44 | #define EHCI_USBSTS 4 /* status register */ | 44 | #define EHCI_USBSTS 4 /* status register */ |
45 | #define EHCI_USBSTS_HALTED (1 << 12) /* HCHalted bit */ | 45 | #define EHCI_USBSTS_HALTED (1 << 12) /* HCHalted bit */ |
46 | #define EHCI_USBINTR 8 /* interrupt register */ | 46 | #define EHCI_USBINTR 8 /* interrupt register */ |
47 | #define EHCI_CONFIGFLAG 0x40 /* configured flag register */ | ||
47 | #define EHCI_USBLEGSUP 0 /* legacy support register */ | 48 | #define EHCI_USBLEGSUP 0 /* legacy support register */ |
48 | #define EHCI_USBLEGSUP_BIOS (1 << 16) /* BIOS semaphore */ | 49 | #define EHCI_USBLEGSUP_BIOS (1 << 16) /* BIOS semaphore */ |
49 | #define EHCI_USBLEGSUP_OS (1 << 24) /* OS semaphore */ | 50 | #define EHCI_USBLEGSUP_OS (1 << 24) /* OS semaphore */ |
@@ -216,6 +217,7 @@ static void __devinit quirk_usb_disable_ehci(struct pci_dev *pdev) | |||
216 | u32 hcc_params, val; | 217 | u32 hcc_params, val; |
217 | u8 offset, cap_length; | 218 | u8 offset, cap_length; |
218 | int count = 256/4; | 219 | int count = 256/4; |
220 | int tried_handoff = 0; | ||
219 | 221 | ||
220 | if (!mmio_resource_enabled(pdev, 0)) | 222 | if (!mmio_resource_enabled(pdev, 0)) |
221 | return; | 223 | return; |
@@ -273,6 +275,7 @@ static void __devinit quirk_usb_disable_ehci(struct pci_dev *pdev) | |||
273 | */ | 275 | */ |
274 | msec = 5000; | 276 | msec = 5000; |
275 | while ((cap & EHCI_USBLEGSUP_BIOS) && (msec > 0)) { | 277 | while ((cap & EHCI_USBLEGSUP_BIOS) && (msec > 0)) { |
278 | tried_handoff = 1; | ||
276 | msleep(10); | 279 | msleep(10); |
277 | msec -= 10; | 280 | msec -= 10; |
278 | pci_read_config_dword(pdev, offset, &cap); | 281 | pci_read_config_dword(pdev, offset, &cap); |
@@ -292,6 +295,12 @@ static void __devinit quirk_usb_disable_ehci(struct pci_dev *pdev) | |||
292 | pci_write_config_dword(pdev, | 295 | pci_write_config_dword(pdev, |
293 | offset + EHCI_USBLEGCTLSTS, | 296 | offset + EHCI_USBLEGCTLSTS, |
294 | 0); | 297 | 0); |
298 | |||
299 | /* If the BIOS ever owned the controller then we | ||
300 | * can't expect any power sessions to remain intact. | ||
301 | */ | ||
302 | if (tried_handoff) | ||
303 | writel(0, op_reg_base + EHCI_CONFIGFLAG); | ||
295 | break; | 304 | break; |
296 | case 0: /* illegal reserved capability */ | 305 | case 0: /* illegal reserved capability */ |
297 | cap = 0; | 306 | cap = 0; |
diff --git a/drivers/usb/host/u132-hcd.c b/drivers/usb/host/u132-hcd.c index ff0dba01f1c7..e98df2ee9901 100644 --- a/drivers/usb/host/u132-hcd.c +++ b/drivers/usb/host/u132-hcd.c | |||
@@ -57,6 +57,13 @@ | |||
57 | #include <asm/system.h> | 57 | #include <asm/system.h> |
58 | #include <asm/byteorder.h> | 58 | #include <asm/byteorder.h> |
59 | #include "../core/hcd.h" | 59 | #include "../core/hcd.h" |
60 | |||
61 | /* FIXME ohci.h is ONLY for internal use by the OHCI driver. | ||
62 | * If you're going to try stuff like this, you need to split | ||
63 | * out shareable stuff (register declarations?) into its own | ||
64 | * file, maybe name <linux/usb/ohci.h> | ||
65 | */ | ||
66 | |||
60 | #include "ohci.h" | 67 | #include "ohci.h" |
61 | #define OHCI_CONTROL_INIT OHCI_CTRL_CBSR | 68 | #define OHCI_CONTROL_INIT OHCI_CTRL_CBSR |
62 | #define OHCI_INTR_INIT (OHCI_INTR_MIE | OHCI_INTR_UE | OHCI_INTR_RD | \ | 69 | #define OHCI_INTR_INIT (OHCI_INTR_MIE | OHCI_INTR_UE | OHCI_INTR_RD | \ |
@@ -173,11 +180,6 @@ struct u132_ring { | |||
173 | struct u132_endp *curr_endp; | 180 | struct u132_endp *curr_endp; |
174 | struct delayed_work scheduler; | 181 | struct delayed_work scheduler; |
175 | }; | 182 | }; |
176 | #define OHCI_QUIRK_AMD756 0x01 | ||
177 | #define OHCI_QUIRK_SUPERIO 0x02 | ||
178 | #define OHCI_QUIRK_INITRESET 0x04 | ||
179 | #define OHCI_BIG_ENDIAN 0x08 | ||
180 | #define OHCI_QUIRK_ZFMICRO 0x10 | ||
181 | struct u132 { | 183 | struct u132 { |
182 | struct kref kref; | 184 | struct kref kref; |
183 | struct list_head u132_list; | 185 | struct list_head u132_list; |
diff --git a/drivers/usb/misc/auerswald.c b/drivers/usb/misc/auerswald.c index 88fb56d5db8f..cac1500cba62 100644 --- a/drivers/usb/misc/auerswald.c +++ b/drivers/usb/misc/auerswald.c | |||
@@ -1822,16 +1822,10 @@ static int auerchar_release (struct inode *inode, struct file *file) | |||
1822 | pauerswald_t cp; | 1822 | pauerswald_t cp; |
1823 | dbg("release"); | 1823 | dbg("release"); |
1824 | 1824 | ||
1825 | /* get the mutexes */ | 1825 | down(&ccp->mutex); |
1826 | if (down_interruptible (&ccp->mutex)) { | ||
1827 | return -ERESTARTSYS; | ||
1828 | } | ||
1829 | cp = ccp->auerdev; | 1826 | cp = ccp->auerdev; |
1830 | if (cp) { | 1827 | if (cp) { |
1831 | if (down_interruptible (&cp->mutex)) { | 1828 | down(&cp->mutex); |
1832 | up (&ccp->mutex); | ||
1833 | return -ERESTARTSYS; | ||
1834 | } | ||
1835 | /* remove an open service */ | 1829 | /* remove an open service */ |
1836 | auerswald_removeservice (cp, &ccp->scontext); | 1830 | auerswald_removeservice (cp, &ccp->scontext); |
1837 | /* detach from device */ | 1831 | /* detach from device */ |
diff --git a/drivers/usb/misc/ftdi-elan.c b/drivers/usb/misc/ftdi-elan.c index e2172e5cf152..e0f122e131d7 100644 --- a/drivers/usb/misc/ftdi-elan.c +++ b/drivers/usb/misc/ftdi-elan.c | |||
@@ -73,6 +73,13 @@ static struct list_head ftdi_static_list; | |||
73 | #include "usb_u132.h" | 73 | #include "usb_u132.h" |
74 | #include <asm/io.h> | 74 | #include <asm/io.h> |
75 | #include "../core/hcd.h" | 75 | #include "../core/hcd.h" |
76 | |||
77 | /* FIXME ohci.h is ONLY for internal use by the OHCI driver. | ||
78 | * If you're going to try stuff like this, you need to split | ||
79 | * out shareable stuff (register declarations?) into its own | ||
80 | * file, maybe name <linux/usb/ohci.h> | ||
81 | */ | ||
82 | |||
76 | #include "../host/ohci.h" | 83 | #include "../host/ohci.h" |
77 | /* Define these values to match your devices*/ | 84 | /* Define these values to match your devices*/ |
78 | #define USB_FTDI_ELAN_VENDOR_ID 0x0403 | 85 | #define USB_FTDI_ELAN_VENDOR_ID 0x0403 |
@@ -2300,10 +2307,7 @@ static int ftdi_elan_checkingPCI(struct usb_ftdi *ftdi) | |||
2300 | offsetof(struct ohci_regs, member), 0, data); | 2307 | offsetof(struct ohci_regs, member), 0, data); |
2301 | #define ftdi_write_pcimem(ftdi, member, data) ftdi_elan_write_pcimem(ftdi, \ | 2308 | #define ftdi_write_pcimem(ftdi, member, data) ftdi_elan_write_pcimem(ftdi, \ |
2302 | offsetof(struct ohci_regs, member), 0, data); | 2309 | offsetof(struct ohci_regs, member), 0, data); |
2303 | #define OHCI_QUIRK_AMD756 0x01 | 2310 | |
2304 | #define OHCI_QUIRK_SUPERIO 0x02 | ||
2305 | #define OHCI_QUIRK_INITRESET 0x04 | ||
2306 | #define OHCI_BIG_ENDIAN 0x08 | ||
2307 | #define OHCI_CONTROL_INIT OHCI_CTRL_CBSR | 2311 | #define OHCI_CONTROL_INIT OHCI_CTRL_CBSR |
2308 | #define OHCI_INTR_INIT (OHCI_INTR_MIE | OHCI_INTR_UE | OHCI_INTR_RD | \ | 2312 | #define OHCI_INTR_INIT (OHCI_INTR_MIE | OHCI_INTR_UE | OHCI_INTR_RD | \ |
2309 | OHCI_INTR_WDH) | 2313 | OHCI_INTR_WDH) |
diff --git a/drivers/usb/misc/ldusb.c b/drivers/usb/misc/ldusb.c index 11555bde655b..7bad49404762 100644 --- a/drivers/usb/misc/ldusb.c +++ b/drivers/usb/misc/ldusb.c | |||
@@ -165,6 +165,8 @@ struct ld_usb { | |||
165 | size_t interrupt_in_endpoint_size; | 165 | size_t interrupt_in_endpoint_size; |
166 | int interrupt_in_running; | 166 | int interrupt_in_running; |
167 | int interrupt_in_done; | 167 | int interrupt_in_done; |
168 | int buffer_overflow; | ||
169 | spinlock_t rbsl; | ||
168 | 170 | ||
169 | char* interrupt_out_buffer; | 171 | char* interrupt_out_buffer; |
170 | struct usb_endpoint_descriptor* interrupt_out_endpoint; | 172 | struct usb_endpoint_descriptor* interrupt_out_endpoint; |
@@ -230,10 +232,12 @@ static void ld_usb_interrupt_in_callback(struct urb *urb) | |||
230 | } else { | 232 | } else { |
231 | dbg_info(&dev->intf->dev, "%s: nonzero status received: %d\n", | 233 | dbg_info(&dev->intf->dev, "%s: nonzero status received: %d\n", |
232 | __FUNCTION__, urb->status); | 234 | __FUNCTION__, urb->status); |
235 | spin_lock(&dev->rbsl); | ||
233 | goto resubmit; /* maybe we can recover */ | 236 | goto resubmit; /* maybe we can recover */ |
234 | } | 237 | } |
235 | } | 238 | } |
236 | 239 | ||
240 | spin_lock(&dev->rbsl); | ||
237 | if (urb->actual_length > 0) { | 241 | if (urb->actual_length > 0) { |
238 | next_ring_head = (dev->ring_head+1) % ring_buffer_size; | 242 | next_ring_head = (dev->ring_head+1) % ring_buffer_size; |
239 | if (next_ring_head != dev->ring_tail) { | 243 | if (next_ring_head != dev->ring_tail) { |
@@ -244,21 +248,25 @@ static void ld_usb_interrupt_in_callback(struct urb *urb) | |||
244 | dev->ring_head = next_ring_head; | 248 | dev->ring_head = next_ring_head; |
245 | dbg_info(&dev->intf->dev, "%s: received %d bytes\n", | 249 | dbg_info(&dev->intf->dev, "%s: received %d bytes\n", |
246 | __FUNCTION__, urb->actual_length); | 250 | __FUNCTION__, urb->actual_length); |
247 | } else | 251 | } else { |
248 | dev_warn(&dev->intf->dev, | 252 | dev_warn(&dev->intf->dev, |
249 | "Ring buffer overflow, %d bytes dropped\n", | 253 | "Ring buffer overflow, %d bytes dropped\n", |
250 | urb->actual_length); | 254 | urb->actual_length); |
255 | dev->buffer_overflow = 1; | ||
256 | } | ||
251 | } | 257 | } |
252 | 258 | ||
253 | resubmit: | 259 | resubmit: |
254 | /* resubmit if we're still running */ | 260 | /* resubmit if we're still running */ |
255 | if (dev->interrupt_in_running && dev->intf) { | 261 | if (dev->interrupt_in_running && !dev->buffer_overflow && dev->intf) { |
256 | retval = usb_submit_urb(dev->interrupt_in_urb, GFP_ATOMIC); | 262 | retval = usb_submit_urb(dev->interrupt_in_urb, GFP_ATOMIC); |
257 | if (retval) | 263 | if (retval) { |
258 | dev_err(&dev->intf->dev, | 264 | dev_err(&dev->intf->dev, |
259 | "usb_submit_urb failed (%d)\n", retval); | 265 | "usb_submit_urb failed (%d)\n", retval); |
266 | dev->buffer_overflow = 1; | ||
267 | } | ||
260 | } | 268 | } |
261 | 269 | spin_unlock(&dev->rbsl); | |
262 | exit: | 270 | exit: |
263 | dev->interrupt_in_done = 1; | 271 | dev->interrupt_in_done = 1; |
264 | wake_up_interruptible(&dev->read_wait); | 272 | wake_up_interruptible(&dev->read_wait); |
@@ -330,6 +338,7 @@ static int ld_usb_open(struct inode *inode, struct file *file) | |||
330 | /* initialize in direction */ | 338 | /* initialize in direction */ |
331 | dev->ring_head = 0; | 339 | dev->ring_head = 0; |
332 | dev->ring_tail = 0; | 340 | dev->ring_tail = 0; |
341 | dev->buffer_overflow = 0; | ||
333 | usb_fill_int_urb(dev->interrupt_in_urb, | 342 | usb_fill_int_urb(dev->interrupt_in_urb, |
334 | interface_to_usbdev(interface), | 343 | interface_to_usbdev(interface), |
335 | usb_rcvintpipe(interface_to_usbdev(interface), | 344 | usb_rcvintpipe(interface_to_usbdev(interface), |
@@ -439,6 +448,7 @@ static ssize_t ld_usb_read(struct file *file, char __user *buffer, size_t count, | |||
439 | size_t *actual_buffer; | 448 | size_t *actual_buffer; |
440 | size_t bytes_to_read; | 449 | size_t bytes_to_read; |
441 | int retval = 0; | 450 | int retval = 0; |
451 | int rv; | ||
442 | 452 | ||
443 | dev = file->private_data; | 453 | dev = file->private_data; |
444 | 454 | ||
@@ -460,7 +470,10 @@ static ssize_t ld_usb_read(struct file *file, char __user *buffer, size_t count, | |||
460 | } | 470 | } |
461 | 471 | ||
462 | /* wait for data */ | 472 | /* wait for data */ |
473 | spin_lock_irq(&dev->rbsl); | ||
463 | if (dev->ring_head == dev->ring_tail) { | 474 | if (dev->ring_head == dev->ring_tail) { |
475 | dev->interrupt_in_done = 0; | ||
476 | spin_unlock_irq(&dev->rbsl); | ||
464 | if (file->f_flags & O_NONBLOCK) { | 477 | if (file->f_flags & O_NONBLOCK) { |
465 | retval = -EAGAIN; | 478 | retval = -EAGAIN; |
466 | goto unlock_exit; | 479 | goto unlock_exit; |
@@ -468,6 +481,8 @@ static ssize_t ld_usb_read(struct file *file, char __user *buffer, size_t count, | |||
468 | retval = wait_event_interruptible(dev->read_wait, dev->interrupt_in_done); | 481 | retval = wait_event_interruptible(dev->read_wait, dev->interrupt_in_done); |
469 | if (retval < 0) | 482 | if (retval < 0) |
470 | goto unlock_exit; | 483 | goto unlock_exit; |
484 | } else { | ||
485 | spin_unlock_irq(&dev->rbsl); | ||
471 | } | 486 | } |
472 | 487 | ||
473 | /* actual_buffer contains actual_length + interrupt_in_buffer */ | 488 | /* actual_buffer contains actual_length + interrupt_in_buffer */ |
@@ -486,6 +501,17 @@ static ssize_t ld_usb_read(struct file *file, char __user *buffer, size_t count, | |||
486 | 501 | ||
487 | retval = bytes_to_read; | 502 | retval = bytes_to_read; |
488 | 503 | ||
504 | spin_lock_irq(&dev->rbsl); | ||
505 | if (dev->buffer_overflow) { | ||
506 | dev->buffer_overflow = 0; | ||
507 | spin_unlock_irq(&dev->rbsl); | ||
508 | rv = usb_submit_urb(dev->interrupt_in_urb, GFP_KERNEL); | ||
509 | if (rv < 0) | ||
510 | dev->buffer_overflow = 1; | ||
511 | } else { | ||
512 | spin_unlock_irq(&dev->rbsl); | ||
513 | } | ||
514 | |||
489 | unlock_exit: | 515 | unlock_exit: |
490 | /* unlock the device */ | 516 | /* unlock the device */ |
491 | up(&dev->sem); | 517 | up(&dev->sem); |
@@ -635,6 +661,7 @@ static int ld_usb_probe(struct usb_interface *intf, const struct usb_device_id * | |||
635 | goto exit; | 661 | goto exit; |
636 | } | 662 | } |
637 | init_MUTEX(&dev->sem); | 663 | init_MUTEX(&dev->sem); |
664 | spin_lock_init(&dev->rbsl); | ||
638 | dev->intf = intf; | 665 | dev->intf = intf; |
639 | init_waitqueue_head(&dev->read_wait); | 666 | init_waitqueue_head(&dev->read_wait); |
640 | init_waitqueue_head(&dev->write_wait); | 667 | init_waitqueue_head(&dev->write_wait); |
diff --git a/drivers/usb/serial/ark3116.c b/drivers/usb/serial/ark3116.c index ea2175bb2274..fe437125f14b 100644 --- a/drivers/usb/serial/ark3116.c +++ b/drivers/usb/serial/ark3116.c | |||
@@ -63,7 +63,8 @@ static inline void ARK3116_RCV(struct usb_serial *serial, int seq, | |||
63 | request, requesttype, value, index, | 63 | request, requesttype, value, index, |
64 | buf, 0x0000001, 1000); | 64 | buf, 0x0000001, 1000); |
65 | if (result) | 65 | if (result) |
66 | dbg("%03d < %d bytes [0x%02X]", seq, result, buf[0]); | 66 | dbg("%03d < %d bytes [0x%02X]", seq, result, |
67 | ((unsigned char *)buf)[0]); | ||
67 | else | 68 | else |
68 | dbg("%03d < 0 bytes", seq); | 69 | dbg("%03d < 0 bytes", seq); |
69 | } | 70 | } |
diff --git a/drivers/usb/serial/ftdi_sio.c b/drivers/usb/serial/ftdi_sio.c index 95a1805b064f..2353679f601e 100644 --- a/drivers/usb/serial/ftdi_sio.c +++ b/drivers/usb/serial/ftdi_sio.c | |||
@@ -273,12 +273,18 @@ static __u16 product; | |||
273 | 273 | ||
274 | /* struct ftdi_sio_quirk is used by devices requiring special attention. */ | 274 | /* struct ftdi_sio_quirk is used by devices requiring special attention. */ |
275 | struct ftdi_sio_quirk { | 275 | struct ftdi_sio_quirk { |
276 | int (*probe)(struct usb_serial *); | ||
276 | void (*setup)(struct usb_serial *); /* Special settings during startup. */ | 277 | void (*setup)(struct usb_serial *); /* Special settings during startup. */ |
277 | }; | 278 | }; |
278 | 279 | ||
280 | static int ftdi_olimex_probe (struct usb_serial *serial); | ||
279 | static void ftdi_USB_UIRT_setup (struct usb_serial *serial); | 281 | static void ftdi_USB_UIRT_setup (struct usb_serial *serial); |
280 | static void ftdi_HE_TIRA1_setup (struct usb_serial *serial); | 282 | static void ftdi_HE_TIRA1_setup (struct usb_serial *serial); |
281 | 283 | ||
284 | static struct ftdi_sio_quirk ftdi_olimex_quirk = { | ||
285 | .probe = ftdi_olimex_probe, | ||
286 | }; | ||
287 | |||
282 | static struct ftdi_sio_quirk ftdi_USB_UIRT_quirk = { | 288 | static struct ftdi_sio_quirk ftdi_USB_UIRT_quirk = { |
283 | .setup = ftdi_USB_UIRT_setup, | 289 | .setup = ftdi_USB_UIRT_setup, |
284 | }; | 290 | }; |
@@ -319,6 +325,7 @@ static struct usb_device_id id_table_combined [] = { | |||
319 | { USB_DEVICE(FTDI_VID, FTDI_8U2232C_PID) }, | 325 | { USB_DEVICE(FTDI_VID, FTDI_8U2232C_PID) }, |
320 | { USB_DEVICE(FTDI_VID, FTDI_MICRO_CHAMELEON_PID) }, | 326 | { USB_DEVICE(FTDI_VID, FTDI_MICRO_CHAMELEON_PID) }, |
321 | { USB_DEVICE(FTDI_VID, FTDI_RELAIS_PID) }, | 327 | { USB_DEVICE(FTDI_VID, FTDI_RELAIS_PID) }, |
328 | { USB_DEVICE(FTDI_VID, FTDI_OPENDCC_PID) }, | ||
322 | { USB_DEVICE(INTERBIOMETRICS_VID, INTERBIOMETRICS_IOBOARD_PID) }, | 329 | { USB_DEVICE(INTERBIOMETRICS_VID, INTERBIOMETRICS_IOBOARD_PID) }, |
323 | { USB_DEVICE(INTERBIOMETRICS_VID, INTERBIOMETRICS_MINI_IOBOARD_PID) }, | 330 | { USB_DEVICE(INTERBIOMETRICS_VID, INTERBIOMETRICS_MINI_IOBOARD_PID) }, |
324 | { USB_DEVICE(FTDI_VID, FTDI_XF_632_PID) }, | 331 | { USB_DEVICE(FTDI_VID, FTDI_XF_632_PID) }, |
@@ -525,6 +532,9 @@ static struct usb_device_id id_table_combined [] = { | |||
525 | { USB_DEVICE(FTDI_VID, FTDI_TACTRIX_OPENPORT_13U_PID) }, | 532 | { USB_DEVICE(FTDI_VID, FTDI_TACTRIX_OPENPORT_13U_PID) }, |
526 | { USB_DEVICE(ELEKTOR_VID, ELEKTOR_FT323R_PID) }, | 533 | { USB_DEVICE(ELEKTOR_VID, ELEKTOR_FT323R_PID) }, |
527 | { USB_DEVICE(TELLDUS_VID, TELLDUS_TELLSTICK_PID) }, | 534 | { USB_DEVICE(TELLDUS_VID, TELLDUS_TELLSTICK_PID) }, |
535 | { USB_DEVICE(FTDI_VID, FTDI_MAXSTREAM_PID) }, | ||
536 | { USB_DEVICE(OLIMEX_VID, OLIMEX_ARM_USB_OCD_PID), | ||
537 | .driver_info = (kernel_ulong_t)&ftdi_olimex_quirk }, | ||
528 | { }, /* Optional parameter entry */ | 538 | { }, /* Optional parameter entry */ |
529 | { } /* Terminating entry */ | 539 | { } /* Terminating entry */ |
530 | }; | 540 | }; |
@@ -669,7 +679,7 @@ static struct usb_serial_driver ftdi_sio_device = { | |||
669 | 679 | ||
670 | /* | 680 | /* |
671 | * *************************************************************************** | 681 | * *************************************************************************** |
672 | * Utlity functions | 682 | * Utility functions |
673 | * *************************************************************************** | 683 | * *************************************************************************** |
674 | */ | 684 | */ |
675 | 685 | ||
@@ -1171,9 +1181,17 @@ static void remove_sysfs_attrs(struct usb_serial_port *port) | |||
1171 | /* Probe function to check for special devices */ | 1181 | /* Probe function to check for special devices */ |
1172 | static int ftdi_sio_probe (struct usb_serial *serial, const struct usb_device_id *id) | 1182 | static int ftdi_sio_probe (struct usb_serial *serial, const struct usb_device_id *id) |
1173 | { | 1183 | { |
1184 | struct ftdi_sio_quirk *quirk = (struct ftdi_sio_quirk *)id->driver_info; | ||
1185 | |||
1186 | if (quirk && quirk->probe) { | ||
1187 | int ret = quirk->probe(serial); | ||
1188 | if (ret != 0) | ||
1189 | return ret; | ||
1190 | } | ||
1191 | |||
1174 | usb_set_serial_data(serial, (void *)id->driver_info); | 1192 | usb_set_serial_data(serial, (void *)id->driver_info); |
1175 | 1193 | ||
1176 | return (0); | 1194 | return 0; |
1177 | } | 1195 | } |
1178 | 1196 | ||
1179 | static int ftdi_sio_port_probe(struct usb_serial_port *port) | 1197 | static int ftdi_sio_port_probe(struct usb_serial_port *port) |
@@ -1268,6 +1286,24 @@ static void ftdi_HE_TIRA1_setup (struct usb_serial *serial) | |||
1268 | priv->force_rtscts = 1; | 1286 | priv->force_rtscts = 1; |
1269 | } /* ftdi_HE_TIRA1_setup */ | 1287 | } /* ftdi_HE_TIRA1_setup */ |
1270 | 1288 | ||
1289 | /* | ||
1290 | * First port on Olimex arm-usb-ocd is reserved for JTAG interface | ||
1291 | * and can be accessed from userspace using openocd. | ||
1292 | */ | ||
1293 | static int ftdi_olimex_probe(struct usb_serial *serial) | ||
1294 | { | ||
1295 | struct usb_device *udev = serial->dev; | ||
1296 | struct usb_interface *interface = serial->interface; | ||
1297 | |||
1298 | dbg("%s",__FUNCTION__); | ||
1299 | |||
1300 | if (interface == udev->actconfig->interface[0]) { | ||
1301 | info("Ignoring reserved serial port on Olimex arm-usb-ocd\n"); | ||
1302 | return -ENODEV; | ||
1303 | } | ||
1304 | |||
1305 | return 0; | ||
1306 | } | ||
1271 | 1307 | ||
1272 | /* ftdi_shutdown is called from usbserial:usb_serial_disconnect | 1308 | /* ftdi_shutdown is called from usbserial:usb_serial_disconnect |
1273 | * it is called when the usb device is disconnected | 1309 | * it is called when the usb device is disconnected |
diff --git a/drivers/usb/serial/ftdi_sio.h b/drivers/usb/serial/ftdi_sio.h index 77ad0a09b384..33aee9047242 100644 --- a/drivers/usb/serial/ftdi_sio.h +++ b/drivers/usb/serial/ftdi_sio.h | |||
@@ -60,6 +60,9 @@ | |||
60 | /* DMX4ALL DMX Interfaces */ | 60 | /* DMX4ALL DMX Interfaces */ |
61 | #define FTDI_DMX4ALL 0xC850 | 61 | #define FTDI_DMX4ALL 0xC850 |
62 | 62 | ||
63 | /* OpenDCC (www.opendcc.de) product id */ | ||
64 | #define FTDI_OPENDCC_PID 0xBFD8 | ||
65 | |||
63 | /* www.crystalfontz.com devices - thanx for providing free devices for evaluation ! */ | 66 | /* www.crystalfontz.com devices - thanx for providing free devices for evaluation ! */ |
64 | /* they use the ftdi chipset for the USB interface and the vendor id is the same */ | 67 | /* they use the ftdi chipset for the USB interface and the vendor id is the same */ |
65 | #define FTDI_XF_632_PID 0xFC08 /* 632: 16x2 Character Display */ | 68 | #define FTDI_XF_632_PID 0xFC08 /* 632: 16x2 Character Display */ |
@@ -518,6 +521,15 @@ | |||
518 | #define FTDI_IBS_PEDO_PID 0xff3e /* IBS PEDO-Modem (RF modem 868.35 MHz) */ | 521 | #define FTDI_IBS_PEDO_PID 0xff3e /* IBS PEDO-Modem (RF modem 868.35 MHz) */ |
519 | #define FTDI_IBS_PROD_PID 0xff3f /* future device */ | 522 | #define FTDI_IBS_PROD_PID 0xff3f /* future device */ |
520 | 523 | ||
524 | /* | ||
525 | * MaxStream devices www.maxstream.net | ||
526 | */ | ||
527 | #define FTDI_MAXSTREAM_PID 0xEE18 /* Xbee PKG-U Module */ | ||
528 | |||
529 | /* Olimex */ | ||
530 | #define OLIMEX_VID 0x15BA | ||
531 | #define OLIMEX_ARM_USB_OCD_PID 0x0003 | ||
532 | |||
521 | /* Commands */ | 533 | /* Commands */ |
522 | #define FTDI_SIO_RESET 0 /* Reset the port */ | 534 | #define FTDI_SIO_RESET 0 /* Reset the port */ |
523 | #define FTDI_SIO_MODEM_CTRL 1 /* Set the modem control register */ | 535 | #define FTDI_SIO_MODEM_CTRL 1 /* Set the modem control register */ |
diff --git a/drivers/usb/serial/mos7840.c b/drivers/usb/serial/mos7840.c index 2366e7b63ece..36620c651079 100644 --- a/drivers/usb/serial/mos7840.c +++ b/drivers/usb/serial/mos7840.c | |||
@@ -769,11 +769,6 @@ static void mos7840_bulk_out_data_callback(struct urb *urb) | |||
769 | return; | 769 | return; |
770 | } | 770 | } |
771 | 771 | ||
772 | if (!mos7840_port) { | ||
773 | dbg("%s", "NULL mos7840_port pointer \n"); | ||
774 | return; | ||
775 | } | ||
776 | |||
777 | if (mos7840_port_paranoia_check(mos7840_port->port, __FUNCTION__)) { | 772 | if (mos7840_port_paranoia_check(mos7840_port->port, __FUNCTION__)) { |
778 | dbg("%s", "Port Paranoia failed \n"); | 773 | dbg("%s", "Port Paranoia failed \n"); |
779 | return; | 774 | return; |
diff --git a/drivers/usb/serial/omninet.c b/drivers/usb/serial/omninet.c index 4adfab988e86..00afc1712c39 100644 --- a/drivers/usb/serial/omninet.c +++ b/drivers/usb/serial/omninet.c | |||
@@ -165,12 +165,10 @@ static int omninet_open (struct usb_serial_port *port, struct file *filp) | |||
165 | { | 165 | { |
166 | struct usb_serial *serial = port->serial; | 166 | struct usb_serial *serial = port->serial; |
167 | struct usb_serial_port *wport; | 167 | struct usb_serial_port *wport; |
168 | struct omninet_data *od = usb_get_serial_port_data(port); | ||
169 | int result = 0; | 168 | int result = 0; |
170 | 169 | ||
171 | dbg("%s - port %d", __FUNCTION__, port->number); | 170 | dbg("%s - port %d", __FUNCTION__, port->number); |
172 | 171 | ||
173 | od = kmalloc( sizeof(struct omninet_data), GFP_KERNEL ); | ||
174 | wport = serial->port[1]; | 172 | wport = serial->port[1]; |
175 | wport->tty = port->tty; | 173 | wport->tty = port->tty; |
176 | 174 | ||
diff --git a/drivers/usb/serial/option.c b/drivers/usb/serial/option.c index 8c3f55b080b4..89f067d95076 100644 --- a/drivers/usb/serial/option.c +++ b/drivers/usb/serial/option.c | |||
@@ -165,7 +165,6 @@ static struct usb_device_id option_ids[] = { | |||
165 | { USB_DEVICE(NOVATELWIRELESS_VENDOR_ID, 0x1410) }, /* Novatel U740 */ | 165 | { USB_DEVICE(NOVATELWIRELESS_VENDOR_ID, 0x1410) }, /* Novatel U740 */ |
166 | { USB_DEVICE(NOVATELWIRELESS_VENDOR_ID, 0x1420) }, /* Novatel EU870 */ | 166 | { USB_DEVICE(NOVATELWIRELESS_VENDOR_ID, 0x1420) }, /* Novatel EU870 */ |
167 | { USB_DEVICE(NOVATELWIRELESS_VENDOR_ID, 0x1430) }, /* Novatel Merlin XU870 HSDPA/3G */ | 167 | { USB_DEVICE(NOVATELWIRELESS_VENDOR_ID, 0x1430) }, /* Novatel Merlin XU870 HSDPA/3G */ |
168 | { USB_DEVICE(NOVATELWIRELESS_VENDOR_ID, 0x1430) }, /* Novatel XU870 */ | ||
169 | { USB_DEVICE(NOVATELWIRELESS_VENDOR_ID, 0x2100) }, /* Novatel EV620 CDMA/EV-DO */ | 168 | { USB_DEVICE(NOVATELWIRELESS_VENDOR_ID, 0x2100) }, /* Novatel EV620 CDMA/EV-DO */ |
170 | { USB_DEVICE(NOVATELWIRELESS_VENDOR_ID, 0x2110) }, /* Novatel Merlin ES620 / Merlin ES720 / Ovation U720 */ | 169 | { USB_DEVICE(NOVATELWIRELESS_VENDOR_ID, 0x2110) }, /* Novatel Merlin ES620 / Merlin ES720 / Ovation U720 */ |
171 | { USB_DEVICE(NOVATELWIRELESS_VENDOR_ID, 0x2130) }, /* Novatel Merlin ES620 SM Bus */ | 170 | { USB_DEVICE(NOVATELWIRELESS_VENDOR_ID, 0x2130) }, /* Novatel Merlin ES620 SM Bus */ |
diff --git a/drivers/usb/serial/sierra.c b/drivers/usb/serial/sierra.c index 644607de4c11..ac1829c6e8f0 100644 --- a/drivers/usb/serial/sierra.c +++ b/drivers/usb/serial/sierra.c | |||
@@ -35,6 +35,7 @@ static struct usb_device_id id_table [] = { | |||
35 | { USB_DEVICE(0x1199, 0x0218) }, /* Sierra Wireless MC5720 */ | 35 | { USB_DEVICE(0x1199, 0x0218) }, /* Sierra Wireless MC5720 */ |
36 | { USB_DEVICE(0x1199, 0x0020) }, /* Sierra Wireless MC5725 */ | 36 | { USB_DEVICE(0x1199, 0x0020) }, /* Sierra Wireless MC5725 */ |
37 | { USB_DEVICE(0x1199, 0x0019) }, /* Sierra Wireless AirCard 595 */ | 37 | { USB_DEVICE(0x1199, 0x0019) }, /* Sierra Wireless AirCard 595 */ |
38 | { USB_DEVICE(0x1199, 0x0120) }, /* Sierra Wireless AirCard 595U */ | ||
38 | { USB_DEVICE(0x1199, 0x0021) }, /* Sierra Wireless AirCard 597E */ | 39 | { USB_DEVICE(0x1199, 0x0021) }, /* Sierra Wireless AirCard 597E */ |
39 | { USB_DEVICE(0x1199, 0x6802) }, /* Sierra Wireless MC8755 */ | 40 | { USB_DEVICE(0x1199, 0x6802) }, /* Sierra Wireless MC8755 */ |
40 | { USB_DEVICE(0x1199, 0x6804) }, /* Sierra Wireless MC8755 */ | 41 | { USB_DEVICE(0x1199, 0x6804) }, /* Sierra Wireless MC8755 */ |
@@ -60,6 +61,7 @@ static struct usb_device_id id_table_3port [] = { | |||
60 | { USB_DEVICE(0x1199, 0x0218) }, /* Sierra Wireless MC5720 */ | 61 | { USB_DEVICE(0x1199, 0x0218) }, /* Sierra Wireless MC5720 */ |
61 | { USB_DEVICE(0x1199, 0x0020) }, /* Sierra Wireless MC5725 */ | 62 | { USB_DEVICE(0x1199, 0x0020) }, /* Sierra Wireless MC5725 */ |
62 | { USB_DEVICE(0x1199, 0x0019) }, /* Sierra Wireless AirCard 595 */ | 63 | { USB_DEVICE(0x1199, 0x0019) }, /* Sierra Wireless AirCard 595 */ |
64 | { USB_DEVICE(0x1199, 0x0120) }, /* Sierra Wireless AirCard 595U */ | ||
63 | { USB_DEVICE(0x1199, 0x0021) }, /* Sierra Wireless AirCard 597E */ | 65 | { USB_DEVICE(0x1199, 0x0021) }, /* Sierra Wireless AirCard 597E */ |
64 | { USB_DEVICE(0x1199, 0x6802) }, /* Sierra Wireless MC8755 */ | 66 | { USB_DEVICE(0x1199, 0x6802) }, /* Sierra Wireless MC8755 */ |
65 | { USB_DEVICE(0x1199, 0x6804) }, /* Sierra Wireless MC8755 */ | 67 | { USB_DEVICE(0x1199, 0x6804) }, /* Sierra Wireless MC8755 */ |
diff --git a/drivers/usb/storage/onetouch.c b/drivers/usb/storage/onetouch.c index 6d3dad3d1dae..d35369392fed 100644 --- a/drivers/usb/storage/onetouch.c +++ b/drivers/usb/storage/onetouch.c | |||
@@ -84,7 +84,7 @@ resubmit: | |||
84 | 84 | ||
85 | static int usb_onetouch_open(struct input_dev *dev) | 85 | static int usb_onetouch_open(struct input_dev *dev) |
86 | { | 86 | { |
87 | struct usb_onetouch *onetouch = dev->private; | 87 | struct usb_onetouch *onetouch = input_get_drvdata(dev); |
88 | 88 | ||
89 | onetouch->is_open = 1; | 89 | onetouch->is_open = 1; |
90 | onetouch->irq->dev = onetouch->udev; | 90 | onetouch->irq->dev = onetouch->udev; |
@@ -98,7 +98,7 @@ static int usb_onetouch_open(struct input_dev *dev) | |||
98 | 98 | ||
99 | static void usb_onetouch_close(struct input_dev *dev) | 99 | static void usb_onetouch_close(struct input_dev *dev) |
100 | { | 100 | { |
101 | struct usb_onetouch *onetouch = dev->private; | 101 | struct usb_onetouch *onetouch = input_get_drvdata(dev); |
102 | 102 | ||
103 | usb_kill_urb(onetouch->irq); | 103 | usb_kill_urb(onetouch->irq); |
104 | onetouch->is_open = 0; | 104 | onetouch->is_open = 0; |
@@ -185,13 +185,14 @@ int onetouch_connect_input(struct us_data *ss) | |||
185 | input_dev->name = onetouch->name; | 185 | input_dev->name = onetouch->name; |
186 | input_dev->phys = onetouch->phys; | 186 | input_dev->phys = onetouch->phys; |
187 | usb_to_input_id(udev, &input_dev->id); | 187 | usb_to_input_id(udev, &input_dev->id); |
188 | input_dev->cdev.dev = &udev->dev; | 188 | input_dev->dev.parent = &udev->dev; |
189 | 189 | ||
190 | set_bit(EV_KEY, input_dev->evbit); | 190 | set_bit(EV_KEY, input_dev->evbit); |
191 | set_bit(ONETOUCH_BUTTON, input_dev->keybit); | 191 | set_bit(ONETOUCH_BUTTON, input_dev->keybit); |
192 | clear_bit(0, input_dev->keybit); | 192 | clear_bit(0, input_dev->keybit); |
193 | 193 | ||
194 | input_dev->private = onetouch; | 194 | input_set_drvdata(input_dev, onetouch); |
195 | |||
195 | input_dev->open = usb_onetouch_open; | 196 | input_dev->open = usb_onetouch_open; |
196 | input_dev->close = usb_onetouch_close; | 197 | input_dev->close = usb_onetouch_close; |
197 | 198 | ||
diff --git a/drivers/usb/storage/unusual_devs.h b/drivers/usb/storage/unusual_devs.h index 8b3145ab7757..d230ee72f9cd 100644 --- a/drivers/usb/storage/unusual_devs.h +++ b/drivers/usb/storage/unusual_devs.h | |||
@@ -1179,14 +1179,20 @@ UNUSUAL_DEV( 0x0a17, 0x006, 0x0000, 0xffff, | |||
1179 | US_SC_DEVICE, US_PR_DEVICE, NULL, | 1179 | US_SC_DEVICE, US_PR_DEVICE, NULL, |
1180 | US_FL_FIX_INQUIRY ), | 1180 | US_FL_FIX_INQUIRY ), |
1181 | 1181 | ||
1182 | /* This is a virtual windows driver CD, which the zd1211rw driver automatically | 1182 | /* These are virtual windows driver CDs, which the zd1211rw driver automatically |
1183 | * converts into a WLAN device. */ | 1183 | * converts into a WLAN devices. */ |
1184 | UNUSUAL_DEV( 0x0ace, 0x2011, 0x0101, 0x0101, | 1184 | UNUSUAL_DEV( 0x0ace, 0x2011, 0x0101, 0x0101, |
1185 | "ZyXEL", | 1185 | "ZyXEL", |
1186 | "G-220F USB-WLAN Install", | 1186 | "G-220F USB-WLAN Install", |
1187 | US_SC_DEVICE, US_PR_DEVICE, NULL, | 1187 | US_SC_DEVICE, US_PR_DEVICE, NULL, |
1188 | US_FL_IGNORE_DEVICE ), | 1188 | US_FL_IGNORE_DEVICE ), |
1189 | 1189 | ||
1190 | UNUSUAL_DEV( 0x0ace, 0x20ff, 0x0101, 0x0101, | ||
1191 | "SiteCom", | ||
1192 | "WL-117 USB-WLAN Install", | ||
1193 | US_SC_DEVICE, US_PR_DEVICE, NULL, | ||
1194 | US_FL_IGNORE_DEVICE ), | ||
1195 | |||
1190 | #ifdef CONFIG_USB_STORAGE_ISD200 | 1196 | #ifdef CONFIG_USB_STORAGE_ISD200 |
1191 | UNUSUAL_DEV( 0x0bf6, 0xa001, 0x0100, 0x0110, | 1197 | UNUSUAL_DEV( 0x0bf6, 0xa001, 0x0100, 0x0110, |
1192 | "ATI", | 1198 | "ATI", |
diff --git a/drivers/video/Kconfig b/drivers/video/Kconfig index 4d7485fa553f..6e1f1ea21b38 100644 --- a/drivers/video/Kconfig +++ b/drivers/video/Kconfig | |||
@@ -704,6 +704,91 @@ config FB_CG6 | |||
704 | This is the frame buffer device driver for the CGsix (GX, TurboGX) | 704 | This is the frame buffer device driver for the CGsix (GX, TurboGX) |
705 | frame buffer. | 705 | frame buffer. |
706 | 706 | ||
707 | config FB_FFB | ||
708 | bool "Creator/Creator3D/Elite3D support" | ||
709 | depends on FB_SBUS && SPARC64 | ||
710 | select FB_CFB_COPYAREA | ||
711 | select FB_CFB_IMAGEBLIT | ||
712 | help | ||
713 | This is the frame buffer device driver for the Creator, Creator3D, | ||
714 | and Elite3D graphics boards. | ||
715 | |||
716 | config FB_TCX | ||
717 | bool "TCX (SS4/SS5 only) support" | ||
718 | depends on FB_SBUS | ||
719 | select FB_CFB_FILLRECT | ||
720 | select FB_CFB_COPYAREA | ||
721 | select FB_CFB_IMAGEBLIT | ||
722 | help | ||
723 | This is the frame buffer device driver for the TCX 24/8bit frame | ||
724 | buffer. | ||
725 | |||
726 | config FB_CG14 | ||
727 | bool "CGfourteen (SX) support" | ||
728 | depends on FB_SBUS | ||
729 | select FB_CFB_FILLRECT | ||
730 | select FB_CFB_COPYAREA | ||
731 | select FB_CFB_IMAGEBLIT | ||
732 | help | ||
733 | This is the frame buffer device driver for the CGfourteen frame | ||
734 | buffer on Desktop SPARCsystems with the SX graphics option. | ||
735 | |||
736 | config FB_P9100 | ||
737 | bool "P9100 (Sparcbook 3 only) support" | ||
738 | depends on FB_SBUS | ||
739 | select FB_CFB_FILLRECT | ||
740 | select FB_CFB_COPYAREA | ||
741 | select FB_CFB_IMAGEBLIT | ||
742 | help | ||
743 | This is the frame buffer device driver for the P9100 card | ||
744 | supported on Sparcbook 3 machines. | ||
745 | |||
746 | config FB_LEO | ||
747 | bool "Leo (ZX) support" | ||
748 | depends on FB_SBUS | ||
749 | select FB_CFB_FILLRECT | ||
750 | select FB_CFB_COPYAREA | ||
751 | select FB_CFB_IMAGEBLIT | ||
752 | help | ||
753 | This is the frame buffer device driver for the SBUS-based Sun ZX | ||
754 | (leo) frame buffer cards. | ||
755 | |||
756 | config FB_IGA | ||
757 | bool "IGA 168x display support" | ||
758 | depends on FB && SPARC32 | ||
759 | select FB_CFB_FILLRECT | ||
760 | select FB_CFB_COPYAREA | ||
761 | select FB_CFB_IMAGEBLIT | ||
762 | help | ||
763 | This is the framebuffer device for the INTERGRAPHICS 1680 and | ||
764 | successor frame buffer cards. | ||
765 | |||
766 | config FB_XVR500 | ||
767 | bool "Sun XVR-500 3DLABS Wildcat support" | ||
768 | depends on FB && PCI && SPARC64 | ||
769 | select FB_CFB_FILLRECT | ||
770 | select FB_CFB_COPYAREA | ||
771 | select FB_CFB_IMAGEBLIT | ||
772 | help | ||
773 | This is the framebuffer device for the Sun XVR-500 and similar | ||
774 | graphics cards based upon the 3DLABS Wildcat chipset. The driver | ||
775 | only works on sparc64 systems where the system firwmare has | ||
776 | mostly initialized the card already. It is treated as a | ||
777 | completely dumb framebuffer device. | ||
778 | |||
779 | config FB_XVR2500 | ||
780 | bool "Sun XVR-2500 3DLABS Wildcat support" | ||
781 | depends on FB && PCI && SPARC64 | ||
782 | select FB_CFB_FILLRECT | ||
783 | select FB_CFB_COPYAREA | ||
784 | select FB_CFB_IMAGEBLIT | ||
785 | help | ||
786 | This is the framebuffer device for the Sun XVR-2500 and similar | ||
787 | graphics cards based upon the 3DLABS Wildcat chipset. The driver | ||
788 | only works on sparc64 systems where the system firwmare has | ||
789 | mostly initialized the card already. It is treated as a | ||
790 | completely dumb framebuffer device. | ||
791 | |||
707 | config FB_PVR2 | 792 | config FB_PVR2 |
708 | tristate "NEC PowerVR 2 display support" | 793 | tristate "NEC PowerVR 2 display support" |
709 | depends on FB && SH_DREAMCAST | 794 | depends on FB && SH_DREAMCAST |
@@ -1195,7 +1280,7 @@ config FB_ATY | |||
1195 | config FB_ATY_CT | 1280 | config FB_ATY_CT |
1196 | bool "Mach64 CT/VT/GT/LT (incl. 3D RAGE) support" | 1281 | bool "Mach64 CT/VT/GT/LT (incl. 3D RAGE) support" |
1197 | depends on PCI && FB_ATY | 1282 | depends on PCI && FB_ATY |
1198 | default y if SPARC64 && FB_PCI | 1283 | default y if SPARC64 && PCI |
1199 | help | 1284 | help |
1200 | Say Y here to support use of ATI's 64-bit Rage boards (or other | 1285 | Say Y here to support use of ATI's 64-bit Rage boards (or other |
1201 | boards based on the Mach64 CT, VT, GT, and LT chipsets) as a | 1286 | boards based on the Mach64 CT, VT, GT, and LT chipsets) as a |
@@ -1484,95 +1569,6 @@ config FB_AU1200 | |||
1484 | 1569 | ||
1485 | source "drivers/video/geode/Kconfig" | 1570 | source "drivers/video/geode/Kconfig" |
1486 | 1571 | ||
1487 | config FB_FFB | ||
1488 | bool "Creator/Creator3D/Elite3D support" | ||
1489 | depends on FB_SBUS && SPARC64 | ||
1490 | select FB_CFB_COPYAREA | ||
1491 | select FB_CFB_IMAGEBLIT | ||
1492 | help | ||
1493 | This is the frame buffer device driver for the Creator, Creator3D, | ||
1494 | and Elite3D graphics boards. | ||
1495 | |||
1496 | config FB_TCX | ||
1497 | bool "TCX (SS4/SS5 only) support" | ||
1498 | depends on FB_SBUS | ||
1499 | select FB_CFB_FILLRECT | ||
1500 | select FB_CFB_COPYAREA | ||
1501 | select FB_CFB_IMAGEBLIT | ||
1502 | help | ||
1503 | This is the frame buffer device driver for the TCX 24/8bit frame | ||
1504 | buffer. | ||
1505 | |||
1506 | config FB_CG14 | ||
1507 | bool "CGfourteen (SX) support" | ||
1508 | depends on FB_SBUS | ||
1509 | select FB_CFB_FILLRECT | ||
1510 | select FB_CFB_COPYAREA | ||
1511 | select FB_CFB_IMAGEBLIT | ||
1512 | help | ||
1513 | This is the frame buffer device driver for the CGfourteen frame | ||
1514 | buffer on Desktop SPARCsystems with the SX graphics option. | ||
1515 | |||
1516 | config FB_P9100 | ||
1517 | bool "P9100 (Sparcbook 3 only) support" | ||
1518 | depends on FB_SBUS | ||
1519 | select FB_CFB_FILLRECT | ||
1520 | select FB_CFB_COPYAREA | ||
1521 | select FB_CFB_IMAGEBLIT | ||
1522 | help | ||
1523 | This is the frame buffer device driver for the P9100 card | ||
1524 | supported on Sparcbook 3 machines. | ||
1525 | |||
1526 | config FB_LEO | ||
1527 | bool "Leo (ZX) support" | ||
1528 | depends on FB_SBUS | ||
1529 | select FB_CFB_FILLRECT | ||
1530 | select FB_CFB_COPYAREA | ||
1531 | select FB_CFB_IMAGEBLIT | ||
1532 | help | ||
1533 | This is the frame buffer device driver for the SBUS-based Sun ZX | ||
1534 | (leo) frame buffer cards. | ||
1535 | |||
1536 | config FB_XVR500 | ||
1537 | bool "Sun XVR-500 3DLABS Wildcat support" | ||
1538 | depends on (FB = y) && PCI && SPARC64 | ||
1539 | select FB_CFB_FILLRECT | ||
1540 | select FB_CFB_COPYAREA | ||
1541 | select FB_CFB_IMAGEBLIT | ||
1542 | help | ||
1543 | This is the framebuffer device for the Sun XVR-500 and similar | ||
1544 | graphics cards based upon the 3DLABS Wildcat chipset. The driver | ||
1545 | only works on sparc64 systems where the system firwmare has | ||
1546 | mostly initialized the card already. It is treated as a | ||
1547 | completely dumb framebuffer device. | ||
1548 | |||
1549 | config FB_XVR2500 | ||
1550 | bool "Sun XVR-2500 3DLABS Wildcat support" | ||
1551 | depends on (FB = y) && PCI && SPARC64 | ||
1552 | select FB_CFB_FILLRECT | ||
1553 | select FB_CFB_COPYAREA | ||
1554 | select FB_CFB_IMAGEBLIT | ||
1555 | help | ||
1556 | This is the framebuffer device for the Sun XVR-2500 and similar | ||
1557 | graphics cards based upon the 3DLABS Wildcat chipset. The driver | ||
1558 | only works on sparc64 systems where the system firwmare has | ||
1559 | mostly initialized the card already. It is treated as a | ||
1560 | completely dumb framebuffer device. | ||
1561 | |||
1562 | config FB_PCI | ||
1563 | bool "PCI framebuffers" | ||
1564 | depends on (FB = y) && PCI && SPARC | ||
1565 | |||
1566 | config FB_IGA | ||
1567 | bool "IGA 168x display support" | ||
1568 | depends on SPARC32 && FB_PCI | ||
1569 | select FB_CFB_FILLRECT | ||
1570 | select FB_CFB_COPYAREA | ||
1571 | select FB_CFB_IMAGEBLIT | ||
1572 | help | ||
1573 | This is the framebuffer device for the INTERGRAPHICS 1680 and | ||
1574 | successor frame buffer cards. | ||
1575 | |||
1576 | config FB_HIT | 1572 | config FB_HIT |
1577 | tristate "HD64461 Frame Buffer support" | 1573 | tristate "HD64461 Frame Buffer support" |
1578 | depends on FB && HD64461 | 1574 | depends on FB && HD64461 |
@@ -1796,9 +1792,10 @@ config FB_IBM_GXT4500 | |||
1796 | config FB_PS3 | 1792 | config FB_PS3 |
1797 | bool "PS3 GPU framebuffer driver" | 1793 | bool "PS3 GPU framebuffer driver" |
1798 | depends on (FB = y) && PS3_PS3AV | 1794 | depends on (FB = y) && PS3_PS3AV |
1799 | select FB_CFB_FILLRECT | 1795 | select FB_SYS_FILLRECT |
1800 | select FB_CFB_COPYAREA | 1796 | select FB_SYS_COPYAREA |
1801 | select FB_CFB_IMAGEBLIT | 1797 | select FB_SYS_IMAGEBLIT |
1798 | select FB_SYS_FOPS | ||
1802 | ---help--- | 1799 | ---help--- |
1803 | Include support for the virtual frame buffer in the PS3 platform. | 1800 | Include support for the virtual frame buffer in the PS3 platform. |
1804 | 1801 | ||
diff --git a/drivers/video/imxfb.c b/drivers/video/imxfb.c index 267c1ff9ebd9..a12589898597 100644 --- a/drivers/video/imxfb.c +++ b/drivers/video/imxfb.c | |||
@@ -394,26 +394,18 @@ static void imxfb_setup_gpio(struct imxfb_info *fbi) | |||
394 | 394 | ||
395 | /* initialize GPIOs */ | 395 | /* initialize GPIOs */ |
396 | imx_gpio_mode(PD6_PF_LSCLK); | 396 | imx_gpio_mode(PD6_PF_LSCLK); |
397 | imx_gpio_mode(PD10_PF_SPL_SPR); | ||
398 | imx_gpio_mode(PD11_PF_CONTRAST); | 397 | imx_gpio_mode(PD11_PF_CONTRAST); |
399 | imx_gpio_mode(PD14_PF_FLM_VSYNC); | 398 | imx_gpio_mode(PD14_PF_FLM_VSYNC); |
400 | imx_gpio_mode(PD13_PF_LP_HSYNC); | 399 | imx_gpio_mode(PD13_PF_LP_HSYNC); |
401 | imx_gpio_mode(PD7_PF_REV); | ||
402 | imx_gpio_mode(PD8_PF_CLS); | ||
403 | |||
404 | #ifndef CONFIG_MACH_PIMX1 | ||
405 | /* on PiMX1 used as buffers enable signal | ||
406 | */ | ||
407 | imx_gpio_mode(PD9_PF_PS); | ||
408 | #endif | ||
409 | |||
410 | #ifndef CONFIG_MACH_MX1FS2 | ||
411 | /* on mx1fs2 this pin is used to (de)activate the display, so we need | ||
412 | * it as a normal gpio | ||
413 | */ | ||
414 | imx_gpio_mode(PD12_PF_ACD_OE); | 400 | imx_gpio_mode(PD12_PF_ACD_OE); |
415 | #endif | ||
416 | 401 | ||
402 | /* These are only needed for Sharp HR TFT displays */ | ||
403 | if (fbi->pcr & PCR_SHARP) { | ||
404 | imx_gpio_mode(PD7_PF_REV); | ||
405 | imx_gpio_mode(PD8_PF_CLS); | ||
406 | imx_gpio_mode(PD9_PF_PS); | ||
407 | imx_gpio_mode(PD10_PF_SPL_SPR); | ||
408 | } | ||
417 | } | 409 | } |
418 | 410 | ||
419 | #ifdef CONFIG_PM | 411 | #ifdef CONFIG_PM |
@@ -476,7 +468,6 @@ static int __init imxfb_init_fbinfo(struct device *dev) | |||
476 | 468 | ||
477 | info->fbops = &imxfb_ops; | 469 | info->fbops = &imxfb_ops; |
478 | info->flags = FBINFO_FLAG_DEFAULT; | 470 | info->flags = FBINFO_FLAG_DEFAULT; |
479 | info->pseudo_palette = (fbi + 1); | ||
480 | 471 | ||
481 | fbi->rgb[RGB_16] = &def_rgb_16; | 472 | fbi->rgb[RGB_16] = &def_rgb_16; |
482 | fbi->rgb[RGB_8] = &def_rgb_8; | 473 | fbi->rgb[RGB_8] = &def_rgb_8; |
@@ -499,6 +490,7 @@ static int __init imxfb_init_fbinfo(struct device *dev) | |||
499 | info->var.sync = inf->sync; | 490 | info->var.sync = inf->sync; |
500 | info->var.grayscale = inf->cmap_greyscale; | 491 | info->var.grayscale = inf->cmap_greyscale; |
501 | fbi->cmap_inverse = inf->cmap_inverse; | 492 | fbi->cmap_inverse = inf->cmap_inverse; |
493 | fbi->cmap_static = inf->cmap_static; | ||
502 | fbi->pcr = inf->pcr; | 494 | fbi->pcr = inf->pcr; |
503 | fbi->lscr1 = inf->lscr1; | 495 | fbi->lscr1 = inf->lscr1; |
504 | fbi->dmacr = inf->dmacr; | 496 | fbi->dmacr = inf->dmacr; |
diff --git a/drivers/video/pm2fb.c b/drivers/video/pm2fb.c index ab5e66890e4e..0a04483aa3e0 100644 --- a/drivers/video/pm2fb.c +++ b/drivers/video/pm2fb.c | |||
@@ -183,15 +183,17 @@ static inline void pm2_RDAC_WR(struct pm2fb_par* p, s32 idx, u32 v) | |||
183 | index = PM2VR_RD_INDEXED_DATA; | 183 | index = PM2VR_RD_INDEXED_DATA; |
184 | break; | 184 | break; |
185 | } | 185 | } |
186 | mb(); | 186 | wmb(); |
187 | pm2_WR(p, index, v); | 187 | pm2_WR(p, index, v); |
188 | wmb(); | ||
188 | } | 189 | } |
189 | 190 | ||
190 | static inline void pm2v_RDAC_WR(struct pm2fb_par* p, s32 idx, u32 v) | 191 | static inline void pm2v_RDAC_WR(struct pm2fb_par* p, s32 idx, u32 v) |
191 | { | 192 | { |
192 | pm2_WR(p, PM2VR_RD_INDEX_LOW, idx & 0xff); | 193 | pm2_WR(p, PM2VR_RD_INDEX_LOW, idx & 0xff); |
193 | mb(); | 194 | wmb(); |
194 | pm2_WR(p, PM2VR_RD_INDEXED_DATA, v); | 195 | pm2_WR(p, PM2VR_RD_INDEXED_DATA, v); |
196 | wmb(); | ||
195 | } | 197 | } |
196 | 198 | ||
197 | #ifdef CONFIG_FB_PM2_FIFO_DISCONNECT | 199 | #ifdef CONFIG_FB_PM2_FIFO_DISCONNECT |
@@ -466,11 +468,9 @@ static void set_memclock(struct pm2fb_par* par, u32 clk) | |||
466 | WAIT_FIFO(par, 8); | 468 | WAIT_FIFO(par, 8); |
467 | pm2_WR(par, PM2VR_RD_INDEX_HIGH, PM2VI_RD_MCLK_CONTROL >> 8); | 469 | pm2_WR(par, PM2VR_RD_INDEX_HIGH, PM2VI_RD_MCLK_CONTROL >> 8); |
468 | pm2v_RDAC_WR(par, PM2VI_RD_MCLK_CONTROL, 0); | 470 | pm2v_RDAC_WR(par, PM2VI_RD_MCLK_CONTROL, 0); |
469 | wmb(); | ||
470 | pm2v_RDAC_WR(par, PM2VI_RD_MCLK_PRESCALE, m); | 471 | pm2v_RDAC_WR(par, PM2VI_RD_MCLK_PRESCALE, m); |
471 | pm2v_RDAC_WR(par, PM2VI_RD_MCLK_FEEDBACK, n); | 472 | pm2v_RDAC_WR(par, PM2VI_RD_MCLK_FEEDBACK, n); |
472 | pm2v_RDAC_WR(par, PM2VI_RD_MCLK_POSTSCALE, p); | 473 | pm2v_RDAC_WR(par, PM2VI_RD_MCLK_POSTSCALE, p); |
473 | wmb(); | ||
474 | pm2v_RDAC_WR(par, PM2VI_RD_MCLK_CONTROL, 1); | 474 | pm2v_RDAC_WR(par, PM2VI_RD_MCLK_CONTROL, 1); |
475 | rmb(); | 475 | rmb(); |
476 | for (i = 256; | 476 | for (i = 256; |
@@ -483,12 +483,9 @@ static void set_memclock(struct pm2fb_par* par, u32 clk) | |||
483 | pm2_mnp(clk, &m, &n, &p); | 483 | pm2_mnp(clk, &m, &n, &p); |
484 | WAIT_FIFO(par, 10); | 484 | WAIT_FIFO(par, 10); |
485 | pm2_RDAC_WR(par, PM2I_RD_MEMORY_CLOCK_3, 6); | 485 | pm2_RDAC_WR(par, PM2I_RD_MEMORY_CLOCK_3, 6); |
486 | wmb(); | ||
487 | pm2_RDAC_WR(par, PM2I_RD_MEMORY_CLOCK_1, m); | 486 | pm2_RDAC_WR(par, PM2I_RD_MEMORY_CLOCK_1, m); |
488 | pm2_RDAC_WR(par, PM2I_RD_MEMORY_CLOCK_2, n); | 487 | pm2_RDAC_WR(par, PM2I_RD_MEMORY_CLOCK_2, n); |
489 | wmb(); | ||
490 | pm2_RDAC_WR(par, PM2I_RD_MEMORY_CLOCK_3, 8|p); | 488 | pm2_RDAC_WR(par, PM2I_RD_MEMORY_CLOCK_3, 8|p); |
491 | wmb(); | ||
492 | pm2_RDAC_RD(par, PM2I_RD_MEMORY_CLOCK_STATUS); | 489 | pm2_RDAC_RD(par, PM2I_RD_MEMORY_CLOCK_STATUS); |
493 | rmb(); | 490 | rmb(); |
494 | for (i = 256; | 491 | for (i = 256; |
@@ -509,12 +506,9 @@ static void set_pixclock(struct pm2fb_par* par, u32 clk) | |||
509 | pm2_mnp(clk, &m, &n, &p); | 506 | pm2_mnp(clk, &m, &n, &p); |
510 | WAIT_FIFO(par, 8); | 507 | WAIT_FIFO(par, 8); |
511 | pm2_RDAC_WR(par, PM2I_RD_PIXEL_CLOCK_A3, 0); | 508 | pm2_RDAC_WR(par, PM2I_RD_PIXEL_CLOCK_A3, 0); |
512 | wmb(); | ||
513 | pm2_RDAC_WR(par, PM2I_RD_PIXEL_CLOCK_A1, m); | 509 | pm2_RDAC_WR(par, PM2I_RD_PIXEL_CLOCK_A1, m); |
514 | pm2_RDAC_WR(par, PM2I_RD_PIXEL_CLOCK_A2, n); | 510 | pm2_RDAC_WR(par, PM2I_RD_PIXEL_CLOCK_A2, n); |
515 | wmb(); | ||
516 | pm2_RDAC_WR(par, PM2I_RD_PIXEL_CLOCK_A3, 8|p); | 511 | pm2_RDAC_WR(par, PM2I_RD_PIXEL_CLOCK_A3, 8|p); |
517 | wmb(); | ||
518 | pm2_RDAC_RD(par, PM2I_RD_PIXEL_CLOCK_STATUS); | 512 | pm2_RDAC_RD(par, PM2I_RD_PIXEL_CLOCK_STATUS); |
519 | rmb(); | 513 | rmb(); |
520 | for (i = 256; | 514 | for (i = 256; |
@@ -1066,10 +1060,9 @@ static void pm2fb_block_op(struct fb_info* info, int copy, | |||
1066 | 1060 | ||
1067 | if (!w || !h) | 1061 | if (!w || !h) |
1068 | return; | 1062 | return; |
1069 | WAIT_FIFO(par, 6); | 1063 | WAIT_FIFO(par, 5); |
1070 | pm2_WR(par, PM2R_CONFIG, PM2F_CONFIG_FB_WRITE_ENABLE | | 1064 | pm2_WR(par, PM2R_CONFIG, PM2F_CONFIG_FB_WRITE_ENABLE | |
1071 | PM2F_CONFIG_FB_READ_SOURCE_ENABLE); | 1065 | PM2F_CONFIG_FB_READ_SOURCE_ENABLE); |
1072 | pm2_WR(par, PM2R_FB_PIXEL_OFFSET, 0); | ||
1073 | if (copy) | 1066 | if (copy) |
1074 | pm2_WR(par, PM2R_FB_SOURCE_DELTA, | 1067 | pm2_WR(par, PM2R_FB_SOURCE_DELTA, |
1075 | ((ysrc-y) & 0xfff) << 16 | ((xsrc-x) & 0xfff)); | 1068 | ((ysrc-y) & 0xfff) << 16 | ((xsrc-x) & 0xfff)); |
diff --git a/drivers/video/pm3fb.c b/drivers/video/pm3fb.c index c77a1a1fd46b..616a0c08e30c 100644 --- a/drivers/video/pm3fb.c +++ b/drivers/video/pm3fb.c | |||
@@ -52,11 +52,6 @@ | |||
52 | static char *mode_option __devinitdata; | 52 | static char *mode_option __devinitdata; |
53 | 53 | ||
54 | /* | 54 | /* |
55 | * If your driver supports multiple boards, you should make the | ||
56 | * below data types arrays, or allocate them dynamically (using kmalloc()). | ||
57 | */ | ||
58 | |||
59 | /* | ||
60 | * This structure defines the hardware state of the graphics card. Normally | 55 | * This structure defines the hardware state of the graphics card. Normally |
61 | * you place this in a header file in linux/include/video. This file usually | 56 | * you place this in a header file in linux/include/video. This file usually |
62 | * also includes register information. That allows other driver subsystems | 57 | * also includes register information. That allows other driver subsystems |
@@ -67,7 +62,7 @@ struct pm3_par { | |||
67 | unsigned char __iomem *v_regs;/* virtual address of p_regs */ | 62 | unsigned char __iomem *v_regs;/* virtual address of p_regs */ |
68 | u32 video; /* video flags before blanking */ | 63 | u32 video; /* video flags before blanking */ |
69 | u32 base; /* screen base (xoffset+yoffset) in 128 bits unit */ | 64 | u32 base; /* screen base (xoffset+yoffset) in 128 bits unit */ |
70 | u32 palette[16]; | 65 | u32 palette[16]; |
71 | }; | 66 | }; |
72 | 67 | ||
73 | /* | 68 | /* |
@@ -104,36 +99,28 @@ static inline void PM3_WAIT(struct pm3_par *par, u32 n) | |||
104 | while (PM3_READ_REG(par, PM3InFIFOSpace) < n); | 99 | while (PM3_READ_REG(par, PM3InFIFOSpace) < n); |
105 | } | 100 | } |
106 | 101 | ||
107 | static inline void PM3_SLOW_WRITE_REG(struct pm3_par *par, s32 off, u32 v) | ||
108 | { | ||
109 | if (par->v_regs) { | ||
110 | mb(); | ||
111 | PM3_WAIT(par, 1); | ||
112 | wmb(); | ||
113 | PM3_WRITE_REG(par, off, v); | ||
114 | } | ||
115 | } | ||
116 | |||
117 | static inline void PM3_SET_INDEX(struct pm3_par *par, unsigned index) | ||
118 | { | ||
119 | PM3_SLOW_WRITE_REG(par, PM3RD_IndexHigh, (index >> 8) & 0xff); | ||
120 | PM3_SLOW_WRITE_REG(par, PM3RD_IndexLow, index & 0xff); | ||
121 | } | ||
122 | |||
123 | static inline void PM3_WRITE_DAC_REG(struct pm3_par *par, unsigned r, u8 v) | 102 | static inline void PM3_WRITE_DAC_REG(struct pm3_par *par, unsigned r, u8 v) |
124 | { | 103 | { |
125 | PM3_SET_INDEX(par, r); | 104 | PM3_WAIT(par, 3); |
105 | PM3_WRITE_REG(par, PM3RD_IndexHigh, (r >> 8) & 0xff); | ||
106 | PM3_WRITE_REG(par, PM3RD_IndexLow, r & 0xff); | ||
126 | wmb(); | 107 | wmb(); |
127 | PM3_WRITE_REG(par, PM3RD_IndexedData, v); | 108 | PM3_WRITE_REG(par, PM3RD_IndexedData, v); |
109 | wmb(); | ||
128 | } | 110 | } |
129 | 111 | ||
130 | static inline void pm3fb_set_color(struct pm3_par *par, unsigned char regno, | 112 | static inline void pm3fb_set_color(struct pm3_par *par, unsigned char regno, |
131 | unsigned char r, unsigned char g, unsigned char b) | 113 | unsigned char r, unsigned char g, unsigned char b) |
132 | { | 114 | { |
133 | PM3_SLOW_WRITE_REG(par, PM3RD_PaletteWriteAddress, regno); | 115 | PM3_WAIT(par, 4); |
134 | PM3_SLOW_WRITE_REG(par, PM3RD_PaletteData, r); | 116 | PM3_WRITE_REG(par, PM3RD_PaletteWriteAddress, regno); |
135 | PM3_SLOW_WRITE_REG(par, PM3RD_PaletteData, g); | 117 | wmb(); |
136 | PM3_SLOW_WRITE_REG(par, PM3RD_PaletteData, b); | 118 | PM3_WRITE_REG(par, PM3RD_PaletteData, r); |
119 | wmb(); | ||
120 | PM3_WRITE_REG(par, PM3RD_PaletteData, g); | ||
121 | wmb(); | ||
122 | PM3_WRITE_REG(par, PM3RD_PaletteData, b); | ||
123 | wmb(); | ||
137 | } | 124 | } |
138 | 125 | ||
139 | static void pm3fb_clear_colormap(struct pm3_par *par, | 126 | static void pm3fb_clear_colormap(struct pm3_par *par, |
@@ -141,7 +128,7 @@ static void pm3fb_clear_colormap(struct pm3_par *par, | |||
141 | { | 128 | { |
142 | int i; | 129 | int i; |
143 | 130 | ||
144 | for (i = 0; i < 256 ; i++) /* fill color map with white */ | 131 | for (i = 0; i < 256 ; i++) |
145 | pm3fb_set_color(par, i, r, g, b); | 132 | pm3fb_set_color(par, i, r, g, b); |
146 | 133 | ||
147 | } | 134 | } |
@@ -175,19 +162,26 @@ static void pm3fb_calculate_clock(unsigned long reqclock, | |||
175 | } | 162 | } |
176 | } | 163 | } |
177 | 164 | ||
178 | static inline int pm3fb_shift_bpp(unsigned long depth, int v) | 165 | static inline int pm3fb_depth(const struct fb_var_screeninfo *var) |
179 | { | 166 | { |
180 | switch (depth) { | 167 | if ( var->bits_per_pixel == 16 ) |
168 | return var->red.length + var->green.length | ||
169 | + var->blue.length; | ||
170 | |||
171 | return var->bits_per_pixel; | ||
172 | } | ||
173 | |||
174 | static inline int pm3fb_shift_bpp(unsigned bpp, int v) | ||
175 | { | ||
176 | switch (bpp) { | ||
181 | case 8: | 177 | case 8: |
182 | return (v >> 4); | 178 | return (v >> 4); |
183 | case 12: | ||
184 | case 15: | ||
185 | case 16: | 179 | case 16: |
186 | return (v >> 3); | 180 | return (v >> 3); |
187 | case 32: | 181 | case 32: |
188 | return (v >> 2); | 182 | return (v >> 2); |
189 | } | 183 | } |
190 | DPRINTK("Unsupported depth %ld\n", depth); | 184 | DPRINTK("Unsupported depth %u\n", bpp); |
191 | return 0; | 185 | return 0; |
192 | } | 186 | } |
193 | 187 | ||
@@ -206,56 +200,50 @@ static void pm3fb_write_mode(struct fb_info *info) | |||
206 | const u32 vbend = vsend + info->var.upper_margin; | 200 | const u32 vbend = vsend + info->var.upper_margin; |
207 | const u32 vtotal = info->var.yres + vbend; | 201 | const u32 vtotal = info->var.yres + vbend; |
208 | const u32 width = (info->var.xres_virtual + 7) & ~7; | 202 | const u32 width = (info->var.xres_virtual + 7) & ~7; |
209 | 203 | const unsigned bpp = info->var.bits_per_pixel; | |
210 | PM3_SLOW_WRITE_REG(par, PM3MemBypassWriteMask, 0xffffffff); | 204 | |
211 | PM3_SLOW_WRITE_REG(par, PM3Aperture0, 0x00000000); | 205 | PM3_WAIT(par, 20); |
212 | PM3_SLOW_WRITE_REG(par, PM3Aperture1, 0x00000000); | 206 | PM3_WRITE_REG(par, PM3MemBypassWriteMask, 0xffffffff); |
213 | PM3_SLOW_WRITE_REG(par, PM3FIFODis, 0x00000007); | 207 | PM3_WRITE_REG(par, PM3Aperture0, 0x00000000); |
214 | 208 | PM3_WRITE_REG(par, PM3Aperture1, 0x00000000); | |
215 | PM3_SLOW_WRITE_REG(par, PM3HTotal, | 209 | PM3_WRITE_REG(par, PM3FIFODis, 0x00000007); |
216 | pm3fb_shift_bpp(info->var.bits_per_pixel, | 210 | |
217 | htotal - 1)); | 211 | PM3_WRITE_REG(par, PM3HTotal, |
218 | PM3_SLOW_WRITE_REG(par, PM3HsEnd, | 212 | pm3fb_shift_bpp(bpp, htotal - 1)); |
219 | pm3fb_shift_bpp(info->var.bits_per_pixel, | 213 | PM3_WRITE_REG(par, PM3HsEnd, |
220 | hsend)); | 214 | pm3fb_shift_bpp(bpp, hsend)); |
221 | PM3_SLOW_WRITE_REG(par, PM3HsStart, | 215 | PM3_WRITE_REG(par, PM3HsStart, |
222 | pm3fb_shift_bpp(info->var.bits_per_pixel, | 216 | pm3fb_shift_bpp(bpp, hsstart)); |
223 | hsstart)); | 217 | PM3_WRITE_REG(par, PM3HbEnd, |
224 | PM3_SLOW_WRITE_REG(par, PM3HbEnd, | 218 | pm3fb_shift_bpp(bpp, hbend)); |
225 | pm3fb_shift_bpp(info->var.bits_per_pixel, | 219 | PM3_WRITE_REG(par, PM3HgEnd, |
226 | hbend)); | 220 | pm3fb_shift_bpp(bpp, hbend)); |
227 | PM3_SLOW_WRITE_REG(par, PM3HgEnd, | 221 | PM3_WRITE_REG(par, PM3ScreenStride, |
228 | pm3fb_shift_bpp(info->var.bits_per_pixel, | 222 | pm3fb_shift_bpp(bpp, width)); |
229 | hbend)); | 223 | PM3_WRITE_REG(par, PM3VTotal, vtotal - 1); |
230 | PM3_SLOW_WRITE_REG(par, PM3ScreenStride, | 224 | PM3_WRITE_REG(par, PM3VsEnd, vsend - 1); |
231 | pm3fb_shift_bpp(info->var.bits_per_pixel, | 225 | PM3_WRITE_REG(par, PM3VsStart, vsstart - 1); |
232 | width)); | 226 | PM3_WRITE_REG(par, PM3VbEnd, vbend); |
233 | PM3_SLOW_WRITE_REG(par, PM3VTotal, vtotal - 1); | 227 | |
234 | PM3_SLOW_WRITE_REG(par, PM3VsEnd, vsend - 1); | 228 | switch (bpp) { |
235 | PM3_SLOW_WRITE_REG(par, PM3VsStart, vsstart - 1); | ||
236 | PM3_SLOW_WRITE_REG(par, PM3VbEnd, vbend); | ||
237 | |||
238 | switch (info->var.bits_per_pixel) { | ||
239 | case 8: | 229 | case 8: |
240 | PM3_SLOW_WRITE_REG(par, PM3ByAperture1Mode, | 230 | PM3_WRITE_REG(par, PM3ByAperture1Mode, |
241 | PM3ByApertureMode_PIXELSIZE_8BIT); | 231 | PM3ByApertureMode_PIXELSIZE_8BIT); |
242 | PM3_SLOW_WRITE_REG(par, PM3ByAperture2Mode, | 232 | PM3_WRITE_REG(par, PM3ByAperture2Mode, |
243 | PM3ByApertureMode_PIXELSIZE_8BIT); | 233 | PM3ByApertureMode_PIXELSIZE_8BIT); |
244 | break; | 234 | break; |
245 | 235 | ||
246 | case 12: | ||
247 | case 15: | ||
248 | case 16: | 236 | case 16: |
249 | #ifndef __BIG_ENDIAN | 237 | #ifndef __BIG_ENDIAN |
250 | PM3_SLOW_WRITE_REG(par, PM3ByAperture1Mode, | 238 | PM3_WRITE_REG(par, PM3ByAperture1Mode, |
251 | PM3ByApertureMode_PIXELSIZE_16BIT); | 239 | PM3ByApertureMode_PIXELSIZE_16BIT); |
252 | PM3_SLOW_WRITE_REG(par, PM3ByAperture2Mode, | 240 | PM3_WRITE_REG(par, PM3ByAperture2Mode, |
253 | PM3ByApertureMode_PIXELSIZE_16BIT); | 241 | PM3ByApertureMode_PIXELSIZE_16BIT); |
254 | #else | 242 | #else |
255 | PM3_SLOW_WRITE_REG(par, PM3ByAperture1Mode, | 243 | PM3_WRITE_REG(par, PM3ByAperture1Mode, |
256 | PM3ByApertureMode_PIXELSIZE_16BIT | | 244 | PM3ByApertureMode_PIXELSIZE_16BIT | |
257 | PM3ByApertureMode_BYTESWAP_BADC); | 245 | PM3ByApertureMode_BYTESWAP_BADC); |
258 | PM3_SLOW_WRITE_REG(par, PM3ByAperture2Mode, | 246 | PM3_WRITE_REG(par, PM3ByAperture2Mode, |
259 | PM3ByApertureMode_PIXELSIZE_16BIT | | 247 | PM3ByApertureMode_PIXELSIZE_16BIT | |
260 | PM3ByApertureMode_BYTESWAP_BADC); | 248 | PM3ByApertureMode_BYTESWAP_BADC); |
261 | #endif /* ! __BIG_ENDIAN */ | 249 | #endif /* ! __BIG_ENDIAN */ |
@@ -263,23 +251,22 @@ static void pm3fb_write_mode(struct fb_info *info) | |||
263 | 251 | ||
264 | case 32: | 252 | case 32: |
265 | #ifndef __BIG_ENDIAN | 253 | #ifndef __BIG_ENDIAN |
266 | PM3_SLOW_WRITE_REG(par, PM3ByAperture1Mode, | 254 | PM3_WRITE_REG(par, PM3ByAperture1Mode, |
267 | PM3ByApertureMode_PIXELSIZE_32BIT); | 255 | PM3ByApertureMode_PIXELSIZE_32BIT); |
268 | PM3_SLOW_WRITE_REG(par, PM3ByAperture2Mode, | 256 | PM3_WRITE_REG(par, PM3ByAperture2Mode, |
269 | PM3ByApertureMode_PIXELSIZE_32BIT); | 257 | PM3ByApertureMode_PIXELSIZE_32BIT); |
270 | #else | 258 | #else |
271 | PM3_SLOW_WRITE_REG(par, PM3ByAperture1Mode, | 259 | PM3_WRITE_REG(par, PM3ByAperture1Mode, |
272 | PM3ByApertureMode_PIXELSIZE_32BIT | | 260 | PM3ByApertureMode_PIXELSIZE_32BIT | |
273 | PM3ByApertureMode_BYTESWAP_DCBA); | 261 | PM3ByApertureMode_BYTESWAP_DCBA); |
274 | PM3_SLOW_WRITE_REG(par, PM3ByAperture2Mode, | 262 | PM3_WRITE_REG(par, PM3ByAperture2Mode, |
275 | PM3ByApertureMode_PIXELSIZE_32BIT | | 263 | PM3ByApertureMode_PIXELSIZE_32BIT | |
276 | PM3ByApertureMode_BYTESWAP_DCBA); | 264 | PM3ByApertureMode_BYTESWAP_DCBA); |
277 | #endif /* ! __BIG_ENDIAN */ | 265 | #endif /* ! __BIG_ENDIAN */ |
278 | break; | 266 | break; |
279 | 267 | ||
280 | default: | 268 | default: |
281 | DPRINTK("Unsupported depth %d\n", | 269 | DPRINTK("Unsupported depth %d\n", bpp); |
282 | info->var.bits_per_pixel); | ||
283 | break; | 270 | break; |
284 | } | 271 | } |
285 | 272 | ||
@@ -296,14 +283,15 @@ static void pm3fb_write_mode(struct fb_info *info) | |||
296 | PM3VideoControl_VSYNC_MASK); | 283 | PM3VideoControl_VSYNC_MASK); |
297 | video |= PM3VideoControl_HSYNC_ACTIVE_HIGH | | 284 | video |= PM3VideoControl_HSYNC_ACTIVE_HIGH | |
298 | PM3VideoControl_VSYNC_ACTIVE_HIGH; | 285 | PM3VideoControl_VSYNC_ACTIVE_HIGH; |
299 | PM3_SLOW_WRITE_REG(par, PM3VideoControl, video); | 286 | PM3_WRITE_REG(par, PM3VideoControl, video); |
300 | } | 287 | } |
301 | PM3_SLOW_WRITE_REG(par, PM3VClkCtl, | 288 | PM3_WRITE_REG(par, PM3VClkCtl, |
302 | (PM3_READ_REG(par, PM3VClkCtl) & 0xFFFFFFFC)); | 289 | (PM3_READ_REG(par, PM3VClkCtl) & 0xFFFFFFFC)); |
303 | PM3_SLOW_WRITE_REG(par, PM3ScreenBase, par->base); | 290 | PM3_WRITE_REG(par, PM3ScreenBase, par->base); |
304 | PM3_SLOW_WRITE_REG(par, PM3ChipConfig, | 291 | PM3_WRITE_REG(par, PM3ChipConfig, |
305 | (PM3_READ_REG(par, PM3ChipConfig) & 0xFFFFFFFD)); | 292 | (PM3_READ_REG(par, PM3ChipConfig) & 0xFFFFFFFD)); |
306 | 293 | ||
294 | wmb(); | ||
307 | { | 295 | { |
308 | unsigned char uninitialized_var(m); /* ClkPreScale */ | 296 | unsigned char uninitialized_var(m); /* ClkPreScale */ |
309 | unsigned char uninitialized_var(n); /* ClkFeedBackScale */ | 297 | unsigned char uninitialized_var(n); /* ClkFeedBackScale */ |
@@ -337,7 +325,7 @@ static void pm3fb_write_mode(struct fb_info *info) | |||
337 | 325 | ||
338 | PM3_WRITE_DAC_REG(par, PM3RD_DACControl, 0x00); | 326 | PM3_WRITE_DAC_REG(par, PM3RD_DACControl, 0x00); |
339 | 327 | ||
340 | switch (info->var.bits_per_pixel) { | 328 | switch (pm3fb_depth(&info->var)) { |
341 | case 8: | 329 | case 8: |
342 | PM3_WRITE_DAC_REG(par, PM3RD_PixelSize, | 330 | PM3_WRITE_DAC_REG(par, PM3RD_PixelSize, |
343 | PM3RD_PixelSize_8_BIT_PIXELS); | 331 | PM3RD_PixelSize_8_BIT_PIXELS); |
@@ -393,57 +381,44 @@ static void pm3fb_write_mode(struct fb_info *info) | |||
393 | * hardware independent functions | 381 | * hardware independent functions |
394 | */ | 382 | */ |
395 | int pm3fb_init(void); | 383 | int pm3fb_init(void); |
396 | int pm3fb_setup(char*); | ||
397 | 384 | ||
398 | static int pm3fb_check_var(struct fb_var_screeninfo *var, struct fb_info *info) | 385 | static int pm3fb_check_var(struct fb_var_screeninfo *var, struct fb_info *info) |
399 | { | 386 | { |
400 | u32 lpitch; | 387 | u32 lpitch; |
388 | unsigned bpp = var->red.length + var->green.length | ||
389 | + var->blue.length + var->transp.length; | ||
401 | 390 | ||
402 | var->transp.offset = 0; | 391 | if ( bpp != var->bits_per_pixel ) { |
403 | var->transp.length = 0; | 392 | /* set predefined mode for bits_per_pixel settings */ |
404 | switch(var->bits_per_pixel) { | 393 | |
405 | case 8: | 394 | switch(var->bits_per_pixel) { |
406 | var->red.length = var->green.length = var->blue.length = 8; | 395 | case 8: |
407 | var->red.offset = var->green.offset = var->blue.offset = 0; | 396 | var->red.length = var->green.length = var->blue.length = 8; |
408 | break; | 397 | var->red.offset = var->green.offset = var->blue.offset = 0; |
409 | case 12: | 398 | var->transp.offset = 0; |
410 | var->red.offset = 8; | 399 | var->transp.length = 0; |
411 | var->red.length = 4; | 400 | break; |
412 | var->green.offset = 4; | 401 | case 16: |
413 | var->green.length = 4; | 402 | var->red.length = var->blue.length = 5; |
414 | var->blue.offset = 0; | 403 | var->green.length = 6; |
415 | var->blue.length = 4; | 404 | var->transp.length = 0; |
416 | var->transp.offset = 12; | 405 | break; |
417 | var->transp.length = 4; | 406 | case 32: |
418 | case 15: | 407 | var->red.length = var->green.length = var->blue.length = 8; |
419 | var->red.offset = 10; | 408 | var->transp.length = 8; |
420 | var->red.length = 5; | 409 | break; |
421 | var->green.offset = 5; | 410 | default: |
422 | var->green.length = 5; | 411 | DPRINTK("depth not supported: %u\n", var->bits_per_pixel); |
423 | var->blue.offset = 0; | 412 | return -EINVAL; |
424 | var->blue.length = 5; | 413 | } |
425 | var->transp.offset = 15; | 414 | } |
426 | var->transp.length = 1; | 415 | /* it is assumed BGRA order */ |
427 | break; | 416 | if (var->bits_per_pixel > 8 ) |
428 | case 16: | 417 | { |
429 | var->red.offset = 11; | 418 | var->blue.offset = 0; |
430 | var->red.length = 5; | 419 | var->green.offset = var->blue.length; |
431 | var->green.offset = 5; | 420 | var->red.offset = var->green.offset + var->green.length; |
432 | var->green.length = 6; | 421 | var->transp.offset = var->red.offset + var->red.length; |
433 | var->blue.offset = 0; | ||
434 | var->blue.length = 5; | ||
435 | break; | ||
436 | case 32: | ||
437 | var->transp.offset = 24; | ||
438 | var->transp.length = 8; | ||
439 | var->red.offset = 16; | ||
440 | var->green.offset = 8; | ||
441 | var->blue.offset = 0; | ||
442 | var->red.length = var->green.length = var->blue.length = 8; | ||
443 | break; | ||
444 | default: | ||
445 | DPRINTK("depth not supported: %u\n", var->bits_per_pixel); | ||
446 | return -EINVAL; | ||
447 | } | 422 | } |
448 | var->height = var->width = -1; | 423 | var->height = var->width = -1; |
449 | 424 | ||
@@ -502,10 +477,9 @@ static int pm3fb_set_par(struct fb_info *info) | |||
502 | { | 477 | { |
503 | struct pm3_par *par = info->par; | 478 | struct pm3_par *par = info->par; |
504 | const u32 xres = (info->var.xres + 31) & ~31; | 479 | const u32 xres = (info->var.xres + 31) & ~31; |
505 | const int depth = (info->var.bits_per_pixel + 7) & ~7; | 480 | const unsigned bpp = info->var.bits_per_pixel; |
506 | 481 | ||
507 | par->base = pm3fb_shift_bpp(info->var.bits_per_pixel, | 482 | par->base = pm3fb_shift_bpp(bpp,(info->var.yoffset * xres) |
508 | (info->var.yoffset * xres) | ||
509 | + info->var.xoffset); | 483 | + info->var.xoffset); |
510 | par->video = 0; | 484 | par->video = 0; |
511 | 485 | ||
@@ -530,12 +504,10 @@ static int pm3fb_set_par(struct fb_info *info) | |||
530 | par->video |= PM3VideoControl_DISABLE; | 504 | par->video |= PM3VideoControl_DISABLE; |
531 | DPRINTK("PM3Video disabled\n"); | 505 | DPRINTK("PM3Video disabled\n"); |
532 | } | 506 | } |
533 | switch (depth) { | 507 | switch (bpp) { |
534 | case 8: | 508 | case 8: |
535 | par->video |= PM3VideoControl_PIXELSIZE_8BIT; | 509 | par->video |= PM3VideoControl_PIXELSIZE_8BIT; |
536 | break; | 510 | break; |
537 | case 12: | ||
538 | case 15: | ||
539 | case 16: | 511 | case 16: |
540 | par->video |= PM3VideoControl_PIXELSIZE_16BIT; | 512 | par->video |= PM3VideoControl_PIXELSIZE_16BIT; |
541 | break; | 513 | break; |
@@ -548,9 +520,9 @@ static int pm3fb_set_par(struct fb_info *info) | |||
548 | } | 520 | } |
549 | 521 | ||
550 | info->fix.visual = | 522 | info->fix.visual = |
551 | (depth == 8) ? FB_VISUAL_PSEUDOCOLOR : FB_VISUAL_TRUECOLOR; | 523 | (bpp == 8) ? FB_VISUAL_PSEUDOCOLOR : FB_VISUAL_TRUECOLOR; |
552 | info->fix.line_length = ((info->var.xres_virtual + 7) & ~7) | 524 | info->fix.line_length = ((info->var.xres_virtual + 7) & ~7) |
553 | * depth / 8; | 525 | * bpp / 8; |
554 | 526 | ||
555 | /* pm3fb_clear_memory(info, 0);*/ | 527 | /* pm3fb_clear_memory(info, 0);*/ |
556 | pm3fb_clear_colormap(par, 0, 0, 0); | 528 | pm3fb_clear_colormap(par, 0, 0, 0); |
@@ -580,8 +552,8 @@ static int pm3fb_setcolreg(unsigned regno, unsigned red, unsigned green, | |||
580 | * var->{color}.length contains length of bitfield | 552 | * var->{color}.length contains length of bitfield |
581 | * {hardwarespecific} contains width of DAC | 553 | * {hardwarespecific} contains width of DAC |
582 | * pseudo_palette[X] is programmed to (X << red.offset) | | 554 | * pseudo_palette[X] is programmed to (X << red.offset) | |
583 | * (X << green.offset) | | 555 | * (X << green.offset) | |
584 | * (X << blue.offset) | 556 | * (X << blue.offset) |
585 | * RAMDAC[X] is programmed to (red, green, blue) | 557 | * RAMDAC[X] is programmed to (red, green, blue) |
586 | * color depth = SUM(var->{color}.length) | 558 | * color depth = SUM(var->{color}.length) |
587 | * | 559 | * |
@@ -621,7 +593,6 @@ static int pm3fb_setcolreg(unsigned regno, unsigned red, unsigned green, | |||
621 | case 8: | 593 | case 8: |
622 | break; | 594 | break; |
623 | case 16: | 595 | case 16: |
624 | case 24: | ||
625 | case 32: | 596 | case 32: |
626 | ((u32*)(info->pseudo_palette))[regno] = v; | 597 | ((u32*)(info->pseudo_palette))[regno] = v; |
627 | break; | 598 | break; |
@@ -643,7 +614,8 @@ static int pm3fb_pan_display(struct fb_var_screeninfo *var, | |||
643 | par->base = pm3fb_shift_bpp(var->bits_per_pixel, | 614 | par->base = pm3fb_shift_bpp(var->bits_per_pixel, |
644 | (var->yoffset * xres) | 615 | (var->yoffset * xres) |
645 | + var->xoffset); | 616 | + var->xoffset); |
646 | PM3_SLOW_WRITE_REG(par, PM3ScreenBase, par->base); | 617 | PM3_WAIT(par, 1); |
618 | PM3_WRITE_REG(par, PM3ScreenBase, par->base); | ||
647 | return 0; | 619 | return 0; |
648 | } | 620 | } |
649 | 621 | ||
@@ -665,31 +637,31 @@ static int pm3fb_blank(int blank_mode, struct fb_info *info) | |||
665 | 637 | ||
666 | switch (blank_mode) { | 638 | switch (blank_mode) { |
667 | case FB_BLANK_UNBLANK: | 639 | case FB_BLANK_UNBLANK: |
668 | video = video | PM3VideoControl_ENABLE; | 640 | video |= PM3VideoControl_ENABLE; |
669 | break; | 641 | break; |
670 | case FB_BLANK_NORMAL: /* FIXME */ | 642 | case FB_BLANK_NORMAL: |
671 | video = video & ~(PM3VideoControl_ENABLE); | 643 | video &= ~(PM3VideoControl_ENABLE); |
672 | break; | 644 | break; |
673 | case FB_BLANK_HSYNC_SUSPEND: | 645 | case FB_BLANK_HSYNC_SUSPEND: |
674 | video = video & ~(PM3VideoControl_HSYNC_MASK | | 646 | video &= ~(PM3VideoControl_HSYNC_MASK | |
675 | PM3VideoControl_BLANK_ACTIVE_LOW); | 647 | PM3VideoControl_BLANK_ACTIVE_LOW); |
676 | break; | 648 | break; |
677 | case FB_BLANK_VSYNC_SUSPEND: | 649 | case FB_BLANK_VSYNC_SUSPEND: |
678 | video = video & ~(PM3VideoControl_VSYNC_MASK | | 650 | video &= ~(PM3VideoControl_VSYNC_MASK | |
679 | PM3VideoControl_BLANK_ACTIVE_LOW); | 651 | PM3VideoControl_BLANK_ACTIVE_LOW); |
680 | break; | 652 | break; |
681 | case FB_BLANK_POWERDOWN: | 653 | case FB_BLANK_POWERDOWN: |
682 | video = video & ~(PM3VideoControl_HSYNC_MASK | | 654 | video &= ~(PM3VideoControl_HSYNC_MASK | |
683 | PM3VideoControl_VSYNC_MASK | | 655 | PM3VideoControl_VSYNC_MASK | |
684 | PM3VideoControl_BLANK_ACTIVE_LOW); | 656 | PM3VideoControl_BLANK_ACTIVE_LOW); |
685 | break; | 657 | break; |
686 | default: | 658 | default: |
687 | DPRINTK("Unsupported blanking %d\n", blank_mode); | 659 | DPRINTK("Unsupported blanking %d\n", blank_mode); |
688 | return 1; | 660 | return 1; |
689 | } | 661 | } |
690 | 662 | ||
691 | PM3_SLOW_WRITE_REG(par,PM3VideoControl, video); | 663 | PM3_WAIT(par, 1); |
692 | 664 | PM3_WRITE_REG(par,PM3VideoControl, video); | |
693 | return 0; | 665 | return 0; |
694 | } | 666 | } |
695 | 667 | ||
@@ -703,9 +675,9 @@ static struct fb_ops pm3fb_ops = { | |||
703 | .fb_set_par = pm3fb_set_par, | 675 | .fb_set_par = pm3fb_set_par, |
704 | .fb_setcolreg = pm3fb_setcolreg, | 676 | .fb_setcolreg = pm3fb_setcolreg, |
705 | .fb_pan_display = pm3fb_pan_display, | 677 | .fb_pan_display = pm3fb_pan_display, |
706 | .fb_fillrect = cfb_fillrect, /* Needed !!! */ | 678 | .fb_fillrect = cfb_fillrect, |
707 | .fb_copyarea = cfb_copyarea, /* Needed !!! */ | 679 | .fb_copyarea = cfb_copyarea, |
708 | .fb_imageblit = cfb_imageblit, /* Needed !!! */ | 680 | .fb_imageblit = cfb_imageblit, |
709 | .fb_blank = pm3fb_blank, | 681 | .fb_blank = pm3fb_blank, |
710 | }; | 682 | }; |
711 | 683 | ||
@@ -722,7 +694,7 @@ static unsigned long pm3fb_size_memory(struct pm3_par *par) | |||
722 | unsigned long memsize = 0, tempBypass, i, temp1, temp2; | 694 | unsigned long memsize = 0, tempBypass, i, temp1, temp2; |
723 | unsigned char __iomem *screen_mem; | 695 | unsigned char __iomem *screen_mem; |
724 | 696 | ||
725 | pm3fb_fix.smem_len = 64 * 1024 * 1024; /* request full aperture size */ | 697 | pm3fb_fix.smem_len = 64 * 1024l * 1024; /* request full aperture size */ |
726 | /* Linear frame buffer - request region and map it. */ | 698 | /* Linear frame buffer - request region and map it. */ |
727 | if (!request_mem_region(pm3fb_fix.smem_start, pm3fb_fix.smem_len, | 699 | if (!request_mem_region(pm3fb_fix.smem_start, pm3fb_fix.smem_len, |
728 | "pm3fb smem")) { | 700 | "pm3fb smem")) { |
@@ -744,7 +716,8 @@ static unsigned long pm3fb_size_memory(struct pm3_par *par) | |||
744 | 716 | ||
745 | DPRINTK("PM3MemBypassWriteMask was: 0x%08lx\n", tempBypass); | 717 | DPRINTK("PM3MemBypassWriteMask was: 0x%08lx\n", tempBypass); |
746 | 718 | ||
747 | PM3_SLOW_WRITE_REG(par, PM3MemBypassWriteMask, 0xFFFFFFFF); | 719 | PM3_WAIT(par, 1); |
720 | PM3_WRITE_REG(par, PM3MemBypassWriteMask, 0xFFFFFFFF); | ||
748 | 721 | ||
749 | /* pm3 split up memory, replicates, and do a lot of nasty stuff IMHO ;-) */ | 722 | /* pm3 split up memory, replicates, and do a lot of nasty stuff IMHO ;-) */ |
750 | for (i = 0; i < 32; i++) { | 723 | for (i = 0; i < 32; i++) { |
@@ -765,10 +738,9 @@ static unsigned long pm3fb_size_memory(struct pm3_par *par) | |||
765 | if (memsize + 1 == i) { | 738 | if (memsize + 1 == i) { |
766 | for (i = 0; i < 32; i++) { | 739 | for (i = 0; i < 32; i++) { |
767 | /* Clear first 32MB ; 0 is 0, no need to byteswap */ | 740 | /* Clear first 32MB ; 0 is 0, no need to byteswap */ |
768 | writel(0x0000000, | 741 | writel(0x0000000, (screen_mem + (i * 1048576))); |
769 | (screen_mem + (i * 1048576))); | ||
770 | mb(); | ||
771 | } | 742 | } |
743 | wmb(); | ||
772 | 744 | ||
773 | for (i = 32; i < 64; i++) { | 745 | for (i = 32; i < 64; i++) { |
774 | fb_writel(i * 0x00345678, | 746 | fb_writel(i * 0x00345678, |
@@ -787,7 +759,8 @@ static unsigned long pm3fb_size_memory(struct pm3_par *par) | |||
787 | } | 759 | } |
788 | DPRINTK("Second detect pass got %ld MB\n", memsize + 1); | 760 | DPRINTK("Second detect pass got %ld MB\n", memsize + 1); |
789 | 761 | ||
790 | PM3_SLOW_WRITE_REG(par, PM3MemBypassWriteMask, tempBypass); | 762 | PM3_WAIT(par, 1); |
763 | PM3_WRITE_REG(par, PM3MemBypassWriteMask, tempBypass); | ||
791 | 764 | ||
792 | iounmap(screen_mem); | 765 | iounmap(screen_mem); |
793 | release_mem_region(pm3fb_fix.smem_start, pm3fb_fix.smem_len); | 766 | release_mem_region(pm3fb_fix.smem_start, pm3fb_fix.smem_len); |
@@ -890,7 +863,6 @@ static int __devinit pm3fb_probe(struct pci_dev *dev, | |||
890 | goto err_exit_both; | 863 | goto err_exit_both; |
891 | } | 864 | } |
892 | 865 | ||
893 | /* This has to been done !!! */ | ||
894 | if (fb_alloc_cmap(&info->cmap, 256, 0) < 0) { | 866 | if (fb_alloc_cmap(&info->cmap, 256, 0) < 0) { |
895 | retval = -ENOMEM; | 867 | retval = -ENOMEM; |
896 | goto err_exit_both; | 868 | goto err_exit_both; |
@@ -907,7 +879,7 @@ static int __devinit pm3fb_probe(struct pci_dev *dev, | |||
907 | } | 879 | } |
908 | printk(KERN_INFO "fb%d: %s frame buffer device\n", info->node, | 880 | printk(KERN_INFO "fb%d: %s frame buffer device\n", info->node, |
909 | info->fix.id); | 881 | info->fix.id); |
910 | pci_set_drvdata(dev, info); /* or dev_set_drvdata(device, info) */ | 882 | pci_set_drvdata(dev, info); |
911 | return 0; | 883 | return 0; |
912 | 884 | ||
913 | err_exit_all: | 885 | err_exit_all: |
@@ -949,8 +921,7 @@ static void __devexit pm3fb_remove(struct pci_dev *dev) | |||
949 | 921 | ||
950 | static struct pci_device_id pm3fb_id_table[] = { | 922 | static struct pci_device_id pm3fb_id_table[] = { |
951 | { PCI_VENDOR_ID_3DLABS, 0x0a, | 923 | { PCI_VENDOR_ID_3DLABS, 0x0a, |
952 | PCI_ANY_ID, PCI_ANY_ID, PCI_BASE_CLASS_DISPLAY << 16, | 924 | PCI_ANY_ID, PCI_ANY_ID, 0, 0, 0 }, |
953 | 0xff0000, 0 }, | ||
954 | { 0, } | 925 | { 0, } |
955 | }; | 926 | }; |
956 | 927 | ||
@@ -964,6 +935,22 @@ static struct pci_driver pm3fb_driver = { | |||
964 | 935 | ||
965 | MODULE_DEVICE_TABLE(pci, pm3fb_id_table); | 936 | MODULE_DEVICE_TABLE(pci, pm3fb_id_table); |
966 | 937 | ||
938 | #ifndef MODULE | ||
939 | /* | ||
940 | * Setup | ||
941 | */ | ||
942 | |||
943 | /* | ||
944 | * Only necessary if your driver takes special options, | ||
945 | * otherwise we fall back on the generic fb_setup(). | ||
946 | */ | ||
947 | static int __init pm3fb_setup(char *options) | ||
948 | { | ||
949 | /* Parse user speficied options (`video=pm3fb:') */ | ||
950 | return 0; | ||
951 | } | ||
952 | #endif /* MODULE */ | ||
953 | |||
967 | int __init pm3fb_init(void) | 954 | int __init pm3fb_init(void) |
968 | { | 955 | { |
969 | /* | 956 | /* |
@@ -985,22 +972,6 @@ static void __exit pm3fb_exit(void) | |||
985 | pci_unregister_driver(&pm3fb_driver); | 972 | pci_unregister_driver(&pm3fb_driver); |
986 | } | 973 | } |
987 | 974 | ||
988 | #ifndef MODULE | ||
989 | /* | ||
990 | * Setup | ||
991 | */ | ||
992 | |||
993 | /* | ||
994 | * Only necessary if your driver takes special options, | ||
995 | * otherwise we fall back on the generic fb_setup(). | ||
996 | */ | ||
997 | int __init pm3fb_setup(char *options) | ||
998 | { | ||
999 | /* Parse user speficied options (`video=pm3fb:') */ | ||
1000 | return 0; | ||
1001 | } | ||
1002 | #endif /* MODULE */ | ||
1003 | |||
1004 | module_init(pm3fb_init); | 975 | module_init(pm3fb_init); |
1005 | module_exit(pm3fb_exit); | 976 | module_exit(pm3fb_exit); |
1006 | 977 | ||
diff --git a/drivers/video/ps3fb.c b/drivers/video/ps3fb.c index 9756a728b74f..9cf92ba5d6e3 100644 --- a/drivers/video/ps3fb.c +++ b/drivers/video/ps3fb.c | |||
@@ -951,12 +951,14 @@ static int ps3fb_xdr_settings(u64 xdr_lpar) | |||
951 | static struct fb_ops ps3fb_ops = { | 951 | static struct fb_ops ps3fb_ops = { |
952 | .fb_open = ps3fb_open, | 952 | .fb_open = ps3fb_open, |
953 | .fb_release = ps3fb_release, | 953 | .fb_release = ps3fb_release, |
954 | .fb_read = fb_sys_read, | ||
955 | .fb_write = fb_sys_write, | ||
954 | .fb_check_var = ps3fb_check_var, | 956 | .fb_check_var = ps3fb_check_var, |
955 | .fb_set_par = ps3fb_set_par, | 957 | .fb_set_par = ps3fb_set_par, |
956 | .fb_setcolreg = ps3fb_setcolreg, | 958 | .fb_setcolreg = ps3fb_setcolreg, |
957 | .fb_fillrect = cfb_fillrect, | 959 | .fb_fillrect = sys_fillrect, |
958 | .fb_copyarea = cfb_copyarea, | 960 | .fb_copyarea = sys_copyarea, |
959 | .fb_imageblit = cfb_imageblit, | 961 | .fb_imageblit = sys_imageblit, |
960 | .fb_mmap = ps3fb_mmap, | 962 | .fb_mmap = ps3fb_mmap, |
961 | .fb_blank = ps3fb_blank, | 963 | .fb_blank = ps3fb_blank, |
962 | .fb_ioctl = ps3fb_ioctl, | 964 | .fb_ioctl = ps3fb_ioctl, |
diff --git a/drivers/video/w100fb.c b/drivers/video/w100fb.c index 5fc86ea20692..003c49a490eb 100644 --- a/drivers/video/w100fb.c +++ b/drivers/video/w100fb.c | |||
@@ -660,7 +660,7 @@ int __init w100fb_probe(struct platform_device *pdev) | |||
660 | err = -ENODEV; | 660 | err = -ENODEV; |
661 | goto out; | 661 | goto out; |
662 | } | 662 | } |
663 | printk(" at 0x%08lx.\n", mem->start+W100_CFG_BASE); | 663 | printk(" at 0x%08lx.\n", (unsigned long) mem->start+W100_CFG_BASE); |
664 | 664 | ||
665 | /* Remap the framebuffer */ | 665 | /* Remap the framebuffer */ |
666 | remapped_fbuf = ioremap_nocache(mem->start+MEM_WINDOW_BASE, MEM_WINDOW_SIZE); | 666 | remapped_fbuf = ioremap_nocache(mem->start+MEM_WINDOW_BASE, MEM_WINDOW_SIZE); |
@@ -753,10 +753,14 @@ int __init w100fb_probe(struct platform_device *pdev) | |||
753 | goto out; | 753 | goto out; |
754 | } | 754 | } |
755 | 755 | ||
756 | device_create_file(&pdev->dev, &dev_attr_fastpllclk); | 756 | err = device_create_file(&pdev->dev, &dev_attr_fastpllclk); |
757 | device_create_file(&pdev->dev, &dev_attr_reg_read); | 757 | err |= device_create_file(&pdev->dev, &dev_attr_reg_read); |
758 | device_create_file(&pdev->dev, &dev_attr_reg_write); | 758 | err |= device_create_file(&pdev->dev, &dev_attr_reg_write); |
759 | device_create_file(&pdev->dev, &dev_attr_flip); | 759 | err |= device_create_file(&pdev->dev, &dev_attr_flip); |
760 | |||
761 | if (err != 0) | ||
762 | printk(KERN_WARNING "fb%d: failed to register attributes (%d)\n", | ||
763 | info->node, err); | ||
760 | 764 | ||
761 | printk(KERN_INFO "fb%d: %s frame buffer device\n", info->node, info->fix.id); | 765 | printk(KERN_INFO "fb%d: %s frame buffer device\n", info->node, info->fix.id); |
762 | return 0; | 766 | return 0; |