diff options
Diffstat (limited to 'drivers')
81 files changed, 959 insertions, 420 deletions
diff --git a/drivers/acpi/blacklist.c b/drivers/acpi/blacklist.c index ed122e17636e..7556e7c4a055 100644 --- a/drivers/acpi/blacklist.c +++ b/drivers/acpi/blacklist.c | |||
@@ -290,6 +290,14 @@ static struct dmi_system_id acpi_osi_dmi_table[] __initdata = { | |||
290 | DMI_MATCH(DMI_PRODUCT_NAME, "Vostro 3446"), | 290 | DMI_MATCH(DMI_PRODUCT_NAME, "Vostro 3446"), |
291 | }, | 291 | }, |
292 | }, | 292 | }, |
293 | { | ||
294 | .callback = dmi_disable_osi_win8, | ||
295 | .ident = "Dell Vostro 3546", | ||
296 | .matches = { | ||
297 | DMI_MATCH(DMI_SYS_VENDOR, "Dell Inc."), | ||
298 | DMI_MATCH(DMI_PRODUCT_NAME, "Vostro 3546"), | ||
299 | }, | ||
300 | }, | ||
293 | 301 | ||
294 | /* | 302 | /* |
295 | * BIOS invocation of _OSI(Linux) is almost always a BIOS bug. | 303 | * BIOS invocation of _OSI(Linux) is almost always a BIOS bug. |
diff --git a/drivers/acpi/device_pm.c b/drivers/acpi/device_pm.c index 143ec6ea1468..7db193160766 100644 --- a/drivers/acpi/device_pm.c +++ b/drivers/acpi/device_pm.c | |||
@@ -878,7 +878,7 @@ int acpi_dev_suspend_late(struct device *dev) | |||
878 | return 0; | 878 | return 0; |
879 | 879 | ||
880 | target_state = acpi_target_system_state(); | 880 | target_state = acpi_target_system_state(); |
881 | wakeup = device_may_wakeup(dev); | 881 | wakeup = device_may_wakeup(dev) && acpi_device_can_wakeup(adev); |
882 | error = acpi_device_wakeup(adev, target_state, wakeup); | 882 | error = acpi_device_wakeup(adev, target_state, wakeup); |
883 | if (wakeup && error) | 883 | if (wakeup && error) |
884 | return error; | 884 | return error; |
diff --git a/drivers/ata/ahci.c b/drivers/ata/ahci.c index 5f039f191067..e45f83789809 100644 --- a/drivers/ata/ahci.c +++ b/drivers/ata/ahci.c | |||
@@ -60,6 +60,7 @@ enum board_ids { | |||
60 | /* board IDs by feature in alphabetical order */ | 60 | /* board IDs by feature in alphabetical order */ |
61 | board_ahci, | 61 | board_ahci, |
62 | board_ahci_ign_iferr, | 62 | board_ahci_ign_iferr, |
63 | board_ahci_nomsi, | ||
63 | board_ahci_noncq, | 64 | board_ahci_noncq, |
64 | board_ahci_nosntf, | 65 | board_ahci_nosntf, |
65 | board_ahci_yes_fbs, | 66 | board_ahci_yes_fbs, |
@@ -121,6 +122,13 @@ static const struct ata_port_info ahci_port_info[] = { | |||
121 | .udma_mask = ATA_UDMA6, | 122 | .udma_mask = ATA_UDMA6, |
122 | .port_ops = &ahci_ops, | 123 | .port_ops = &ahci_ops, |
123 | }, | 124 | }, |
125 | [board_ahci_nomsi] = { | ||
126 | AHCI_HFLAGS (AHCI_HFLAG_NO_MSI), | ||
127 | .flags = AHCI_FLAG_COMMON, | ||
128 | .pio_mask = ATA_PIO4, | ||
129 | .udma_mask = ATA_UDMA6, | ||
130 | .port_ops = &ahci_ops, | ||
131 | }, | ||
124 | [board_ahci_noncq] = { | 132 | [board_ahci_noncq] = { |
125 | AHCI_HFLAGS (AHCI_HFLAG_NO_NCQ), | 133 | AHCI_HFLAGS (AHCI_HFLAG_NO_NCQ), |
126 | .flags = AHCI_FLAG_COMMON, | 134 | .flags = AHCI_FLAG_COMMON, |
@@ -313,6 +321,11 @@ static const struct pci_device_id ahci_pci_tbl[] = { | |||
313 | { PCI_VDEVICE(INTEL, 0x8c87), board_ahci }, /* 9 Series RAID */ | 321 | { PCI_VDEVICE(INTEL, 0x8c87), board_ahci }, /* 9 Series RAID */ |
314 | { PCI_VDEVICE(INTEL, 0x8c8e), board_ahci }, /* 9 Series RAID */ | 322 | { PCI_VDEVICE(INTEL, 0x8c8e), board_ahci }, /* 9 Series RAID */ |
315 | { PCI_VDEVICE(INTEL, 0x8c8f), board_ahci }, /* 9 Series RAID */ | 323 | { PCI_VDEVICE(INTEL, 0x8c8f), board_ahci }, /* 9 Series RAID */ |
324 | { PCI_VDEVICE(INTEL, 0xa103), board_ahci }, /* Sunrise Point-H AHCI */ | ||
325 | { PCI_VDEVICE(INTEL, 0xa103), board_ahci }, /* Sunrise Point-H RAID */ | ||
326 | { PCI_VDEVICE(INTEL, 0xa105), board_ahci }, /* Sunrise Point-H RAID */ | ||
327 | { PCI_VDEVICE(INTEL, 0xa107), board_ahci }, /* Sunrise Point-H RAID */ | ||
328 | { PCI_VDEVICE(INTEL, 0xa10f), board_ahci }, /* Sunrise Point-H RAID */ | ||
316 | 329 | ||
317 | /* JMicron 360/1/3/5/6, match class to avoid IDE function */ | 330 | /* JMicron 360/1/3/5/6, match class to avoid IDE function */ |
318 | { PCI_VENDOR_ID_JMICRON, PCI_ANY_ID, PCI_ANY_ID, PCI_ANY_ID, | 331 | { PCI_VENDOR_ID_JMICRON, PCI_ANY_ID, PCI_ANY_ID, PCI_ANY_ID, |
@@ -475,10 +488,10 @@ static const struct pci_device_id ahci_pci_tbl[] = { | |||
475 | { PCI_VDEVICE(ASMEDIA, 0x0612), board_ahci }, /* ASM1062 */ | 488 | { PCI_VDEVICE(ASMEDIA, 0x0612), board_ahci }, /* ASM1062 */ |
476 | 489 | ||
477 | /* | 490 | /* |
478 | * Samsung SSDs found on some macbooks. NCQ times out. | 491 | * Samsung SSDs found on some macbooks. NCQ times out if MSI is |
479 | * https://bugzilla.kernel.org/show_bug.cgi?id=60731 | 492 | * enabled. https://bugzilla.kernel.org/show_bug.cgi?id=60731 |
480 | */ | 493 | */ |
481 | { PCI_VDEVICE(SAMSUNG, 0x1600), board_ahci_noncq }, | 494 | { PCI_VDEVICE(SAMSUNG, 0x1600), board_ahci_nomsi }, |
482 | 495 | ||
483 | /* Enmotus */ | 496 | /* Enmotus */ |
484 | { PCI_DEVICE(0x1c44, 0x8000), board_ahci }, | 497 | { PCI_DEVICE(0x1c44, 0x8000), board_ahci }, |
@@ -514,12 +527,9 @@ MODULE_PARM_DESC(marvell_enable, "Marvell SATA via AHCI (1 = enabled)"); | |||
514 | static void ahci_pci_save_initial_config(struct pci_dev *pdev, | 527 | static void ahci_pci_save_initial_config(struct pci_dev *pdev, |
515 | struct ahci_host_priv *hpriv) | 528 | struct ahci_host_priv *hpriv) |
516 | { | 529 | { |
517 | unsigned int force_port_map = 0; | ||
518 | unsigned int mask_port_map = 0; | ||
519 | |||
520 | if (pdev->vendor == PCI_VENDOR_ID_JMICRON && pdev->device == 0x2361) { | 530 | if (pdev->vendor == PCI_VENDOR_ID_JMICRON && pdev->device == 0x2361) { |
521 | dev_info(&pdev->dev, "JMB361 has only one port\n"); | 531 | dev_info(&pdev->dev, "JMB361 has only one port\n"); |
522 | force_port_map = 1; | 532 | hpriv->force_port_map = 1; |
523 | } | 533 | } |
524 | 534 | ||
525 | /* | 535 | /* |
@@ -529,9 +539,9 @@ static void ahci_pci_save_initial_config(struct pci_dev *pdev, | |||
529 | */ | 539 | */ |
530 | if (hpriv->flags & AHCI_HFLAG_MV_PATA) { | 540 | if (hpriv->flags & AHCI_HFLAG_MV_PATA) { |
531 | if (pdev->device == 0x6121) | 541 | if (pdev->device == 0x6121) |
532 | mask_port_map = 0x3; | 542 | hpriv->mask_port_map = 0x3; |
533 | else | 543 | else |
534 | mask_port_map = 0xf; | 544 | hpriv->mask_port_map = 0xf; |
535 | dev_info(&pdev->dev, | 545 | dev_info(&pdev->dev, |
536 | "Disabling your PATA port. Use the boot option 'ahci.marvell_enable=0' to avoid this.\n"); | 546 | "Disabling your PATA port. Use the boot option 'ahci.marvell_enable=0' to avoid this.\n"); |
537 | } | 547 | } |
diff --git a/drivers/ata/libahci.c b/drivers/ata/libahci.c index 5eb61c9e63da..97683e45ab04 100644 --- a/drivers/ata/libahci.c +++ b/drivers/ata/libahci.c | |||
@@ -1778,16 +1778,15 @@ static void ahci_handle_port_interrupt(struct ata_port *ap, | |||
1778 | } | 1778 | } |
1779 | } | 1779 | } |
1780 | 1780 | ||
1781 | static void ahci_update_intr_status(struct ata_port *ap) | 1781 | static void ahci_port_intr(struct ata_port *ap) |
1782 | { | 1782 | { |
1783 | void __iomem *port_mmio = ahci_port_base(ap); | 1783 | void __iomem *port_mmio = ahci_port_base(ap); |
1784 | struct ahci_port_priv *pp = ap->private_data; | ||
1785 | u32 status; | 1784 | u32 status; |
1786 | 1785 | ||
1787 | status = readl(port_mmio + PORT_IRQ_STAT); | 1786 | status = readl(port_mmio + PORT_IRQ_STAT); |
1788 | writel(status, port_mmio + PORT_IRQ_STAT); | 1787 | writel(status, port_mmio + PORT_IRQ_STAT); |
1789 | 1788 | ||
1790 | atomic_or(status, &pp->intr_status); | 1789 | ahci_handle_port_interrupt(ap, port_mmio, status); |
1791 | } | 1790 | } |
1792 | 1791 | ||
1793 | static irqreturn_t ahci_port_thread_fn(int irq, void *dev_instance) | 1792 | static irqreturn_t ahci_port_thread_fn(int irq, void *dev_instance) |
@@ -1808,34 +1807,6 @@ static irqreturn_t ahci_port_thread_fn(int irq, void *dev_instance) | |||
1808 | return IRQ_HANDLED; | 1807 | return IRQ_HANDLED; |
1809 | } | 1808 | } |
1810 | 1809 | ||
1811 | irqreturn_t ahci_thread_fn(int irq, void *dev_instance) | ||
1812 | { | ||
1813 | struct ata_host *host = dev_instance; | ||
1814 | struct ahci_host_priv *hpriv = host->private_data; | ||
1815 | u32 irq_masked = hpriv->port_map; | ||
1816 | unsigned int i; | ||
1817 | |||
1818 | for (i = 0; i < host->n_ports; i++) { | ||
1819 | struct ata_port *ap; | ||
1820 | |||
1821 | if (!(irq_masked & (1 << i))) | ||
1822 | continue; | ||
1823 | |||
1824 | ap = host->ports[i]; | ||
1825 | if (ap) { | ||
1826 | ahci_port_thread_fn(irq, ap); | ||
1827 | VPRINTK("port %u\n", i); | ||
1828 | } else { | ||
1829 | VPRINTK("port %u (no irq)\n", i); | ||
1830 | if (ata_ratelimit()) | ||
1831 | dev_warn(host->dev, | ||
1832 | "interrupt on disabled port %u\n", i); | ||
1833 | } | ||
1834 | } | ||
1835 | |||
1836 | return IRQ_HANDLED; | ||
1837 | } | ||
1838 | |||
1839 | static irqreturn_t ahci_multi_irqs_intr(int irq, void *dev_instance) | 1810 | static irqreturn_t ahci_multi_irqs_intr(int irq, void *dev_instance) |
1840 | { | 1811 | { |
1841 | struct ata_port *ap = dev_instance; | 1812 | struct ata_port *ap = dev_instance; |
@@ -1875,6 +1846,8 @@ static irqreturn_t ahci_single_irq_intr(int irq, void *dev_instance) | |||
1875 | 1846 | ||
1876 | irq_masked = irq_stat & hpriv->port_map; | 1847 | irq_masked = irq_stat & hpriv->port_map; |
1877 | 1848 | ||
1849 | spin_lock(&host->lock); | ||
1850 | |||
1878 | for (i = 0; i < host->n_ports; i++) { | 1851 | for (i = 0; i < host->n_ports; i++) { |
1879 | struct ata_port *ap; | 1852 | struct ata_port *ap; |
1880 | 1853 | ||
@@ -1883,7 +1856,7 @@ static irqreturn_t ahci_single_irq_intr(int irq, void *dev_instance) | |||
1883 | 1856 | ||
1884 | ap = host->ports[i]; | 1857 | ap = host->ports[i]; |
1885 | if (ap) { | 1858 | if (ap) { |
1886 | ahci_update_intr_status(ap); | 1859 | ahci_port_intr(ap); |
1887 | VPRINTK("port %u\n", i); | 1860 | VPRINTK("port %u\n", i); |
1888 | } else { | 1861 | } else { |
1889 | VPRINTK("port %u (no irq)\n", i); | 1862 | VPRINTK("port %u (no irq)\n", i); |
@@ -1906,9 +1879,11 @@ static irqreturn_t ahci_single_irq_intr(int irq, void *dev_instance) | |||
1906 | */ | 1879 | */ |
1907 | writel(irq_stat, mmio + HOST_IRQ_STAT); | 1880 | writel(irq_stat, mmio + HOST_IRQ_STAT); |
1908 | 1881 | ||
1882 | spin_unlock(&host->lock); | ||
1883 | |||
1909 | VPRINTK("EXIT\n"); | 1884 | VPRINTK("EXIT\n"); |
1910 | 1885 | ||
1911 | return handled ? IRQ_WAKE_THREAD : IRQ_NONE; | 1886 | return IRQ_RETVAL(handled); |
1912 | } | 1887 | } |
1913 | 1888 | ||
1914 | unsigned int ahci_qc_issue(struct ata_queued_cmd *qc) | 1889 | unsigned int ahci_qc_issue(struct ata_queued_cmd *qc) |
@@ -2320,8 +2295,13 @@ static int ahci_port_start(struct ata_port *ap) | |||
2320 | */ | 2295 | */ |
2321 | pp->intr_mask = DEF_PORT_IRQ; | 2296 | pp->intr_mask = DEF_PORT_IRQ; |
2322 | 2297 | ||
2323 | spin_lock_init(&pp->lock); | 2298 | /* |
2324 | ap->lock = &pp->lock; | 2299 | * Switch to per-port locking in case each port has its own MSI vector. |
2300 | */ | ||
2301 | if ((hpriv->flags & AHCI_HFLAG_MULTI_MSI)) { | ||
2302 | spin_lock_init(&pp->lock); | ||
2303 | ap->lock = &pp->lock; | ||
2304 | } | ||
2325 | 2305 | ||
2326 | ap->private_data = pp; | 2306 | ap->private_data = pp; |
2327 | 2307 | ||
@@ -2482,31 +2462,6 @@ out_free_irqs: | |||
2482 | return rc; | 2462 | return rc; |
2483 | } | 2463 | } |
2484 | 2464 | ||
2485 | static int ahci_host_activate_single_irq(struct ata_host *host, int irq, | ||
2486 | struct scsi_host_template *sht) | ||
2487 | { | ||
2488 | int i, rc; | ||
2489 | |||
2490 | rc = ata_host_start(host); | ||
2491 | if (rc) | ||
2492 | return rc; | ||
2493 | |||
2494 | rc = devm_request_threaded_irq(host->dev, irq, ahci_single_irq_intr, | ||
2495 | ahci_thread_fn, IRQF_SHARED, | ||
2496 | dev_driver_string(host->dev), host); | ||
2497 | if (rc) | ||
2498 | return rc; | ||
2499 | |||
2500 | for (i = 0; i < host->n_ports; i++) | ||
2501 | ata_port_desc(host->ports[i], "irq %d", irq); | ||
2502 | |||
2503 | rc = ata_host_register(host, sht); | ||
2504 | if (rc) | ||
2505 | devm_free_irq(host->dev, irq, host); | ||
2506 | |||
2507 | return rc; | ||
2508 | } | ||
2509 | |||
2510 | /** | 2465 | /** |
2511 | * ahci_host_activate - start AHCI host, request IRQs and register it | 2466 | * ahci_host_activate - start AHCI host, request IRQs and register it |
2512 | * @host: target ATA host | 2467 | * @host: target ATA host |
@@ -2532,7 +2487,8 @@ int ahci_host_activate(struct ata_host *host, int irq, | |||
2532 | if (hpriv->flags & AHCI_HFLAG_MULTI_MSI) | 2487 | if (hpriv->flags & AHCI_HFLAG_MULTI_MSI) |
2533 | rc = ahci_host_activate_multi_irqs(host, irq, sht); | 2488 | rc = ahci_host_activate_multi_irqs(host, irq, sht); |
2534 | else | 2489 | else |
2535 | rc = ahci_host_activate_single_irq(host, irq, sht); | 2490 | rc = ata_host_activate(host, irq, ahci_single_irq_intr, |
2491 | IRQF_SHARED, sht); | ||
2536 | return rc; | 2492 | return rc; |
2537 | } | 2493 | } |
2538 | EXPORT_SYMBOL_GPL(ahci_host_activate); | 2494 | EXPORT_SYMBOL_GPL(ahci_host_activate); |
diff --git a/drivers/ata/sata_rcar.c b/drivers/ata/sata_rcar.c index 61eb6d77dac7..ea1fbc1d4c5f 100644 --- a/drivers/ata/sata_rcar.c +++ b/drivers/ata/sata_rcar.c | |||
@@ -146,6 +146,7 @@ | |||
146 | enum sata_rcar_type { | 146 | enum sata_rcar_type { |
147 | RCAR_GEN1_SATA, | 147 | RCAR_GEN1_SATA, |
148 | RCAR_GEN2_SATA, | 148 | RCAR_GEN2_SATA, |
149 | RCAR_R8A7790_ES1_SATA, | ||
149 | }; | 150 | }; |
150 | 151 | ||
151 | struct sata_rcar_priv { | 152 | struct sata_rcar_priv { |
@@ -763,6 +764,9 @@ static void sata_rcar_setup_port(struct ata_host *host) | |||
763 | ap->udma_mask = ATA_UDMA6; | 764 | ap->udma_mask = ATA_UDMA6; |
764 | ap->flags |= ATA_FLAG_SATA; | 765 | ap->flags |= ATA_FLAG_SATA; |
765 | 766 | ||
767 | if (priv->type == RCAR_R8A7790_ES1_SATA) | ||
768 | ap->flags |= ATA_FLAG_NO_DIPM; | ||
769 | |||
766 | ioaddr->cmd_addr = base + SDATA_REG; | 770 | ioaddr->cmd_addr = base + SDATA_REG; |
767 | ioaddr->ctl_addr = base + SSDEVCON_REG; | 771 | ioaddr->ctl_addr = base + SSDEVCON_REG; |
768 | ioaddr->scr_addr = base + SCRSSTS_REG; | 772 | ioaddr->scr_addr = base + SCRSSTS_REG; |
@@ -792,6 +796,7 @@ static void sata_rcar_init_controller(struct ata_host *host) | |||
792 | sata_rcar_gen1_phy_init(priv); | 796 | sata_rcar_gen1_phy_init(priv); |
793 | break; | 797 | break; |
794 | case RCAR_GEN2_SATA: | 798 | case RCAR_GEN2_SATA: |
799 | case RCAR_R8A7790_ES1_SATA: | ||
795 | sata_rcar_gen2_phy_init(priv); | 800 | sata_rcar_gen2_phy_init(priv); |
796 | break; | 801 | break; |
797 | default: | 802 | default: |
@@ -838,9 +843,17 @@ static struct of_device_id sata_rcar_match[] = { | |||
838 | .data = (void *)RCAR_GEN2_SATA | 843 | .data = (void *)RCAR_GEN2_SATA |
839 | }, | 844 | }, |
840 | { | 845 | { |
846 | .compatible = "renesas,sata-r8a7790-es1", | ||
847 | .data = (void *)RCAR_R8A7790_ES1_SATA | ||
848 | }, | ||
849 | { | ||
841 | .compatible = "renesas,sata-r8a7791", | 850 | .compatible = "renesas,sata-r8a7791", |
842 | .data = (void *)RCAR_GEN2_SATA | 851 | .data = (void *)RCAR_GEN2_SATA |
843 | }, | 852 | }, |
853 | { | ||
854 | .compatible = "renesas,sata-r8a7793", | ||
855 | .data = (void *)RCAR_GEN2_SATA | ||
856 | }, | ||
844 | { }, | 857 | { }, |
845 | }; | 858 | }; |
846 | MODULE_DEVICE_TABLE(of, sata_rcar_match); | 859 | MODULE_DEVICE_TABLE(of, sata_rcar_match); |
@@ -849,7 +862,9 @@ static const struct platform_device_id sata_rcar_id_table[] = { | |||
849 | { "sata_rcar", RCAR_GEN1_SATA }, /* Deprecated by "sata-r8a7779" */ | 862 | { "sata_rcar", RCAR_GEN1_SATA }, /* Deprecated by "sata-r8a7779" */ |
850 | { "sata-r8a7779", RCAR_GEN1_SATA }, | 863 | { "sata-r8a7779", RCAR_GEN1_SATA }, |
851 | { "sata-r8a7790", RCAR_GEN2_SATA }, | 864 | { "sata-r8a7790", RCAR_GEN2_SATA }, |
865 | { "sata-r8a7790-es1", RCAR_R8A7790_ES1_SATA }, | ||
852 | { "sata-r8a7791", RCAR_GEN2_SATA }, | 866 | { "sata-r8a7791", RCAR_GEN2_SATA }, |
867 | { "sata-r8a7793", RCAR_GEN2_SATA }, | ||
853 | { }, | 868 | { }, |
854 | }; | 869 | }; |
855 | MODULE_DEVICE_TABLE(platform, sata_rcar_id_table); | 870 | MODULE_DEVICE_TABLE(platform, sata_rcar_id_table); |
diff --git a/drivers/base/power/domain.c b/drivers/base/power/domain.c index 40bc2f4072cc..fb83d4acd400 100644 --- a/drivers/base/power/domain.c +++ b/drivers/base/power/domain.c | |||
@@ -361,9 +361,19 @@ static int __pm_genpd_save_device(struct pm_domain_data *pdd, | |||
361 | struct device *dev = pdd->dev; | 361 | struct device *dev = pdd->dev; |
362 | int ret = 0; | 362 | int ret = 0; |
363 | 363 | ||
364 | if (gpd_data->need_restore) | 364 | if (gpd_data->need_restore > 0) |
365 | return 0; | 365 | return 0; |
366 | 366 | ||
367 | /* | ||
368 | * If the value of the need_restore flag is still unknown at this point, | ||
369 | * we trust that pm_genpd_poweroff() has verified that the device is | ||
370 | * already runtime PM suspended. | ||
371 | */ | ||
372 | if (gpd_data->need_restore < 0) { | ||
373 | gpd_data->need_restore = 1; | ||
374 | return 0; | ||
375 | } | ||
376 | |||
367 | mutex_unlock(&genpd->lock); | 377 | mutex_unlock(&genpd->lock); |
368 | 378 | ||
369 | genpd_start_dev(genpd, dev); | 379 | genpd_start_dev(genpd, dev); |
@@ -373,7 +383,7 @@ static int __pm_genpd_save_device(struct pm_domain_data *pdd, | |||
373 | mutex_lock(&genpd->lock); | 383 | mutex_lock(&genpd->lock); |
374 | 384 | ||
375 | if (!ret) | 385 | if (!ret) |
376 | gpd_data->need_restore = true; | 386 | gpd_data->need_restore = 1; |
377 | 387 | ||
378 | return ret; | 388 | return ret; |
379 | } | 389 | } |
@@ -389,12 +399,17 @@ static void __pm_genpd_restore_device(struct pm_domain_data *pdd, | |||
389 | { | 399 | { |
390 | struct generic_pm_domain_data *gpd_data = to_gpd_data(pdd); | 400 | struct generic_pm_domain_data *gpd_data = to_gpd_data(pdd); |
391 | struct device *dev = pdd->dev; | 401 | struct device *dev = pdd->dev; |
392 | bool need_restore = gpd_data->need_restore; | 402 | int need_restore = gpd_data->need_restore; |
393 | 403 | ||
394 | gpd_data->need_restore = false; | 404 | gpd_data->need_restore = 0; |
395 | mutex_unlock(&genpd->lock); | 405 | mutex_unlock(&genpd->lock); |
396 | 406 | ||
397 | genpd_start_dev(genpd, dev); | 407 | genpd_start_dev(genpd, dev); |
408 | |||
409 | /* | ||
410 | * Call genpd_restore_dev() for recently added devices too (need_restore | ||
411 | * is negative then). | ||
412 | */ | ||
398 | if (need_restore) | 413 | if (need_restore) |
399 | genpd_restore_dev(genpd, dev); | 414 | genpd_restore_dev(genpd, dev); |
400 | 415 | ||
@@ -603,6 +618,7 @@ static void genpd_power_off_work_fn(struct work_struct *work) | |||
603 | static int pm_genpd_runtime_suspend(struct device *dev) | 618 | static int pm_genpd_runtime_suspend(struct device *dev) |
604 | { | 619 | { |
605 | struct generic_pm_domain *genpd; | 620 | struct generic_pm_domain *genpd; |
621 | struct generic_pm_domain_data *gpd_data; | ||
606 | bool (*stop_ok)(struct device *__dev); | 622 | bool (*stop_ok)(struct device *__dev); |
607 | int ret; | 623 | int ret; |
608 | 624 | ||
@@ -628,6 +644,16 @@ static int pm_genpd_runtime_suspend(struct device *dev) | |||
628 | return 0; | 644 | return 0; |
629 | 645 | ||
630 | mutex_lock(&genpd->lock); | 646 | mutex_lock(&genpd->lock); |
647 | |||
648 | /* | ||
649 | * If we have an unknown state of the need_restore flag, it means none | ||
650 | * of the runtime PM callbacks has been invoked yet. Let's update the | ||
651 | * flag to reflect that the current state is active. | ||
652 | */ | ||
653 | gpd_data = to_gpd_data(dev->power.subsys_data->domain_data); | ||
654 | if (gpd_data->need_restore < 0) | ||
655 | gpd_data->need_restore = 0; | ||
656 | |||
631 | genpd->in_progress++; | 657 | genpd->in_progress++; |
632 | pm_genpd_poweroff(genpd); | 658 | pm_genpd_poweroff(genpd); |
633 | genpd->in_progress--; | 659 | genpd->in_progress--; |
@@ -1437,12 +1463,12 @@ int __pm_genpd_add_device(struct generic_pm_domain *genpd, struct device *dev, | |||
1437 | spin_unlock_irq(&dev->power.lock); | 1463 | spin_unlock_irq(&dev->power.lock); |
1438 | 1464 | ||
1439 | if (genpd->attach_dev) | 1465 | if (genpd->attach_dev) |
1440 | genpd->attach_dev(dev); | 1466 | genpd->attach_dev(genpd, dev); |
1441 | 1467 | ||
1442 | mutex_lock(&gpd_data->lock); | 1468 | mutex_lock(&gpd_data->lock); |
1443 | gpd_data->base.dev = dev; | 1469 | gpd_data->base.dev = dev; |
1444 | list_add_tail(&gpd_data->base.list_node, &genpd->dev_list); | 1470 | list_add_tail(&gpd_data->base.list_node, &genpd->dev_list); |
1445 | gpd_data->need_restore = genpd->status == GPD_STATE_POWER_OFF; | 1471 | gpd_data->need_restore = -1; |
1446 | gpd_data->td.constraint_changed = true; | 1472 | gpd_data->td.constraint_changed = true; |
1447 | gpd_data->td.effective_constraint_ns = -1; | 1473 | gpd_data->td.effective_constraint_ns = -1; |
1448 | mutex_unlock(&gpd_data->lock); | 1474 | mutex_unlock(&gpd_data->lock); |
@@ -1499,7 +1525,7 @@ int pm_genpd_remove_device(struct generic_pm_domain *genpd, | |||
1499 | genpd->max_off_time_changed = true; | 1525 | genpd->max_off_time_changed = true; |
1500 | 1526 | ||
1501 | if (genpd->detach_dev) | 1527 | if (genpd->detach_dev) |
1502 | genpd->detach_dev(dev); | 1528 | genpd->detach_dev(genpd, dev); |
1503 | 1529 | ||
1504 | spin_lock_irq(&dev->power.lock); | 1530 | spin_lock_irq(&dev->power.lock); |
1505 | 1531 | ||
@@ -1546,7 +1572,7 @@ void pm_genpd_dev_need_restore(struct device *dev, bool val) | |||
1546 | 1572 | ||
1547 | psd = dev_to_psd(dev); | 1573 | psd = dev_to_psd(dev); |
1548 | if (psd && psd->domain_data) | 1574 | if (psd && psd->domain_data) |
1549 | to_gpd_data(psd->domain_data)->need_restore = val; | 1575 | to_gpd_data(psd->domain_data)->need_restore = val ? 1 : 0; |
1550 | 1576 | ||
1551 | spin_unlock_irqrestore(&dev->power.lock, flags); | 1577 | spin_unlock_irqrestore(&dev->power.lock, flags); |
1552 | } | 1578 | } |
diff --git a/drivers/cpufreq/cpufreq-dt.c b/drivers/cpufreq/cpufreq-dt.c index 23aaf40cf37f..f657c571b18e 100644 --- a/drivers/cpufreq/cpufreq-dt.c +++ b/drivers/cpufreq/cpufreq-dt.c | |||
@@ -166,8 +166,8 @@ try_again: | |||
166 | if (ret == -EPROBE_DEFER) | 166 | if (ret == -EPROBE_DEFER) |
167 | dev_dbg(cpu_dev, "cpu%d clock not ready, retry\n", cpu); | 167 | dev_dbg(cpu_dev, "cpu%d clock not ready, retry\n", cpu); |
168 | else | 168 | else |
169 | dev_err(cpu_dev, "failed to get cpu%d clock: %d\n", ret, | 169 | dev_err(cpu_dev, "failed to get cpu%d clock: %d\n", cpu, |
170 | cpu); | 170 | ret); |
171 | } else { | 171 | } else { |
172 | *cdev = cpu_dev; | 172 | *cdev = cpu_dev; |
173 | *creg = cpu_reg; | 173 | *creg = cpu_reg; |
diff --git a/drivers/cpufreq/cpufreq.c b/drivers/cpufreq/cpufreq.c index 644b54e1e7d1..4473eba1d6b0 100644 --- a/drivers/cpufreq/cpufreq.c +++ b/drivers/cpufreq/cpufreq.c | |||
@@ -1022,7 +1022,8 @@ static struct cpufreq_policy *cpufreq_policy_restore(unsigned int cpu) | |||
1022 | 1022 | ||
1023 | read_unlock_irqrestore(&cpufreq_driver_lock, flags); | 1023 | read_unlock_irqrestore(&cpufreq_driver_lock, flags); |
1024 | 1024 | ||
1025 | policy->governor = NULL; | 1025 | if (policy) |
1026 | policy->governor = NULL; | ||
1026 | 1027 | ||
1027 | return policy; | 1028 | return policy; |
1028 | } | 1029 | } |
diff --git a/drivers/dma/pl330.c b/drivers/dma/pl330.c index 4839bfa74a10..19a99743cf52 100644 --- a/drivers/dma/pl330.c +++ b/drivers/dma/pl330.c | |||
@@ -271,7 +271,7 @@ struct pl330_config { | |||
271 | #define DMAC_MODE_NS (1 << 0) | 271 | #define DMAC_MODE_NS (1 << 0) |
272 | unsigned int mode; | 272 | unsigned int mode; |
273 | unsigned int data_bus_width:10; /* In number of bits */ | 273 | unsigned int data_bus_width:10; /* In number of bits */ |
274 | unsigned int data_buf_dep:10; | 274 | unsigned int data_buf_dep:11; |
275 | unsigned int num_chan:4; | 275 | unsigned int num_chan:4; |
276 | unsigned int num_peri:6; | 276 | unsigned int num_peri:6; |
277 | u32 peri_ns; | 277 | u32 peri_ns; |
@@ -2336,7 +2336,7 @@ static inline int get_burst_len(struct dma_pl330_desc *desc, size_t len) | |||
2336 | int burst_len; | 2336 | int burst_len; |
2337 | 2337 | ||
2338 | burst_len = pl330->pcfg.data_bus_width / 8; | 2338 | burst_len = pl330->pcfg.data_bus_width / 8; |
2339 | burst_len *= pl330->pcfg.data_buf_dep; | 2339 | burst_len *= pl330->pcfg.data_buf_dep / pl330->pcfg.num_chan; |
2340 | burst_len >>= desc->rqcfg.brst_size; | 2340 | burst_len >>= desc->rqcfg.brst_size; |
2341 | 2341 | ||
2342 | /* src/dst_burst_len can't be more than 16 */ | 2342 | /* src/dst_burst_len can't be more than 16 */ |
@@ -2459,16 +2459,25 @@ pl330_prep_dma_memcpy(struct dma_chan *chan, dma_addr_t dst, | |||
2459 | /* Select max possible burst size */ | 2459 | /* Select max possible burst size */ |
2460 | burst = pl330->pcfg.data_bus_width / 8; | 2460 | burst = pl330->pcfg.data_bus_width / 8; |
2461 | 2461 | ||
2462 | while (burst > 1) { | 2462 | /* |
2463 | if (!(len % burst)) | 2463 | * Make sure we use a burst size that aligns with all the memcpy |
2464 | break; | 2464 | * parameters because our DMA programming algorithm doesn't cope with |
2465 | * transfers which straddle an entry in the DMA device's MFIFO. | ||
2466 | */ | ||
2467 | while ((src | dst | len) & (burst - 1)) | ||
2465 | burst /= 2; | 2468 | burst /= 2; |
2466 | } | ||
2467 | 2469 | ||
2468 | desc->rqcfg.brst_size = 0; | 2470 | desc->rqcfg.brst_size = 0; |
2469 | while (burst != (1 << desc->rqcfg.brst_size)) | 2471 | while (burst != (1 << desc->rqcfg.brst_size)) |
2470 | desc->rqcfg.brst_size++; | 2472 | desc->rqcfg.brst_size++; |
2471 | 2473 | ||
2474 | /* | ||
2475 | * If burst size is smaller than bus width then make sure we only | ||
2476 | * transfer one at a time to avoid a burst stradling an MFIFO entry. | ||
2477 | */ | ||
2478 | if (desc->rqcfg.brst_size * 8 < pl330->pcfg.data_bus_width) | ||
2479 | desc->rqcfg.brst_len = 1; | ||
2480 | |||
2472 | desc->rqcfg.brst_len = get_burst_len(desc, len); | 2481 | desc->rqcfg.brst_len = get_burst_len(desc, len); |
2473 | 2482 | ||
2474 | desc->txd.flags = flags; | 2483 | desc->txd.flags = flags; |
@@ -2732,7 +2741,7 @@ pl330_probe(struct amba_device *adev, const struct amba_id *id) | |||
2732 | 2741 | ||
2733 | 2742 | ||
2734 | dev_info(&adev->dev, | 2743 | dev_info(&adev->dev, |
2735 | "Loaded driver for PL330 DMAC-%d\n", adev->periphid); | 2744 | "Loaded driver for PL330 DMAC-%x\n", adev->periphid); |
2736 | dev_info(&adev->dev, | 2745 | dev_info(&adev->dev, |
2737 | "\tDBUFF-%ux%ubytes Num_Chans-%u Num_Peri-%u Num_Events-%u\n", | 2746 | "\tDBUFF-%ux%ubytes Num_Chans-%u Num_Peri-%u Num_Events-%u\n", |
2738 | pcfg->data_buf_dep, pcfg->data_bus_width / 8, pcfg->num_chan, | 2747 | pcfg->data_buf_dep, pcfg->data_bus_width / 8, pcfg->num_chan, |
diff --git a/drivers/dma/sun6i-dma.c b/drivers/dma/sun6i-dma.c index 3aa10b328254..91292f5513ff 100644 --- a/drivers/dma/sun6i-dma.c +++ b/drivers/dma/sun6i-dma.c | |||
@@ -230,30 +230,25 @@ static inline void sun6i_dma_dump_chan_regs(struct sun6i_dma_dev *sdev, | |||
230 | readl(pchan->base + DMA_CHAN_CUR_PARA)); | 230 | readl(pchan->base + DMA_CHAN_CUR_PARA)); |
231 | } | 231 | } |
232 | 232 | ||
233 | static inline int convert_burst(u32 maxburst, u8 *burst) | 233 | static inline s8 convert_burst(u32 maxburst) |
234 | { | 234 | { |
235 | switch (maxburst) { | 235 | switch (maxburst) { |
236 | case 1: | 236 | case 1: |
237 | *burst = 0; | 237 | return 0; |
238 | break; | ||
239 | case 8: | 238 | case 8: |
240 | *burst = 2; | 239 | return 2; |
241 | break; | ||
242 | default: | 240 | default: |
243 | return -EINVAL; | 241 | return -EINVAL; |
244 | } | 242 | } |
245 | |||
246 | return 0; | ||
247 | } | 243 | } |
248 | 244 | ||
249 | static inline int convert_buswidth(enum dma_slave_buswidth addr_width, u8 *width) | 245 | static inline s8 convert_buswidth(enum dma_slave_buswidth addr_width) |
250 | { | 246 | { |
251 | if ((addr_width < DMA_SLAVE_BUSWIDTH_1_BYTE) || | 247 | if ((addr_width < DMA_SLAVE_BUSWIDTH_1_BYTE) || |
252 | (addr_width > DMA_SLAVE_BUSWIDTH_4_BYTES)) | 248 | (addr_width > DMA_SLAVE_BUSWIDTH_4_BYTES)) |
253 | return -EINVAL; | 249 | return -EINVAL; |
254 | 250 | ||
255 | *width = addr_width >> 1; | 251 | return addr_width >> 1; |
256 | return 0; | ||
257 | } | 252 | } |
258 | 253 | ||
259 | static void *sun6i_dma_lli_add(struct sun6i_dma_lli *prev, | 254 | static void *sun6i_dma_lli_add(struct sun6i_dma_lli *prev, |
@@ -284,26 +279,25 @@ static inline int sun6i_dma_cfg_lli(struct sun6i_dma_lli *lli, | |||
284 | struct dma_slave_config *config) | 279 | struct dma_slave_config *config) |
285 | { | 280 | { |
286 | u8 src_width, dst_width, src_burst, dst_burst; | 281 | u8 src_width, dst_width, src_burst, dst_burst; |
287 | int ret; | ||
288 | 282 | ||
289 | if (!config) | 283 | if (!config) |
290 | return -EINVAL; | 284 | return -EINVAL; |
291 | 285 | ||
292 | ret = convert_burst(config->src_maxburst, &src_burst); | 286 | src_burst = convert_burst(config->src_maxburst); |
293 | if (ret) | 287 | if (src_burst) |
294 | return ret; | 288 | return src_burst; |
295 | 289 | ||
296 | ret = convert_burst(config->dst_maxburst, &dst_burst); | 290 | dst_burst = convert_burst(config->dst_maxburst); |
297 | if (ret) | 291 | if (dst_burst) |
298 | return ret; | 292 | return dst_burst; |
299 | 293 | ||
300 | ret = convert_buswidth(config->src_addr_width, &src_width); | 294 | src_width = convert_buswidth(config->src_addr_width); |
301 | if (ret) | 295 | if (src_width) |
302 | return ret; | 296 | return src_width; |
303 | 297 | ||
304 | ret = convert_buswidth(config->dst_addr_width, &dst_width); | 298 | dst_width = convert_buswidth(config->dst_addr_width); |
305 | if (ret) | 299 | if (dst_width) |
306 | return ret; | 300 | return dst_width; |
307 | 301 | ||
308 | lli->cfg = DMA_CHAN_CFG_SRC_BURST(src_burst) | | 302 | lli->cfg = DMA_CHAN_CFG_SRC_BURST(src_burst) | |
309 | DMA_CHAN_CFG_SRC_WIDTH(src_width) | | 303 | DMA_CHAN_CFG_SRC_WIDTH(src_width) | |
@@ -542,11 +536,10 @@ static struct dma_async_tx_descriptor *sun6i_dma_prep_dma_memcpy( | |||
542 | { | 536 | { |
543 | struct sun6i_dma_dev *sdev = to_sun6i_dma_dev(chan->device); | 537 | struct sun6i_dma_dev *sdev = to_sun6i_dma_dev(chan->device); |
544 | struct sun6i_vchan *vchan = to_sun6i_vchan(chan); | 538 | struct sun6i_vchan *vchan = to_sun6i_vchan(chan); |
545 | struct dma_slave_config *sconfig = &vchan->cfg; | ||
546 | struct sun6i_dma_lli *v_lli; | 539 | struct sun6i_dma_lli *v_lli; |
547 | struct sun6i_desc *txd; | 540 | struct sun6i_desc *txd; |
548 | dma_addr_t p_lli; | 541 | dma_addr_t p_lli; |
549 | int ret; | 542 | s8 burst, width; |
550 | 543 | ||
551 | dev_dbg(chan2dev(chan), | 544 | dev_dbg(chan2dev(chan), |
552 | "%s; chan: %d, dest: %pad, src: %pad, len: %zu. flags: 0x%08lx\n", | 545 | "%s; chan: %d, dest: %pad, src: %pad, len: %zu. flags: 0x%08lx\n", |
@@ -565,14 +558,21 @@ static struct dma_async_tx_descriptor *sun6i_dma_prep_dma_memcpy( | |||
565 | goto err_txd_free; | 558 | goto err_txd_free; |
566 | } | 559 | } |
567 | 560 | ||
568 | ret = sun6i_dma_cfg_lli(v_lli, src, dest, len, sconfig); | 561 | v_lli->src = src; |
569 | if (ret) | 562 | v_lli->dst = dest; |
570 | goto err_dma_free; | 563 | v_lli->len = len; |
564 | v_lli->para = NORMAL_WAIT; | ||
571 | 565 | ||
566 | burst = convert_burst(8); | ||
567 | width = convert_buswidth(DMA_SLAVE_BUSWIDTH_4_BYTES); | ||
572 | v_lli->cfg |= DMA_CHAN_CFG_SRC_DRQ(DRQ_SDRAM) | | 568 | v_lli->cfg |= DMA_CHAN_CFG_SRC_DRQ(DRQ_SDRAM) | |
573 | DMA_CHAN_CFG_DST_DRQ(DRQ_SDRAM) | | 569 | DMA_CHAN_CFG_DST_DRQ(DRQ_SDRAM) | |
574 | DMA_CHAN_CFG_DST_LINEAR_MODE | | 570 | DMA_CHAN_CFG_DST_LINEAR_MODE | |
575 | DMA_CHAN_CFG_SRC_LINEAR_MODE; | 571 | DMA_CHAN_CFG_SRC_LINEAR_MODE | |
572 | DMA_CHAN_CFG_SRC_BURST(burst) | | ||
573 | DMA_CHAN_CFG_SRC_WIDTH(width) | | ||
574 | DMA_CHAN_CFG_DST_BURST(burst) | | ||
575 | DMA_CHAN_CFG_DST_WIDTH(width); | ||
576 | 576 | ||
577 | sun6i_dma_lli_add(NULL, v_lli, p_lli, txd); | 577 | sun6i_dma_lli_add(NULL, v_lli, p_lli, txd); |
578 | 578 | ||
@@ -580,8 +580,6 @@ static struct dma_async_tx_descriptor *sun6i_dma_prep_dma_memcpy( | |||
580 | 580 | ||
581 | return vchan_tx_prep(&vchan->vc, &txd->vd, flags); | 581 | return vchan_tx_prep(&vchan->vc, &txd->vd, flags); |
582 | 582 | ||
583 | err_dma_free: | ||
584 | dma_pool_free(sdev->pool, v_lli, p_lli); | ||
585 | err_txd_free: | 583 | err_txd_free: |
586 | kfree(txd); | 584 | kfree(txd); |
587 | return NULL; | 585 | return NULL; |
@@ -915,6 +913,7 @@ static int sun6i_dma_probe(struct platform_device *pdev) | |||
915 | sdc->slave.device_prep_dma_memcpy = sun6i_dma_prep_dma_memcpy; | 913 | sdc->slave.device_prep_dma_memcpy = sun6i_dma_prep_dma_memcpy; |
916 | sdc->slave.device_control = sun6i_dma_control; | 914 | sdc->slave.device_control = sun6i_dma_control; |
917 | sdc->slave.chancnt = NR_MAX_VCHANS; | 915 | sdc->slave.chancnt = NR_MAX_VCHANS; |
916 | sdc->slave.copy_align = 4; | ||
918 | 917 | ||
919 | sdc->slave.dev = &pdev->dev; | 918 | sdc->slave.dev = &pdev->dev; |
920 | 919 | ||
diff --git a/drivers/firewire/core-cdev.c b/drivers/firewire/core-cdev.c index 5d997a33907e..2a3973a7c441 100644 --- a/drivers/firewire/core-cdev.c +++ b/drivers/firewire/core-cdev.c | |||
@@ -1637,8 +1637,7 @@ static int dispatch_ioctl(struct client *client, | |||
1637 | _IOC_SIZE(cmd) > sizeof(buffer)) | 1637 | _IOC_SIZE(cmd) > sizeof(buffer)) |
1638 | return -ENOTTY; | 1638 | return -ENOTTY; |
1639 | 1639 | ||
1640 | if (_IOC_DIR(cmd) == _IOC_READ) | 1640 | memset(&buffer, 0, sizeof(buffer)); |
1641 | memset(&buffer, 0, _IOC_SIZE(cmd)); | ||
1642 | 1641 | ||
1643 | if (_IOC_DIR(cmd) & _IOC_WRITE) | 1642 | if (_IOC_DIR(cmd) & _IOC_WRITE) |
1644 | if (copy_from_user(&buffer, arg, _IOC_SIZE(cmd))) | 1643 | if (copy_from_user(&buffer, arg, _IOC_SIZE(cmd))) |
diff --git a/drivers/gpu/drm/exynos/exynos_drm_drv.c b/drivers/gpu/drm/exynos/exynos_drm_drv.c index c57466edf45b..e5c4c6c8c967 100644 --- a/drivers/gpu/drm/exynos/exynos_drm_drv.c +++ b/drivers/gpu/drm/exynos/exynos_drm_drv.c | |||
@@ -495,6 +495,12 @@ static struct component_match *exynos_drm_match_add(struct device *dev) | |||
495 | 495 | ||
496 | mutex_lock(&drm_component_lock); | 496 | mutex_lock(&drm_component_lock); |
497 | 497 | ||
498 | /* Do not retry to probe if there is no any kms driver regitered. */ | ||
499 | if (list_empty(&drm_component_list)) { | ||
500 | mutex_unlock(&drm_component_lock); | ||
501 | return ERR_PTR(-ENODEV); | ||
502 | } | ||
503 | |||
498 | list_for_each_entry(cdev, &drm_component_list, list) { | 504 | list_for_each_entry(cdev, &drm_component_list, list) { |
499 | /* | 505 | /* |
500 | * Add components to master only in case that crtc and | 506 | * Add components to master only in case that crtc and |
@@ -585,10 +591,21 @@ static int exynos_drm_platform_probe(struct platform_device *pdev) | |||
585 | goto err_unregister_mixer_drv; | 591 | goto err_unregister_mixer_drv; |
586 | #endif | 592 | #endif |
587 | 593 | ||
594 | match = exynos_drm_match_add(&pdev->dev); | ||
595 | if (IS_ERR(match)) { | ||
596 | ret = PTR_ERR(match); | ||
597 | goto err_unregister_hdmi_drv; | ||
598 | } | ||
599 | |||
600 | ret = component_master_add_with_match(&pdev->dev, &exynos_drm_ops, | ||
601 | match); | ||
602 | if (ret < 0) | ||
603 | goto err_unregister_hdmi_drv; | ||
604 | |||
588 | #ifdef CONFIG_DRM_EXYNOS_G2D | 605 | #ifdef CONFIG_DRM_EXYNOS_G2D |
589 | ret = platform_driver_register(&g2d_driver); | 606 | ret = platform_driver_register(&g2d_driver); |
590 | if (ret < 0) | 607 | if (ret < 0) |
591 | goto err_unregister_hdmi_drv; | 608 | goto err_del_component_master; |
592 | #endif | 609 | #endif |
593 | 610 | ||
594 | #ifdef CONFIG_DRM_EXYNOS_FIMC | 611 | #ifdef CONFIG_DRM_EXYNOS_FIMC |
@@ -619,23 +636,9 @@ static int exynos_drm_platform_probe(struct platform_device *pdev) | |||
619 | goto err_unregister_ipp_drv; | 636 | goto err_unregister_ipp_drv; |
620 | #endif | 637 | #endif |
621 | 638 | ||
622 | match = exynos_drm_match_add(&pdev->dev); | ||
623 | if (IS_ERR(match)) { | ||
624 | ret = PTR_ERR(match); | ||
625 | goto err_unregister_resources; | ||
626 | } | ||
627 | |||
628 | ret = component_master_add_with_match(&pdev->dev, &exynos_drm_ops, | ||
629 | match); | ||
630 | if (ret < 0) | ||
631 | goto err_unregister_resources; | ||
632 | |||
633 | return ret; | 639 | return ret; |
634 | 640 | ||
635 | err_unregister_resources: | ||
636 | |||
637 | #ifdef CONFIG_DRM_EXYNOS_IPP | 641 | #ifdef CONFIG_DRM_EXYNOS_IPP |
638 | exynos_platform_device_ipp_unregister(); | ||
639 | err_unregister_ipp_drv: | 642 | err_unregister_ipp_drv: |
640 | platform_driver_unregister(&ipp_driver); | 643 | platform_driver_unregister(&ipp_driver); |
641 | err_unregister_gsc_drv: | 644 | err_unregister_gsc_drv: |
@@ -658,9 +661,11 @@ err_unregister_g2d_drv: | |||
658 | 661 | ||
659 | #ifdef CONFIG_DRM_EXYNOS_G2D | 662 | #ifdef CONFIG_DRM_EXYNOS_G2D |
660 | platform_driver_unregister(&g2d_driver); | 663 | platform_driver_unregister(&g2d_driver); |
661 | err_unregister_hdmi_drv: | 664 | err_del_component_master: |
662 | #endif | 665 | #endif |
666 | component_master_del(&pdev->dev, &exynos_drm_ops); | ||
663 | 667 | ||
668 | err_unregister_hdmi_drv: | ||
664 | #ifdef CONFIG_DRM_EXYNOS_HDMI | 669 | #ifdef CONFIG_DRM_EXYNOS_HDMI |
665 | platform_driver_unregister(&hdmi_driver); | 670 | platform_driver_unregister(&hdmi_driver); |
666 | err_unregister_mixer_drv: | 671 | err_unregister_mixer_drv: |
@@ -741,6 +746,18 @@ static int exynos_drm_init(void) | |||
741 | { | 746 | { |
742 | int ret; | 747 | int ret; |
743 | 748 | ||
749 | /* | ||
750 | * Register device object only in case of Exynos SoC. | ||
751 | * | ||
752 | * Below codes resolves temporarily infinite loop issue incurred | ||
753 | * by Exynos drm driver when using multi-platform kernel. | ||
754 | * So these codes will be replaced with more generic way later. | ||
755 | */ | ||
756 | if (!of_machine_is_compatible("samsung,exynos3") && | ||
757 | !of_machine_is_compatible("samsung,exynos4") && | ||
758 | !of_machine_is_compatible("samsung,exynos5")) | ||
759 | return -ENODEV; | ||
760 | |||
744 | exynos_drm_pdev = platform_device_register_simple("exynos-drm", -1, | 761 | exynos_drm_pdev = platform_device_register_simple("exynos-drm", -1, |
745 | NULL, 0); | 762 | NULL, 0); |
746 | if (IS_ERR(exynos_drm_pdev)) | 763 | if (IS_ERR(exynos_drm_pdev)) |
diff --git a/drivers/gpu/drm/exynos/exynos_drm_g2d.c b/drivers/gpu/drm/exynos/exynos_drm_g2d.c index df7a77d3eff8..6ff8599f6cbf 100644 --- a/drivers/gpu/drm/exynos/exynos_drm_g2d.c +++ b/drivers/gpu/drm/exynos/exynos_drm_g2d.c | |||
@@ -302,9 +302,12 @@ static void g2d_fini_cmdlist(struct g2d_data *g2d) | |||
302 | struct exynos_drm_subdrv *subdrv = &g2d->subdrv; | 302 | struct exynos_drm_subdrv *subdrv = &g2d->subdrv; |
303 | 303 | ||
304 | kfree(g2d->cmdlist_node); | 304 | kfree(g2d->cmdlist_node); |
305 | dma_free_attrs(subdrv->drm_dev->dev, G2D_CMDLIST_POOL_SIZE, | 305 | |
306 | g2d->cmdlist_pool_virt, | 306 | if (g2d->cmdlist_pool_virt && g2d->cmdlist_pool) { |
307 | g2d->cmdlist_pool, &g2d->cmdlist_dma_attrs); | 307 | dma_free_attrs(subdrv->drm_dev->dev, G2D_CMDLIST_POOL_SIZE, |
308 | g2d->cmdlist_pool_virt, | ||
309 | g2d->cmdlist_pool, &g2d->cmdlist_dma_attrs); | ||
310 | } | ||
308 | } | 311 | } |
309 | 312 | ||
310 | static struct g2d_cmdlist_node *g2d_get_cmdlist(struct g2d_data *g2d) | 313 | static struct g2d_cmdlist_node *g2d_get_cmdlist(struct g2d_data *g2d) |
diff --git a/drivers/gpu/drm/i915/i915_dma.c b/drivers/gpu/drm/i915/i915_dma.c index 1403b01e8216..318ade9bb5af 100644 --- a/drivers/gpu/drm/i915/i915_dma.c +++ b/drivers/gpu/drm/i915/i915_dma.c | |||
@@ -1670,15 +1670,17 @@ int i915_driver_load(struct drm_device *dev, unsigned long flags) | |||
1670 | goto out_regs; | 1670 | goto out_regs; |
1671 | 1671 | ||
1672 | if (drm_core_check_feature(dev, DRIVER_MODESET)) { | 1672 | if (drm_core_check_feature(dev, DRIVER_MODESET)) { |
1673 | ret = i915_kick_out_vgacon(dev_priv); | 1673 | /* WARNING: Apparently we must kick fbdev drivers before vgacon, |
1674 | * otherwise the vga fbdev driver falls over. */ | ||
1675 | ret = i915_kick_out_firmware_fb(dev_priv); | ||
1674 | if (ret) { | 1676 | if (ret) { |
1675 | DRM_ERROR("failed to remove conflicting VGA console\n"); | 1677 | DRM_ERROR("failed to remove conflicting framebuffer drivers\n"); |
1676 | goto out_gtt; | 1678 | goto out_gtt; |
1677 | } | 1679 | } |
1678 | 1680 | ||
1679 | ret = i915_kick_out_firmware_fb(dev_priv); | 1681 | ret = i915_kick_out_vgacon(dev_priv); |
1680 | if (ret) { | 1682 | if (ret) { |
1681 | DRM_ERROR("failed to remove conflicting framebuffer drivers\n"); | 1683 | DRM_ERROR("failed to remove conflicting VGA console\n"); |
1682 | goto out_gtt; | 1684 | goto out_gtt; |
1683 | } | 1685 | } |
1684 | } | 1686 | } |
diff --git a/drivers/gpu/drm/i915/i915_gem_tiling.c b/drivers/gpu/drm/i915/i915_gem_tiling.c index 2cefb597df6d..2b1eaa29ada4 100644 --- a/drivers/gpu/drm/i915/i915_gem_tiling.c +++ b/drivers/gpu/drm/i915/i915_gem_tiling.c | |||
@@ -364,22 +364,9 @@ i915_gem_set_tiling(struct drm_device *dev, void *data, | |||
364 | * has to also include the unfenced register the GPU uses | 364 | * has to also include the unfenced register the GPU uses |
365 | * whilst executing a fenced command for an untiled object. | 365 | * whilst executing a fenced command for an untiled object. |
366 | */ | 366 | */ |
367 | 367 | if (obj->map_and_fenceable && | |
368 | obj->map_and_fenceable = | 368 | !i915_gem_object_fence_ok(obj, args->tiling_mode)) |
369 | !i915_gem_obj_ggtt_bound(obj) || | 369 | ret = i915_gem_object_ggtt_unbind(obj); |
370 | (i915_gem_obj_ggtt_offset(obj) + | ||
371 | obj->base.size <= dev_priv->gtt.mappable_end && | ||
372 | i915_gem_object_fence_ok(obj, args->tiling_mode)); | ||
373 | |||
374 | /* Rebind if we need a change of alignment */ | ||
375 | if (!obj->map_and_fenceable) { | ||
376 | u32 unfenced_align = | ||
377 | i915_gem_get_gtt_alignment(dev, obj->base.size, | ||
378 | args->tiling_mode, | ||
379 | false); | ||
380 | if (i915_gem_obj_ggtt_offset(obj) & (unfenced_align - 1)) | ||
381 | ret = i915_gem_object_ggtt_unbind(obj); | ||
382 | } | ||
383 | 370 | ||
384 | if (ret == 0) { | 371 | if (ret == 0) { |
385 | obj->fence_dirty = | 372 | obj->fence_dirty = |
diff --git a/drivers/gpu/drm/i915/intel_pm.c b/drivers/gpu/drm/i915/intel_pm.c index c27b6140bfd1..ad2fd605f76b 100644 --- a/drivers/gpu/drm/i915/intel_pm.c +++ b/drivers/gpu/drm/i915/intel_pm.c | |||
@@ -5469,11 +5469,6 @@ static void gen6_init_clock_gating(struct drm_device *dev) | |||
5469 | I915_WRITE(_3D_CHICKEN, | 5469 | I915_WRITE(_3D_CHICKEN, |
5470 | _MASKED_BIT_ENABLE(_3D_CHICKEN_HIZ_PLANE_DISABLE_MSAA_4X_SNB)); | 5470 | _MASKED_BIT_ENABLE(_3D_CHICKEN_HIZ_PLANE_DISABLE_MSAA_4X_SNB)); |
5471 | 5471 | ||
5472 | /* WaSetupGtModeTdRowDispatch:snb */ | ||
5473 | if (IS_SNB_GT1(dev)) | ||
5474 | I915_WRITE(GEN6_GT_MODE, | ||
5475 | _MASKED_BIT_ENABLE(GEN6_TD_FOUR_ROW_DISPATCH_DISABLE)); | ||
5476 | |||
5477 | /* WaDisable_RenderCache_OperationalFlush:snb */ | 5472 | /* WaDisable_RenderCache_OperationalFlush:snb */ |
5478 | I915_WRITE(CACHE_MODE_0, _MASKED_BIT_DISABLE(RC_OP_FLUSH_ENABLE)); | 5473 | I915_WRITE(CACHE_MODE_0, _MASKED_BIT_DISABLE(RC_OP_FLUSH_ENABLE)); |
5479 | 5474 | ||
diff --git a/drivers/gpu/drm/nouveau/core/subdev/fb/gk20a.c b/drivers/gpu/drm/nouveau/core/subdev/fb/gk20a.c index a16024a74771..fde42e4d1b56 100644 --- a/drivers/gpu/drm/nouveau/core/subdev/fb/gk20a.c +++ b/drivers/gpu/drm/nouveau/core/subdev/fb/gk20a.c | |||
@@ -27,6 +27,20 @@ struct gk20a_fb_priv { | |||
27 | }; | 27 | }; |
28 | 28 | ||
29 | static int | 29 | static int |
30 | gk20a_fb_init(struct nouveau_object *object) | ||
31 | { | ||
32 | struct gk20a_fb_priv *priv = (void *)object; | ||
33 | int ret; | ||
34 | |||
35 | ret = nouveau_fb_init(&priv->base); | ||
36 | if (ret) | ||
37 | return ret; | ||
38 | |||
39 | nv_mask(priv, 0x100c80, 0x00000001, 0x00000000); /* 128KiB lpg */ | ||
40 | return 0; | ||
41 | } | ||
42 | |||
43 | static int | ||
30 | gk20a_fb_ctor(struct nouveau_object *parent, struct nouveau_object *engine, | 44 | gk20a_fb_ctor(struct nouveau_object *parent, struct nouveau_object *engine, |
31 | struct nouveau_oclass *oclass, void *data, u32 size, | 45 | struct nouveau_oclass *oclass, void *data, u32 size, |
32 | struct nouveau_object **pobject) | 46 | struct nouveau_object **pobject) |
@@ -48,7 +62,7 @@ gk20a_fb_oclass = &(struct nouveau_fb_impl) { | |||
48 | .base.ofuncs = &(struct nouveau_ofuncs) { | 62 | .base.ofuncs = &(struct nouveau_ofuncs) { |
49 | .ctor = gk20a_fb_ctor, | 63 | .ctor = gk20a_fb_ctor, |
50 | .dtor = _nouveau_fb_dtor, | 64 | .dtor = _nouveau_fb_dtor, |
51 | .init = _nouveau_fb_init, | 65 | .init = gk20a_fb_init, |
52 | .fini = _nouveau_fb_fini, | 66 | .fini = _nouveau_fb_fini, |
53 | }, | 67 | }, |
54 | .memtype = nvc0_fb_memtype_valid, | 68 | .memtype = nvc0_fb_memtype_valid, |
diff --git a/drivers/gpu/drm/nouveau/nv50_display.c b/drivers/gpu/drm/nouveau/nv50_display.c index ae873d1a8d46..eb8b36714fa1 100644 --- a/drivers/gpu/drm/nouveau/nv50_display.c +++ b/drivers/gpu/drm/nouveau/nv50_display.c | |||
@@ -791,6 +791,22 @@ nv50_crtc_set_scale(struct nouveau_crtc *nv_crtc, bool update) | |||
791 | } | 791 | } |
792 | 792 | ||
793 | static int | 793 | static int |
794 | nv50_crtc_set_raster_vblank_dmi(struct nouveau_crtc *nv_crtc, u32 usec) | ||
795 | { | ||
796 | struct nv50_mast *mast = nv50_mast(nv_crtc->base.dev); | ||
797 | u32 *push; | ||
798 | |||
799 | push = evo_wait(mast, 8); | ||
800 | if (!push) | ||
801 | return -ENOMEM; | ||
802 | |||
803 | evo_mthd(push, 0x0828 + (nv_crtc->index * 0x400), 1); | ||
804 | evo_data(push, usec); | ||
805 | evo_kick(push, mast); | ||
806 | return 0; | ||
807 | } | ||
808 | |||
809 | static int | ||
794 | nv50_crtc_set_color_vibrance(struct nouveau_crtc *nv_crtc, bool update) | 810 | nv50_crtc_set_color_vibrance(struct nouveau_crtc *nv_crtc, bool update) |
795 | { | 811 | { |
796 | struct nv50_mast *mast = nv50_mast(nv_crtc->base.dev); | 812 | struct nv50_mast *mast = nv50_mast(nv_crtc->base.dev); |
@@ -1104,14 +1120,14 @@ nv50_crtc_mode_set(struct drm_crtc *crtc, struct drm_display_mode *umode, | |||
1104 | evo_mthd(push, 0x0804 + (nv_crtc->index * 0x400), 2); | 1120 | evo_mthd(push, 0x0804 + (nv_crtc->index * 0x400), 2); |
1105 | evo_data(push, 0x00800000 | mode->clock); | 1121 | evo_data(push, 0x00800000 | mode->clock); |
1106 | evo_data(push, (ilace == 2) ? 2 : 0); | 1122 | evo_data(push, (ilace == 2) ? 2 : 0); |
1107 | evo_mthd(push, 0x0810 + (nv_crtc->index * 0x400), 8); | 1123 | evo_mthd(push, 0x0810 + (nv_crtc->index * 0x400), 6); |
1108 | evo_data(push, 0x00000000); | 1124 | evo_data(push, 0x00000000); |
1109 | evo_data(push, (vactive << 16) | hactive); | 1125 | evo_data(push, (vactive << 16) | hactive); |
1110 | evo_data(push, ( vsynce << 16) | hsynce); | 1126 | evo_data(push, ( vsynce << 16) | hsynce); |
1111 | evo_data(push, (vblanke << 16) | hblanke); | 1127 | evo_data(push, (vblanke << 16) | hblanke); |
1112 | evo_data(push, (vblanks << 16) | hblanks); | 1128 | evo_data(push, (vblanks << 16) | hblanks); |
1113 | evo_data(push, (vblan2e << 16) | vblan2s); | 1129 | evo_data(push, (vblan2e << 16) | vblan2s); |
1114 | evo_data(push, vblankus); | 1130 | evo_mthd(push, 0x082c + (nv_crtc->index * 0x400), 1); |
1115 | evo_data(push, 0x00000000); | 1131 | evo_data(push, 0x00000000); |
1116 | evo_mthd(push, 0x0900 + (nv_crtc->index * 0x400), 2); | 1132 | evo_mthd(push, 0x0900 + (nv_crtc->index * 0x400), 2); |
1117 | evo_data(push, 0x00000311); | 1133 | evo_data(push, 0x00000311); |
@@ -1141,6 +1157,11 @@ nv50_crtc_mode_set(struct drm_crtc *crtc, struct drm_display_mode *umode, | |||
1141 | nv_connector = nouveau_crtc_connector_get(nv_crtc); | 1157 | nv_connector = nouveau_crtc_connector_get(nv_crtc); |
1142 | nv50_crtc_set_dither(nv_crtc, false); | 1158 | nv50_crtc_set_dither(nv_crtc, false); |
1143 | nv50_crtc_set_scale(nv_crtc, false); | 1159 | nv50_crtc_set_scale(nv_crtc, false); |
1160 | |||
1161 | /* G94 only accepts this after setting scale */ | ||
1162 | if (nv50_vers(mast) < GF110_DISP_CORE_CHANNEL_DMA) | ||
1163 | nv50_crtc_set_raster_vblank_dmi(nv_crtc, vblankus); | ||
1164 | |||
1144 | nv50_crtc_set_color_vibrance(nv_crtc, false); | 1165 | nv50_crtc_set_color_vibrance(nv_crtc, false); |
1145 | nv50_crtc_set_image(nv_crtc, crtc->primary->fb, x, y, false); | 1166 | nv50_crtc_set_image(nv_crtc, crtc->primary->fb, x, y, false); |
1146 | return 0; | 1167 | return 0; |
diff --git a/drivers/gpu/drm/radeon/atom.c b/drivers/gpu/drm/radeon/atom.c index 15da7ef344a4..ec1593a6a561 100644 --- a/drivers/gpu/drm/radeon/atom.c +++ b/drivers/gpu/drm/radeon/atom.c | |||
@@ -1217,7 +1217,7 @@ free: | |||
1217 | return ret; | 1217 | return ret; |
1218 | } | 1218 | } |
1219 | 1219 | ||
1220 | int atom_execute_table(struct atom_context *ctx, int index, uint32_t * params) | 1220 | int atom_execute_table_scratch_unlocked(struct atom_context *ctx, int index, uint32_t * params) |
1221 | { | 1221 | { |
1222 | int r; | 1222 | int r; |
1223 | 1223 | ||
@@ -1238,6 +1238,15 @@ int atom_execute_table(struct atom_context *ctx, int index, uint32_t * params) | |||
1238 | return r; | 1238 | return r; |
1239 | } | 1239 | } |
1240 | 1240 | ||
1241 | int atom_execute_table(struct atom_context *ctx, int index, uint32_t * params) | ||
1242 | { | ||
1243 | int r; | ||
1244 | mutex_lock(&ctx->scratch_mutex); | ||
1245 | r = atom_execute_table_scratch_unlocked(ctx, index, params); | ||
1246 | mutex_unlock(&ctx->scratch_mutex); | ||
1247 | return r; | ||
1248 | } | ||
1249 | |||
1241 | static int atom_iio_len[] = { 1, 2, 3, 3, 3, 3, 4, 4, 4, 3 }; | 1250 | static int atom_iio_len[] = { 1, 2, 3, 3, 3, 3, 4, 4, 4, 3 }; |
1242 | 1251 | ||
1243 | static void atom_index_iio(struct atom_context *ctx, int base) | 1252 | static void atom_index_iio(struct atom_context *ctx, int base) |
diff --git a/drivers/gpu/drm/radeon/atom.h b/drivers/gpu/drm/radeon/atom.h index feba6b8d36b3..6d014ddb6b78 100644 --- a/drivers/gpu/drm/radeon/atom.h +++ b/drivers/gpu/drm/radeon/atom.h | |||
@@ -125,6 +125,7 @@ struct card_info { | |||
125 | struct atom_context { | 125 | struct atom_context { |
126 | struct card_info *card; | 126 | struct card_info *card; |
127 | struct mutex mutex; | 127 | struct mutex mutex; |
128 | struct mutex scratch_mutex; | ||
128 | void *bios; | 129 | void *bios; |
129 | uint32_t cmd_table, data_table; | 130 | uint32_t cmd_table, data_table; |
130 | uint16_t *iio; | 131 | uint16_t *iio; |
@@ -145,6 +146,7 @@ extern int atom_debug; | |||
145 | 146 | ||
146 | struct atom_context *atom_parse(struct card_info *, void *); | 147 | struct atom_context *atom_parse(struct card_info *, void *); |
147 | int atom_execute_table(struct atom_context *, int, uint32_t *); | 148 | int atom_execute_table(struct atom_context *, int, uint32_t *); |
149 | int atom_execute_table_scratch_unlocked(struct atom_context *, int, uint32_t *); | ||
148 | int atom_asic_init(struct atom_context *); | 150 | int atom_asic_init(struct atom_context *); |
149 | void atom_destroy(struct atom_context *); | 151 | void atom_destroy(struct atom_context *); |
150 | bool atom_parse_data_header(struct atom_context *ctx, int index, uint16_t *size, | 152 | bool atom_parse_data_header(struct atom_context *ctx, int index, uint16_t *size, |
diff --git a/drivers/gpu/drm/radeon/atombios_dp.c b/drivers/gpu/drm/radeon/atombios_dp.c index 95d5d4ab3335..11ba9d21b89b 100644 --- a/drivers/gpu/drm/radeon/atombios_dp.c +++ b/drivers/gpu/drm/radeon/atombios_dp.c | |||
@@ -100,6 +100,7 @@ static int radeon_process_aux_ch(struct radeon_i2c_chan *chan, | |||
100 | memset(&args, 0, sizeof(args)); | 100 | memset(&args, 0, sizeof(args)); |
101 | 101 | ||
102 | mutex_lock(&chan->mutex); | 102 | mutex_lock(&chan->mutex); |
103 | mutex_lock(&rdev->mode_info.atom_context->scratch_mutex); | ||
103 | 104 | ||
104 | base = (unsigned char *)(rdev->mode_info.atom_context->scratch + 1); | 105 | base = (unsigned char *)(rdev->mode_info.atom_context->scratch + 1); |
105 | 106 | ||
@@ -113,7 +114,7 @@ static int radeon_process_aux_ch(struct radeon_i2c_chan *chan, | |||
113 | if (ASIC_IS_DCE4(rdev)) | 114 | if (ASIC_IS_DCE4(rdev)) |
114 | args.v2.ucHPD_ID = chan->rec.hpd; | 115 | args.v2.ucHPD_ID = chan->rec.hpd; |
115 | 116 | ||
116 | atom_execute_table(rdev->mode_info.atom_context, index, (uint32_t *)&args); | 117 | atom_execute_table_scratch_unlocked(rdev->mode_info.atom_context, index, (uint32_t *)&args); |
117 | 118 | ||
118 | *ack = args.v1.ucReplyStatus; | 119 | *ack = args.v1.ucReplyStatus; |
119 | 120 | ||
@@ -147,6 +148,7 @@ static int radeon_process_aux_ch(struct radeon_i2c_chan *chan, | |||
147 | 148 | ||
148 | r = recv_bytes; | 149 | r = recv_bytes; |
149 | done: | 150 | done: |
151 | mutex_unlock(&rdev->mode_info.atom_context->scratch_mutex); | ||
150 | mutex_unlock(&chan->mutex); | 152 | mutex_unlock(&chan->mutex); |
151 | 153 | ||
152 | return r; | 154 | return r; |
diff --git a/drivers/gpu/drm/radeon/atombios_i2c.c b/drivers/gpu/drm/radeon/atombios_i2c.c index 9c570fb15b8c..4157780585a0 100644 --- a/drivers/gpu/drm/radeon/atombios_i2c.c +++ b/drivers/gpu/drm/radeon/atombios_i2c.c | |||
@@ -48,6 +48,7 @@ static int radeon_process_i2c_ch(struct radeon_i2c_chan *chan, | |||
48 | memset(&args, 0, sizeof(args)); | 48 | memset(&args, 0, sizeof(args)); |
49 | 49 | ||
50 | mutex_lock(&chan->mutex); | 50 | mutex_lock(&chan->mutex); |
51 | mutex_lock(&rdev->mode_info.atom_context->scratch_mutex); | ||
51 | 52 | ||
52 | base = (unsigned char *)rdev->mode_info.atom_context->scratch; | 53 | base = (unsigned char *)rdev->mode_info.atom_context->scratch; |
53 | 54 | ||
@@ -82,7 +83,7 @@ static int radeon_process_i2c_ch(struct radeon_i2c_chan *chan, | |||
82 | args.ucSlaveAddr = slave_addr << 1; | 83 | args.ucSlaveAddr = slave_addr << 1; |
83 | args.ucLineNumber = chan->rec.i2c_id; | 84 | args.ucLineNumber = chan->rec.i2c_id; |
84 | 85 | ||
85 | atom_execute_table(rdev->mode_info.atom_context, index, (uint32_t *)&args); | 86 | atom_execute_table_scratch_unlocked(rdev->mode_info.atom_context, index, (uint32_t *)&args); |
86 | 87 | ||
87 | /* error */ | 88 | /* error */ |
88 | if (args.ucStatus != HW_ASSISTED_I2C_STATUS_SUCCESS) { | 89 | if (args.ucStatus != HW_ASSISTED_I2C_STATUS_SUCCESS) { |
@@ -95,6 +96,7 @@ static int radeon_process_i2c_ch(struct radeon_i2c_chan *chan, | |||
95 | radeon_atom_copy_swap(buf, base, num, false); | 96 | radeon_atom_copy_swap(buf, base, num, false); |
96 | 97 | ||
97 | done: | 98 | done: |
99 | mutex_unlock(&rdev->mode_info.atom_context->scratch_mutex); | ||
98 | mutex_unlock(&chan->mutex); | 100 | mutex_unlock(&chan->mutex); |
99 | 101 | ||
100 | return r; | 102 | return r; |
diff --git a/drivers/gpu/drm/radeon/r600_dpm.c b/drivers/gpu/drm/radeon/r600_dpm.c index f6309bd23e01..b5c73df8e202 100644 --- a/drivers/gpu/drm/radeon/r600_dpm.c +++ b/drivers/gpu/drm/radeon/r600_dpm.c | |||
@@ -1256,7 +1256,7 @@ int r600_parse_extended_power_table(struct radeon_device *rdev) | |||
1256 | (mode_info->atom_context->bios + data_offset + | 1256 | (mode_info->atom_context->bios + data_offset + |
1257 | le16_to_cpu(ext_hdr->usPowerTuneTableOffset)); | 1257 | le16_to_cpu(ext_hdr->usPowerTuneTableOffset)); |
1258 | rdev->pm.dpm.dyn_state.cac_tdp_table->maximum_power_delivery_limit = | 1258 | rdev->pm.dpm.dyn_state.cac_tdp_table->maximum_power_delivery_limit = |
1259 | ppt->usMaximumPowerDeliveryLimit; | 1259 | le16_to_cpu(ppt->usMaximumPowerDeliveryLimit); |
1260 | pt = &ppt->power_tune_table; | 1260 | pt = &ppt->power_tune_table; |
1261 | } else { | 1261 | } else { |
1262 | ATOM_PPLIB_POWERTUNE_Table *ppt = (ATOM_PPLIB_POWERTUNE_Table *) | 1262 | ATOM_PPLIB_POWERTUNE_Table *ppt = (ATOM_PPLIB_POWERTUNE_Table *) |
diff --git a/drivers/gpu/drm/radeon/radeon_device.c b/drivers/gpu/drm/radeon/radeon_device.c index ea2676954dde..995a8b1770dd 100644 --- a/drivers/gpu/drm/radeon/radeon_device.c +++ b/drivers/gpu/drm/radeon/radeon_device.c | |||
@@ -952,6 +952,7 @@ int radeon_atombios_init(struct radeon_device *rdev) | |||
952 | } | 952 | } |
953 | 953 | ||
954 | mutex_init(&rdev->mode_info.atom_context->mutex); | 954 | mutex_init(&rdev->mode_info.atom_context->mutex); |
955 | mutex_init(&rdev->mode_info.atom_context->scratch_mutex); | ||
955 | radeon_atom_initialize_bios_scratch_regs(rdev->ddev); | 956 | radeon_atom_initialize_bios_scratch_regs(rdev->ddev); |
956 | atom_allocate_fb_scratch(rdev->mode_info.atom_context); | 957 | atom_allocate_fb_scratch(rdev->mode_info.atom_context); |
957 | return 0; | 958 | return 0; |
diff --git a/drivers/gpu/drm/radeon/radeon_encoders.c b/drivers/gpu/drm/radeon/radeon_encoders.c index 9a19e52cc655..6b670b0bc47b 100644 --- a/drivers/gpu/drm/radeon/radeon_encoders.c +++ b/drivers/gpu/drm/radeon/radeon_encoders.c | |||
@@ -179,6 +179,9 @@ static void radeon_encoder_add_backlight(struct radeon_encoder *radeon_encoder, | |||
179 | (rdev->pdev->subsystem_vendor == 0x1734) && | 179 | (rdev->pdev->subsystem_vendor == 0x1734) && |
180 | (rdev->pdev->subsystem_device == 0x1107)) | 180 | (rdev->pdev->subsystem_device == 0x1107)) |
181 | use_bl = false; | 181 | use_bl = false; |
182 | /* disable native backlight control on older asics */ | ||
183 | else if (rdev->family < CHIP_R600) | ||
184 | use_bl = false; | ||
182 | else | 185 | else |
183 | use_bl = true; | 186 | use_bl = true; |
184 | } | 187 | } |
diff --git a/drivers/gpu/drm/tegra/dc.c b/drivers/gpu/drm/tegra/dc.c index 6553fd238685..054a79f143ae 100644 --- a/drivers/gpu/drm/tegra/dc.c +++ b/drivers/gpu/drm/tegra/dc.c | |||
@@ -736,7 +736,6 @@ static const struct drm_crtc_funcs tegra_crtc_funcs = { | |||
736 | 736 | ||
737 | static void tegra_crtc_disable(struct drm_crtc *crtc) | 737 | static void tegra_crtc_disable(struct drm_crtc *crtc) |
738 | { | 738 | { |
739 | struct tegra_dc *dc = to_tegra_dc(crtc); | ||
740 | struct drm_device *drm = crtc->dev; | 739 | struct drm_device *drm = crtc->dev; |
741 | struct drm_plane *plane; | 740 | struct drm_plane *plane; |
742 | 741 | ||
@@ -752,7 +751,7 @@ static void tegra_crtc_disable(struct drm_crtc *crtc) | |||
752 | } | 751 | } |
753 | } | 752 | } |
754 | 753 | ||
755 | drm_vblank_off(drm, dc->pipe); | 754 | drm_crtc_vblank_off(crtc); |
756 | } | 755 | } |
757 | 756 | ||
758 | static bool tegra_crtc_mode_fixup(struct drm_crtc *crtc, | 757 | static bool tegra_crtc_mode_fixup(struct drm_crtc *crtc, |
@@ -841,8 +840,6 @@ static int tegra_crtc_mode_set(struct drm_crtc *crtc, | |||
841 | u32 value; | 840 | u32 value; |
842 | int err; | 841 | int err; |
843 | 842 | ||
844 | drm_vblank_pre_modeset(crtc->dev, dc->pipe); | ||
845 | |||
846 | err = tegra_crtc_setup_clk(crtc, mode); | 843 | err = tegra_crtc_setup_clk(crtc, mode); |
847 | if (err) { | 844 | if (err) { |
848 | dev_err(dc->dev, "failed to setup clock for CRTC: %d\n", err); | 845 | dev_err(dc->dev, "failed to setup clock for CRTC: %d\n", err); |
@@ -896,6 +893,8 @@ static void tegra_crtc_prepare(struct drm_crtc *crtc) | |||
896 | unsigned int syncpt; | 893 | unsigned int syncpt; |
897 | unsigned long value; | 894 | unsigned long value; |
898 | 895 | ||
896 | drm_crtc_vblank_off(crtc); | ||
897 | |||
899 | /* hardware initialization */ | 898 | /* hardware initialization */ |
900 | reset_control_deassert(dc->rst); | 899 | reset_control_deassert(dc->rst); |
901 | usleep_range(10000, 20000); | 900 | usleep_range(10000, 20000); |
@@ -943,7 +942,7 @@ static void tegra_crtc_commit(struct drm_crtc *crtc) | |||
943 | value = GENERAL_ACT_REQ | WIN_A_ACT_REQ; | 942 | value = GENERAL_ACT_REQ | WIN_A_ACT_REQ; |
944 | tegra_dc_writel(dc, value, DC_CMD_STATE_CONTROL); | 943 | tegra_dc_writel(dc, value, DC_CMD_STATE_CONTROL); |
945 | 944 | ||
946 | drm_vblank_post_modeset(crtc->dev, dc->pipe); | 945 | drm_crtc_vblank_on(crtc); |
947 | } | 946 | } |
948 | 947 | ||
949 | static void tegra_crtc_load_lut(struct drm_crtc *crtc) | 948 | static void tegra_crtc_load_lut(struct drm_crtc *crtc) |
diff --git a/drivers/infiniband/ulp/isert/ib_isert.c b/drivers/infiniband/ulp/isert/ib_isert.c index 3effa931fce2..10641b7816f4 100644 --- a/drivers/infiniband/ulp/isert/ib_isert.c +++ b/drivers/infiniband/ulp/isert/ib_isert.c | |||
@@ -115,9 +115,12 @@ isert_conn_setup_qp(struct isert_conn *isert_conn, struct rdma_cm_id *cma_id, | |||
115 | attr.cap.max_recv_wr = ISERT_QP_MAX_RECV_DTOS; | 115 | attr.cap.max_recv_wr = ISERT_QP_MAX_RECV_DTOS; |
116 | /* | 116 | /* |
117 | * FIXME: Use devattr.max_sge - 2 for max_send_sge as | 117 | * FIXME: Use devattr.max_sge - 2 for max_send_sge as |
118 | * work-around for RDMA_READ.. | 118 | * work-around for RDMA_READs with ConnectX-2. |
119 | * | ||
120 | * Also, still make sure to have at least two SGEs for | ||
121 | * outgoing control PDU responses. | ||
119 | */ | 122 | */ |
120 | attr.cap.max_send_sge = device->dev_attr.max_sge - 2; | 123 | attr.cap.max_send_sge = max(2, device->dev_attr.max_sge - 2); |
121 | isert_conn->max_sge = attr.cap.max_send_sge; | 124 | isert_conn->max_sge = attr.cap.max_send_sge; |
122 | 125 | ||
123 | attr.cap.max_recv_sge = 1; | 126 | attr.cap.max_recv_sge = 1; |
@@ -225,12 +228,16 @@ isert_create_device_ib_res(struct isert_device *device) | |||
225 | struct isert_cq_desc *cq_desc; | 228 | struct isert_cq_desc *cq_desc; |
226 | struct ib_device_attr *dev_attr; | 229 | struct ib_device_attr *dev_attr; |
227 | int ret = 0, i, j; | 230 | int ret = 0, i, j; |
231 | int max_rx_cqe, max_tx_cqe; | ||
228 | 232 | ||
229 | dev_attr = &device->dev_attr; | 233 | dev_attr = &device->dev_attr; |
230 | ret = isert_query_device(ib_dev, dev_attr); | 234 | ret = isert_query_device(ib_dev, dev_attr); |
231 | if (ret) | 235 | if (ret) |
232 | return ret; | 236 | return ret; |
233 | 237 | ||
238 | max_rx_cqe = min(ISER_MAX_RX_CQ_LEN, dev_attr->max_cqe); | ||
239 | max_tx_cqe = min(ISER_MAX_TX_CQ_LEN, dev_attr->max_cqe); | ||
240 | |||
234 | /* asign function handlers */ | 241 | /* asign function handlers */ |
235 | if (dev_attr->device_cap_flags & IB_DEVICE_MEM_MGT_EXTENSIONS && | 242 | if (dev_attr->device_cap_flags & IB_DEVICE_MEM_MGT_EXTENSIONS && |
236 | dev_attr->device_cap_flags & IB_DEVICE_SIGNATURE_HANDOVER) { | 243 | dev_attr->device_cap_flags & IB_DEVICE_SIGNATURE_HANDOVER) { |
@@ -272,7 +279,7 @@ isert_create_device_ib_res(struct isert_device *device) | |||
272 | isert_cq_rx_callback, | 279 | isert_cq_rx_callback, |
273 | isert_cq_event_callback, | 280 | isert_cq_event_callback, |
274 | (void *)&cq_desc[i], | 281 | (void *)&cq_desc[i], |
275 | ISER_MAX_RX_CQ_LEN, i); | 282 | max_rx_cqe, i); |
276 | if (IS_ERR(device->dev_rx_cq[i])) { | 283 | if (IS_ERR(device->dev_rx_cq[i])) { |
277 | ret = PTR_ERR(device->dev_rx_cq[i]); | 284 | ret = PTR_ERR(device->dev_rx_cq[i]); |
278 | device->dev_rx_cq[i] = NULL; | 285 | device->dev_rx_cq[i] = NULL; |
@@ -284,7 +291,7 @@ isert_create_device_ib_res(struct isert_device *device) | |||
284 | isert_cq_tx_callback, | 291 | isert_cq_tx_callback, |
285 | isert_cq_event_callback, | 292 | isert_cq_event_callback, |
286 | (void *)&cq_desc[i], | 293 | (void *)&cq_desc[i], |
287 | ISER_MAX_TX_CQ_LEN, i); | 294 | max_tx_cqe, i); |
288 | if (IS_ERR(device->dev_tx_cq[i])) { | 295 | if (IS_ERR(device->dev_tx_cq[i])) { |
289 | ret = PTR_ERR(device->dev_tx_cq[i]); | 296 | ret = PTR_ERR(device->dev_tx_cq[i]); |
290 | device->dev_tx_cq[i] = NULL; | 297 | device->dev_tx_cq[i] = NULL; |
@@ -803,14 +810,25 @@ wake_up: | |||
803 | complete(&isert_conn->conn_wait); | 810 | complete(&isert_conn->conn_wait); |
804 | } | 811 | } |
805 | 812 | ||
806 | static void | 813 | static int |
807 | isert_disconnected_handler(struct rdma_cm_id *cma_id, bool disconnect) | 814 | isert_disconnected_handler(struct rdma_cm_id *cma_id, bool disconnect) |
808 | { | 815 | { |
809 | struct isert_conn *isert_conn = (struct isert_conn *)cma_id->context; | 816 | struct isert_conn *isert_conn; |
817 | |||
818 | if (!cma_id->qp) { | ||
819 | struct isert_np *isert_np = cma_id->context; | ||
820 | |||
821 | isert_np->np_cm_id = NULL; | ||
822 | return -1; | ||
823 | } | ||
824 | |||
825 | isert_conn = (struct isert_conn *)cma_id->context; | ||
810 | 826 | ||
811 | isert_conn->disconnect = disconnect; | 827 | isert_conn->disconnect = disconnect; |
812 | INIT_WORK(&isert_conn->conn_logout_work, isert_disconnect_work); | 828 | INIT_WORK(&isert_conn->conn_logout_work, isert_disconnect_work); |
813 | schedule_work(&isert_conn->conn_logout_work); | 829 | schedule_work(&isert_conn->conn_logout_work); |
830 | |||
831 | return 0; | ||
814 | } | 832 | } |
815 | 833 | ||
816 | static int | 834 | static int |
@@ -825,6 +843,9 @@ isert_cma_handler(struct rdma_cm_id *cma_id, struct rdma_cm_event *event) | |||
825 | switch (event->event) { | 843 | switch (event->event) { |
826 | case RDMA_CM_EVENT_CONNECT_REQUEST: | 844 | case RDMA_CM_EVENT_CONNECT_REQUEST: |
827 | ret = isert_connect_request(cma_id, event); | 845 | ret = isert_connect_request(cma_id, event); |
846 | if (ret) | ||
847 | pr_err("isert_cma_handler failed RDMA_CM_EVENT: 0x%08x %d\n", | ||
848 | event->event, ret); | ||
828 | break; | 849 | break; |
829 | case RDMA_CM_EVENT_ESTABLISHED: | 850 | case RDMA_CM_EVENT_ESTABLISHED: |
830 | isert_connected_handler(cma_id); | 851 | isert_connected_handler(cma_id); |
@@ -834,7 +855,7 @@ isert_cma_handler(struct rdma_cm_id *cma_id, struct rdma_cm_event *event) | |||
834 | case RDMA_CM_EVENT_DEVICE_REMOVAL: /* FALLTHRU */ | 855 | case RDMA_CM_EVENT_DEVICE_REMOVAL: /* FALLTHRU */ |
835 | disconnect = true; | 856 | disconnect = true; |
836 | case RDMA_CM_EVENT_TIMEWAIT_EXIT: /* FALLTHRU */ | 857 | case RDMA_CM_EVENT_TIMEWAIT_EXIT: /* FALLTHRU */ |
837 | isert_disconnected_handler(cma_id, disconnect); | 858 | ret = isert_disconnected_handler(cma_id, disconnect); |
838 | break; | 859 | break; |
839 | case RDMA_CM_EVENT_CONNECT_ERROR: | 860 | case RDMA_CM_EVENT_CONNECT_ERROR: |
840 | default: | 861 | default: |
@@ -842,12 +863,6 @@ isert_cma_handler(struct rdma_cm_id *cma_id, struct rdma_cm_event *event) | |||
842 | break; | 863 | break; |
843 | } | 864 | } |
844 | 865 | ||
845 | if (ret != 0) { | ||
846 | pr_err("isert_cma_handler failed RDMA_CM_EVENT: 0x%08x %d\n", | ||
847 | event->event, ret); | ||
848 | dump_stack(); | ||
849 | } | ||
850 | |||
851 | return ret; | 866 | return ret; |
852 | } | 867 | } |
853 | 868 | ||
@@ -3190,7 +3205,8 @@ isert_free_np(struct iscsi_np *np) | |||
3190 | { | 3205 | { |
3191 | struct isert_np *isert_np = (struct isert_np *)np->np_context; | 3206 | struct isert_np *isert_np = (struct isert_np *)np->np_context; |
3192 | 3207 | ||
3193 | rdma_destroy_id(isert_np->np_cm_id); | 3208 | if (isert_np->np_cm_id) |
3209 | rdma_destroy_id(isert_np->np_cm_id); | ||
3194 | 3210 | ||
3195 | np->np_context = NULL; | 3211 | np->np_context = NULL; |
3196 | kfree(isert_np); | 3212 | kfree(isert_np); |
diff --git a/drivers/infiniband/ulp/srpt/ib_srpt.c b/drivers/infiniband/ulp/srpt/ib_srpt.c index 7206547c13ce..dc829682701a 100644 --- a/drivers/infiniband/ulp/srpt/ib_srpt.c +++ b/drivers/infiniband/ulp/srpt/ib_srpt.c | |||
@@ -2092,6 +2092,7 @@ static int srpt_create_ch_ib(struct srpt_rdma_ch *ch) | |||
2092 | if (!qp_init) | 2092 | if (!qp_init) |
2093 | goto out; | 2093 | goto out; |
2094 | 2094 | ||
2095 | retry: | ||
2095 | ch->cq = ib_create_cq(sdev->device, srpt_completion, NULL, ch, | 2096 | ch->cq = ib_create_cq(sdev->device, srpt_completion, NULL, ch, |
2096 | ch->rq_size + srp_sq_size, 0); | 2097 | ch->rq_size + srp_sq_size, 0); |
2097 | if (IS_ERR(ch->cq)) { | 2098 | if (IS_ERR(ch->cq)) { |
@@ -2115,6 +2116,13 @@ static int srpt_create_ch_ib(struct srpt_rdma_ch *ch) | |||
2115 | ch->qp = ib_create_qp(sdev->pd, qp_init); | 2116 | ch->qp = ib_create_qp(sdev->pd, qp_init); |
2116 | if (IS_ERR(ch->qp)) { | 2117 | if (IS_ERR(ch->qp)) { |
2117 | ret = PTR_ERR(ch->qp); | 2118 | ret = PTR_ERR(ch->qp); |
2119 | if (ret == -ENOMEM) { | ||
2120 | srp_sq_size /= 2; | ||
2121 | if (srp_sq_size >= MIN_SRPT_SQ_SIZE) { | ||
2122 | ib_destroy_cq(ch->cq); | ||
2123 | goto retry; | ||
2124 | } | ||
2125 | } | ||
2118 | printk(KERN_ERR "failed to create_qp ret= %d\n", ret); | 2126 | printk(KERN_ERR "failed to create_qp ret= %d\n", ret); |
2119 | goto err_destroy_cq; | 2127 | goto err_destroy_cq; |
2120 | } | 2128 | } |
diff --git a/drivers/input/misc/twl4030-pwrbutton.c b/drivers/input/misc/twl4030-pwrbutton.c index fb3b63b2f85c..8400a1a34d87 100644 --- a/drivers/input/misc/twl4030-pwrbutton.c +++ b/drivers/input/misc/twl4030-pwrbutton.c | |||
@@ -85,6 +85,7 @@ static int twl4030_pwrbutton_probe(struct platform_device *pdev) | |||
85 | } | 85 | } |
86 | 86 | ||
87 | platform_set_drvdata(pdev, pwr); | 87 | platform_set_drvdata(pdev, pwr); |
88 | device_init_wakeup(&pdev->dev, true); | ||
88 | 89 | ||
89 | return 0; | 90 | return 0; |
90 | } | 91 | } |
diff --git a/drivers/input/mouse/alps.c b/drivers/input/mouse/alps.c index 2b0ae8cc8e51..d125a019383f 100644 --- a/drivers/input/mouse/alps.c +++ b/drivers/input/mouse/alps.c | |||
@@ -1156,7 +1156,13 @@ static psmouse_ret_t alps_process_byte(struct psmouse *psmouse) | |||
1156 | { | 1156 | { |
1157 | struct alps_data *priv = psmouse->private; | 1157 | struct alps_data *priv = psmouse->private; |
1158 | 1158 | ||
1159 | if ((psmouse->packet[0] & 0xc8) == 0x08) { /* PS/2 packet */ | 1159 | /* |
1160 | * Check if we are dealing with a bare PS/2 packet, presumably from | ||
1161 | * a device connected to the external PS/2 port. Because bare PS/2 | ||
1162 | * protocol does not have enough constant bits to self-synchronize | ||
1163 | * properly we only do this if the device is fully synchronized. | ||
1164 | */ | ||
1165 | if (!psmouse->out_of_sync_cnt && (psmouse->packet[0] & 0xc8) == 0x08) { | ||
1160 | if (psmouse->pktcnt == 3) { | 1166 | if (psmouse->pktcnt == 3) { |
1161 | alps_report_bare_ps2_packet(psmouse, psmouse->packet, | 1167 | alps_report_bare_ps2_packet(psmouse, psmouse->packet, |
1162 | true); | 1168 | true); |
@@ -1180,12 +1186,27 @@ static psmouse_ret_t alps_process_byte(struct psmouse *psmouse) | |||
1180 | } | 1186 | } |
1181 | 1187 | ||
1182 | /* Bytes 2 - pktsize should have 0 in the highest bit */ | 1188 | /* Bytes 2 - pktsize should have 0 in the highest bit */ |
1183 | if ((priv->proto_version < ALPS_PROTO_V5) && | 1189 | if (priv->proto_version < ALPS_PROTO_V5 && |
1184 | psmouse->pktcnt >= 2 && psmouse->pktcnt <= psmouse->pktsize && | 1190 | psmouse->pktcnt >= 2 && psmouse->pktcnt <= psmouse->pktsize && |
1185 | (psmouse->packet[psmouse->pktcnt - 1] & 0x80)) { | 1191 | (psmouse->packet[psmouse->pktcnt - 1] & 0x80)) { |
1186 | psmouse_dbg(psmouse, "refusing packet[%i] = %x\n", | 1192 | psmouse_dbg(psmouse, "refusing packet[%i] = %x\n", |
1187 | psmouse->pktcnt - 1, | 1193 | psmouse->pktcnt - 1, |
1188 | psmouse->packet[psmouse->pktcnt - 1]); | 1194 | psmouse->packet[psmouse->pktcnt - 1]); |
1195 | |||
1196 | if (priv->proto_version == ALPS_PROTO_V3 && | ||
1197 | psmouse->pktcnt == psmouse->pktsize) { | ||
1198 | /* | ||
1199 | * Some Dell boxes, such as Latitude E6440 or E7440 | ||
1200 | * with closed lid, quite often smash last byte of | ||
1201 | * otherwise valid packet with 0xff. Given that the | ||
1202 | * next packet is very likely to be valid let's | ||
1203 | * report PSMOUSE_FULL_PACKET but not process data, | ||
1204 | * rather than reporting PSMOUSE_BAD_DATA and | ||
1205 | * filling the logs. | ||
1206 | */ | ||
1207 | return PSMOUSE_FULL_PACKET; | ||
1208 | } | ||
1209 | |||
1189 | return PSMOUSE_BAD_DATA; | 1210 | return PSMOUSE_BAD_DATA; |
1190 | } | 1211 | } |
1191 | 1212 | ||
@@ -2389,6 +2410,9 @@ int alps_init(struct psmouse *psmouse) | |||
2389 | /* We are having trouble resyncing ALPS touchpads so disable it for now */ | 2410 | /* We are having trouble resyncing ALPS touchpads so disable it for now */ |
2390 | psmouse->resync_time = 0; | 2411 | psmouse->resync_time = 0; |
2391 | 2412 | ||
2413 | /* Allow 2 invalid packets without resetting device */ | ||
2414 | psmouse->resetafter = psmouse->pktsize * 2; | ||
2415 | |||
2392 | return 0; | 2416 | return 0; |
2393 | 2417 | ||
2394 | init_fail: | 2418 | init_fail: |
diff --git a/drivers/input/mouse/elantech.c b/drivers/input/mouse/elantech.c index 06fc6e76ffbe..3fcb6b3cb0bd 100644 --- a/drivers/input/mouse/elantech.c +++ b/drivers/input/mouse/elantech.c | |||
@@ -563,6 +563,7 @@ static void elantech_input_sync_v4(struct psmouse *psmouse) | |||
563 | } else { | 563 | } else { |
564 | input_report_key(dev, BTN_LEFT, packet[0] & 0x01); | 564 | input_report_key(dev, BTN_LEFT, packet[0] & 0x01); |
565 | input_report_key(dev, BTN_RIGHT, packet[0] & 0x02); | 565 | input_report_key(dev, BTN_RIGHT, packet[0] & 0x02); |
566 | input_report_key(dev, BTN_MIDDLE, packet[0] & 0x04); | ||
566 | } | 567 | } |
567 | 568 | ||
568 | input_mt_report_pointer_emulation(dev, true); | 569 | input_mt_report_pointer_emulation(dev, true); |
@@ -792,6 +793,9 @@ static int elantech_packet_check_v4(struct psmouse *psmouse) | |||
792 | unsigned char packet_type = packet[3] & 0x03; | 793 | unsigned char packet_type = packet[3] & 0x03; |
793 | bool sanity_check; | 794 | bool sanity_check; |
794 | 795 | ||
796 | if ((packet[3] & 0x0f) == 0x06) | ||
797 | return PACKET_TRACKPOINT; | ||
798 | |||
795 | /* | 799 | /* |
796 | * Sanity check based on the constant bits of a packet. | 800 | * Sanity check based on the constant bits of a packet. |
797 | * The constant bits change depending on the value of | 801 | * The constant bits change depending on the value of |
@@ -877,10 +881,19 @@ static psmouse_ret_t elantech_process_byte(struct psmouse *psmouse) | |||
877 | 881 | ||
878 | case 4: | 882 | case 4: |
879 | packet_type = elantech_packet_check_v4(psmouse); | 883 | packet_type = elantech_packet_check_v4(psmouse); |
880 | if (packet_type == PACKET_UNKNOWN) | 884 | switch (packet_type) { |
885 | case PACKET_UNKNOWN: | ||
881 | return PSMOUSE_BAD_DATA; | 886 | return PSMOUSE_BAD_DATA; |
882 | 887 | ||
883 | elantech_report_absolute_v4(psmouse, packet_type); | 888 | case PACKET_TRACKPOINT: |
889 | elantech_report_trackpoint(psmouse, packet_type); | ||
890 | break; | ||
891 | |||
892 | default: | ||
893 | elantech_report_absolute_v4(psmouse, packet_type); | ||
894 | break; | ||
895 | } | ||
896 | |||
884 | break; | 897 | break; |
885 | } | 898 | } |
886 | 899 | ||
@@ -1120,6 +1133,22 @@ static void elantech_set_buttonpad_prop(struct psmouse *psmouse) | |||
1120 | } | 1133 | } |
1121 | 1134 | ||
1122 | /* | 1135 | /* |
1136 | * Some hw_version 4 models do have a middle button | ||
1137 | */ | ||
1138 | static const struct dmi_system_id elantech_dmi_has_middle_button[] = { | ||
1139 | #if defined(CONFIG_DMI) && defined(CONFIG_X86) | ||
1140 | { | ||
1141 | /* Fujitsu H730 has a middle button */ | ||
1142 | .matches = { | ||
1143 | DMI_MATCH(DMI_SYS_VENDOR, "FUJITSU"), | ||
1144 | DMI_MATCH(DMI_PRODUCT_NAME, "CELSIUS H730"), | ||
1145 | }, | ||
1146 | }, | ||
1147 | #endif | ||
1148 | { } | ||
1149 | }; | ||
1150 | |||
1151 | /* | ||
1123 | * Set the appropriate event bits for the input subsystem | 1152 | * Set the appropriate event bits for the input subsystem |
1124 | */ | 1153 | */ |
1125 | static int elantech_set_input_params(struct psmouse *psmouse) | 1154 | static int elantech_set_input_params(struct psmouse *psmouse) |
@@ -1138,6 +1167,8 @@ static int elantech_set_input_params(struct psmouse *psmouse) | |||
1138 | __clear_bit(EV_REL, dev->evbit); | 1167 | __clear_bit(EV_REL, dev->evbit); |
1139 | 1168 | ||
1140 | __set_bit(BTN_LEFT, dev->keybit); | 1169 | __set_bit(BTN_LEFT, dev->keybit); |
1170 | if (dmi_check_system(elantech_dmi_has_middle_button)) | ||
1171 | __set_bit(BTN_MIDDLE, dev->keybit); | ||
1141 | __set_bit(BTN_RIGHT, dev->keybit); | 1172 | __set_bit(BTN_RIGHT, dev->keybit); |
1142 | 1173 | ||
1143 | __set_bit(BTN_TOUCH, dev->keybit); | 1174 | __set_bit(BTN_TOUCH, dev->keybit); |
@@ -1299,6 +1330,7 @@ ELANTECH_INT_ATTR(reg_25, 0x25); | |||
1299 | ELANTECH_INT_ATTR(reg_26, 0x26); | 1330 | ELANTECH_INT_ATTR(reg_26, 0x26); |
1300 | ELANTECH_INT_ATTR(debug, 0); | 1331 | ELANTECH_INT_ATTR(debug, 0); |
1301 | ELANTECH_INT_ATTR(paritycheck, 0); | 1332 | ELANTECH_INT_ATTR(paritycheck, 0); |
1333 | ELANTECH_INT_ATTR(crc_enabled, 0); | ||
1302 | 1334 | ||
1303 | static struct attribute *elantech_attrs[] = { | 1335 | static struct attribute *elantech_attrs[] = { |
1304 | &psmouse_attr_reg_07.dattr.attr, | 1336 | &psmouse_attr_reg_07.dattr.attr, |
@@ -1313,6 +1345,7 @@ static struct attribute *elantech_attrs[] = { | |||
1313 | &psmouse_attr_reg_26.dattr.attr, | 1345 | &psmouse_attr_reg_26.dattr.attr, |
1314 | &psmouse_attr_debug.dattr.attr, | 1346 | &psmouse_attr_debug.dattr.attr, |
1315 | &psmouse_attr_paritycheck.dattr.attr, | 1347 | &psmouse_attr_paritycheck.dattr.attr, |
1348 | &psmouse_attr_crc_enabled.dattr.attr, | ||
1316 | NULL | 1349 | NULL |
1317 | }; | 1350 | }; |
1318 | 1351 | ||
@@ -1439,6 +1472,22 @@ static int elantech_reconnect(struct psmouse *psmouse) | |||
1439 | } | 1472 | } |
1440 | 1473 | ||
1441 | /* | 1474 | /* |
1475 | * Some hw_version 4 models do not work with crc_disabled | ||
1476 | */ | ||
1477 | static const struct dmi_system_id elantech_dmi_force_crc_enabled[] = { | ||
1478 | #if defined(CONFIG_DMI) && defined(CONFIG_X86) | ||
1479 | { | ||
1480 | /* Fujitsu H730 does not work with crc_enabled == 0 */ | ||
1481 | .matches = { | ||
1482 | DMI_MATCH(DMI_SYS_VENDOR, "FUJITSU"), | ||
1483 | DMI_MATCH(DMI_PRODUCT_NAME, "CELSIUS H730"), | ||
1484 | }, | ||
1485 | }, | ||
1486 | #endif | ||
1487 | { } | ||
1488 | }; | ||
1489 | |||
1490 | /* | ||
1442 | * Some hw_version 3 models go into error state when we try to set | 1491 | * Some hw_version 3 models go into error state when we try to set |
1443 | * bit 3 and/or bit 1 of r10. | 1492 | * bit 3 and/or bit 1 of r10. |
1444 | */ | 1493 | */ |
@@ -1513,7 +1562,8 @@ static int elantech_set_properties(struct elantech_data *etd) | |||
1513 | * The signatures of v3 and v4 packets change depending on the | 1562 | * The signatures of v3 and v4 packets change depending on the |
1514 | * value of this hardware flag. | 1563 | * value of this hardware flag. |
1515 | */ | 1564 | */ |
1516 | etd->crc_enabled = ((etd->fw_version & 0x4000) == 0x4000); | 1565 | etd->crc_enabled = (etd->fw_version & 0x4000) == 0x4000 || |
1566 | dmi_check_system(elantech_dmi_force_crc_enabled); | ||
1517 | 1567 | ||
1518 | /* Enable real hardware resolution on hw_version 3 ? */ | 1568 | /* Enable real hardware resolution on hw_version 3 ? */ |
1519 | etd->set_hw_resolution = !dmi_check_system(no_hw_res_dmi_table); | 1569 | etd->set_hw_resolution = !dmi_check_system(no_hw_res_dmi_table); |
diff --git a/drivers/input/mouse/synaptics.c b/drivers/input/mouse/synaptics.c index 9031a0a28ea4..2a7a9174c702 100644 --- a/drivers/input/mouse/synaptics.c +++ b/drivers/input/mouse/synaptics.c | |||
@@ -135,8 +135,8 @@ static const struct min_max_quirk min_max_pnpid_table[] = { | |||
135 | 1232, 5710, 1156, 4696 | 135 | 1232, 5710, 1156, 4696 |
136 | }, | 136 | }, |
137 | { | 137 | { |
138 | (const char * const []){"LEN0034", "LEN0036", "LEN2002", | 138 | (const char * const []){"LEN0034", "LEN0036", "LEN0039", |
139 | "LEN2004", NULL}, | 139 | "LEN2002", "LEN2004", NULL}, |
140 | 1024, 5112, 2024, 4832 | 140 | 1024, 5112, 2024, 4832 |
141 | }, | 141 | }, |
142 | { | 142 | { |
@@ -163,6 +163,7 @@ static const char * const topbuttonpad_pnp_ids[] = { | |||
163 | "LEN0036", /* T440 */ | 163 | "LEN0036", /* T440 */ |
164 | "LEN0037", | 164 | "LEN0037", |
165 | "LEN0038", | 165 | "LEN0038", |
166 | "LEN0039", /* T440s */ | ||
166 | "LEN0041", | 167 | "LEN0041", |
167 | "LEN0042", /* Yoga */ | 168 | "LEN0042", /* Yoga */ |
168 | "LEN0045", | 169 | "LEN0045", |
diff --git a/drivers/md/md.c b/drivers/md/md.c index 4dfa15da9cb8..9233c71138f1 100644 --- a/drivers/md/md.c +++ b/drivers/md/md.c | |||
@@ -5121,6 +5121,7 @@ static int md_set_readonly(struct mddev *mddev, struct block_device *bdev) | |||
5121 | printk("md: %s still in use.\n",mdname(mddev)); | 5121 | printk("md: %s still in use.\n",mdname(mddev)); |
5122 | if (did_freeze) { | 5122 | if (did_freeze) { |
5123 | clear_bit(MD_RECOVERY_FROZEN, &mddev->recovery); | 5123 | clear_bit(MD_RECOVERY_FROZEN, &mddev->recovery); |
5124 | set_bit(MD_RECOVERY_NEEDED, &mddev->recovery); | ||
5124 | md_wakeup_thread(mddev->thread); | 5125 | md_wakeup_thread(mddev->thread); |
5125 | } | 5126 | } |
5126 | err = -EBUSY; | 5127 | err = -EBUSY; |
@@ -5135,6 +5136,8 @@ static int md_set_readonly(struct mddev *mddev, struct block_device *bdev) | |||
5135 | mddev->ro = 1; | 5136 | mddev->ro = 1; |
5136 | set_disk_ro(mddev->gendisk, 1); | 5137 | set_disk_ro(mddev->gendisk, 1); |
5137 | clear_bit(MD_RECOVERY_FROZEN, &mddev->recovery); | 5138 | clear_bit(MD_RECOVERY_FROZEN, &mddev->recovery); |
5139 | set_bit(MD_RECOVERY_NEEDED, &mddev->recovery); | ||
5140 | md_wakeup_thread(mddev->thread); | ||
5138 | sysfs_notify_dirent_safe(mddev->sysfs_state); | 5141 | sysfs_notify_dirent_safe(mddev->sysfs_state); |
5139 | err = 0; | 5142 | err = 0; |
5140 | } | 5143 | } |
@@ -5178,6 +5181,7 @@ static int do_md_stop(struct mddev *mddev, int mode, | |||
5178 | mutex_unlock(&mddev->open_mutex); | 5181 | mutex_unlock(&mddev->open_mutex); |
5179 | if (did_freeze) { | 5182 | if (did_freeze) { |
5180 | clear_bit(MD_RECOVERY_FROZEN, &mddev->recovery); | 5183 | clear_bit(MD_RECOVERY_FROZEN, &mddev->recovery); |
5184 | set_bit(MD_RECOVERY_NEEDED, &mddev->recovery); | ||
5181 | md_wakeup_thread(mddev->thread); | 5185 | md_wakeup_thread(mddev->thread); |
5182 | } | 5186 | } |
5183 | return -EBUSY; | 5187 | return -EBUSY; |
diff --git a/drivers/net/bonding/bond_main.c b/drivers/net/bonding/bond_main.c index c1d7da427a3e..184c434ae305 100644 --- a/drivers/net/bonding/bond_main.c +++ b/drivers/net/bonding/bond_main.c | |||
@@ -2470,7 +2470,8 @@ static void bond_loadbalance_arp_mon(struct work_struct *work) | |||
2470 | bond_slave_state_change(bond); | 2470 | bond_slave_state_change(bond); |
2471 | if (BOND_MODE(bond) == BOND_MODE_XOR) | 2471 | if (BOND_MODE(bond) == BOND_MODE_XOR) |
2472 | bond_update_slave_arr(bond, NULL); | 2472 | bond_update_slave_arr(bond, NULL); |
2473 | } else if (do_failover) { | 2473 | } |
2474 | if (do_failover) { | ||
2474 | block_netpoll_tx(); | 2475 | block_netpoll_tx(); |
2475 | bond_select_active_slave(bond); | 2476 | bond_select_active_slave(bond); |
2476 | unblock_netpoll_tx(); | 2477 | unblock_netpoll_tx(); |
diff --git a/drivers/net/can/dev.c b/drivers/net/can/dev.c index 02492d241e4c..2cfe5012e4e5 100644 --- a/drivers/net/can/dev.c +++ b/drivers/net/can/dev.c | |||
@@ -110,7 +110,7 @@ static int can_calc_bittiming(struct net_device *dev, struct can_bittiming *bt, | |||
110 | long rate; | 110 | long rate; |
111 | u64 v64; | 111 | u64 v64; |
112 | 112 | ||
113 | /* Use CIA recommended sample points */ | 113 | /* Use CiA recommended sample points */ |
114 | if (bt->sample_point) { | 114 | if (bt->sample_point) { |
115 | sampl_pt = bt->sample_point; | 115 | sampl_pt = bt->sample_point; |
116 | } else { | 116 | } else { |
@@ -382,7 +382,7 @@ void can_free_echo_skb(struct net_device *dev, unsigned int idx) | |||
382 | BUG_ON(idx >= priv->echo_skb_max); | 382 | BUG_ON(idx >= priv->echo_skb_max); |
383 | 383 | ||
384 | if (priv->echo_skb[idx]) { | 384 | if (priv->echo_skb[idx]) { |
385 | kfree_skb(priv->echo_skb[idx]); | 385 | dev_kfree_skb_any(priv->echo_skb[idx]); |
386 | priv->echo_skb[idx] = NULL; | 386 | priv->echo_skb[idx] = NULL; |
387 | } | 387 | } |
388 | } | 388 | } |
diff --git a/drivers/net/can/m_can/Kconfig b/drivers/net/can/m_can/Kconfig index fca5482c09ac..04f20dd39007 100644 --- a/drivers/net/can/m_can/Kconfig +++ b/drivers/net/can/m_can/Kconfig | |||
@@ -1,4 +1,5 @@ | |||
1 | config CAN_M_CAN | 1 | config CAN_M_CAN |
2 | depends on HAS_IOMEM | ||
2 | tristate "Bosch M_CAN devices" | 3 | tristate "Bosch M_CAN devices" |
3 | ---help--- | 4 | ---help--- |
4 | Say Y here if you want to support for Bosch M_CAN controller. | 5 | Say Y here if you want to support for Bosch M_CAN controller. |
diff --git a/drivers/net/can/m_can/m_can.c b/drivers/net/can/m_can/m_can.c index 10d571eaed85..d7bc462aafdc 100644 --- a/drivers/net/can/m_can/m_can.c +++ b/drivers/net/can/m_can/m_can.c | |||
@@ -105,14 +105,36 @@ enum m_can_mram_cfg { | |||
105 | MRAM_CFG_NUM, | 105 | MRAM_CFG_NUM, |
106 | }; | 106 | }; |
107 | 107 | ||
108 | /* Fast Bit Timing & Prescaler Register (FBTP) */ | ||
109 | #define FBTR_FBRP_MASK 0x1f | ||
110 | #define FBTR_FBRP_SHIFT 16 | ||
111 | #define FBTR_FTSEG1_SHIFT 8 | ||
112 | #define FBTR_FTSEG1_MASK (0xf << FBTR_FTSEG1_SHIFT) | ||
113 | #define FBTR_FTSEG2_SHIFT 4 | ||
114 | #define FBTR_FTSEG2_MASK (0x7 << FBTR_FTSEG2_SHIFT) | ||
115 | #define FBTR_FSJW_SHIFT 0 | ||
116 | #define FBTR_FSJW_MASK 0x3 | ||
117 | |||
108 | /* Test Register (TEST) */ | 118 | /* Test Register (TEST) */ |
109 | #define TEST_LBCK BIT(4) | 119 | #define TEST_LBCK BIT(4) |
110 | 120 | ||
111 | /* CC Control Register(CCCR) */ | 121 | /* CC Control Register(CCCR) */ |
112 | #define CCCR_TEST BIT(7) | 122 | #define CCCR_TEST BIT(7) |
113 | #define CCCR_MON BIT(5) | 123 | #define CCCR_CMR_MASK 0x3 |
114 | #define CCCR_CCE BIT(1) | 124 | #define CCCR_CMR_SHIFT 10 |
115 | #define CCCR_INIT BIT(0) | 125 | #define CCCR_CMR_CANFD 0x1 |
126 | #define CCCR_CMR_CANFD_BRS 0x2 | ||
127 | #define CCCR_CMR_CAN 0x3 | ||
128 | #define CCCR_CME_MASK 0x3 | ||
129 | #define CCCR_CME_SHIFT 8 | ||
130 | #define CCCR_CME_CAN 0 | ||
131 | #define CCCR_CME_CANFD 0x1 | ||
132 | #define CCCR_CME_CANFD_BRS 0x2 | ||
133 | #define CCCR_TEST BIT(7) | ||
134 | #define CCCR_MON BIT(5) | ||
135 | #define CCCR_CCE BIT(1) | ||
136 | #define CCCR_INIT BIT(0) | ||
137 | #define CCCR_CANFD 0x10 | ||
116 | 138 | ||
117 | /* Bit Timing & Prescaler Register (BTP) */ | 139 | /* Bit Timing & Prescaler Register (BTP) */ |
118 | #define BTR_BRP_MASK 0x3ff | 140 | #define BTR_BRP_MASK 0x3ff |
@@ -204,6 +226,7 @@ enum m_can_mram_cfg { | |||
204 | 226 | ||
205 | /* Rx Buffer / FIFO Element Size Configuration (RXESC) */ | 227 | /* Rx Buffer / FIFO Element Size Configuration (RXESC) */ |
206 | #define M_CAN_RXESC_8BYTES 0x0 | 228 | #define M_CAN_RXESC_8BYTES 0x0 |
229 | #define M_CAN_RXESC_64BYTES 0x777 | ||
207 | 230 | ||
208 | /* Tx Buffer Configuration(TXBC) */ | 231 | /* Tx Buffer Configuration(TXBC) */ |
209 | #define TXBC_NDTB_OFF 16 | 232 | #define TXBC_NDTB_OFF 16 |
@@ -211,6 +234,7 @@ enum m_can_mram_cfg { | |||
211 | 234 | ||
212 | /* Tx Buffer Element Size Configuration(TXESC) */ | 235 | /* Tx Buffer Element Size Configuration(TXESC) */ |
213 | #define TXESC_TBDS_8BYTES 0x0 | 236 | #define TXESC_TBDS_8BYTES 0x0 |
237 | #define TXESC_TBDS_64BYTES 0x7 | ||
214 | 238 | ||
215 | /* Tx Event FIFO Con.guration (TXEFC) */ | 239 | /* Tx Event FIFO Con.guration (TXEFC) */ |
216 | #define TXEFC_EFS_OFF 16 | 240 | #define TXEFC_EFS_OFF 16 |
@@ -219,11 +243,11 @@ enum m_can_mram_cfg { | |||
219 | /* Message RAM Configuration (in bytes) */ | 243 | /* Message RAM Configuration (in bytes) */ |
220 | #define SIDF_ELEMENT_SIZE 4 | 244 | #define SIDF_ELEMENT_SIZE 4 |
221 | #define XIDF_ELEMENT_SIZE 8 | 245 | #define XIDF_ELEMENT_SIZE 8 |
222 | #define RXF0_ELEMENT_SIZE 16 | 246 | #define RXF0_ELEMENT_SIZE 72 |
223 | #define RXF1_ELEMENT_SIZE 16 | 247 | #define RXF1_ELEMENT_SIZE 72 |
224 | #define RXB_ELEMENT_SIZE 16 | 248 | #define RXB_ELEMENT_SIZE 16 |
225 | #define TXE_ELEMENT_SIZE 8 | 249 | #define TXE_ELEMENT_SIZE 8 |
226 | #define TXB_ELEMENT_SIZE 16 | 250 | #define TXB_ELEMENT_SIZE 72 |
227 | 251 | ||
228 | /* Message RAM Elements */ | 252 | /* Message RAM Elements */ |
229 | #define M_CAN_FIFO_ID 0x0 | 253 | #define M_CAN_FIFO_ID 0x0 |
@@ -231,11 +255,17 @@ enum m_can_mram_cfg { | |||
231 | #define M_CAN_FIFO_DATA(n) (0x8 + ((n) << 2)) | 255 | #define M_CAN_FIFO_DATA(n) (0x8 + ((n) << 2)) |
232 | 256 | ||
233 | /* Rx Buffer Element */ | 257 | /* Rx Buffer Element */ |
258 | /* R0 */ | ||
234 | #define RX_BUF_ESI BIT(31) | 259 | #define RX_BUF_ESI BIT(31) |
235 | #define RX_BUF_XTD BIT(30) | 260 | #define RX_BUF_XTD BIT(30) |
236 | #define RX_BUF_RTR BIT(29) | 261 | #define RX_BUF_RTR BIT(29) |
262 | /* R1 */ | ||
263 | #define RX_BUF_ANMF BIT(31) | ||
264 | #define RX_BUF_EDL BIT(21) | ||
265 | #define RX_BUF_BRS BIT(20) | ||
237 | 266 | ||
238 | /* Tx Buffer Element */ | 267 | /* Tx Buffer Element */ |
268 | /* R0 */ | ||
239 | #define TX_BUF_XTD BIT(30) | 269 | #define TX_BUF_XTD BIT(30) |
240 | #define TX_BUF_RTR BIT(29) | 270 | #define TX_BUF_RTR BIT(29) |
241 | 271 | ||
@@ -296,6 +326,7 @@ static inline void m_can_config_endisable(const struct m_can_priv *priv, | |||
296 | if (enable) { | 326 | if (enable) { |
297 | /* enable m_can configuration */ | 327 | /* enable m_can configuration */ |
298 | m_can_write(priv, M_CAN_CCCR, cccr | CCCR_INIT); | 328 | m_can_write(priv, M_CAN_CCCR, cccr | CCCR_INIT); |
329 | udelay(5); | ||
299 | /* CCCR.CCE can only be set/reset while CCCR.INIT = '1' */ | 330 | /* CCCR.CCE can only be set/reset while CCCR.INIT = '1' */ |
300 | m_can_write(priv, M_CAN_CCCR, cccr | CCCR_INIT | CCCR_CCE); | 331 | m_can_write(priv, M_CAN_CCCR, cccr | CCCR_INIT | CCCR_CCE); |
301 | } else { | 332 | } else { |
@@ -326,41 +357,67 @@ static inline void m_can_disable_all_interrupts(const struct m_can_priv *priv) | |||
326 | m_can_write(priv, M_CAN_ILE, 0x0); | 357 | m_can_write(priv, M_CAN_ILE, 0x0); |
327 | } | 358 | } |
328 | 359 | ||
329 | static void m_can_read_fifo(const struct net_device *dev, struct can_frame *cf, | 360 | static void m_can_read_fifo(struct net_device *dev, u32 rxfs) |
330 | u32 rxfs) | ||
331 | { | 361 | { |
362 | struct net_device_stats *stats = &dev->stats; | ||
332 | struct m_can_priv *priv = netdev_priv(dev); | 363 | struct m_can_priv *priv = netdev_priv(dev); |
333 | u32 id, fgi; | 364 | struct canfd_frame *cf; |
365 | struct sk_buff *skb; | ||
366 | u32 id, fgi, dlc; | ||
367 | int i; | ||
334 | 368 | ||
335 | /* calculate the fifo get index for where to read data */ | 369 | /* calculate the fifo get index for where to read data */ |
336 | fgi = (rxfs & RXFS_FGI_MASK) >> RXFS_FGI_OFF; | 370 | fgi = (rxfs & RXFS_FGI_MASK) >> RXFS_FGI_OFF; |
371 | dlc = m_can_fifo_read(priv, fgi, M_CAN_FIFO_DLC); | ||
372 | if (dlc & RX_BUF_EDL) | ||
373 | skb = alloc_canfd_skb(dev, &cf); | ||
374 | else | ||
375 | skb = alloc_can_skb(dev, (struct can_frame **)&cf); | ||
376 | if (!skb) { | ||
377 | stats->rx_dropped++; | ||
378 | return; | ||
379 | } | ||
380 | |||
381 | if (dlc & RX_BUF_EDL) | ||
382 | cf->len = can_dlc2len((dlc >> 16) & 0x0F); | ||
383 | else | ||
384 | cf->len = get_can_dlc((dlc >> 16) & 0x0F); | ||
385 | |||
337 | id = m_can_fifo_read(priv, fgi, M_CAN_FIFO_ID); | 386 | id = m_can_fifo_read(priv, fgi, M_CAN_FIFO_ID); |
338 | if (id & RX_BUF_XTD) | 387 | if (id & RX_BUF_XTD) |
339 | cf->can_id = (id & CAN_EFF_MASK) | CAN_EFF_FLAG; | 388 | cf->can_id = (id & CAN_EFF_MASK) | CAN_EFF_FLAG; |
340 | else | 389 | else |
341 | cf->can_id = (id >> 18) & CAN_SFF_MASK; | 390 | cf->can_id = (id >> 18) & CAN_SFF_MASK; |
342 | 391 | ||
343 | if (id & RX_BUF_RTR) { | 392 | if (id & RX_BUF_ESI) { |
393 | cf->flags |= CANFD_ESI; | ||
394 | netdev_dbg(dev, "ESI Error\n"); | ||
395 | } | ||
396 | |||
397 | if (!(dlc & RX_BUF_EDL) && (id & RX_BUF_RTR)) { | ||
344 | cf->can_id |= CAN_RTR_FLAG; | 398 | cf->can_id |= CAN_RTR_FLAG; |
345 | } else { | 399 | } else { |
346 | id = m_can_fifo_read(priv, fgi, M_CAN_FIFO_DLC); | 400 | if (dlc & RX_BUF_BRS) |
347 | cf->can_dlc = get_can_dlc((id >> 16) & 0x0F); | 401 | cf->flags |= CANFD_BRS; |
348 | *(u32 *)(cf->data + 0) = m_can_fifo_read(priv, fgi, | 402 | |
349 | M_CAN_FIFO_DATA(0)); | 403 | for (i = 0; i < cf->len; i += 4) |
350 | *(u32 *)(cf->data + 4) = m_can_fifo_read(priv, fgi, | 404 | *(u32 *)(cf->data + i) = |
351 | M_CAN_FIFO_DATA(1)); | 405 | m_can_fifo_read(priv, fgi, |
406 | M_CAN_FIFO_DATA(i / 4)); | ||
352 | } | 407 | } |
353 | 408 | ||
354 | /* acknowledge rx fifo 0 */ | 409 | /* acknowledge rx fifo 0 */ |
355 | m_can_write(priv, M_CAN_RXF0A, fgi); | 410 | m_can_write(priv, M_CAN_RXF0A, fgi); |
411 | |||
412 | stats->rx_packets++; | ||
413 | stats->rx_bytes += cf->len; | ||
414 | |||
415 | netif_receive_skb(skb); | ||
356 | } | 416 | } |
357 | 417 | ||
358 | static int m_can_do_rx_poll(struct net_device *dev, int quota) | 418 | static int m_can_do_rx_poll(struct net_device *dev, int quota) |
359 | { | 419 | { |
360 | struct m_can_priv *priv = netdev_priv(dev); | 420 | struct m_can_priv *priv = netdev_priv(dev); |
361 | struct net_device_stats *stats = &dev->stats; | ||
362 | struct sk_buff *skb; | ||
363 | struct can_frame *frame; | ||
364 | u32 pkts = 0; | 421 | u32 pkts = 0; |
365 | u32 rxfs; | 422 | u32 rxfs; |
366 | 423 | ||
@@ -374,18 +431,7 @@ static int m_can_do_rx_poll(struct net_device *dev, int quota) | |||
374 | if (rxfs & RXFS_RFL) | 431 | if (rxfs & RXFS_RFL) |
375 | netdev_warn(dev, "Rx FIFO 0 Message Lost\n"); | 432 | netdev_warn(dev, "Rx FIFO 0 Message Lost\n"); |
376 | 433 | ||
377 | skb = alloc_can_skb(dev, &frame); | 434 | m_can_read_fifo(dev, rxfs); |
378 | if (!skb) { | ||
379 | stats->rx_dropped++; | ||
380 | return pkts; | ||
381 | } | ||
382 | |||
383 | m_can_read_fifo(dev, frame, rxfs); | ||
384 | |||
385 | stats->rx_packets++; | ||
386 | stats->rx_bytes += frame->can_dlc; | ||
387 | |||
388 | netif_receive_skb(skb); | ||
389 | 435 | ||
390 | quota--; | 436 | quota--; |
391 | pkts++; | 437 | pkts++; |
@@ -481,11 +527,23 @@ static int m_can_handle_lec_err(struct net_device *dev, | |||
481 | return 1; | 527 | return 1; |
482 | } | 528 | } |
483 | 529 | ||
530 | static int __m_can_get_berr_counter(const struct net_device *dev, | ||
531 | struct can_berr_counter *bec) | ||
532 | { | ||
533 | struct m_can_priv *priv = netdev_priv(dev); | ||
534 | unsigned int ecr; | ||
535 | |||
536 | ecr = m_can_read(priv, M_CAN_ECR); | ||
537 | bec->rxerr = (ecr & ECR_REC_MASK) >> ECR_REC_SHIFT; | ||
538 | bec->txerr = ecr & ECR_TEC_MASK; | ||
539 | |||
540 | return 0; | ||
541 | } | ||
542 | |||
484 | static int m_can_get_berr_counter(const struct net_device *dev, | 543 | static int m_can_get_berr_counter(const struct net_device *dev, |
485 | struct can_berr_counter *bec) | 544 | struct can_berr_counter *bec) |
486 | { | 545 | { |
487 | struct m_can_priv *priv = netdev_priv(dev); | 546 | struct m_can_priv *priv = netdev_priv(dev); |
488 | unsigned int ecr; | ||
489 | int err; | 547 | int err; |
490 | 548 | ||
491 | err = clk_prepare_enable(priv->hclk); | 549 | err = clk_prepare_enable(priv->hclk); |
@@ -498,9 +556,7 @@ static int m_can_get_berr_counter(const struct net_device *dev, | |||
498 | return err; | 556 | return err; |
499 | } | 557 | } |
500 | 558 | ||
501 | ecr = m_can_read(priv, M_CAN_ECR); | 559 | __m_can_get_berr_counter(dev, bec); |
502 | bec->rxerr = (ecr & ECR_REC_MASK) >> ECR_REC_SHIFT; | ||
503 | bec->txerr = ecr & ECR_TEC_MASK; | ||
504 | 560 | ||
505 | clk_disable_unprepare(priv->cclk); | 561 | clk_disable_unprepare(priv->cclk); |
506 | clk_disable_unprepare(priv->hclk); | 562 | clk_disable_unprepare(priv->hclk); |
@@ -544,7 +600,7 @@ static int m_can_handle_state_change(struct net_device *dev, | |||
544 | if (unlikely(!skb)) | 600 | if (unlikely(!skb)) |
545 | return 0; | 601 | return 0; |
546 | 602 | ||
547 | m_can_get_berr_counter(dev, &bec); | 603 | __m_can_get_berr_counter(dev, &bec); |
548 | 604 | ||
549 | switch (new_state) { | 605 | switch (new_state) { |
550 | case CAN_STATE_ERROR_ACTIVE: | 606 | case CAN_STATE_ERROR_ACTIVE: |
@@ -596,14 +652,14 @@ static int m_can_handle_state_errors(struct net_device *dev, u32 psr) | |||
596 | 652 | ||
597 | if ((psr & PSR_EP) && | 653 | if ((psr & PSR_EP) && |
598 | (priv->can.state != CAN_STATE_ERROR_PASSIVE)) { | 654 | (priv->can.state != CAN_STATE_ERROR_PASSIVE)) { |
599 | netdev_dbg(dev, "entered error warning state\n"); | 655 | netdev_dbg(dev, "entered error passive state\n"); |
600 | work_done += m_can_handle_state_change(dev, | 656 | work_done += m_can_handle_state_change(dev, |
601 | CAN_STATE_ERROR_PASSIVE); | 657 | CAN_STATE_ERROR_PASSIVE); |
602 | } | 658 | } |
603 | 659 | ||
604 | if ((psr & PSR_BO) && | 660 | if ((psr & PSR_BO) && |
605 | (priv->can.state != CAN_STATE_BUS_OFF)) { | 661 | (priv->can.state != CAN_STATE_BUS_OFF)) { |
606 | netdev_dbg(dev, "entered error warning state\n"); | 662 | netdev_dbg(dev, "entered error bus off state\n"); |
607 | work_done += m_can_handle_state_change(dev, | 663 | work_done += m_can_handle_state_change(dev, |
608 | CAN_STATE_BUS_OFF); | 664 | CAN_STATE_BUS_OFF); |
609 | } | 665 | } |
@@ -615,7 +671,7 @@ static void m_can_handle_other_err(struct net_device *dev, u32 irqstatus) | |||
615 | { | 671 | { |
616 | if (irqstatus & IR_WDI) | 672 | if (irqstatus & IR_WDI) |
617 | netdev_err(dev, "Message RAM Watchdog event due to missing READY\n"); | 673 | netdev_err(dev, "Message RAM Watchdog event due to missing READY\n"); |
618 | if (irqstatus & IR_BEU) | 674 | if (irqstatus & IR_ELO) |
619 | netdev_err(dev, "Error Logging Overflow\n"); | 675 | netdev_err(dev, "Error Logging Overflow\n"); |
620 | if (irqstatus & IR_BEU) | 676 | if (irqstatus & IR_BEU) |
621 | netdev_err(dev, "Bit Error Uncorrected\n"); | 677 | netdev_err(dev, "Bit Error Uncorrected\n"); |
@@ -733,10 +789,23 @@ static const struct can_bittiming_const m_can_bittiming_const = { | |||
733 | .brp_inc = 1, | 789 | .brp_inc = 1, |
734 | }; | 790 | }; |
735 | 791 | ||
792 | static const struct can_bittiming_const m_can_data_bittiming_const = { | ||
793 | .name = KBUILD_MODNAME, | ||
794 | .tseg1_min = 2, /* Time segment 1 = prop_seg + phase_seg1 */ | ||
795 | .tseg1_max = 16, | ||
796 | .tseg2_min = 1, /* Time segment 2 = phase_seg2 */ | ||
797 | .tseg2_max = 8, | ||
798 | .sjw_max = 4, | ||
799 | .brp_min = 1, | ||
800 | .brp_max = 32, | ||
801 | .brp_inc = 1, | ||
802 | }; | ||
803 | |||
736 | static int m_can_set_bittiming(struct net_device *dev) | 804 | static int m_can_set_bittiming(struct net_device *dev) |
737 | { | 805 | { |
738 | struct m_can_priv *priv = netdev_priv(dev); | 806 | struct m_can_priv *priv = netdev_priv(dev); |
739 | const struct can_bittiming *bt = &priv->can.bittiming; | 807 | const struct can_bittiming *bt = &priv->can.bittiming; |
808 | const struct can_bittiming *dbt = &priv->can.data_bittiming; | ||
740 | u16 brp, sjw, tseg1, tseg2; | 809 | u16 brp, sjw, tseg1, tseg2; |
741 | u32 reg_btp; | 810 | u32 reg_btp; |
742 | 811 | ||
@@ -747,7 +816,17 @@ static int m_can_set_bittiming(struct net_device *dev) | |||
747 | reg_btp = (brp << BTR_BRP_SHIFT) | (sjw << BTR_SJW_SHIFT) | | 816 | reg_btp = (brp << BTR_BRP_SHIFT) | (sjw << BTR_SJW_SHIFT) | |
748 | (tseg1 << BTR_TSEG1_SHIFT) | (tseg2 << BTR_TSEG2_SHIFT); | 817 | (tseg1 << BTR_TSEG1_SHIFT) | (tseg2 << BTR_TSEG2_SHIFT); |
749 | m_can_write(priv, M_CAN_BTP, reg_btp); | 818 | m_can_write(priv, M_CAN_BTP, reg_btp); |
750 | netdev_dbg(dev, "setting BTP 0x%x\n", reg_btp); | 819 | |
820 | if (priv->can.ctrlmode & CAN_CTRLMODE_FD) { | ||
821 | brp = dbt->brp - 1; | ||
822 | sjw = dbt->sjw - 1; | ||
823 | tseg1 = dbt->prop_seg + dbt->phase_seg1 - 1; | ||
824 | tseg2 = dbt->phase_seg2 - 1; | ||
825 | reg_btp = (brp << FBTR_FBRP_SHIFT) | (sjw << FBTR_FSJW_SHIFT) | | ||
826 | (tseg1 << FBTR_FTSEG1_SHIFT) | | ||
827 | (tseg2 << FBTR_FTSEG2_SHIFT); | ||
828 | m_can_write(priv, M_CAN_FBTP, reg_btp); | ||
829 | } | ||
751 | 830 | ||
752 | return 0; | 831 | return 0; |
753 | } | 832 | } |
@@ -767,8 +846,8 @@ static void m_can_chip_config(struct net_device *dev) | |||
767 | 846 | ||
768 | m_can_config_endisable(priv, true); | 847 | m_can_config_endisable(priv, true); |
769 | 848 | ||
770 | /* RX Buffer/FIFO Element Size 8 bytes data field */ | 849 | /* RX Buffer/FIFO Element Size 64 bytes data field */ |
771 | m_can_write(priv, M_CAN_RXESC, M_CAN_RXESC_8BYTES); | 850 | m_can_write(priv, M_CAN_RXESC, M_CAN_RXESC_64BYTES); |
772 | 851 | ||
773 | /* Accept Non-matching Frames Into FIFO 0 */ | 852 | /* Accept Non-matching Frames Into FIFO 0 */ |
774 | m_can_write(priv, M_CAN_GFC, 0x0); | 853 | m_can_write(priv, M_CAN_GFC, 0x0); |
@@ -777,8 +856,8 @@ static void m_can_chip_config(struct net_device *dev) | |||
777 | m_can_write(priv, M_CAN_TXBC, (1 << TXBC_NDTB_OFF) | | 856 | m_can_write(priv, M_CAN_TXBC, (1 << TXBC_NDTB_OFF) | |
778 | priv->mcfg[MRAM_TXB].off); | 857 | priv->mcfg[MRAM_TXB].off); |
779 | 858 | ||
780 | /* only support 8 bytes firstly */ | 859 | /* support 64 bytes payload */ |
781 | m_can_write(priv, M_CAN_TXESC, TXESC_TBDS_8BYTES); | 860 | m_can_write(priv, M_CAN_TXESC, TXESC_TBDS_64BYTES); |
782 | 861 | ||
783 | m_can_write(priv, M_CAN_TXEFC, (1 << TXEFC_EFS_OFF) | | 862 | m_can_write(priv, M_CAN_TXEFC, (1 << TXEFC_EFS_OFF) | |
784 | priv->mcfg[MRAM_TXE].off); | 863 | priv->mcfg[MRAM_TXE].off); |
@@ -793,7 +872,8 @@ static void m_can_chip_config(struct net_device *dev) | |||
793 | RXFC_FWM_1 | priv->mcfg[MRAM_RXF1].off); | 872 | RXFC_FWM_1 | priv->mcfg[MRAM_RXF1].off); |
794 | 873 | ||
795 | cccr = m_can_read(priv, M_CAN_CCCR); | 874 | cccr = m_can_read(priv, M_CAN_CCCR); |
796 | cccr &= ~(CCCR_TEST | CCCR_MON); | 875 | cccr &= ~(CCCR_TEST | CCCR_MON | (CCCR_CMR_MASK << CCCR_CMR_SHIFT) | |
876 | (CCCR_CME_MASK << CCCR_CME_SHIFT)); | ||
797 | test = m_can_read(priv, M_CAN_TEST); | 877 | test = m_can_read(priv, M_CAN_TEST); |
798 | test &= ~TEST_LBCK; | 878 | test &= ~TEST_LBCK; |
799 | 879 | ||
@@ -805,6 +885,9 @@ static void m_can_chip_config(struct net_device *dev) | |||
805 | test |= TEST_LBCK; | 885 | test |= TEST_LBCK; |
806 | } | 886 | } |
807 | 887 | ||
888 | if (priv->can.ctrlmode & CAN_CTRLMODE_FD) | ||
889 | cccr |= CCCR_CME_CANFD_BRS << CCCR_CME_SHIFT; | ||
890 | |||
808 | m_can_write(priv, M_CAN_CCCR, cccr); | 891 | m_can_write(priv, M_CAN_CCCR, cccr); |
809 | m_can_write(priv, M_CAN_TEST, test); | 892 | m_can_write(priv, M_CAN_TEST, test); |
810 | 893 | ||
@@ -869,11 +952,13 @@ static struct net_device *alloc_m_can_dev(void) | |||
869 | 952 | ||
870 | priv->dev = dev; | 953 | priv->dev = dev; |
871 | priv->can.bittiming_const = &m_can_bittiming_const; | 954 | priv->can.bittiming_const = &m_can_bittiming_const; |
955 | priv->can.data_bittiming_const = &m_can_data_bittiming_const; | ||
872 | priv->can.do_set_mode = m_can_set_mode; | 956 | priv->can.do_set_mode = m_can_set_mode; |
873 | priv->can.do_get_berr_counter = m_can_get_berr_counter; | 957 | priv->can.do_get_berr_counter = m_can_get_berr_counter; |
874 | priv->can.ctrlmode_supported = CAN_CTRLMODE_LOOPBACK | | 958 | priv->can.ctrlmode_supported = CAN_CTRLMODE_LOOPBACK | |
875 | CAN_CTRLMODE_LISTENONLY | | 959 | CAN_CTRLMODE_LISTENONLY | |
876 | CAN_CTRLMODE_BERR_REPORTING; | 960 | CAN_CTRLMODE_BERR_REPORTING | |
961 | CAN_CTRLMODE_FD; | ||
877 | 962 | ||
878 | return dev; | 963 | return dev; |
879 | } | 964 | } |
@@ -956,8 +1041,9 @@ static netdev_tx_t m_can_start_xmit(struct sk_buff *skb, | |||
956 | struct net_device *dev) | 1041 | struct net_device *dev) |
957 | { | 1042 | { |
958 | struct m_can_priv *priv = netdev_priv(dev); | 1043 | struct m_can_priv *priv = netdev_priv(dev); |
959 | struct can_frame *cf = (struct can_frame *)skb->data; | 1044 | struct canfd_frame *cf = (struct canfd_frame *)skb->data; |
960 | u32 id; | 1045 | u32 id, cccr; |
1046 | int i; | ||
961 | 1047 | ||
962 | if (can_dropped_invalid_skb(dev, skb)) | 1048 | if (can_dropped_invalid_skb(dev, skb)) |
963 | return NETDEV_TX_OK; | 1049 | return NETDEV_TX_OK; |
@@ -976,11 +1062,28 @@ static netdev_tx_t m_can_start_xmit(struct sk_buff *skb, | |||
976 | 1062 | ||
977 | /* message ram configuration */ | 1063 | /* message ram configuration */ |
978 | m_can_fifo_write(priv, 0, M_CAN_FIFO_ID, id); | 1064 | m_can_fifo_write(priv, 0, M_CAN_FIFO_ID, id); |
979 | m_can_fifo_write(priv, 0, M_CAN_FIFO_DLC, cf->can_dlc << 16); | 1065 | m_can_fifo_write(priv, 0, M_CAN_FIFO_DLC, can_len2dlc(cf->len) << 16); |
980 | m_can_fifo_write(priv, 0, M_CAN_FIFO_DATA(0), *(u32 *)(cf->data + 0)); | 1066 | |
981 | m_can_fifo_write(priv, 0, M_CAN_FIFO_DATA(1), *(u32 *)(cf->data + 4)); | 1067 | for (i = 0; i < cf->len; i += 4) |
1068 | m_can_fifo_write(priv, 0, M_CAN_FIFO_DATA(i / 4), | ||
1069 | *(u32 *)(cf->data + i)); | ||
1070 | |||
982 | can_put_echo_skb(skb, dev, 0); | 1071 | can_put_echo_skb(skb, dev, 0); |
983 | 1072 | ||
1073 | if (priv->can.ctrlmode & CAN_CTRLMODE_FD) { | ||
1074 | cccr = m_can_read(priv, M_CAN_CCCR); | ||
1075 | cccr &= ~(CCCR_CMR_MASK << CCCR_CMR_SHIFT); | ||
1076 | if (can_is_canfd_skb(skb)) { | ||
1077 | if (cf->flags & CANFD_BRS) | ||
1078 | cccr |= CCCR_CMR_CANFD_BRS << CCCR_CMR_SHIFT; | ||
1079 | else | ||
1080 | cccr |= CCCR_CMR_CANFD << CCCR_CMR_SHIFT; | ||
1081 | } else { | ||
1082 | cccr |= CCCR_CMR_CAN << CCCR_CMR_SHIFT; | ||
1083 | } | ||
1084 | m_can_write(priv, M_CAN_CCCR, cccr); | ||
1085 | } | ||
1086 | |||
984 | /* enable first TX buffer to start transfer */ | 1087 | /* enable first TX buffer to start transfer */ |
985 | m_can_write(priv, M_CAN_TXBTIE, 0x1); | 1088 | m_can_write(priv, M_CAN_TXBTIE, 0x1); |
986 | m_can_write(priv, M_CAN_TXBAR, 0x1); | 1089 | m_can_write(priv, M_CAN_TXBAR, 0x1); |
@@ -992,6 +1095,7 @@ static const struct net_device_ops m_can_netdev_ops = { | |||
992 | .ndo_open = m_can_open, | 1095 | .ndo_open = m_can_open, |
993 | .ndo_stop = m_can_close, | 1096 | .ndo_stop = m_can_close, |
994 | .ndo_start_xmit = m_can_start_xmit, | 1097 | .ndo_start_xmit = m_can_start_xmit, |
1098 | .ndo_change_mtu = can_change_mtu, | ||
995 | }; | 1099 | }; |
996 | 1100 | ||
997 | static int register_m_can_dev(struct net_device *dev) | 1101 | static int register_m_can_dev(struct net_device *dev) |
@@ -1009,7 +1113,7 @@ static int m_can_of_parse_mram(struct platform_device *pdev, | |||
1009 | struct resource *res; | 1113 | struct resource *res; |
1010 | void __iomem *addr; | 1114 | void __iomem *addr; |
1011 | u32 out_val[MRAM_CFG_LEN]; | 1115 | u32 out_val[MRAM_CFG_LEN]; |
1012 | int ret; | 1116 | int i, start, end, ret; |
1013 | 1117 | ||
1014 | /* message ram could be shared */ | 1118 | /* message ram could be shared */ |
1015 | res = platform_get_resource_byname(pdev, IORESOURCE_MEM, "message_ram"); | 1119 | res = platform_get_resource_byname(pdev, IORESOURCE_MEM, "message_ram"); |
@@ -1060,6 +1164,15 @@ static int m_can_of_parse_mram(struct platform_device *pdev, | |||
1060 | priv->mcfg[MRAM_TXE].off, priv->mcfg[MRAM_TXE].num, | 1164 | priv->mcfg[MRAM_TXE].off, priv->mcfg[MRAM_TXE].num, |
1061 | priv->mcfg[MRAM_TXB].off, priv->mcfg[MRAM_TXB].num); | 1165 | priv->mcfg[MRAM_TXB].off, priv->mcfg[MRAM_TXB].num); |
1062 | 1166 | ||
1167 | /* initialize the entire Message RAM in use to avoid possible | ||
1168 | * ECC/parity checksum errors when reading an uninitialized buffer | ||
1169 | */ | ||
1170 | start = priv->mcfg[MRAM_SIDF].off; | ||
1171 | end = priv->mcfg[MRAM_TXB].off + | ||
1172 | priv->mcfg[MRAM_TXB].num * TXB_ELEMENT_SIZE; | ||
1173 | for (i = start; i < end; i += 4) | ||
1174 | writel(0x0, priv->mram_base + i); | ||
1175 | |||
1063 | return 0; | 1176 | return 0; |
1064 | } | 1177 | } |
1065 | 1178 | ||
diff --git a/drivers/net/can/rcar_can.c b/drivers/net/can/rcar_can.c index 1abe133d1594..9718248e55f1 100644 --- a/drivers/net/can/rcar_can.c +++ b/drivers/net/can/rcar_can.c | |||
@@ -628,6 +628,7 @@ static const struct net_device_ops rcar_can_netdev_ops = { | |||
628 | .ndo_open = rcar_can_open, | 628 | .ndo_open = rcar_can_open, |
629 | .ndo_stop = rcar_can_close, | 629 | .ndo_stop = rcar_can_close, |
630 | .ndo_start_xmit = rcar_can_start_xmit, | 630 | .ndo_start_xmit = rcar_can_start_xmit, |
631 | .ndo_change_mtu = can_change_mtu, | ||
631 | }; | 632 | }; |
632 | 633 | ||
633 | static void rcar_can_rx_pkt(struct rcar_can_priv *priv) | 634 | static void rcar_can_rx_pkt(struct rcar_can_priv *priv) |
diff --git a/drivers/net/can/sja1000/kvaser_pci.c b/drivers/net/can/sja1000/kvaser_pci.c index 8ff3424d5147..15c00faeec61 100644 --- a/drivers/net/can/sja1000/kvaser_pci.c +++ b/drivers/net/can/sja1000/kvaser_pci.c | |||
@@ -214,7 +214,7 @@ static int kvaser_pci_add_chan(struct pci_dev *pdev, int channel, | |||
214 | struct net_device *dev; | 214 | struct net_device *dev; |
215 | struct sja1000_priv *priv; | 215 | struct sja1000_priv *priv; |
216 | struct kvaser_pci *board; | 216 | struct kvaser_pci *board; |
217 | int err, init_step; | 217 | int err; |
218 | 218 | ||
219 | dev = alloc_sja1000dev(sizeof(struct kvaser_pci)); | 219 | dev = alloc_sja1000dev(sizeof(struct kvaser_pci)); |
220 | if (dev == NULL) | 220 | if (dev == NULL) |
@@ -235,7 +235,6 @@ static int kvaser_pci_add_chan(struct pci_dev *pdev, int channel, | |||
235 | if (channel == 0) { | 235 | if (channel == 0) { |
236 | board->xilinx_ver = | 236 | board->xilinx_ver = |
237 | ioread8(board->res_addr + XILINX_VERINT) >> 4; | 237 | ioread8(board->res_addr + XILINX_VERINT) >> 4; |
238 | init_step = 2; | ||
239 | 238 | ||
240 | /* Assert PTADR# - we're in passive mode so the other bits are | 239 | /* Assert PTADR# - we're in passive mode so the other bits are |
241 | not important */ | 240 | not important */ |
@@ -264,8 +263,6 @@ static int kvaser_pci_add_chan(struct pci_dev *pdev, int channel, | |||
264 | priv->irq_flags = IRQF_SHARED; | 263 | priv->irq_flags = IRQF_SHARED; |
265 | dev->irq = pdev->irq; | 264 | dev->irq = pdev->irq; |
266 | 265 | ||
267 | init_step = 4; | ||
268 | |||
269 | dev_info(&pdev->dev, "reg_base=%p conf_addr=%p irq=%d\n", | 266 | dev_info(&pdev->dev, "reg_base=%p conf_addr=%p irq=%d\n", |
270 | priv->reg_base, board->conf_addr, dev->irq); | 267 | priv->reg_base, board->conf_addr, dev->irq); |
271 | 268 | ||
diff --git a/drivers/net/can/usb/ems_usb.c b/drivers/net/can/usb/ems_usb.c index 00f2534dde73..29d3f0938eb8 100644 --- a/drivers/net/can/usb/ems_usb.c +++ b/drivers/net/can/usb/ems_usb.c | |||
@@ -434,10 +434,9 @@ static void ems_usb_read_bulk_callback(struct urb *urb) | |||
434 | if (urb->actual_length > CPC_HEADER_SIZE) { | 434 | if (urb->actual_length > CPC_HEADER_SIZE) { |
435 | struct ems_cpc_msg *msg; | 435 | struct ems_cpc_msg *msg; |
436 | u8 *ibuf = urb->transfer_buffer; | 436 | u8 *ibuf = urb->transfer_buffer; |
437 | u8 msg_count, again, start; | 437 | u8 msg_count, start; |
438 | 438 | ||
439 | msg_count = ibuf[0] & ~0x80; | 439 | msg_count = ibuf[0] & ~0x80; |
440 | again = ibuf[0] & 0x80; | ||
441 | 440 | ||
442 | start = CPC_HEADER_SIZE; | 441 | start = CPC_HEADER_SIZE; |
443 | 442 | ||
diff --git a/drivers/net/can/usb/esd_usb2.c b/drivers/net/can/usb/esd_usb2.c index b7c9e8b11460..c063a54ab8dd 100644 --- a/drivers/net/can/usb/esd_usb2.c +++ b/drivers/net/can/usb/esd_usb2.c | |||
@@ -464,7 +464,6 @@ static void esd_usb2_write_bulk_callback(struct urb *urb) | |||
464 | { | 464 | { |
465 | struct esd_tx_urb_context *context = urb->context; | 465 | struct esd_tx_urb_context *context = urb->context; |
466 | struct esd_usb2_net_priv *priv; | 466 | struct esd_usb2_net_priv *priv; |
467 | struct esd_usb2 *dev; | ||
468 | struct net_device *netdev; | 467 | struct net_device *netdev; |
469 | size_t size = sizeof(struct esd_usb2_msg); | 468 | size_t size = sizeof(struct esd_usb2_msg); |
470 | 469 | ||
@@ -472,7 +471,6 @@ static void esd_usb2_write_bulk_callback(struct urb *urb) | |||
472 | 471 | ||
473 | priv = context->priv; | 472 | priv = context->priv; |
474 | netdev = priv->netdev; | 473 | netdev = priv->netdev; |
475 | dev = priv->usb2; | ||
476 | 474 | ||
477 | /* free up our allocated buffer */ | 475 | /* free up our allocated buffer */ |
478 | usb_free_coherent(urb->dev, size, | 476 | usb_free_coherent(urb->dev, size, |
@@ -1143,6 +1141,7 @@ static void esd_usb2_disconnect(struct usb_interface *intf) | |||
1143 | } | 1141 | } |
1144 | } | 1142 | } |
1145 | unlink_all_urbs(dev); | 1143 | unlink_all_urbs(dev); |
1144 | kfree(dev); | ||
1146 | } | 1145 | } |
1147 | } | 1146 | } |
1148 | 1147 | ||
diff --git a/drivers/net/can/usb/gs_usb.c b/drivers/net/can/usb/gs_usb.c index 04b0f84612f0..009acc8641fc 100644 --- a/drivers/net/can/usb/gs_usb.c +++ b/drivers/net/can/usb/gs_usb.c | |||
@@ -718,6 +718,7 @@ static const struct net_device_ops gs_usb_netdev_ops = { | |||
718 | .ndo_open = gs_can_open, | 718 | .ndo_open = gs_can_open, |
719 | .ndo_stop = gs_can_close, | 719 | .ndo_stop = gs_can_close, |
720 | .ndo_start_xmit = gs_can_start_xmit, | 720 | .ndo_start_xmit = gs_can_start_xmit, |
721 | .ndo_change_mtu = can_change_mtu, | ||
721 | }; | 722 | }; |
722 | 723 | ||
723 | static struct gs_can *gs_make_candev(unsigned int channel, struct usb_interface *intf) | 724 | static struct gs_can *gs_make_candev(unsigned int channel, struct usb_interface *intf) |
diff --git a/drivers/net/can/xilinx_can.c b/drivers/net/can/xilinx_can.c index 5e8b5609c067..8a998e3884ce 100644 --- a/drivers/net/can/xilinx_can.c +++ b/drivers/net/can/xilinx_can.c | |||
@@ -300,7 +300,8 @@ static int xcan_set_bittiming(struct net_device *ndev) | |||
300 | static int xcan_chip_start(struct net_device *ndev) | 300 | static int xcan_chip_start(struct net_device *ndev) |
301 | { | 301 | { |
302 | struct xcan_priv *priv = netdev_priv(ndev); | 302 | struct xcan_priv *priv = netdev_priv(ndev); |
303 | u32 err, reg_msr, reg_sr_mask; | 303 | u32 reg_msr, reg_sr_mask; |
304 | int err; | ||
304 | unsigned long timeout; | 305 | unsigned long timeout; |
305 | 306 | ||
306 | /* Check if it is in reset mode */ | 307 | /* Check if it is in reset mode */ |
@@ -961,6 +962,7 @@ static const struct net_device_ops xcan_netdev_ops = { | |||
961 | .ndo_open = xcan_open, | 962 | .ndo_open = xcan_open, |
962 | .ndo_stop = xcan_close, | 963 | .ndo_stop = xcan_close, |
963 | .ndo_start_xmit = xcan_start_xmit, | 964 | .ndo_start_xmit = xcan_start_xmit, |
965 | .ndo_change_mtu = can_change_mtu, | ||
964 | }; | 966 | }; |
965 | 967 | ||
966 | /** | 968 | /** |
diff --git a/drivers/net/ethernet/chelsio/cxgb4/cxgb4_dcb.c b/drivers/net/ethernet/chelsio/cxgb4/cxgb4_dcb.c index cca604994003..4fe33606f372 100644 --- a/drivers/net/ethernet/chelsio/cxgb4/cxgb4_dcb.c +++ b/drivers/net/ethernet/chelsio/cxgb4/cxgb4_dcb.c | |||
@@ -1082,7 +1082,7 @@ static int cxgb4_cee_peer_getpg(struct net_device *dev, struct cee_pg *pg) | |||
1082 | pgid = be32_to_cpu(pcmd.u.dcb.pgid.pgid); | 1082 | pgid = be32_to_cpu(pcmd.u.dcb.pgid.pgid); |
1083 | 1083 | ||
1084 | for (i = 0; i < CXGB4_MAX_PRIORITY; i++) | 1084 | for (i = 0; i < CXGB4_MAX_PRIORITY; i++) |
1085 | pg->prio_pg[i] = (pgid >> (i * 4)) & 0xF; | 1085 | pg->prio_pg[7 - i] = (pgid >> (i * 4)) & 0xF; |
1086 | 1086 | ||
1087 | INIT_PORT_DCB_READ_PEER_CMD(pcmd, pi->port_id); | 1087 | INIT_PORT_DCB_READ_PEER_CMD(pcmd, pi->port_id); |
1088 | pcmd.u.dcb.pgrate.type = FW_PORT_DCB_TYPE_PGRATE; | 1088 | pcmd.u.dcb.pgrate.type = FW_PORT_DCB_TYPE_PGRATE; |
diff --git a/drivers/net/ethernet/emulex/benet/be_main.c b/drivers/net/ethernet/emulex/benet/be_main.c index d02fbc7694ea..9070b98e15c4 100644 --- a/drivers/net/ethernet/emulex/benet/be_main.c +++ b/drivers/net/ethernet/emulex/benet/be_main.c | |||
@@ -4423,6 +4423,11 @@ static void be_del_vxlan_port(struct net_device *netdev, sa_family_t sa_family, | |||
4423 | "Disabled VxLAN offloads for UDP port %d\n", | 4423 | "Disabled VxLAN offloads for UDP port %d\n", |
4424 | be16_to_cpu(port)); | 4424 | be16_to_cpu(port)); |
4425 | } | 4425 | } |
4426 | |||
4427 | static bool be_gso_check(struct sk_buff *skb, struct net_device *dev) | ||
4428 | { | ||
4429 | return vxlan_gso_check(skb); | ||
4430 | } | ||
4426 | #endif | 4431 | #endif |
4427 | 4432 | ||
4428 | static const struct net_device_ops be_netdev_ops = { | 4433 | static const struct net_device_ops be_netdev_ops = { |
@@ -4452,6 +4457,7 @@ static const struct net_device_ops be_netdev_ops = { | |||
4452 | #ifdef CONFIG_BE2NET_VXLAN | 4457 | #ifdef CONFIG_BE2NET_VXLAN |
4453 | .ndo_add_vxlan_port = be_add_vxlan_port, | 4458 | .ndo_add_vxlan_port = be_add_vxlan_port, |
4454 | .ndo_del_vxlan_port = be_del_vxlan_port, | 4459 | .ndo_del_vxlan_port = be_del_vxlan_port, |
4460 | .ndo_gso_check = be_gso_check, | ||
4455 | #endif | 4461 | #endif |
4456 | }; | 4462 | }; |
4457 | 4463 | ||
diff --git a/drivers/net/ethernet/mellanox/mlx4/en_netdev.c b/drivers/net/ethernet/mellanox/mlx4/en_netdev.c index f3df9b350d87..89440cb25ad8 100644 --- a/drivers/net/ethernet/mellanox/mlx4/en_netdev.c +++ b/drivers/net/ethernet/mellanox/mlx4/en_netdev.c | |||
@@ -1693,7 +1693,7 @@ int mlx4_en_start_port(struct net_device *dev) | |||
1693 | mlx4_set_stats_bitmap(mdev->dev, &priv->stats_bitmap); | 1693 | mlx4_set_stats_bitmap(mdev->dev, &priv->stats_bitmap); |
1694 | 1694 | ||
1695 | #ifdef CONFIG_MLX4_EN_VXLAN | 1695 | #ifdef CONFIG_MLX4_EN_VXLAN |
1696 | if (priv->mdev->dev->caps.flags2 & MLX4_DEV_CAP_FLAG2_VXLAN_OFFLOADS) | 1696 | if (priv->mdev->dev->caps.tunnel_offload_mode == MLX4_TUNNEL_OFFLOAD_MODE_VXLAN) |
1697 | vxlan_get_rx_port(dev); | 1697 | vxlan_get_rx_port(dev); |
1698 | #endif | 1698 | #endif |
1699 | priv->port_up = true; | 1699 | priv->port_up = true; |
@@ -2365,6 +2365,11 @@ static void mlx4_en_del_vxlan_port(struct net_device *dev, | |||
2365 | 2365 | ||
2366 | queue_work(priv->mdev->workqueue, &priv->vxlan_del_task); | 2366 | queue_work(priv->mdev->workqueue, &priv->vxlan_del_task); |
2367 | } | 2367 | } |
2368 | |||
2369 | static bool mlx4_en_gso_check(struct sk_buff *skb, struct net_device *dev) | ||
2370 | { | ||
2371 | return vxlan_gso_check(skb); | ||
2372 | } | ||
2368 | #endif | 2373 | #endif |
2369 | 2374 | ||
2370 | static const struct net_device_ops mlx4_netdev_ops = { | 2375 | static const struct net_device_ops mlx4_netdev_ops = { |
@@ -2396,6 +2401,7 @@ static const struct net_device_ops mlx4_netdev_ops = { | |||
2396 | #ifdef CONFIG_MLX4_EN_VXLAN | 2401 | #ifdef CONFIG_MLX4_EN_VXLAN |
2397 | .ndo_add_vxlan_port = mlx4_en_add_vxlan_port, | 2402 | .ndo_add_vxlan_port = mlx4_en_add_vxlan_port, |
2398 | .ndo_del_vxlan_port = mlx4_en_del_vxlan_port, | 2403 | .ndo_del_vxlan_port = mlx4_en_del_vxlan_port, |
2404 | .ndo_gso_check = mlx4_en_gso_check, | ||
2399 | #endif | 2405 | #endif |
2400 | }; | 2406 | }; |
2401 | 2407 | ||
@@ -2426,6 +2432,11 @@ static const struct net_device_ops mlx4_netdev_ops_master = { | |||
2426 | .ndo_rx_flow_steer = mlx4_en_filter_rfs, | 2432 | .ndo_rx_flow_steer = mlx4_en_filter_rfs, |
2427 | #endif | 2433 | #endif |
2428 | .ndo_get_phys_port_id = mlx4_en_get_phys_port_id, | 2434 | .ndo_get_phys_port_id = mlx4_en_get_phys_port_id, |
2435 | #ifdef CONFIG_MLX4_EN_VXLAN | ||
2436 | .ndo_add_vxlan_port = mlx4_en_add_vxlan_port, | ||
2437 | .ndo_del_vxlan_port = mlx4_en_del_vxlan_port, | ||
2438 | .ndo_gso_check = mlx4_en_gso_check, | ||
2439 | #endif | ||
2429 | }; | 2440 | }; |
2430 | 2441 | ||
2431 | int mlx4_en_init_netdev(struct mlx4_en_dev *mdev, int port, | 2442 | int mlx4_en_init_netdev(struct mlx4_en_dev *mdev, int port, |
diff --git a/drivers/net/ethernet/qlogic/qlcnic/qlcnic_main.c b/drivers/net/ethernet/qlogic/qlcnic/qlcnic_main.c index f5e29f7bdae3..a913b3ad2f89 100644 --- a/drivers/net/ethernet/qlogic/qlcnic/qlcnic_main.c +++ b/drivers/net/ethernet/qlogic/qlcnic/qlcnic_main.c | |||
@@ -503,6 +503,11 @@ static void qlcnic_del_vxlan_port(struct net_device *netdev, | |||
503 | 503 | ||
504 | adapter->flags |= QLCNIC_DEL_VXLAN_PORT; | 504 | adapter->flags |= QLCNIC_DEL_VXLAN_PORT; |
505 | } | 505 | } |
506 | |||
507 | static bool qlcnic_gso_check(struct sk_buff *skb, struct net_device *dev) | ||
508 | { | ||
509 | return vxlan_gso_check(skb); | ||
510 | } | ||
506 | #endif | 511 | #endif |
507 | 512 | ||
508 | static const struct net_device_ops qlcnic_netdev_ops = { | 513 | static const struct net_device_ops qlcnic_netdev_ops = { |
@@ -526,6 +531,7 @@ static const struct net_device_ops qlcnic_netdev_ops = { | |||
526 | #ifdef CONFIG_QLCNIC_VXLAN | 531 | #ifdef CONFIG_QLCNIC_VXLAN |
527 | .ndo_add_vxlan_port = qlcnic_add_vxlan_port, | 532 | .ndo_add_vxlan_port = qlcnic_add_vxlan_port, |
528 | .ndo_del_vxlan_port = qlcnic_del_vxlan_port, | 533 | .ndo_del_vxlan_port = qlcnic_del_vxlan_port, |
534 | .ndo_gso_check = qlcnic_gso_check, | ||
529 | #endif | 535 | #endif |
530 | #ifdef CONFIG_NET_POLL_CONTROLLER | 536 | #ifdef CONFIG_NET_POLL_CONTROLLER |
531 | .ndo_poll_controller = qlcnic_poll_controller, | 537 | .ndo_poll_controller = qlcnic_poll_controller, |
diff --git a/drivers/net/ethernet/ti/cpsw.c b/drivers/net/ethernet/ti/cpsw.c index d8794488f80a..c560f9aeb55d 100644 --- a/drivers/net/ethernet/ti/cpsw.c +++ b/drivers/net/ethernet/ti/cpsw.c | |||
@@ -129,9 +129,9 @@ do { \ | |||
129 | #define CPSW_VLAN_AWARE BIT(1) | 129 | #define CPSW_VLAN_AWARE BIT(1) |
130 | #define CPSW_ALE_VLAN_AWARE 1 | 130 | #define CPSW_ALE_VLAN_AWARE 1 |
131 | 131 | ||
132 | #define CPSW_FIFO_NORMAL_MODE (0 << 15) | 132 | #define CPSW_FIFO_NORMAL_MODE (0 << 16) |
133 | #define CPSW_FIFO_DUAL_MAC_MODE (1 << 15) | 133 | #define CPSW_FIFO_DUAL_MAC_MODE (1 << 16) |
134 | #define CPSW_FIFO_RATE_LIMIT_MODE (2 << 15) | 134 | #define CPSW_FIFO_RATE_LIMIT_MODE (2 << 16) |
135 | 135 | ||
136 | #define CPSW_INTPACEEN (0x3f << 16) | 136 | #define CPSW_INTPACEEN (0x3f << 16) |
137 | #define CPSW_INTPRESCALE_MASK (0x7FF << 0) | 137 | #define CPSW_INTPRESCALE_MASK (0x7FF << 0) |
diff --git a/drivers/net/ppp/pptp.c b/drivers/net/ppp/pptp.c index 1aff970be33e..1dc628ffce2b 100644 --- a/drivers/net/ppp/pptp.c +++ b/drivers/net/ppp/pptp.c | |||
@@ -506,7 +506,9 @@ static int pptp_getname(struct socket *sock, struct sockaddr *uaddr, | |||
506 | int len = sizeof(struct sockaddr_pppox); | 506 | int len = sizeof(struct sockaddr_pppox); |
507 | struct sockaddr_pppox sp; | 507 | struct sockaddr_pppox sp; |
508 | 508 | ||
509 | sp.sa_family = AF_PPPOX; | 509 | memset(&sp.sa_addr, 0, sizeof(sp.sa_addr)); |
510 | |||
511 | sp.sa_family = AF_PPPOX; | ||
510 | sp.sa_protocol = PX_PROTO_PPTP; | 512 | sp.sa_protocol = PX_PROTO_PPTP; |
511 | sp.sa_addr.pptp = pppox_sk(sock->sk)->proto.pptp.src_addr; | 513 | sp.sa_addr.pptp = pppox_sk(sock->sk)->proto.pptp.src_addr; |
512 | 514 | ||
diff --git a/drivers/net/usb/qmi_wwan.c b/drivers/net/usb/qmi_wwan.c index 22756db53dca..b8a82b86f909 100644 --- a/drivers/net/usb/qmi_wwan.c +++ b/drivers/net/usb/qmi_wwan.c | |||
@@ -780,6 +780,7 @@ static const struct usb_device_id products[] = { | |||
780 | {QMI_FIXED_INTF(0x413c, 0x81a4, 8)}, /* Dell Wireless 5570e HSPA+ (42Mbps) Mobile Broadband Card */ | 780 | {QMI_FIXED_INTF(0x413c, 0x81a4, 8)}, /* Dell Wireless 5570e HSPA+ (42Mbps) Mobile Broadband Card */ |
781 | {QMI_FIXED_INTF(0x413c, 0x81a8, 8)}, /* Dell Wireless 5808 Gobi(TM) 4G LTE Mobile Broadband Card */ | 781 | {QMI_FIXED_INTF(0x413c, 0x81a8, 8)}, /* Dell Wireless 5808 Gobi(TM) 4G LTE Mobile Broadband Card */ |
782 | {QMI_FIXED_INTF(0x413c, 0x81a9, 8)}, /* Dell Wireless 5808e Gobi(TM) 4G LTE Mobile Broadband Card */ | 782 | {QMI_FIXED_INTF(0x413c, 0x81a9, 8)}, /* Dell Wireless 5808e Gobi(TM) 4G LTE Mobile Broadband Card */ |
783 | {QMI_FIXED_INTF(0x03f0, 0x581d, 4)}, /* HP lt4112 LTE/HSPA+ Gobi 4G Module (Huawei me906e) */ | ||
783 | 784 | ||
784 | /* 4. Gobi 1000 devices */ | 785 | /* 4. Gobi 1000 devices */ |
785 | {QMI_GOBI1K_DEVICE(0x05c6, 0x9212)}, /* Acer Gobi Modem Device */ | 786 | {QMI_GOBI1K_DEVICE(0x05c6, 0x9212)}, /* Acer Gobi Modem Device */ |
diff --git a/drivers/net/virtio_net.c b/drivers/net/virtio_net.c index ec2a8b41ed41..b0bc8ead47de 100644 --- a/drivers/net/virtio_net.c +++ b/drivers/net/virtio_net.c | |||
@@ -1673,6 +1673,40 @@ static const struct attribute_group virtio_net_mrg_rx_group = { | |||
1673 | }; | 1673 | }; |
1674 | #endif | 1674 | #endif |
1675 | 1675 | ||
1676 | static bool virtnet_fail_on_feature(struct virtio_device *vdev, | ||
1677 | unsigned int fbit, | ||
1678 | const char *fname, const char *dname) | ||
1679 | { | ||
1680 | if (!virtio_has_feature(vdev, fbit)) | ||
1681 | return false; | ||
1682 | |||
1683 | dev_err(&vdev->dev, "device advertises feature %s but not %s", | ||
1684 | fname, dname); | ||
1685 | |||
1686 | return true; | ||
1687 | } | ||
1688 | |||
1689 | #define VIRTNET_FAIL_ON(vdev, fbit, dbit) \ | ||
1690 | virtnet_fail_on_feature(vdev, fbit, #fbit, dbit) | ||
1691 | |||
1692 | static bool virtnet_validate_features(struct virtio_device *vdev) | ||
1693 | { | ||
1694 | if (!virtio_has_feature(vdev, VIRTIO_NET_F_CTRL_VQ) && | ||
1695 | (VIRTNET_FAIL_ON(vdev, VIRTIO_NET_F_CTRL_RX, | ||
1696 | "VIRTIO_NET_F_CTRL_VQ") || | ||
1697 | VIRTNET_FAIL_ON(vdev, VIRTIO_NET_F_CTRL_VLAN, | ||
1698 | "VIRTIO_NET_F_CTRL_VQ") || | ||
1699 | VIRTNET_FAIL_ON(vdev, VIRTIO_NET_F_GUEST_ANNOUNCE, | ||
1700 | "VIRTIO_NET_F_CTRL_VQ") || | ||
1701 | VIRTNET_FAIL_ON(vdev, VIRTIO_NET_F_MQ, "VIRTIO_NET_F_CTRL_VQ") || | ||
1702 | VIRTNET_FAIL_ON(vdev, VIRTIO_NET_F_CTRL_MAC_ADDR, | ||
1703 | "VIRTIO_NET_F_CTRL_VQ"))) { | ||
1704 | return false; | ||
1705 | } | ||
1706 | |||
1707 | return true; | ||
1708 | } | ||
1709 | |||
1676 | static int virtnet_probe(struct virtio_device *vdev) | 1710 | static int virtnet_probe(struct virtio_device *vdev) |
1677 | { | 1711 | { |
1678 | int i, err; | 1712 | int i, err; |
@@ -1680,6 +1714,9 @@ static int virtnet_probe(struct virtio_device *vdev) | |||
1680 | struct virtnet_info *vi; | 1714 | struct virtnet_info *vi; |
1681 | u16 max_queue_pairs; | 1715 | u16 max_queue_pairs; |
1682 | 1716 | ||
1717 | if (!virtnet_validate_features(vdev)) | ||
1718 | return -EINVAL; | ||
1719 | |||
1683 | /* Find if host supports multiqueue virtio_net device */ | 1720 | /* Find if host supports multiqueue virtio_net device */ |
1684 | err = virtio_cread_feature(vdev, VIRTIO_NET_F_MQ, | 1721 | err = virtio_cread_feature(vdev, VIRTIO_NET_F_MQ, |
1685 | struct virtio_net_config, | 1722 | struct virtio_net_config, |
diff --git a/drivers/net/vxlan.c b/drivers/net/vxlan.c index 64d45fa3d997..e9f81d463659 100644 --- a/drivers/net/vxlan.c +++ b/drivers/net/vxlan.c | |||
@@ -67,12 +67,6 @@ | |||
67 | 67 | ||
68 | #define VXLAN_FLAGS 0x08000000 /* struct vxlanhdr.vx_flags required value. */ | 68 | #define VXLAN_FLAGS 0x08000000 /* struct vxlanhdr.vx_flags required value. */ |
69 | 69 | ||
70 | /* VXLAN protocol header */ | ||
71 | struct vxlanhdr { | ||
72 | __be32 vx_flags; | ||
73 | __be32 vx_vni; | ||
74 | }; | ||
75 | |||
76 | /* UDP port for VXLAN traffic. | 70 | /* UDP port for VXLAN traffic. |
77 | * The IANA assigned port is 4789, but the Linux default is 8472 | 71 | * The IANA assigned port is 4789, but the Linux default is 8472 |
78 | * for compatibility with early adopters. | 72 | * for compatibility with early adopters. |
diff --git a/drivers/net/wireless/ath/ath9k/main.c b/drivers/net/wireless/ath/ath9k/main.c index 7c63976b5b0c..ebbbfc7a193b 100644 --- a/drivers/net/wireless/ath/ath9k/main.c +++ b/drivers/net/wireless/ath/ath9k/main.c | |||
@@ -996,9 +996,8 @@ void ath9k_calculate_iter_data(struct ath_softc *sc, | |||
996 | struct ath_vif *avp; | 996 | struct ath_vif *avp; |
997 | 997 | ||
998 | /* | 998 | /* |
999 | * Pick the MAC address of the first interface as the new hardware | 999 | * The hardware will use primary station addr together with the |
1000 | * MAC address. The hardware will use it together with the BSSID mask | 1000 | * BSSID mask when matching addresses. |
1001 | * when matching addresses. | ||
1002 | */ | 1001 | */ |
1003 | memset(iter_data, 0, sizeof(*iter_data)); | 1002 | memset(iter_data, 0, sizeof(*iter_data)); |
1004 | memset(&iter_data->mask, 0xff, ETH_ALEN); | 1003 | memset(&iter_data->mask, 0xff, ETH_ALEN); |
@@ -1228,6 +1227,8 @@ static int ath9k_add_interface(struct ieee80211_hw *hw, | |||
1228 | list_add_tail(&avp->list, &avp->chanctx->vifs); | 1227 | list_add_tail(&avp->list, &avp->chanctx->vifs); |
1229 | } | 1228 | } |
1230 | 1229 | ||
1230 | ath9k_calculate_summary_state(sc, avp->chanctx); | ||
1231 | |||
1231 | ath9k_assign_hw_queues(hw, vif); | 1232 | ath9k_assign_hw_queues(hw, vif); |
1232 | 1233 | ||
1233 | an->sc = sc; | 1234 | an->sc = sc; |
@@ -1297,6 +1298,8 @@ static void ath9k_remove_interface(struct ieee80211_hw *hw, | |||
1297 | 1298 | ||
1298 | ath_tx_node_cleanup(sc, &avp->mcast_node); | 1299 | ath_tx_node_cleanup(sc, &avp->mcast_node); |
1299 | 1300 | ||
1301 | ath9k_calculate_summary_state(sc, avp->chanctx); | ||
1302 | |||
1300 | mutex_unlock(&sc->mutex); | 1303 | mutex_unlock(&sc->mutex); |
1301 | } | 1304 | } |
1302 | 1305 | ||
diff --git a/drivers/net/wireless/brcm80211/brcmfmac/of.c b/drivers/net/wireless/brcm80211/brcmfmac/of.c index eb3fce82a223..c824570ddea3 100644 --- a/drivers/net/wireless/brcm80211/brcmfmac/of.c +++ b/drivers/net/wireless/brcm80211/brcmfmac/of.c | |||
@@ -40,8 +40,8 @@ void brcmf_of_probe(struct brcmf_sdio_dev *sdiodev) | |||
40 | return; | 40 | return; |
41 | 41 | ||
42 | irq = irq_of_parse_and_map(np, 0); | 42 | irq = irq_of_parse_and_map(np, 0); |
43 | if (irq < 0) { | 43 | if (!irq) { |
44 | brcmf_err("interrupt could not be mapped: err=%d\n", irq); | 44 | brcmf_err("interrupt could not be mapped\n"); |
45 | devm_kfree(dev, sdiodev->pdata); | 45 | devm_kfree(dev, sdiodev->pdata); |
46 | return; | 46 | return; |
47 | } | 47 | } |
diff --git a/drivers/net/wireless/brcm80211/brcmfmac/pcie.c b/drivers/net/wireless/brcm80211/brcmfmac/pcie.c index b0ae7993e2e8..138691a1365a 100644 --- a/drivers/net/wireless/brcm80211/brcmfmac/pcie.c +++ b/drivers/net/wireless/brcm80211/brcmfmac/pcie.c | |||
@@ -19,10 +19,10 @@ | |||
19 | #include <linux/pci.h> | 19 | #include <linux/pci.h> |
20 | #include <linux/vmalloc.h> | 20 | #include <linux/vmalloc.h> |
21 | #include <linux/delay.h> | 21 | #include <linux/delay.h> |
22 | #include <linux/unaligned/access_ok.h> | ||
23 | #include <linux/interrupt.h> | 22 | #include <linux/interrupt.h> |
24 | #include <linux/bcma/bcma.h> | 23 | #include <linux/bcma/bcma.h> |
25 | #include <linux/sched.h> | 24 | #include <linux/sched.h> |
25 | #include <asm/unaligned.h> | ||
26 | 26 | ||
27 | #include <soc.h> | 27 | #include <soc.h> |
28 | #include <chipcommon.h> | 28 | #include <chipcommon.h> |
diff --git a/drivers/net/wireless/brcm80211/brcmfmac/usb.c b/drivers/net/wireless/brcm80211/brcmfmac/usb.c index 5265aa70b094..4572defc280f 100644 --- a/drivers/net/wireless/brcm80211/brcmfmac/usb.c +++ b/drivers/net/wireless/brcm80211/brcmfmac/usb.c | |||
@@ -738,10 +738,12 @@ static int brcmf_usb_dl_cmd(struct brcmf_usbdev_info *devinfo, u8 cmd, | |||
738 | goto finalize; | 738 | goto finalize; |
739 | } | 739 | } |
740 | 740 | ||
741 | if (!brcmf_usb_ioctl_resp_wait(devinfo)) | 741 | if (!brcmf_usb_ioctl_resp_wait(devinfo)) { |
742 | usb_kill_urb(devinfo->ctl_urb); | ||
742 | ret = -ETIMEDOUT; | 743 | ret = -ETIMEDOUT; |
743 | else | 744 | } else { |
744 | memcpy(buffer, tmpbuf, buflen); | 745 | memcpy(buffer, tmpbuf, buflen); |
746 | } | ||
745 | 747 | ||
746 | finalize: | 748 | finalize: |
747 | kfree(tmpbuf); | 749 | kfree(tmpbuf); |
diff --git a/drivers/of/address.c b/drivers/of/address.c index afdb78299f61..06af494184d6 100644 --- a/drivers/of/address.c +++ b/drivers/of/address.c | |||
@@ -450,6 +450,21 @@ static struct of_bus *of_match_bus(struct device_node *np) | |||
450 | return NULL; | 450 | return NULL; |
451 | } | 451 | } |
452 | 452 | ||
453 | static int of_empty_ranges_quirk(void) | ||
454 | { | ||
455 | if (IS_ENABLED(CONFIG_PPC)) { | ||
456 | /* To save cycles, we cache the result */ | ||
457 | static int quirk_state = -1; | ||
458 | |||
459 | if (quirk_state < 0) | ||
460 | quirk_state = | ||
461 | of_machine_is_compatible("Power Macintosh") || | ||
462 | of_machine_is_compatible("MacRISC"); | ||
463 | return quirk_state; | ||
464 | } | ||
465 | return false; | ||
466 | } | ||
467 | |||
453 | static int of_translate_one(struct device_node *parent, struct of_bus *bus, | 468 | static int of_translate_one(struct device_node *parent, struct of_bus *bus, |
454 | struct of_bus *pbus, __be32 *addr, | 469 | struct of_bus *pbus, __be32 *addr, |
455 | int na, int ns, int pna, const char *rprop) | 470 | int na, int ns, int pna, const char *rprop) |
@@ -475,12 +490,10 @@ static int of_translate_one(struct device_node *parent, struct of_bus *bus, | |||
475 | * This code is only enabled on powerpc. --gcl | 490 | * This code is only enabled on powerpc. --gcl |
476 | */ | 491 | */ |
477 | ranges = of_get_property(parent, rprop, &rlen); | 492 | ranges = of_get_property(parent, rprop, &rlen); |
478 | #if !defined(CONFIG_PPC) | 493 | if (ranges == NULL && !of_empty_ranges_quirk()) { |
479 | if (ranges == NULL) { | ||
480 | pr_err("OF: no ranges; cannot translate\n"); | 494 | pr_err("OF: no ranges; cannot translate\n"); |
481 | return 1; | 495 | return 1; |
482 | } | 496 | } |
483 | #endif /* !defined(CONFIG_PPC) */ | ||
484 | if (ranges == NULL || rlen == 0) { | 497 | if (ranges == NULL || rlen == 0) { |
485 | offset = of_read_number(addr, na); | 498 | offset = of_read_number(addr, na); |
486 | memset(addr, 0, pna * 4); | 499 | memset(addr, 0, pna * 4); |
diff --git a/drivers/of/dynamic.c b/drivers/of/dynamic.c index f297891d8529..d4994177dec2 100644 --- a/drivers/of/dynamic.c +++ b/drivers/of/dynamic.c | |||
@@ -247,7 +247,7 @@ void of_node_release(struct kobject *kobj) | |||
247 | * @allocflags: Allocation flags (typically pass GFP_KERNEL) | 247 | * @allocflags: Allocation flags (typically pass GFP_KERNEL) |
248 | * | 248 | * |
249 | * Copy a property by dynamically allocating the memory of both the | 249 | * Copy a property by dynamically allocating the memory of both the |
250 | * property stucture and the property name & contents. The property's | 250 | * property structure and the property name & contents. The property's |
251 | * flags have the OF_DYNAMIC bit set so that we can differentiate between | 251 | * flags have the OF_DYNAMIC bit set so that we can differentiate between |
252 | * dynamically allocated properties and not. | 252 | * dynamically allocated properties and not. |
253 | * Returns the newly allocated property or NULL on out of memory error. | 253 | * Returns the newly allocated property or NULL on out of memory error. |
diff --git a/drivers/of/fdt.c b/drivers/of/fdt.c index d1ffca8b34ea..30e97bcc4f88 100644 --- a/drivers/of/fdt.c +++ b/drivers/of/fdt.c | |||
@@ -773,7 +773,7 @@ int __init early_init_dt_scan_chosen_serial(void) | |||
773 | if (offset < 0) | 773 | if (offset < 0) |
774 | return -ENODEV; | 774 | return -ENODEV; |
775 | 775 | ||
776 | while (match->compatible) { | 776 | while (match->compatible[0]) { |
777 | unsigned long addr; | 777 | unsigned long addr; |
778 | if (fdt_node_check_compatible(fdt, offset, match->compatible)) { | 778 | if (fdt_node_check_compatible(fdt, offset, match->compatible)) { |
779 | match++; | 779 | match++; |
diff --git a/drivers/of/selftest.c b/drivers/of/selftest.c index 11b873c54a77..e2d79afa9dc6 100644 --- a/drivers/of/selftest.c +++ b/drivers/of/selftest.c | |||
@@ -896,10 +896,14 @@ static void selftest_data_remove(void) | |||
896 | return; | 896 | return; |
897 | } | 897 | } |
898 | 898 | ||
899 | while (last_node_index >= 0) { | 899 | while (last_node_index-- > 0) { |
900 | if (nodes[last_node_index]) { | 900 | if (nodes[last_node_index]) { |
901 | np = of_find_node_by_path(nodes[last_node_index]->full_name); | 901 | np = of_find_node_by_path(nodes[last_node_index]->full_name); |
902 | if (strcmp(np->full_name, "/aliases") != 0) { | 902 | if (np == nodes[last_node_index]) { |
903 | if (of_aliases == np) { | ||
904 | of_node_put(of_aliases); | ||
905 | of_aliases = NULL; | ||
906 | } | ||
903 | detach_node_and_children(np); | 907 | detach_node_and_children(np); |
904 | } else { | 908 | } else { |
905 | for_each_property_of_node(np, prop) { | 909 | for_each_property_of_node(np, prop) { |
@@ -908,7 +912,6 @@ static void selftest_data_remove(void) | |||
908 | } | 912 | } |
909 | } | 913 | } |
910 | } | 914 | } |
911 | last_node_index--; | ||
912 | } | 915 | } |
913 | } | 916 | } |
914 | 917 | ||
@@ -921,6 +924,8 @@ static int __init of_selftest(void) | |||
921 | res = selftest_data_add(); | 924 | res = selftest_data_add(); |
922 | if (res) | 925 | if (res) |
923 | return res; | 926 | return res; |
927 | if (!of_aliases) | ||
928 | of_aliases = of_find_node_by_path("/aliases"); | ||
924 | 929 | ||
925 | np = of_find_node_by_path("/testcase-data/phandle-tests/consumer-a"); | 930 | np = of_find_node_by_path("/testcase-data/phandle-tests/consumer-a"); |
926 | if (!np) { | 931 | if (!np) { |
diff --git a/drivers/pci/access.c b/drivers/pci/access.c index d292d7cb3417..49dd766852ba 100644 --- a/drivers/pci/access.c +++ b/drivers/pci/access.c | |||
@@ -444,7 +444,7 @@ static inline int pcie_cap_version(const struct pci_dev *dev) | |||
444 | return pcie_caps_reg(dev) & PCI_EXP_FLAGS_VERS; | 444 | return pcie_caps_reg(dev) & PCI_EXP_FLAGS_VERS; |
445 | } | 445 | } |
446 | 446 | ||
447 | static inline bool pcie_cap_has_lnkctl(const struct pci_dev *dev) | 447 | bool pcie_cap_has_lnkctl(const struct pci_dev *dev) |
448 | { | 448 | { |
449 | int type = pci_pcie_type(dev); | 449 | int type = pci_pcie_type(dev); |
450 | 450 | ||
diff --git a/drivers/pci/host/pci-xgene.c b/drivers/pci/host/pci-xgene.c index 9ecabfa8c634..2988fe136c1e 100644 --- a/drivers/pci/host/pci-xgene.c +++ b/drivers/pci/host/pci-xgene.c | |||
@@ -631,10 +631,15 @@ static int xgene_pcie_probe_bridge(struct platform_device *pdev) | |||
631 | if (ret) | 631 | if (ret) |
632 | return ret; | 632 | return ret; |
633 | 633 | ||
634 | bus = pci_scan_root_bus(&pdev->dev, 0, &xgene_pcie_ops, port, &res); | 634 | bus = pci_create_root_bus(&pdev->dev, 0, |
635 | &xgene_pcie_ops, port, &res); | ||
635 | if (!bus) | 636 | if (!bus) |
636 | return -ENOMEM; | 637 | return -ENOMEM; |
637 | 638 | ||
639 | pci_scan_child_bus(bus); | ||
640 | pci_assign_unassigned_bus_resources(bus); | ||
641 | pci_bus_add_devices(bus); | ||
642 | |||
638 | platform_set_drvdata(pdev, port); | 643 | platform_set_drvdata(pdev, port); |
639 | return 0; | 644 | return 0; |
640 | } | 645 | } |
diff --git a/drivers/pci/pci.h b/drivers/pci/pci.h index 0601890db22d..4a3902d8e6fe 100644 --- a/drivers/pci/pci.h +++ b/drivers/pci/pci.h | |||
@@ -6,6 +6,8 @@ | |||
6 | 6 | ||
7 | extern const unsigned char pcie_link_speed[]; | 7 | extern const unsigned char pcie_link_speed[]; |
8 | 8 | ||
9 | bool pcie_cap_has_lnkctl(const struct pci_dev *dev); | ||
10 | |||
9 | /* Functions internal to the PCI core code */ | 11 | /* Functions internal to the PCI core code */ |
10 | 12 | ||
11 | int pci_create_sysfs_dev_files(struct pci_dev *pdev); | 13 | int pci_create_sysfs_dev_files(struct pci_dev *pdev); |
diff --git a/drivers/pci/probe.c b/drivers/pci/probe.c index 5ed99309c758..c8ca98c2b480 100644 --- a/drivers/pci/probe.c +++ b/drivers/pci/probe.c | |||
@@ -407,15 +407,16 @@ static void pci_read_bridge_mmio_pref(struct pci_bus *child) | |||
407 | { | 407 | { |
408 | struct pci_dev *dev = child->self; | 408 | struct pci_dev *dev = child->self; |
409 | u16 mem_base_lo, mem_limit_lo; | 409 | u16 mem_base_lo, mem_limit_lo; |
410 | unsigned long base, limit; | 410 | u64 base64, limit64; |
411 | dma_addr_t base, limit; | ||
411 | struct pci_bus_region region; | 412 | struct pci_bus_region region; |
412 | struct resource *res; | 413 | struct resource *res; |
413 | 414 | ||
414 | res = child->resource[2]; | 415 | res = child->resource[2]; |
415 | pci_read_config_word(dev, PCI_PREF_MEMORY_BASE, &mem_base_lo); | 416 | pci_read_config_word(dev, PCI_PREF_MEMORY_BASE, &mem_base_lo); |
416 | pci_read_config_word(dev, PCI_PREF_MEMORY_LIMIT, &mem_limit_lo); | 417 | pci_read_config_word(dev, PCI_PREF_MEMORY_LIMIT, &mem_limit_lo); |
417 | base = ((unsigned long) mem_base_lo & PCI_PREF_RANGE_MASK) << 16; | 418 | base64 = (mem_base_lo & PCI_PREF_RANGE_MASK) << 16; |
418 | limit = ((unsigned long) mem_limit_lo & PCI_PREF_RANGE_MASK) << 16; | 419 | limit64 = (mem_limit_lo & PCI_PREF_RANGE_MASK) << 16; |
419 | 420 | ||
420 | if ((mem_base_lo & PCI_PREF_RANGE_TYPE_MASK) == PCI_PREF_RANGE_TYPE_64) { | 421 | if ((mem_base_lo & PCI_PREF_RANGE_TYPE_MASK) == PCI_PREF_RANGE_TYPE_64) { |
421 | u32 mem_base_hi, mem_limit_hi; | 422 | u32 mem_base_hi, mem_limit_hi; |
@@ -429,17 +430,20 @@ static void pci_read_bridge_mmio_pref(struct pci_bus *child) | |||
429 | * this, just assume they are not being used. | 430 | * this, just assume they are not being used. |
430 | */ | 431 | */ |
431 | if (mem_base_hi <= mem_limit_hi) { | 432 | if (mem_base_hi <= mem_limit_hi) { |
432 | #if BITS_PER_LONG == 64 | 433 | base64 |= (u64) mem_base_hi << 32; |
433 | base |= ((unsigned long) mem_base_hi) << 32; | 434 | limit64 |= (u64) mem_limit_hi << 32; |
434 | limit |= ((unsigned long) mem_limit_hi) << 32; | ||
435 | #else | ||
436 | if (mem_base_hi || mem_limit_hi) { | ||
437 | dev_err(&dev->dev, "can't handle 64-bit address space for bridge\n"); | ||
438 | return; | ||
439 | } | ||
440 | #endif | ||
441 | } | 435 | } |
442 | } | 436 | } |
437 | |||
438 | base = (dma_addr_t) base64; | ||
439 | limit = (dma_addr_t) limit64; | ||
440 | |||
441 | if (base != base64) { | ||
442 | dev_err(&dev->dev, "can't handle bridge window above 4GB (bus address %#010llx)\n", | ||
443 | (unsigned long long) base64); | ||
444 | return; | ||
445 | } | ||
446 | |||
443 | if (base <= limit) { | 447 | if (base <= limit) { |
444 | res->flags = (mem_base_lo & PCI_PREF_RANGE_TYPE_MASK) | | 448 | res->flags = (mem_base_lo & PCI_PREF_RANGE_TYPE_MASK) | |
445 | IORESOURCE_MEM | IORESOURCE_PREFETCH; | 449 | IORESOURCE_MEM | IORESOURCE_PREFETCH; |
@@ -1323,7 +1327,7 @@ static void program_hpp_type2(struct pci_dev *dev, struct hpp_type2 *hpp) | |||
1323 | ~hpp->pci_exp_devctl_and, hpp->pci_exp_devctl_or); | 1327 | ~hpp->pci_exp_devctl_and, hpp->pci_exp_devctl_or); |
1324 | 1328 | ||
1325 | /* Initialize Link Control Register */ | 1329 | /* Initialize Link Control Register */ |
1326 | if (dev->subordinate) | 1330 | if (pcie_cap_has_lnkctl(dev)) |
1327 | pcie_capability_clear_and_set_word(dev, PCI_EXP_LNKCTL, | 1331 | pcie_capability_clear_and_set_word(dev, PCI_EXP_LNKCTL, |
1328 | ~hpp->pci_exp_lnkctl_and, hpp->pci_exp_lnkctl_or); | 1332 | ~hpp->pci_exp_lnkctl_and, hpp->pci_exp_lnkctl_or); |
1329 | 1333 | ||
diff --git a/drivers/platform/x86/Kconfig b/drivers/platform/x86/Kconfig index 4dcfb7116a04..a2eabe6ff9ad 100644 --- a/drivers/platform/x86/Kconfig +++ b/drivers/platform/x86/Kconfig | |||
@@ -202,6 +202,7 @@ config TC1100_WMI | |||
202 | config HP_ACCEL | 202 | config HP_ACCEL |
203 | tristate "HP laptop accelerometer" | 203 | tristate "HP laptop accelerometer" |
204 | depends on INPUT && ACPI | 204 | depends on INPUT && ACPI |
205 | depends on SERIO_I8042 | ||
205 | select SENSORS_LIS3LV02D | 206 | select SENSORS_LIS3LV02D |
206 | select NEW_LEDS | 207 | select NEW_LEDS |
207 | select LEDS_CLASS | 208 | select LEDS_CLASS |
diff --git a/drivers/platform/x86/hp_accel.c b/drivers/platform/x86/hp_accel.c index 13e14ec1d3d7..6bec745b6b92 100644 --- a/drivers/platform/x86/hp_accel.c +++ b/drivers/platform/x86/hp_accel.c | |||
@@ -37,6 +37,8 @@ | |||
37 | #include <linux/leds.h> | 37 | #include <linux/leds.h> |
38 | #include <linux/atomic.h> | 38 | #include <linux/atomic.h> |
39 | #include <linux/acpi.h> | 39 | #include <linux/acpi.h> |
40 | #include <linux/i8042.h> | ||
41 | #include <linux/serio.h> | ||
40 | #include "../../misc/lis3lv02d/lis3lv02d.h" | 42 | #include "../../misc/lis3lv02d/lis3lv02d.h" |
41 | 43 | ||
42 | #define DRIVER_NAME "hp_accel" | 44 | #define DRIVER_NAME "hp_accel" |
@@ -73,6 +75,13 @@ static inline void delayed_sysfs_set(struct led_classdev *led_cdev, | |||
73 | 75 | ||
74 | /* HP-specific accelerometer driver ------------------------------------ */ | 76 | /* HP-specific accelerometer driver ------------------------------------ */ |
75 | 77 | ||
78 | /* e0 25, e0 26, e0 27, e0 28 are scan codes that the accelerometer with acpi id | ||
79 | * HPQ6000 sends through the keyboard bus */ | ||
80 | #define ACCEL_1 0x25 | ||
81 | #define ACCEL_2 0x26 | ||
82 | #define ACCEL_3 0x27 | ||
83 | #define ACCEL_4 0x28 | ||
84 | |||
76 | /* For automatic insertion of the module */ | 85 | /* For automatic insertion of the module */ |
77 | static const struct acpi_device_id lis3lv02d_device_ids[] = { | 86 | static const struct acpi_device_id lis3lv02d_device_ids[] = { |
78 | {"HPQ0004", 0}, /* HP Mobile Data Protection System PNP */ | 87 | {"HPQ0004", 0}, /* HP Mobile Data Protection System PNP */ |
@@ -294,6 +303,35 @@ static void lis3lv02d_enum_resources(struct acpi_device *device) | |||
294 | printk(KERN_DEBUG DRIVER_NAME ": Error getting resources\n"); | 303 | printk(KERN_DEBUG DRIVER_NAME ": Error getting resources\n"); |
295 | } | 304 | } |
296 | 305 | ||
306 | static bool hp_accel_i8042_filter(unsigned char data, unsigned char str, | ||
307 | struct serio *port) | ||
308 | { | ||
309 | static bool extended; | ||
310 | |||
311 | if (str & I8042_STR_AUXDATA) | ||
312 | return false; | ||
313 | |||
314 | if (data == 0xe0) { | ||
315 | extended = true; | ||
316 | return true; | ||
317 | } else if (unlikely(extended)) { | ||
318 | extended = false; | ||
319 | |||
320 | switch (data) { | ||
321 | case ACCEL_1: | ||
322 | case ACCEL_2: | ||
323 | case ACCEL_3: | ||
324 | case ACCEL_4: | ||
325 | return true; | ||
326 | default: | ||
327 | serio_interrupt(port, 0xe0, 0); | ||
328 | return false; | ||
329 | } | ||
330 | } | ||
331 | |||
332 | return false; | ||
333 | } | ||
334 | |||
297 | static int lis3lv02d_add(struct acpi_device *device) | 335 | static int lis3lv02d_add(struct acpi_device *device) |
298 | { | 336 | { |
299 | int ret; | 337 | int ret; |
@@ -326,6 +364,11 @@ static int lis3lv02d_add(struct acpi_device *device) | |||
326 | if (ret) | 364 | if (ret) |
327 | return ret; | 365 | return ret; |
328 | 366 | ||
367 | /* filter to remove HPQ6000 accelerometer data | ||
368 | * from keyboard bus stream */ | ||
369 | if (strstr(dev_name(&device->dev), "HPQ6000")) | ||
370 | i8042_install_filter(hp_accel_i8042_filter); | ||
371 | |||
329 | INIT_WORK(&hpled_led.work, delayed_set_status_worker); | 372 | INIT_WORK(&hpled_led.work, delayed_set_status_worker); |
330 | ret = led_classdev_register(NULL, &hpled_led.led_classdev); | 373 | ret = led_classdev_register(NULL, &hpled_led.led_classdev); |
331 | if (ret) { | 374 | if (ret) { |
@@ -343,6 +386,7 @@ static int lis3lv02d_remove(struct acpi_device *device) | |||
343 | if (!device) | 386 | if (!device) |
344 | return -EINVAL; | 387 | return -EINVAL; |
345 | 388 | ||
389 | i8042_remove_filter(hp_accel_i8042_filter); | ||
346 | lis3lv02d_joystick_disable(&lis3_dev); | 390 | lis3lv02d_joystick_disable(&lis3_dev); |
347 | lis3lv02d_poweroff(&lis3_dev); | 391 | lis3lv02d_poweroff(&lis3_dev); |
348 | 392 | ||
diff --git a/drivers/power/ab8500_fg.c b/drivers/power/ab8500_fg.c index 217da4b2ca86..99a78d365ceb 100644 --- a/drivers/power/ab8500_fg.c +++ b/drivers/power/ab8500_fg.c | |||
@@ -25,6 +25,7 @@ | |||
25 | #include <linux/slab.h> | 25 | #include <linux/slab.h> |
26 | #include <linux/delay.h> | 26 | #include <linux/delay.h> |
27 | #include <linux/time.h> | 27 | #include <linux/time.h> |
28 | #include <linux/time64.h> | ||
28 | #include <linux/of.h> | 29 | #include <linux/of.h> |
29 | #include <linux/completion.h> | 30 | #include <linux/completion.h> |
30 | #include <linux/mfd/core.h> | 31 | #include <linux/mfd/core.h> |
@@ -108,7 +109,7 @@ enum ab8500_fg_calibration_state { | |||
108 | struct ab8500_fg_avg_cap { | 109 | struct ab8500_fg_avg_cap { |
109 | int avg; | 110 | int avg; |
110 | int samples[NBR_AVG_SAMPLES]; | 111 | int samples[NBR_AVG_SAMPLES]; |
111 | __kernel_time_t time_stamps[NBR_AVG_SAMPLES]; | 112 | time64_t time_stamps[NBR_AVG_SAMPLES]; |
112 | int pos; | 113 | int pos; |
113 | int nbr_samples; | 114 | int nbr_samples; |
114 | int sum; | 115 | int sum; |
@@ -386,15 +387,15 @@ static int ab8500_fg_is_low_curr(struct ab8500_fg *di, int curr) | |||
386 | */ | 387 | */ |
387 | static int ab8500_fg_add_cap_sample(struct ab8500_fg *di, int sample) | 388 | static int ab8500_fg_add_cap_sample(struct ab8500_fg *di, int sample) |
388 | { | 389 | { |
389 | struct timespec ts; | 390 | struct timespec64 ts64; |
390 | struct ab8500_fg_avg_cap *avg = &di->avg_cap; | 391 | struct ab8500_fg_avg_cap *avg = &di->avg_cap; |
391 | 392 | ||
392 | getnstimeofday(&ts); | 393 | getnstimeofday64(&ts64); |
393 | 394 | ||
394 | do { | 395 | do { |
395 | avg->sum += sample - avg->samples[avg->pos]; | 396 | avg->sum += sample - avg->samples[avg->pos]; |
396 | avg->samples[avg->pos] = sample; | 397 | avg->samples[avg->pos] = sample; |
397 | avg->time_stamps[avg->pos] = ts.tv_sec; | 398 | avg->time_stamps[avg->pos] = ts64.tv_sec; |
398 | avg->pos++; | 399 | avg->pos++; |
399 | 400 | ||
400 | if (avg->pos == NBR_AVG_SAMPLES) | 401 | if (avg->pos == NBR_AVG_SAMPLES) |
@@ -407,7 +408,7 @@ static int ab8500_fg_add_cap_sample(struct ab8500_fg *di, int sample) | |||
407 | * Check the time stamp for each sample. If too old, | 408 | * Check the time stamp for each sample. If too old, |
408 | * replace with latest sample | 409 | * replace with latest sample |
409 | */ | 410 | */ |
410 | } while (ts.tv_sec - VALID_CAPACITY_SEC > avg->time_stamps[avg->pos]); | 411 | } while (ts64.tv_sec - VALID_CAPACITY_SEC > avg->time_stamps[avg->pos]); |
411 | 412 | ||
412 | avg->avg = avg->sum / avg->nbr_samples; | 413 | avg->avg = avg->sum / avg->nbr_samples; |
413 | 414 | ||
@@ -446,14 +447,14 @@ static void ab8500_fg_clear_cap_samples(struct ab8500_fg *di) | |||
446 | static void ab8500_fg_fill_cap_sample(struct ab8500_fg *di, int sample) | 447 | static void ab8500_fg_fill_cap_sample(struct ab8500_fg *di, int sample) |
447 | { | 448 | { |
448 | int i; | 449 | int i; |
449 | struct timespec ts; | 450 | struct timespec64 ts64; |
450 | struct ab8500_fg_avg_cap *avg = &di->avg_cap; | 451 | struct ab8500_fg_avg_cap *avg = &di->avg_cap; |
451 | 452 | ||
452 | getnstimeofday(&ts); | 453 | getnstimeofday64(&ts64); |
453 | 454 | ||
454 | for (i = 0; i < NBR_AVG_SAMPLES; i++) { | 455 | for (i = 0; i < NBR_AVG_SAMPLES; i++) { |
455 | avg->samples[i] = sample; | 456 | avg->samples[i] = sample; |
456 | avg->time_stamps[i] = ts.tv_sec; | 457 | avg->time_stamps[i] = ts64.tv_sec; |
457 | } | 458 | } |
458 | 459 | ||
459 | avg->pos = 0; | 460 | avg->pos = 0; |
diff --git a/drivers/power/bq2415x_charger.c b/drivers/power/bq2415x_charger.c index e384844a1ae1..1f49986fc605 100644 --- a/drivers/power/bq2415x_charger.c +++ b/drivers/power/bq2415x_charger.c | |||
@@ -1579,8 +1579,15 @@ static int bq2415x_probe(struct i2c_client *client, | |||
1579 | if (np) { | 1579 | if (np) { |
1580 | bq->notify_psy = power_supply_get_by_phandle(np, "ti,usb-charger-detection"); | 1580 | bq->notify_psy = power_supply_get_by_phandle(np, "ti,usb-charger-detection"); |
1581 | 1581 | ||
1582 | if (!bq->notify_psy) | 1582 | if (IS_ERR(bq->notify_psy)) { |
1583 | return -EPROBE_DEFER; | 1583 | dev_info(&client->dev, |
1584 | "no 'ti,usb-charger-detection' property (err=%ld)\n", | ||
1585 | PTR_ERR(bq->notify_psy)); | ||
1586 | bq->notify_psy = NULL; | ||
1587 | } else if (!bq->notify_psy) { | ||
1588 | ret = -EPROBE_DEFER; | ||
1589 | goto error_2; | ||
1590 | } | ||
1584 | } | 1591 | } |
1585 | else if (pdata->notify_device) | 1592 | else if (pdata->notify_device) |
1586 | bq->notify_psy = power_supply_get_by_name(pdata->notify_device); | 1593 | bq->notify_psy = power_supply_get_by_name(pdata->notify_device); |
@@ -1602,27 +1609,27 @@ static int bq2415x_probe(struct i2c_client *client, | |||
1602 | ret = of_property_read_u32(np, "ti,current-limit", | 1609 | ret = of_property_read_u32(np, "ti,current-limit", |
1603 | &bq->init_data.current_limit); | 1610 | &bq->init_data.current_limit); |
1604 | if (ret) | 1611 | if (ret) |
1605 | return ret; | 1612 | goto error_2; |
1606 | ret = of_property_read_u32(np, "ti,weak-battery-voltage", | 1613 | ret = of_property_read_u32(np, "ti,weak-battery-voltage", |
1607 | &bq->init_data.weak_battery_voltage); | 1614 | &bq->init_data.weak_battery_voltage); |
1608 | if (ret) | 1615 | if (ret) |
1609 | return ret; | 1616 | goto error_2; |
1610 | ret = of_property_read_u32(np, "ti,battery-regulation-voltage", | 1617 | ret = of_property_read_u32(np, "ti,battery-regulation-voltage", |
1611 | &bq->init_data.battery_regulation_voltage); | 1618 | &bq->init_data.battery_regulation_voltage); |
1612 | if (ret) | 1619 | if (ret) |
1613 | return ret; | 1620 | goto error_2; |
1614 | ret = of_property_read_u32(np, "ti,charge-current", | 1621 | ret = of_property_read_u32(np, "ti,charge-current", |
1615 | &bq->init_data.charge_current); | 1622 | &bq->init_data.charge_current); |
1616 | if (ret) | 1623 | if (ret) |
1617 | return ret; | 1624 | goto error_2; |
1618 | ret = of_property_read_u32(np, "ti,termination-current", | 1625 | ret = of_property_read_u32(np, "ti,termination-current", |
1619 | &bq->init_data.termination_current); | 1626 | &bq->init_data.termination_current); |
1620 | if (ret) | 1627 | if (ret) |
1621 | return ret; | 1628 | goto error_2; |
1622 | ret = of_property_read_u32(np, "ti,resistor-sense", | 1629 | ret = of_property_read_u32(np, "ti,resistor-sense", |
1623 | &bq->init_data.resistor_sense); | 1630 | &bq->init_data.resistor_sense); |
1624 | if (ret) | 1631 | if (ret) |
1625 | return ret; | 1632 | goto error_2; |
1626 | } else { | 1633 | } else { |
1627 | memcpy(&bq->init_data, pdata, sizeof(bq->init_data)); | 1634 | memcpy(&bq->init_data, pdata, sizeof(bq->init_data)); |
1628 | } | 1635 | } |
diff --git a/drivers/power/charger-manager.c b/drivers/power/charger-manager.c index 7098a1ce2d3c..ef8094a61f1e 100644 --- a/drivers/power/charger-manager.c +++ b/drivers/power/charger-manager.c | |||
@@ -97,6 +97,7 @@ static struct charger_global_desc *g_desc; /* init with setup_charger_manager */ | |||
97 | static bool is_batt_present(struct charger_manager *cm) | 97 | static bool is_batt_present(struct charger_manager *cm) |
98 | { | 98 | { |
99 | union power_supply_propval val; | 99 | union power_supply_propval val; |
100 | struct power_supply *psy; | ||
100 | bool present = false; | 101 | bool present = false; |
101 | int i, ret; | 102 | int i, ret; |
102 | 103 | ||
@@ -107,16 +108,27 @@ static bool is_batt_present(struct charger_manager *cm) | |||
107 | case CM_NO_BATTERY: | 108 | case CM_NO_BATTERY: |
108 | break; | 109 | break; |
109 | case CM_FUEL_GAUGE: | 110 | case CM_FUEL_GAUGE: |
110 | ret = cm->fuel_gauge->get_property(cm->fuel_gauge, | 111 | psy = power_supply_get_by_name(cm->desc->psy_fuel_gauge); |
112 | if (!psy) | ||
113 | break; | ||
114 | |||
115 | ret = psy->get_property(psy, | ||
111 | POWER_SUPPLY_PROP_PRESENT, &val); | 116 | POWER_SUPPLY_PROP_PRESENT, &val); |
112 | if (ret == 0 && val.intval) | 117 | if (ret == 0 && val.intval) |
113 | present = true; | 118 | present = true; |
114 | break; | 119 | break; |
115 | case CM_CHARGER_STAT: | 120 | case CM_CHARGER_STAT: |
116 | for (i = 0; cm->charger_stat[i]; i++) { | 121 | for (i = 0; cm->desc->psy_charger_stat[i]; i++) { |
117 | ret = cm->charger_stat[i]->get_property( | 122 | psy = power_supply_get_by_name( |
118 | cm->charger_stat[i], | 123 | cm->desc->psy_charger_stat[i]); |
119 | POWER_SUPPLY_PROP_PRESENT, &val); | 124 | if (!psy) { |
125 | dev_err(cm->dev, "Cannot find power supply \"%s\"\n", | ||
126 | cm->desc->psy_charger_stat[i]); | ||
127 | continue; | ||
128 | } | ||
129 | |||
130 | ret = psy->get_property(psy, POWER_SUPPLY_PROP_PRESENT, | ||
131 | &val); | ||
120 | if (ret == 0 && val.intval) { | 132 | if (ret == 0 && val.intval) { |
121 | present = true; | 133 | present = true; |
122 | break; | 134 | break; |
@@ -139,14 +151,20 @@ static bool is_batt_present(struct charger_manager *cm) | |||
139 | static bool is_ext_pwr_online(struct charger_manager *cm) | 151 | static bool is_ext_pwr_online(struct charger_manager *cm) |
140 | { | 152 | { |
141 | union power_supply_propval val; | 153 | union power_supply_propval val; |
154 | struct power_supply *psy; | ||
142 | bool online = false; | 155 | bool online = false; |
143 | int i, ret; | 156 | int i, ret; |
144 | 157 | ||
145 | /* If at least one of them has one, it's yes. */ | 158 | /* If at least one of them has one, it's yes. */ |
146 | for (i = 0; cm->charger_stat[i]; i++) { | 159 | for (i = 0; cm->desc->psy_charger_stat[i]; i++) { |
147 | ret = cm->charger_stat[i]->get_property( | 160 | psy = power_supply_get_by_name(cm->desc->psy_charger_stat[i]); |
148 | cm->charger_stat[i], | 161 | if (!psy) { |
149 | POWER_SUPPLY_PROP_ONLINE, &val); | 162 | dev_err(cm->dev, "Cannot find power supply \"%s\"\n", |
163 | cm->desc->psy_charger_stat[i]); | ||
164 | continue; | ||
165 | } | ||
166 | |||
167 | ret = psy->get_property(psy, POWER_SUPPLY_PROP_ONLINE, &val); | ||
150 | if (ret == 0 && val.intval) { | 168 | if (ret == 0 && val.intval) { |
151 | online = true; | 169 | online = true; |
152 | break; | 170 | break; |
@@ -167,12 +185,14 @@ static bool is_ext_pwr_online(struct charger_manager *cm) | |||
167 | static int get_batt_uV(struct charger_manager *cm, int *uV) | 185 | static int get_batt_uV(struct charger_manager *cm, int *uV) |
168 | { | 186 | { |
169 | union power_supply_propval val; | 187 | union power_supply_propval val; |
188 | struct power_supply *fuel_gauge; | ||
170 | int ret; | 189 | int ret; |
171 | 190 | ||
172 | if (!cm->fuel_gauge) | 191 | fuel_gauge = power_supply_get_by_name(cm->desc->psy_fuel_gauge); |
192 | if (!fuel_gauge) | ||
173 | return -ENODEV; | 193 | return -ENODEV; |
174 | 194 | ||
175 | ret = cm->fuel_gauge->get_property(cm->fuel_gauge, | 195 | ret = fuel_gauge->get_property(fuel_gauge, |
176 | POWER_SUPPLY_PROP_VOLTAGE_NOW, &val); | 196 | POWER_SUPPLY_PROP_VOLTAGE_NOW, &val); |
177 | if (ret) | 197 | if (ret) |
178 | return ret; | 198 | return ret; |
@@ -189,6 +209,7 @@ static bool is_charging(struct charger_manager *cm) | |||
189 | { | 209 | { |
190 | int i, ret; | 210 | int i, ret; |
191 | bool charging = false; | 211 | bool charging = false; |
212 | struct power_supply *psy; | ||
192 | union power_supply_propval val; | 213 | union power_supply_propval val; |
193 | 214 | ||
194 | /* If there is no battery, it cannot be charged */ | 215 | /* If there is no battery, it cannot be charged */ |
@@ -196,17 +217,22 @@ static bool is_charging(struct charger_manager *cm) | |||
196 | return false; | 217 | return false; |
197 | 218 | ||
198 | /* If at least one of the charger is charging, return yes */ | 219 | /* If at least one of the charger is charging, return yes */ |
199 | for (i = 0; cm->charger_stat[i]; i++) { | 220 | for (i = 0; cm->desc->psy_charger_stat[i]; i++) { |
200 | /* 1. The charger sholuld not be DISABLED */ | 221 | /* 1. The charger sholuld not be DISABLED */ |
201 | if (cm->emergency_stop) | 222 | if (cm->emergency_stop) |
202 | continue; | 223 | continue; |
203 | if (!cm->charger_enabled) | 224 | if (!cm->charger_enabled) |
204 | continue; | 225 | continue; |
205 | 226 | ||
227 | psy = power_supply_get_by_name(cm->desc->psy_charger_stat[i]); | ||
228 | if (!psy) { | ||
229 | dev_err(cm->dev, "Cannot find power supply \"%s\"\n", | ||
230 | cm->desc->psy_charger_stat[i]); | ||
231 | continue; | ||
232 | } | ||
233 | |||
206 | /* 2. The charger should be online (ext-power) */ | 234 | /* 2. The charger should be online (ext-power) */ |
207 | ret = cm->charger_stat[i]->get_property( | 235 | ret = psy->get_property(psy, POWER_SUPPLY_PROP_ONLINE, &val); |
208 | cm->charger_stat[i], | ||
209 | POWER_SUPPLY_PROP_ONLINE, &val); | ||
210 | if (ret) { | 236 | if (ret) { |
211 | dev_warn(cm->dev, "Cannot read ONLINE value from %s\n", | 237 | dev_warn(cm->dev, "Cannot read ONLINE value from %s\n", |
212 | cm->desc->psy_charger_stat[i]); | 238 | cm->desc->psy_charger_stat[i]); |
@@ -219,9 +245,7 @@ static bool is_charging(struct charger_manager *cm) | |||
219 | * 3. The charger should not be FULL, DISCHARGING, | 245 | * 3. The charger should not be FULL, DISCHARGING, |
220 | * or NOT_CHARGING. | 246 | * or NOT_CHARGING. |
221 | */ | 247 | */ |
222 | ret = cm->charger_stat[i]->get_property( | 248 | ret = psy->get_property(psy, POWER_SUPPLY_PROP_STATUS, &val); |
223 | cm->charger_stat[i], | ||
224 | POWER_SUPPLY_PROP_STATUS, &val); | ||
225 | if (ret) { | 249 | if (ret) { |
226 | dev_warn(cm->dev, "Cannot read STATUS value from %s\n", | 250 | dev_warn(cm->dev, "Cannot read STATUS value from %s\n", |
227 | cm->desc->psy_charger_stat[i]); | 251 | cm->desc->psy_charger_stat[i]); |
@@ -248,6 +272,7 @@ static bool is_full_charged(struct charger_manager *cm) | |||
248 | { | 272 | { |
249 | struct charger_desc *desc = cm->desc; | 273 | struct charger_desc *desc = cm->desc; |
250 | union power_supply_propval val; | 274 | union power_supply_propval val; |
275 | struct power_supply *fuel_gauge; | ||
251 | int ret = 0; | 276 | int ret = 0; |
252 | int uV; | 277 | int uV; |
253 | 278 | ||
@@ -255,11 +280,15 @@ static bool is_full_charged(struct charger_manager *cm) | |||
255 | if (!is_batt_present(cm)) | 280 | if (!is_batt_present(cm)) |
256 | return false; | 281 | return false; |
257 | 282 | ||
258 | if (cm->fuel_gauge && desc->fullbatt_full_capacity > 0) { | 283 | fuel_gauge = power_supply_get_by_name(cm->desc->psy_fuel_gauge); |
284 | if (!fuel_gauge) | ||
285 | return false; | ||
286 | |||
287 | if (desc->fullbatt_full_capacity > 0) { | ||
259 | val.intval = 0; | 288 | val.intval = 0; |
260 | 289 | ||
261 | /* Not full if capacity of fuel gauge isn't full */ | 290 | /* Not full if capacity of fuel gauge isn't full */ |
262 | ret = cm->fuel_gauge->get_property(cm->fuel_gauge, | 291 | ret = fuel_gauge->get_property(fuel_gauge, |
263 | POWER_SUPPLY_PROP_CHARGE_FULL, &val); | 292 | POWER_SUPPLY_PROP_CHARGE_FULL, &val); |
264 | if (!ret && val.intval > desc->fullbatt_full_capacity) | 293 | if (!ret && val.intval > desc->fullbatt_full_capacity) |
265 | return true; | 294 | return true; |
@@ -273,10 +302,10 @@ static bool is_full_charged(struct charger_manager *cm) | |||
273 | } | 302 | } |
274 | 303 | ||
275 | /* Full, if the capacity is more than fullbatt_soc */ | 304 | /* Full, if the capacity is more than fullbatt_soc */ |
276 | if (cm->fuel_gauge && desc->fullbatt_soc > 0) { | 305 | if (desc->fullbatt_soc > 0) { |
277 | val.intval = 0; | 306 | val.intval = 0; |
278 | 307 | ||
279 | ret = cm->fuel_gauge->get_property(cm->fuel_gauge, | 308 | ret = fuel_gauge->get_property(fuel_gauge, |
280 | POWER_SUPPLY_PROP_CAPACITY, &val); | 309 | POWER_SUPPLY_PROP_CAPACITY, &val); |
281 | if (!ret && val.intval >= desc->fullbatt_soc) | 310 | if (!ret && val.intval >= desc->fullbatt_soc) |
282 | return true; | 311 | return true; |
@@ -551,6 +580,20 @@ static int check_charging_duration(struct charger_manager *cm) | |||
551 | return ret; | 580 | return ret; |
552 | } | 581 | } |
553 | 582 | ||
583 | static int cm_get_battery_temperature_by_psy(struct charger_manager *cm, | ||
584 | int *temp) | ||
585 | { | ||
586 | struct power_supply *fuel_gauge; | ||
587 | |||
588 | fuel_gauge = power_supply_get_by_name(cm->desc->psy_fuel_gauge); | ||
589 | if (!fuel_gauge) | ||
590 | return -ENODEV; | ||
591 | |||
592 | return fuel_gauge->get_property(fuel_gauge, | ||
593 | POWER_SUPPLY_PROP_TEMP, | ||
594 | (union power_supply_propval *)temp); | ||
595 | } | ||
596 | |||
554 | static int cm_get_battery_temperature(struct charger_manager *cm, | 597 | static int cm_get_battery_temperature(struct charger_manager *cm, |
555 | int *temp) | 598 | int *temp) |
556 | { | 599 | { |
@@ -560,15 +603,18 @@ static int cm_get_battery_temperature(struct charger_manager *cm, | |||
560 | return -ENODEV; | 603 | return -ENODEV; |
561 | 604 | ||
562 | #ifdef CONFIG_THERMAL | 605 | #ifdef CONFIG_THERMAL |
563 | ret = thermal_zone_get_temp(cm->tzd_batt, (unsigned long *)temp); | 606 | if (cm->tzd_batt) { |
564 | if (!ret) | 607 | ret = thermal_zone_get_temp(cm->tzd_batt, (unsigned long *)temp); |
565 | /* Calibrate temperature unit */ | 608 | if (!ret) |
566 | *temp /= 100; | 609 | /* Calibrate temperature unit */ |
567 | #else | 610 | *temp /= 100; |
568 | ret = cm->fuel_gauge->get_property(cm->fuel_gauge, | 611 | } else |
569 | POWER_SUPPLY_PROP_TEMP, | ||
570 | (union power_supply_propval *)temp); | ||
571 | #endif | 612 | #endif |
613 | { | ||
614 | /* if-else continued from CONFIG_THERMAL */ | ||
615 | ret = cm_get_battery_temperature_by_psy(cm, temp); | ||
616 | } | ||
617 | |||
572 | return ret; | 618 | return ret; |
573 | } | 619 | } |
574 | 620 | ||
@@ -827,6 +873,7 @@ static int charger_get_property(struct power_supply *psy, | |||
827 | struct charger_manager *cm = container_of(psy, | 873 | struct charger_manager *cm = container_of(psy, |
828 | struct charger_manager, charger_psy); | 874 | struct charger_manager, charger_psy); |
829 | struct charger_desc *desc = cm->desc; | 875 | struct charger_desc *desc = cm->desc; |
876 | struct power_supply *fuel_gauge; | ||
830 | int ret = 0; | 877 | int ret = 0; |
831 | int uV; | 878 | int uV; |
832 | 879 | ||
@@ -857,14 +904,20 @@ static int charger_get_property(struct power_supply *psy, | |||
857 | ret = get_batt_uV(cm, &val->intval); | 904 | ret = get_batt_uV(cm, &val->intval); |
858 | break; | 905 | break; |
859 | case POWER_SUPPLY_PROP_CURRENT_NOW: | 906 | case POWER_SUPPLY_PROP_CURRENT_NOW: |
860 | ret = cm->fuel_gauge->get_property(cm->fuel_gauge, | 907 | fuel_gauge = power_supply_get_by_name(cm->desc->psy_fuel_gauge); |
908 | if (!fuel_gauge) { | ||
909 | ret = -ENODEV; | ||
910 | break; | ||
911 | } | ||
912 | ret = fuel_gauge->get_property(fuel_gauge, | ||
861 | POWER_SUPPLY_PROP_CURRENT_NOW, val); | 913 | POWER_SUPPLY_PROP_CURRENT_NOW, val); |
862 | break; | 914 | break; |
863 | case POWER_SUPPLY_PROP_TEMP: | 915 | case POWER_SUPPLY_PROP_TEMP: |
864 | case POWER_SUPPLY_PROP_TEMP_AMBIENT: | 916 | case POWER_SUPPLY_PROP_TEMP_AMBIENT: |
865 | return cm_get_battery_temperature(cm, &val->intval); | 917 | return cm_get_battery_temperature(cm, &val->intval); |
866 | case POWER_SUPPLY_PROP_CAPACITY: | 918 | case POWER_SUPPLY_PROP_CAPACITY: |
867 | if (!cm->fuel_gauge) { | 919 | fuel_gauge = power_supply_get_by_name(cm->desc->psy_fuel_gauge); |
920 | if (!fuel_gauge) { | ||
868 | ret = -ENODEV; | 921 | ret = -ENODEV; |
869 | break; | 922 | break; |
870 | } | 923 | } |
@@ -875,7 +928,7 @@ static int charger_get_property(struct power_supply *psy, | |||
875 | break; | 928 | break; |
876 | } | 929 | } |
877 | 930 | ||
878 | ret = cm->fuel_gauge->get_property(cm->fuel_gauge, | 931 | ret = fuel_gauge->get_property(fuel_gauge, |
879 | POWER_SUPPLY_PROP_CAPACITY, val); | 932 | POWER_SUPPLY_PROP_CAPACITY, val); |
880 | if (ret) | 933 | if (ret) |
881 | break; | 934 | break; |
@@ -924,7 +977,14 @@ static int charger_get_property(struct power_supply *psy, | |||
924 | break; | 977 | break; |
925 | case POWER_SUPPLY_PROP_CHARGE_NOW: | 978 | case POWER_SUPPLY_PROP_CHARGE_NOW: |
926 | if (is_charging(cm)) { | 979 | if (is_charging(cm)) { |
927 | ret = cm->fuel_gauge->get_property(cm->fuel_gauge, | 980 | fuel_gauge = power_supply_get_by_name( |
981 | cm->desc->psy_fuel_gauge); | ||
982 | if (!fuel_gauge) { | ||
983 | ret = -ENODEV; | ||
984 | break; | ||
985 | } | ||
986 | |||
987 | ret = fuel_gauge->get_property(fuel_gauge, | ||
928 | POWER_SUPPLY_PROP_CHARGE_NOW, | 988 | POWER_SUPPLY_PROP_CHARGE_NOW, |
929 | val); | 989 | val); |
930 | if (ret) { | 990 | if (ret) { |
@@ -970,6 +1030,7 @@ static struct power_supply psy_default = { | |||
970 | .properties = default_charger_props, | 1030 | .properties = default_charger_props, |
971 | .num_properties = ARRAY_SIZE(default_charger_props), | 1031 | .num_properties = ARRAY_SIZE(default_charger_props), |
972 | .get_property = charger_get_property, | 1032 | .get_property = charger_get_property, |
1033 | .no_thermal = true, | ||
973 | }; | 1034 | }; |
974 | 1035 | ||
975 | /** | 1036 | /** |
@@ -1485,14 +1546,15 @@ err: | |||
1485 | return ret; | 1546 | return ret; |
1486 | } | 1547 | } |
1487 | 1548 | ||
1488 | static int cm_init_thermal_data(struct charger_manager *cm) | 1549 | static int cm_init_thermal_data(struct charger_manager *cm, |
1550 | struct power_supply *fuel_gauge) | ||
1489 | { | 1551 | { |
1490 | struct charger_desc *desc = cm->desc; | 1552 | struct charger_desc *desc = cm->desc; |
1491 | union power_supply_propval val; | 1553 | union power_supply_propval val; |
1492 | int ret; | 1554 | int ret; |
1493 | 1555 | ||
1494 | /* Verify whether fuel gauge provides battery temperature */ | 1556 | /* Verify whether fuel gauge provides battery temperature */ |
1495 | ret = cm->fuel_gauge->get_property(cm->fuel_gauge, | 1557 | ret = fuel_gauge->get_property(fuel_gauge, |
1496 | POWER_SUPPLY_PROP_TEMP, &val); | 1558 | POWER_SUPPLY_PROP_TEMP, &val); |
1497 | 1559 | ||
1498 | if (!ret) { | 1560 | if (!ret) { |
@@ -1502,8 +1564,6 @@ static int cm_init_thermal_data(struct charger_manager *cm) | |||
1502 | cm->desc->measure_battery_temp = true; | 1564 | cm->desc->measure_battery_temp = true; |
1503 | } | 1565 | } |
1504 | #ifdef CONFIG_THERMAL | 1566 | #ifdef CONFIG_THERMAL |
1505 | cm->tzd_batt = cm->fuel_gauge->tzd; | ||
1506 | |||
1507 | if (ret && desc->thermal_zone) { | 1567 | if (ret && desc->thermal_zone) { |
1508 | cm->tzd_batt = | 1568 | cm->tzd_batt = |
1509 | thermal_zone_get_zone_by_name(desc->thermal_zone); | 1569 | thermal_zone_get_zone_by_name(desc->thermal_zone); |
@@ -1666,6 +1726,7 @@ static int charger_manager_probe(struct platform_device *pdev) | |||
1666 | int ret = 0, i = 0; | 1726 | int ret = 0, i = 0; |
1667 | int j = 0; | 1727 | int j = 0; |
1668 | union power_supply_propval val; | 1728 | union power_supply_propval val; |
1729 | struct power_supply *fuel_gauge; | ||
1669 | 1730 | ||
1670 | if (g_desc && !rtc_dev && g_desc->rtc_name) { | 1731 | if (g_desc && !rtc_dev && g_desc->rtc_name) { |
1671 | rtc_dev = rtc_class_open(g_desc->rtc_name); | 1732 | rtc_dev = rtc_class_open(g_desc->rtc_name); |
@@ -1729,23 +1790,20 @@ static int charger_manager_probe(struct platform_device *pdev) | |||
1729 | while (desc->psy_charger_stat[i]) | 1790 | while (desc->psy_charger_stat[i]) |
1730 | i++; | 1791 | i++; |
1731 | 1792 | ||
1732 | cm->charger_stat = devm_kzalloc(&pdev->dev, | 1793 | /* Check if charger's supplies are present at probe */ |
1733 | sizeof(struct power_supply *) * i, GFP_KERNEL); | ||
1734 | if (!cm->charger_stat) | ||
1735 | return -ENOMEM; | ||
1736 | |||
1737 | for (i = 0; desc->psy_charger_stat[i]; i++) { | 1794 | for (i = 0; desc->psy_charger_stat[i]; i++) { |
1738 | cm->charger_stat[i] = power_supply_get_by_name( | 1795 | struct power_supply *psy; |
1739 | desc->psy_charger_stat[i]); | 1796 | |
1740 | if (!cm->charger_stat[i]) { | 1797 | psy = power_supply_get_by_name(desc->psy_charger_stat[i]); |
1798 | if (!psy) { | ||
1741 | dev_err(&pdev->dev, "Cannot find power supply \"%s\"\n", | 1799 | dev_err(&pdev->dev, "Cannot find power supply \"%s\"\n", |
1742 | desc->psy_charger_stat[i]); | 1800 | desc->psy_charger_stat[i]); |
1743 | return -ENODEV; | 1801 | return -ENODEV; |
1744 | } | 1802 | } |
1745 | } | 1803 | } |
1746 | 1804 | ||
1747 | cm->fuel_gauge = power_supply_get_by_name(desc->psy_fuel_gauge); | 1805 | fuel_gauge = power_supply_get_by_name(desc->psy_fuel_gauge); |
1748 | if (!cm->fuel_gauge) { | 1806 | if (!fuel_gauge) { |
1749 | dev_err(&pdev->dev, "Cannot find power supply \"%s\"\n", | 1807 | dev_err(&pdev->dev, "Cannot find power supply \"%s\"\n", |
1750 | desc->psy_fuel_gauge); | 1808 | desc->psy_fuel_gauge); |
1751 | return -ENODEV; | 1809 | return -ENODEV; |
@@ -1788,13 +1846,13 @@ static int charger_manager_probe(struct platform_device *pdev) | |||
1788 | cm->charger_psy.num_properties = psy_default.num_properties; | 1846 | cm->charger_psy.num_properties = psy_default.num_properties; |
1789 | 1847 | ||
1790 | /* Find which optional psy-properties are available */ | 1848 | /* Find which optional psy-properties are available */ |
1791 | if (!cm->fuel_gauge->get_property(cm->fuel_gauge, | 1849 | if (!fuel_gauge->get_property(fuel_gauge, |
1792 | POWER_SUPPLY_PROP_CHARGE_NOW, &val)) { | 1850 | POWER_SUPPLY_PROP_CHARGE_NOW, &val)) { |
1793 | cm->charger_psy.properties[cm->charger_psy.num_properties] = | 1851 | cm->charger_psy.properties[cm->charger_psy.num_properties] = |
1794 | POWER_SUPPLY_PROP_CHARGE_NOW; | 1852 | POWER_SUPPLY_PROP_CHARGE_NOW; |
1795 | cm->charger_psy.num_properties++; | 1853 | cm->charger_psy.num_properties++; |
1796 | } | 1854 | } |
1797 | if (!cm->fuel_gauge->get_property(cm->fuel_gauge, | 1855 | if (!fuel_gauge->get_property(fuel_gauge, |
1798 | POWER_SUPPLY_PROP_CURRENT_NOW, | 1856 | POWER_SUPPLY_PROP_CURRENT_NOW, |
1799 | &val)) { | 1857 | &val)) { |
1800 | cm->charger_psy.properties[cm->charger_psy.num_properties] = | 1858 | cm->charger_psy.properties[cm->charger_psy.num_properties] = |
@@ -1802,7 +1860,7 @@ static int charger_manager_probe(struct platform_device *pdev) | |||
1802 | cm->charger_psy.num_properties++; | 1860 | cm->charger_psy.num_properties++; |
1803 | } | 1861 | } |
1804 | 1862 | ||
1805 | ret = cm_init_thermal_data(cm); | 1863 | ret = cm_init_thermal_data(cm, fuel_gauge); |
1806 | if (ret) { | 1864 | if (ret) { |
1807 | dev_err(&pdev->dev, "Failed to initialize thermal data\n"); | 1865 | dev_err(&pdev->dev, "Failed to initialize thermal data\n"); |
1808 | cm->desc->measure_battery_temp = false; | 1866 | cm->desc->measure_battery_temp = false; |
@@ -2066,8 +2124,8 @@ static bool find_power_supply(struct charger_manager *cm, | |||
2066 | int i; | 2124 | int i; |
2067 | bool found = false; | 2125 | bool found = false; |
2068 | 2126 | ||
2069 | for (i = 0; cm->charger_stat[i]; i++) { | 2127 | for (i = 0; cm->desc->psy_charger_stat[i]; i++) { |
2070 | if (psy == cm->charger_stat[i]) { | 2128 | if (!strcmp(psy->name, cm->desc->psy_charger_stat[i])) { |
2071 | found = true; | 2129 | found = true; |
2072 | break; | 2130 | break; |
2073 | } | 2131 | } |
diff --git a/drivers/power/power_supply_core.c b/drivers/power/power_supply_core.c index 6cb7fe5c022d..694e8cddd5c1 100644 --- a/drivers/power/power_supply_core.c +++ b/drivers/power/power_supply_core.c | |||
@@ -417,6 +417,9 @@ static int psy_register_thermal(struct power_supply *psy) | |||
417 | { | 417 | { |
418 | int i; | 418 | int i; |
419 | 419 | ||
420 | if (psy->no_thermal) | ||
421 | return 0; | ||
422 | |||
420 | /* Register battery zone device psy reports temperature */ | 423 | /* Register battery zone device psy reports temperature */ |
421 | for (i = 0; i < psy->num_properties; i++) { | 424 | for (i = 0; i < psy->num_properties; i++) { |
422 | if (psy->properties[i] == POWER_SUPPLY_PROP_TEMP) { | 425 | if (psy->properties[i] == POWER_SUPPLY_PROP_TEMP) { |
diff --git a/drivers/scsi/bnx2fc/bnx2fc_els.c b/drivers/scsi/bnx2fc/bnx2fc_els.c index ca75c7ca2559..ef355c13ccc4 100644 --- a/drivers/scsi/bnx2fc/bnx2fc_els.c +++ b/drivers/scsi/bnx2fc/bnx2fc_els.c | |||
@@ -480,9 +480,7 @@ void bnx2fc_rec_compl(struct bnx2fc_els_cb_arg *cb_arg) | |||
480 | bnx2fc_initiate_cleanup(orig_io_req); | 480 | bnx2fc_initiate_cleanup(orig_io_req); |
481 | /* Post a new IO req with the same sc_cmd */ | 481 | /* Post a new IO req with the same sc_cmd */ |
482 | BNX2FC_IO_DBG(rec_req, "Post IO request again\n"); | 482 | BNX2FC_IO_DBG(rec_req, "Post IO request again\n"); |
483 | spin_unlock_bh(&tgt->tgt_lock); | ||
484 | rc = bnx2fc_post_io_req(tgt, new_io_req); | 483 | rc = bnx2fc_post_io_req(tgt, new_io_req); |
485 | spin_lock_bh(&tgt->tgt_lock); | ||
486 | if (!rc) | 484 | if (!rc) |
487 | goto free_frame; | 485 | goto free_frame; |
488 | BNX2FC_IO_DBG(rec_req, "REC: io post err\n"); | 486 | BNX2FC_IO_DBG(rec_req, "REC: io post err\n"); |
diff --git a/drivers/scsi/bnx2fc/bnx2fc_io.c b/drivers/scsi/bnx2fc/bnx2fc_io.c index 0679782d9d15..5b99844ef6bf 100644 --- a/drivers/scsi/bnx2fc/bnx2fc_io.c +++ b/drivers/scsi/bnx2fc/bnx2fc_io.c | |||
@@ -1894,18 +1894,24 @@ int bnx2fc_queuecommand(struct Scsi_Host *host, | |||
1894 | goto exit_qcmd; | 1894 | goto exit_qcmd; |
1895 | } | 1895 | } |
1896 | } | 1896 | } |
1897 | |||
1898 | spin_lock_bh(&tgt->tgt_lock); | ||
1899 | |||
1897 | io_req = bnx2fc_cmd_alloc(tgt); | 1900 | io_req = bnx2fc_cmd_alloc(tgt); |
1898 | if (!io_req) { | 1901 | if (!io_req) { |
1899 | rc = SCSI_MLQUEUE_HOST_BUSY; | 1902 | rc = SCSI_MLQUEUE_HOST_BUSY; |
1900 | goto exit_qcmd; | 1903 | goto exit_qcmd_tgtlock; |
1901 | } | 1904 | } |
1902 | io_req->sc_cmd = sc_cmd; | 1905 | io_req->sc_cmd = sc_cmd; |
1903 | 1906 | ||
1904 | if (bnx2fc_post_io_req(tgt, io_req)) { | 1907 | if (bnx2fc_post_io_req(tgt, io_req)) { |
1905 | printk(KERN_ERR PFX "Unable to post io_req\n"); | 1908 | printk(KERN_ERR PFX "Unable to post io_req\n"); |
1906 | rc = SCSI_MLQUEUE_HOST_BUSY; | 1909 | rc = SCSI_MLQUEUE_HOST_BUSY; |
1907 | goto exit_qcmd; | 1910 | goto exit_qcmd_tgtlock; |
1908 | } | 1911 | } |
1912 | |||
1913 | exit_qcmd_tgtlock: | ||
1914 | spin_unlock_bh(&tgt->tgt_lock); | ||
1909 | exit_qcmd: | 1915 | exit_qcmd: |
1910 | return rc; | 1916 | return rc; |
1911 | } | 1917 | } |
@@ -2020,6 +2026,8 @@ int bnx2fc_post_io_req(struct bnx2fc_rport *tgt, | |||
2020 | int task_idx, index; | 2026 | int task_idx, index; |
2021 | u16 xid; | 2027 | u16 xid; |
2022 | 2028 | ||
2029 | /* bnx2fc_post_io_req() is called with the tgt_lock held */ | ||
2030 | |||
2023 | /* Initialize rest of io_req fields */ | 2031 | /* Initialize rest of io_req fields */ |
2024 | io_req->cmd_type = BNX2FC_SCSI_CMD; | 2032 | io_req->cmd_type = BNX2FC_SCSI_CMD; |
2025 | io_req->port = port; | 2033 | io_req->port = port; |
@@ -2047,9 +2055,7 @@ int bnx2fc_post_io_req(struct bnx2fc_rport *tgt, | |||
2047 | /* Build buffer descriptor list for firmware from sg list */ | 2055 | /* Build buffer descriptor list for firmware from sg list */ |
2048 | if (bnx2fc_build_bd_list_from_sg(io_req)) { | 2056 | if (bnx2fc_build_bd_list_from_sg(io_req)) { |
2049 | printk(KERN_ERR PFX "BD list creation failed\n"); | 2057 | printk(KERN_ERR PFX "BD list creation failed\n"); |
2050 | spin_lock_bh(&tgt->tgt_lock); | ||
2051 | kref_put(&io_req->refcount, bnx2fc_cmd_release); | 2058 | kref_put(&io_req->refcount, bnx2fc_cmd_release); |
2052 | spin_unlock_bh(&tgt->tgt_lock); | ||
2053 | return -EAGAIN; | 2059 | return -EAGAIN; |
2054 | } | 2060 | } |
2055 | 2061 | ||
@@ -2061,19 +2067,15 @@ int bnx2fc_post_io_req(struct bnx2fc_rport *tgt, | |||
2061 | task = &(task_page[index]); | 2067 | task = &(task_page[index]); |
2062 | bnx2fc_init_task(io_req, task); | 2068 | bnx2fc_init_task(io_req, task); |
2063 | 2069 | ||
2064 | spin_lock_bh(&tgt->tgt_lock); | ||
2065 | |||
2066 | if (tgt->flush_in_prog) { | 2070 | if (tgt->flush_in_prog) { |
2067 | printk(KERN_ERR PFX "Flush in progress..Host Busy\n"); | 2071 | printk(KERN_ERR PFX "Flush in progress..Host Busy\n"); |
2068 | kref_put(&io_req->refcount, bnx2fc_cmd_release); | 2072 | kref_put(&io_req->refcount, bnx2fc_cmd_release); |
2069 | spin_unlock_bh(&tgt->tgt_lock); | ||
2070 | return -EAGAIN; | 2073 | return -EAGAIN; |
2071 | } | 2074 | } |
2072 | 2075 | ||
2073 | if (!test_bit(BNX2FC_FLAG_SESSION_READY, &tgt->flags)) { | 2076 | if (!test_bit(BNX2FC_FLAG_SESSION_READY, &tgt->flags)) { |
2074 | printk(KERN_ERR PFX "Session not ready...post_io\n"); | 2077 | printk(KERN_ERR PFX "Session not ready...post_io\n"); |
2075 | kref_put(&io_req->refcount, bnx2fc_cmd_release); | 2078 | kref_put(&io_req->refcount, bnx2fc_cmd_release); |
2076 | spin_unlock_bh(&tgt->tgt_lock); | ||
2077 | return -EAGAIN; | 2079 | return -EAGAIN; |
2078 | } | 2080 | } |
2079 | 2081 | ||
@@ -2091,6 +2093,5 @@ int bnx2fc_post_io_req(struct bnx2fc_rport *tgt, | |||
2091 | 2093 | ||
2092 | /* Ring doorbell */ | 2094 | /* Ring doorbell */ |
2093 | bnx2fc_ring_doorbell(tgt); | 2095 | bnx2fc_ring_doorbell(tgt); |
2094 | spin_unlock_bh(&tgt->tgt_lock); | ||
2095 | return 0; | 2096 | return 0; |
2096 | } | 2097 | } |
diff --git a/drivers/scsi/cxgbi/cxgb4i/cxgb4i.c b/drivers/scsi/cxgbi/cxgb4i/cxgb4i.c index ed0e16866dc7..dd5f4e088efe 100644 --- a/drivers/scsi/cxgbi/cxgb4i/cxgb4i.c +++ b/drivers/scsi/cxgbi/cxgb4i/cxgb4i.c | |||
@@ -830,6 +830,8 @@ static void do_act_open_rpl(struct cxgbi_device *cdev, struct sk_buff *skb) | |||
830 | if (status == CPL_ERR_RTX_NEG_ADVICE) | 830 | if (status == CPL_ERR_RTX_NEG_ADVICE) |
831 | goto rel_skb; | 831 | goto rel_skb; |
832 | 832 | ||
833 | module_put(THIS_MODULE); | ||
834 | |||
833 | if (status && status != CPL_ERR_TCAM_FULL && | 835 | if (status && status != CPL_ERR_TCAM_FULL && |
834 | status != CPL_ERR_CONN_EXIST && | 836 | status != CPL_ERR_CONN_EXIST && |
835 | status != CPL_ERR_ARP_MISS) | 837 | status != CPL_ERR_ARP_MISS) |
@@ -938,20 +940,23 @@ static void do_abort_req_rss(struct cxgbi_device *cdev, struct sk_buff *skb) | |||
938 | cxgbi_sock_get(csk); | 940 | cxgbi_sock_get(csk); |
939 | spin_lock_bh(&csk->lock); | 941 | spin_lock_bh(&csk->lock); |
940 | 942 | ||
941 | if (!cxgbi_sock_flag(csk, CTPF_ABORT_REQ_RCVD)) { | 943 | cxgbi_sock_clear_flag(csk, CTPF_ABORT_REQ_RCVD); |
942 | cxgbi_sock_set_flag(csk, CTPF_ABORT_REQ_RCVD); | 944 | |
943 | cxgbi_sock_set_state(csk, CTP_ABORTING); | 945 | if (!cxgbi_sock_flag(csk, CTPF_TX_DATA_SENT)) { |
944 | goto done; | 946 | send_tx_flowc_wr(csk); |
947 | cxgbi_sock_set_flag(csk, CTPF_TX_DATA_SENT); | ||
945 | } | 948 | } |
946 | 949 | ||
947 | cxgbi_sock_clear_flag(csk, CTPF_ABORT_REQ_RCVD); | 950 | cxgbi_sock_set_flag(csk, CTPF_ABORT_REQ_RCVD); |
951 | cxgbi_sock_set_state(csk, CTP_ABORTING); | ||
952 | |||
948 | send_abort_rpl(csk, rst_status); | 953 | send_abort_rpl(csk, rst_status); |
949 | 954 | ||
950 | if (!cxgbi_sock_flag(csk, CTPF_ABORT_RPL_PENDING)) { | 955 | if (!cxgbi_sock_flag(csk, CTPF_ABORT_RPL_PENDING)) { |
951 | csk->err = abort_status_to_errno(csk, req->status, &rst_status); | 956 | csk->err = abort_status_to_errno(csk, req->status, &rst_status); |
952 | cxgbi_sock_closed(csk); | 957 | cxgbi_sock_closed(csk); |
953 | } | 958 | } |
954 | done: | 959 | |
955 | spin_unlock_bh(&csk->lock); | 960 | spin_unlock_bh(&csk->lock); |
956 | cxgbi_sock_put(csk); | 961 | cxgbi_sock_put(csk); |
957 | rel_skb: | 962 | rel_skb: |
diff --git a/drivers/scsi/cxgbi/libcxgbi.c b/drivers/scsi/cxgbi/libcxgbi.c index 674d498b46ab..7da59c38a69e 100644 --- a/drivers/scsi/cxgbi/libcxgbi.c +++ b/drivers/scsi/cxgbi/libcxgbi.c | |||
@@ -816,7 +816,7 @@ static void cxgbi_inform_iscsi_conn_closing(struct cxgbi_sock *csk) | |||
816 | read_lock_bh(&csk->callback_lock); | 816 | read_lock_bh(&csk->callback_lock); |
817 | if (csk->user_data) | 817 | if (csk->user_data) |
818 | iscsi_conn_failure(csk->user_data, | 818 | iscsi_conn_failure(csk->user_data, |
819 | ISCSI_ERR_CONN_FAILED); | 819 | ISCSI_ERR_TCP_CONN_CLOSE); |
820 | read_unlock_bh(&csk->callback_lock); | 820 | read_unlock_bh(&csk->callback_lock); |
821 | } | 821 | } |
822 | } | 822 | } |
@@ -905,18 +905,16 @@ void cxgbi_sock_rcv_abort_rpl(struct cxgbi_sock *csk) | |||
905 | { | 905 | { |
906 | cxgbi_sock_get(csk); | 906 | cxgbi_sock_get(csk); |
907 | spin_lock_bh(&csk->lock); | 907 | spin_lock_bh(&csk->lock); |
908 | |||
909 | cxgbi_sock_set_flag(csk, CTPF_ABORT_RPL_RCVD); | ||
908 | if (cxgbi_sock_flag(csk, CTPF_ABORT_RPL_PENDING)) { | 910 | if (cxgbi_sock_flag(csk, CTPF_ABORT_RPL_PENDING)) { |
909 | if (!cxgbi_sock_flag(csk, CTPF_ABORT_RPL_RCVD)) | 911 | cxgbi_sock_clear_flag(csk, CTPF_ABORT_RPL_PENDING); |
910 | cxgbi_sock_set_flag(csk, CTPF_ABORT_RPL_RCVD); | 912 | if (cxgbi_sock_flag(csk, CTPF_ABORT_REQ_RCVD)) |
911 | else { | 913 | pr_err("csk 0x%p,%u,0x%lx,%u,ABT_RPL_RSS.\n", |
912 | cxgbi_sock_clear_flag(csk, CTPF_ABORT_RPL_RCVD); | 914 | csk, csk->state, csk->flags, csk->tid); |
913 | cxgbi_sock_clear_flag(csk, CTPF_ABORT_RPL_PENDING); | 915 | cxgbi_sock_closed(csk); |
914 | if (cxgbi_sock_flag(csk, CTPF_ABORT_REQ_RCVD)) | ||
915 | pr_err("csk 0x%p,%u,0x%lx,%u,ABT_RPL_RSS.\n", | ||
916 | csk, csk->state, csk->flags, csk->tid); | ||
917 | cxgbi_sock_closed(csk); | ||
918 | } | ||
919 | } | 916 | } |
917 | |||
920 | spin_unlock_bh(&csk->lock); | 918 | spin_unlock_bh(&csk->lock); |
921 | cxgbi_sock_put(csk); | 919 | cxgbi_sock_put(csk); |
922 | } | 920 | } |
diff --git a/drivers/scsi/device_handler/scsi_dh_alua.c b/drivers/scsi/device_handler/scsi_dh_alua.c index e99507ed0e3c..fd78bdc53528 100644 --- a/drivers/scsi/device_handler/scsi_dh_alua.c +++ b/drivers/scsi/device_handler/scsi_dh_alua.c | |||
@@ -474,6 +474,13 @@ static int alua_check_sense(struct scsi_device *sdev, | |||
474 | * LUN Not Ready -- Offline | 474 | * LUN Not Ready -- Offline |
475 | */ | 475 | */ |
476 | return SUCCESS; | 476 | return SUCCESS; |
477 | if (sdev->allow_restart && | ||
478 | sense_hdr->asc == 0x04 && sense_hdr->ascq == 0x02) | ||
479 | /* | ||
480 | * if the device is not started, we need to wake | ||
481 | * the error handler to start the motor | ||
482 | */ | ||
483 | return FAILED; | ||
477 | break; | 484 | break; |
478 | case UNIT_ATTENTION: | 485 | case UNIT_ATTENTION: |
479 | if (sense_hdr->asc == 0x29 && sense_hdr->ascq == 0x00) | 486 | if (sense_hdr->asc == 0x29 && sense_hdr->ascq == 0x00) |
diff --git a/drivers/scsi/megaraid/megaraid_sas_base.c b/drivers/scsi/megaraid/megaraid_sas_base.c index f6a69a3b1b3f..5640ad1c8214 100644 --- a/drivers/scsi/megaraid/megaraid_sas_base.c +++ b/drivers/scsi/megaraid/megaraid_sas_base.c | |||
@@ -4453,7 +4453,7 @@ static int megasas_init_fw(struct megasas_instance *instance) | |||
4453 | instance->msixentry[i].entry = i; | 4453 | instance->msixentry[i].entry = i; |
4454 | i = pci_enable_msix_range(instance->pdev, instance->msixentry, | 4454 | i = pci_enable_msix_range(instance->pdev, instance->msixentry, |
4455 | 1, instance->msix_vectors); | 4455 | 1, instance->msix_vectors); |
4456 | if (i) | 4456 | if (i > 0) |
4457 | instance->msix_vectors = i; | 4457 | instance->msix_vectors = i; |
4458 | else | 4458 | else |
4459 | instance->msix_vectors = 0; | 4459 | instance->msix_vectors = 0; |
diff --git a/drivers/scsi/scsi_error.c b/drivers/scsi/scsi_error.c index 9a6f8468225f..bc5ff6ff9c79 100644 --- a/drivers/scsi/scsi_error.c +++ b/drivers/scsi/scsi_error.c | |||
@@ -459,14 +459,6 @@ static int scsi_check_sense(struct scsi_cmnd *scmd) | |||
459 | if (! scsi_command_normalize_sense(scmd, &sshdr)) | 459 | if (! scsi_command_normalize_sense(scmd, &sshdr)) |
460 | return FAILED; /* no valid sense data */ | 460 | return FAILED; /* no valid sense data */ |
461 | 461 | ||
462 | if (scmd->cmnd[0] == TEST_UNIT_READY && scmd->scsi_done != scsi_eh_done) | ||
463 | /* | ||
464 | * nasty: for mid-layer issued TURs, we need to return the | ||
465 | * actual sense data without any recovery attempt. For eh | ||
466 | * issued ones, we need to try to recover and interpret | ||
467 | */ | ||
468 | return SUCCESS; | ||
469 | |||
470 | scsi_report_sense(sdev, &sshdr); | 462 | scsi_report_sense(sdev, &sshdr); |
471 | 463 | ||
472 | if (scsi_sense_is_deferred(&sshdr)) | 464 | if (scsi_sense_is_deferred(&sshdr)) |
@@ -482,6 +474,14 @@ static int scsi_check_sense(struct scsi_cmnd *scmd) | |||
482 | /* handler does not care. Drop down to default handling */ | 474 | /* handler does not care. Drop down to default handling */ |
483 | } | 475 | } |
484 | 476 | ||
477 | if (scmd->cmnd[0] == TEST_UNIT_READY && scmd->scsi_done != scsi_eh_done) | ||
478 | /* | ||
479 | * nasty: for mid-layer issued TURs, we need to return the | ||
480 | * actual sense data without any recovery attempt. For eh | ||
481 | * issued ones, we need to try to recover and interpret | ||
482 | */ | ||
483 | return SUCCESS; | ||
484 | |||
485 | /* | 485 | /* |
486 | * Previous logic looked for FILEMARK, EOM or ILI which are | 486 | * Previous logic looked for FILEMARK, EOM or ILI which are |
487 | * mainly associated with tapes and returned SUCCESS. | 487 | * mainly associated with tapes and returned SUCCESS. |
@@ -2001,8 +2001,10 @@ static void scsi_restart_operations(struct Scsi_Host *shost) | |||
2001 | * is no point trying to lock the door of an off-line device. | 2001 | * is no point trying to lock the door of an off-line device. |
2002 | */ | 2002 | */ |
2003 | shost_for_each_device(sdev, shost) { | 2003 | shost_for_each_device(sdev, shost) { |
2004 | if (scsi_device_online(sdev) && sdev->locked) | 2004 | if (scsi_device_online(sdev) && sdev->was_reset && sdev->locked) { |
2005 | scsi_eh_lock_door(sdev); | 2005 | scsi_eh_lock_door(sdev); |
2006 | sdev->was_reset = 0; | ||
2007 | } | ||
2006 | } | 2008 | } |
2007 | 2009 | ||
2008 | /* | 2010 | /* |
diff --git a/drivers/target/iscsi/iscsi_target.c b/drivers/target/iscsi/iscsi_target.c index b19e4329ba00..73e58d22e325 100644 --- a/drivers/target/iscsi/iscsi_target.c +++ b/drivers/target/iscsi/iscsi_target.c | |||
@@ -3491,7 +3491,7 @@ iscsit_build_sendtargets_response(struct iscsi_cmd *cmd, | |||
3491 | len = sprintf(buf, "TargetAddress=" | 3491 | len = sprintf(buf, "TargetAddress=" |
3492 | "%s:%hu,%hu", | 3492 | "%s:%hu,%hu", |
3493 | inaddr_any ? conn->local_ip : np->np_ip, | 3493 | inaddr_any ? conn->local_ip : np->np_ip, |
3494 | inaddr_any ? conn->local_port : np->np_port, | 3494 | np->np_port, |
3495 | tpg->tpgt); | 3495 | tpg->tpgt); |
3496 | len += 1; | 3496 | len += 1; |
3497 | 3497 | ||
diff --git a/drivers/target/target_core_pr.c b/drivers/target/target_core_pr.c index 8c60a1a1ae8d..9f93b8234095 100644 --- a/drivers/target/target_core_pr.c +++ b/drivers/target/target_core_pr.c | |||
@@ -2738,7 +2738,8 @@ core_scsi3_pro_preempt(struct se_cmd *cmd, int type, int scope, u64 res_key, | |||
2738 | struct t10_pr_registration *pr_reg, *pr_reg_tmp, *pr_reg_n, *pr_res_holder; | 2738 | struct t10_pr_registration *pr_reg, *pr_reg_tmp, *pr_reg_n, *pr_res_holder; |
2739 | struct t10_reservation *pr_tmpl = &dev->t10_pr; | 2739 | struct t10_reservation *pr_tmpl = &dev->t10_pr; |
2740 | u32 pr_res_mapped_lun = 0; | 2740 | u32 pr_res_mapped_lun = 0; |
2741 | int all_reg = 0, calling_it_nexus = 0, released_regs = 0; | 2741 | int all_reg = 0, calling_it_nexus = 0; |
2742 | bool sa_res_key_unmatched = sa_res_key != 0; | ||
2742 | int prh_type = 0, prh_scope = 0; | 2743 | int prh_type = 0, prh_scope = 0; |
2743 | 2744 | ||
2744 | if (!se_sess) | 2745 | if (!se_sess) |
@@ -2813,6 +2814,7 @@ core_scsi3_pro_preempt(struct se_cmd *cmd, int type, int scope, u64 res_key, | |||
2813 | if (!all_reg) { | 2814 | if (!all_reg) { |
2814 | if (pr_reg->pr_res_key != sa_res_key) | 2815 | if (pr_reg->pr_res_key != sa_res_key) |
2815 | continue; | 2816 | continue; |
2817 | sa_res_key_unmatched = false; | ||
2816 | 2818 | ||
2817 | calling_it_nexus = (pr_reg_n == pr_reg) ? 1 : 0; | 2819 | calling_it_nexus = (pr_reg_n == pr_reg) ? 1 : 0; |
2818 | pr_reg_nacl = pr_reg->pr_reg_nacl; | 2820 | pr_reg_nacl = pr_reg->pr_reg_nacl; |
@@ -2820,7 +2822,6 @@ core_scsi3_pro_preempt(struct se_cmd *cmd, int type, int scope, u64 res_key, | |||
2820 | __core_scsi3_free_registration(dev, pr_reg, | 2822 | __core_scsi3_free_registration(dev, pr_reg, |
2821 | (preempt_type == PREEMPT_AND_ABORT) ? &preempt_and_abort_list : | 2823 | (preempt_type == PREEMPT_AND_ABORT) ? &preempt_and_abort_list : |
2822 | NULL, calling_it_nexus); | 2824 | NULL, calling_it_nexus); |
2823 | released_regs++; | ||
2824 | } else { | 2825 | } else { |
2825 | /* | 2826 | /* |
2826 | * Case for any existing all registrants type | 2827 | * Case for any existing all registrants type |
@@ -2838,6 +2839,7 @@ core_scsi3_pro_preempt(struct se_cmd *cmd, int type, int scope, u64 res_key, | |||
2838 | if ((sa_res_key) && | 2839 | if ((sa_res_key) && |
2839 | (pr_reg->pr_res_key != sa_res_key)) | 2840 | (pr_reg->pr_res_key != sa_res_key)) |
2840 | continue; | 2841 | continue; |
2842 | sa_res_key_unmatched = false; | ||
2841 | 2843 | ||
2842 | calling_it_nexus = (pr_reg_n == pr_reg) ? 1 : 0; | 2844 | calling_it_nexus = (pr_reg_n == pr_reg) ? 1 : 0; |
2843 | if (calling_it_nexus) | 2845 | if (calling_it_nexus) |
@@ -2848,7 +2850,6 @@ core_scsi3_pro_preempt(struct se_cmd *cmd, int type, int scope, u64 res_key, | |||
2848 | __core_scsi3_free_registration(dev, pr_reg, | 2850 | __core_scsi3_free_registration(dev, pr_reg, |
2849 | (preempt_type == PREEMPT_AND_ABORT) ? &preempt_and_abort_list : | 2851 | (preempt_type == PREEMPT_AND_ABORT) ? &preempt_and_abort_list : |
2850 | NULL, 0); | 2852 | NULL, 0); |
2851 | released_regs++; | ||
2852 | } | 2853 | } |
2853 | if (!calling_it_nexus) | 2854 | if (!calling_it_nexus) |
2854 | core_scsi3_ua_allocate(pr_reg_nacl, | 2855 | core_scsi3_ua_allocate(pr_reg_nacl, |
@@ -2863,7 +2864,7 @@ core_scsi3_pro_preempt(struct se_cmd *cmd, int type, int scope, u64 res_key, | |||
2863 | * registered reservation key, then the device server shall | 2864 | * registered reservation key, then the device server shall |
2864 | * complete the command with RESERVATION CONFLICT status. | 2865 | * complete the command with RESERVATION CONFLICT status. |
2865 | */ | 2866 | */ |
2866 | if (!released_regs) { | 2867 | if (sa_res_key_unmatched) { |
2867 | spin_unlock(&dev->dev_reservation_lock); | 2868 | spin_unlock(&dev->dev_reservation_lock); |
2868 | core_scsi3_put_pr_reg(pr_reg_n); | 2869 | core_scsi3_put_pr_reg(pr_reg_n); |
2869 | return TCM_RESERVATION_CONFLICT; | 2870 | return TCM_RESERVATION_CONFLICT; |
diff --git a/drivers/target/target_core_transport.c b/drivers/target/target_core_transport.c index 9ea0d5f03f7a..be877bf6f730 100644 --- a/drivers/target/target_core_transport.c +++ b/drivers/target/target_core_transport.c | |||
@@ -2292,7 +2292,7 @@ transport_generic_new_cmd(struct se_cmd *cmd) | |||
2292 | * and let it call back once the write buffers are ready. | 2292 | * and let it call back once the write buffers are ready. |
2293 | */ | 2293 | */ |
2294 | target_add_to_state_list(cmd); | 2294 | target_add_to_state_list(cmd); |
2295 | if (cmd->data_direction != DMA_TO_DEVICE) { | 2295 | if (cmd->data_direction != DMA_TO_DEVICE || cmd->data_length == 0) { |
2296 | target_execute_cmd(cmd); | 2296 | target_execute_cmd(cmd); |
2297 | return 0; | 2297 | return 0; |
2298 | } | 2298 | } |
diff --git a/drivers/vhost/scsi.c b/drivers/vhost/scsi.c index 69906cacd04f..a17f11850669 100644 --- a/drivers/vhost/scsi.c +++ b/drivers/vhost/scsi.c | |||
@@ -1312,6 +1312,7 @@ static int | |||
1312 | vhost_scsi_set_endpoint(struct vhost_scsi *vs, | 1312 | vhost_scsi_set_endpoint(struct vhost_scsi *vs, |
1313 | struct vhost_scsi_target *t) | 1313 | struct vhost_scsi_target *t) |
1314 | { | 1314 | { |
1315 | struct se_portal_group *se_tpg; | ||
1315 | struct tcm_vhost_tport *tv_tport; | 1316 | struct tcm_vhost_tport *tv_tport; |
1316 | struct tcm_vhost_tpg *tpg; | 1317 | struct tcm_vhost_tpg *tpg; |
1317 | struct tcm_vhost_tpg **vs_tpg; | 1318 | struct tcm_vhost_tpg **vs_tpg; |
@@ -1359,6 +1360,21 @@ vhost_scsi_set_endpoint(struct vhost_scsi *vs, | |||
1359 | ret = -EEXIST; | 1360 | ret = -EEXIST; |
1360 | goto out; | 1361 | goto out; |
1361 | } | 1362 | } |
1363 | /* | ||
1364 | * In order to ensure individual vhost-scsi configfs | ||
1365 | * groups cannot be removed while in use by vhost ioctl, | ||
1366 | * go ahead and take an explicit se_tpg->tpg_group.cg_item | ||
1367 | * dependency now. | ||
1368 | */ | ||
1369 | se_tpg = &tpg->se_tpg; | ||
1370 | ret = configfs_depend_item(se_tpg->se_tpg_tfo->tf_subsys, | ||
1371 | &se_tpg->tpg_group.cg_item); | ||
1372 | if (ret) { | ||
1373 | pr_warn("configfs_depend_item() failed: %d\n", ret); | ||
1374 | kfree(vs_tpg); | ||
1375 | mutex_unlock(&tpg->tv_tpg_mutex); | ||
1376 | goto out; | ||
1377 | } | ||
1362 | tpg->tv_tpg_vhost_count++; | 1378 | tpg->tv_tpg_vhost_count++; |
1363 | tpg->vhost_scsi = vs; | 1379 | tpg->vhost_scsi = vs; |
1364 | vs_tpg[tpg->tport_tpgt] = tpg; | 1380 | vs_tpg[tpg->tport_tpgt] = tpg; |
@@ -1401,6 +1417,7 @@ static int | |||
1401 | vhost_scsi_clear_endpoint(struct vhost_scsi *vs, | 1417 | vhost_scsi_clear_endpoint(struct vhost_scsi *vs, |
1402 | struct vhost_scsi_target *t) | 1418 | struct vhost_scsi_target *t) |
1403 | { | 1419 | { |
1420 | struct se_portal_group *se_tpg; | ||
1404 | struct tcm_vhost_tport *tv_tport; | 1421 | struct tcm_vhost_tport *tv_tport; |
1405 | struct tcm_vhost_tpg *tpg; | 1422 | struct tcm_vhost_tpg *tpg; |
1406 | struct vhost_virtqueue *vq; | 1423 | struct vhost_virtqueue *vq; |
@@ -1449,6 +1466,13 @@ vhost_scsi_clear_endpoint(struct vhost_scsi *vs, | |||
1449 | vs->vs_tpg[target] = NULL; | 1466 | vs->vs_tpg[target] = NULL; |
1450 | match = true; | 1467 | match = true; |
1451 | mutex_unlock(&tpg->tv_tpg_mutex); | 1468 | mutex_unlock(&tpg->tv_tpg_mutex); |
1469 | /* | ||
1470 | * Release se_tpg->tpg_group.cg_item configfs dependency now | ||
1471 | * to allow vhost-scsi WWPN se_tpg->tpg_group shutdown to occur. | ||
1472 | */ | ||
1473 | se_tpg = &tpg->se_tpg; | ||
1474 | configfs_undepend_item(se_tpg->se_tpg_tfo->tf_subsys, | ||
1475 | &se_tpg->tpg_group.cg_item); | ||
1452 | } | 1476 | } |
1453 | if (match) { | 1477 | if (match) { |
1454 | for (i = 0; i < VHOST_SCSI_MAX_VQ; i++) { | 1478 | for (i = 0; i < VHOST_SCSI_MAX_VQ; i++) { |