diff options
| author | David S. Miller <davem@davemloft.net> | 2011-07-06 02:23:37 -0400 |
|---|---|---|
| committer | David S. Miller <davem@davemloft.net> | 2011-07-06 02:23:37 -0400 |
| commit | e12fe68ce34d60c04bb1ddb1d3cc5c3022388fe4 (patch) | |
| tree | 83c0e192ccaa4752c80b6131a7d0aa8272b5d0d0 /drivers | |
| parent | 7329f0d58de01878d9ce4f0be7a76e136f223eef (diff) | |
| parent | 712ae51afd55b20c04c5383d02ba5d10233313b1 (diff) | |
Merge branch 'master' of master.kernel.org:/pub/scm/linux/kernel/git/davem/net-2.6
Diffstat (limited to 'drivers')
140 files changed, 1255 insertions, 539 deletions
diff --git a/drivers/ata/libahci.c b/drivers/ata/libahci.c index d38c40fe4ddb..41223c7f0206 100644 --- a/drivers/ata/libahci.c +++ b/drivers/ata/libahci.c | |||
| @@ -452,7 +452,7 @@ void ahci_save_initial_config(struct device *dev, | |||
| 452 | } | 452 | } |
| 453 | 453 | ||
| 454 | if (mask_port_map) { | 454 | if (mask_port_map) { |
| 455 | dev_printk(KERN_ERR, dev, "masking port_map 0x%x -> 0x%x\n", | 455 | dev_printk(KERN_WARNING, dev, "masking port_map 0x%x -> 0x%x\n", |
| 456 | port_map, | 456 | port_map, |
| 457 | port_map & mask_port_map); | 457 | port_map & mask_port_map); |
| 458 | port_map &= mask_port_map; | 458 | port_map &= mask_port_map; |
diff --git a/drivers/ata/libata-core.c b/drivers/ata/libata-core.c index 736bee5dafeb..000d03ae6653 100644 --- a/drivers/ata/libata-core.c +++ b/drivers/ata/libata-core.c | |||
| @@ -4143,9 +4143,9 @@ static const struct ata_blacklist_entry ata_device_blacklist [] = { | |||
| 4143 | * Devices which choke on SETXFER. Applies only if both the | 4143 | * Devices which choke on SETXFER. Applies only if both the |
| 4144 | * device and controller are SATA. | 4144 | * device and controller are SATA. |
| 4145 | */ | 4145 | */ |
| 4146 | { "PIONEER DVD-RW DVRTD08", "1.00", ATA_HORKAGE_NOSETXFER }, | 4146 | { "PIONEER DVD-RW DVRTD08", NULL, ATA_HORKAGE_NOSETXFER }, |
| 4147 | { "PIONEER DVD-RW DVR-212D", "1.28", ATA_HORKAGE_NOSETXFER }, | 4147 | { "PIONEER DVD-RW DVR-212D", NULL, ATA_HORKAGE_NOSETXFER }, |
| 4148 | { "PIONEER DVD-RW DVR-216D", "1.08", ATA_HORKAGE_NOSETXFER }, | 4148 | { "PIONEER DVD-RW DVR-216D", NULL, ATA_HORKAGE_NOSETXFER }, |
| 4149 | 4149 | ||
| 4150 | /* End Marker */ | 4150 | /* End Marker */ |
| 4151 | { } | 4151 | { } |
diff --git a/drivers/ata/libata-scsi.c b/drivers/ata/libata-scsi.c index d51f9795c064..927f968e99d9 100644 --- a/drivers/ata/libata-scsi.c +++ b/drivers/ata/libata-scsi.c | |||
| @@ -3797,6 +3797,12 @@ EXPORT_SYMBOL_GPL(ata_sas_port_alloc); | |||
| 3797 | */ | 3797 | */ |
| 3798 | int ata_sas_port_start(struct ata_port *ap) | 3798 | int ata_sas_port_start(struct ata_port *ap) |
| 3799 | { | 3799 | { |
| 3800 | /* | ||
| 3801 | * the port is marked as frozen at allocation time, but if we don't | ||
| 3802 | * have new eh, we won't thaw it | ||
| 3803 | */ | ||
| 3804 | if (!ap->ops->error_handler) | ||
| 3805 | ap->pflags &= ~ATA_PFLAG_FROZEN; | ||
| 3800 | return 0; | 3806 | return 0; |
| 3801 | } | 3807 | } |
| 3802 | EXPORT_SYMBOL_GPL(ata_sas_port_start); | 3808 | EXPORT_SYMBOL_GPL(ata_sas_port_start); |
diff --git a/drivers/ata/pata_marvell.c b/drivers/ata/pata_marvell.c index 75a6a0c0094f..5d7f58a7e34d 100644 --- a/drivers/ata/pata_marvell.c +++ b/drivers/ata/pata_marvell.c | |||
| @@ -161,6 +161,9 @@ static const struct pci_device_id marvell_pci_tbl[] = { | |||
| 161 | { PCI_DEVICE(0x11AB, 0x6121), }, | 161 | { PCI_DEVICE(0x11AB, 0x6121), }, |
| 162 | { PCI_DEVICE(0x11AB, 0x6123), }, | 162 | { PCI_DEVICE(0x11AB, 0x6123), }, |
| 163 | { PCI_DEVICE(0x11AB, 0x6145), }, | 163 | { PCI_DEVICE(0x11AB, 0x6145), }, |
| 164 | { PCI_DEVICE(0x1B4B, 0x91A0), }, | ||
| 165 | { PCI_DEVICE(0x1B4B, 0x91A4), }, | ||
| 166 | |||
| 164 | { } /* terminate list */ | 167 | { } /* terminate list */ |
| 165 | }; | 168 | }; |
| 166 | 169 | ||
diff --git a/drivers/ata/sata_dwc_460ex.c b/drivers/ata/sata_dwc_460ex.c index 1c4b3aa4c7c4..dc88a39e7db8 100644 --- a/drivers/ata/sata_dwc_460ex.c +++ b/drivers/ata/sata_dwc_460ex.c | |||
| @@ -389,7 +389,7 @@ static void sata_dwc_tf_dump(struct ata_taskfile *tf) | |||
| 389 | /* | 389 | /* |
| 390 | * Function: get_burst_length_encode | 390 | * Function: get_burst_length_encode |
| 391 | * arguments: datalength: length in bytes of data | 391 | * arguments: datalength: length in bytes of data |
| 392 | * returns value to be programmed in register corrresponding to data length | 392 | * returns value to be programmed in register corresponding to data length |
| 393 | * This value is effectively the log(base 2) of the length | 393 | * This value is effectively the log(base 2) of the length |
| 394 | */ | 394 | */ |
| 395 | static int get_burst_length_encode(int datalength) | 395 | static int get_burst_length_encode(int datalength) |
diff --git a/drivers/base/platform.c b/drivers/base/platform.c index 1c291af637b3..6040717b62bb 100644 --- a/drivers/base/platform.c +++ b/drivers/base/platform.c | |||
| @@ -367,7 +367,7 @@ EXPORT_SYMBOL_GPL(platform_device_unregister); | |||
| 367 | * | 367 | * |
| 368 | * Returns &struct platform_device pointer on success, or ERR_PTR() on error. | 368 | * Returns &struct platform_device pointer on success, or ERR_PTR() on error. |
| 369 | */ | 369 | */ |
| 370 | struct platform_device *__init_or_module platform_device_register_resndata( | 370 | struct platform_device *platform_device_register_resndata( |
| 371 | struct device *parent, | 371 | struct device *parent, |
| 372 | const char *name, int id, | 372 | const char *name, int id, |
| 373 | const struct resource *res, unsigned int num, | 373 | const struct resource *res, unsigned int num, |
diff --git a/drivers/base/power/clock_ops.c b/drivers/base/power/clock_ops.c index eaa8a854af03..ad367c4139b1 100644 --- a/drivers/base/power/clock_ops.c +++ b/drivers/base/power/clock_ops.c | |||
| @@ -387,7 +387,7 @@ static int pm_runtime_clk_notify(struct notifier_block *nb, | |||
| 387 | clknb = container_of(nb, struct pm_clk_notifier_block, nb); | 387 | clknb = container_of(nb, struct pm_clk_notifier_block, nb); |
| 388 | 388 | ||
| 389 | switch (action) { | 389 | switch (action) { |
| 390 | case BUS_NOTIFY_ADD_DEVICE: | 390 | case BUS_NOTIFY_BIND_DRIVER: |
| 391 | if (clknb->con_ids[0]) { | 391 | if (clknb->con_ids[0]) { |
| 392 | for (con_id = clknb->con_ids; *con_id; con_id++) | 392 | for (con_id = clknb->con_ids; *con_id; con_id++) |
| 393 | enable_clock(dev, *con_id); | 393 | enable_clock(dev, *con_id); |
| @@ -395,7 +395,7 @@ static int pm_runtime_clk_notify(struct notifier_block *nb, | |||
| 395 | enable_clock(dev, NULL); | 395 | enable_clock(dev, NULL); |
| 396 | } | 396 | } |
| 397 | break; | 397 | break; |
| 398 | case BUS_NOTIFY_DEL_DEVICE: | 398 | case BUS_NOTIFY_UNBOUND_DRIVER: |
| 399 | if (clknb->con_ids[0]) { | 399 | if (clknb->con_ids[0]) { |
| 400 | for (con_id = clknb->con_ids; *con_id; con_id++) | 400 | for (con_id = clknb->con_ids; *con_id; con_id++) |
| 401 | disable_clock(dev, *con_id); | 401 | disable_clock(dev, *con_id); |
diff --git a/drivers/base/power/main.c b/drivers/base/power/main.c index aa6320207745..06f09bf89cb2 100644 --- a/drivers/base/power/main.c +++ b/drivers/base/power/main.c | |||
| @@ -57,7 +57,8 @@ static int async_error; | |||
| 57 | */ | 57 | */ |
| 58 | void device_pm_init(struct device *dev) | 58 | void device_pm_init(struct device *dev) |
| 59 | { | 59 | { |
| 60 | dev->power.in_suspend = false; | 60 | dev->power.is_prepared = false; |
| 61 | dev->power.is_suspended = false; | ||
| 61 | init_completion(&dev->power.completion); | 62 | init_completion(&dev->power.completion); |
| 62 | complete_all(&dev->power.completion); | 63 | complete_all(&dev->power.completion); |
| 63 | dev->power.wakeup = NULL; | 64 | dev->power.wakeup = NULL; |
| @@ -91,7 +92,7 @@ void device_pm_add(struct device *dev) | |||
| 91 | pr_debug("PM: Adding info for %s:%s\n", | 92 | pr_debug("PM: Adding info for %s:%s\n", |
| 92 | dev->bus ? dev->bus->name : "No Bus", dev_name(dev)); | 93 | dev->bus ? dev->bus->name : "No Bus", dev_name(dev)); |
| 93 | mutex_lock(&dpm_list_mtx); | 94 | mutex_lock(&dpm_list_mtx); |
| 94 | if (dev->parent && dev->parent->power.in_suspend) | 95 | if (dev->parent && dev->parent->power.is_prepared) |
| 95 | dev_warn(dev, "parent %s should not be sleeping\n", | 96 | dev_warn(dev, "parent %s should not be sleeping\n", |
| 96 | dev_name(dev->parent)); | 97 | dev_name(dev->parent)); |
| 97 | list_add_tail(&dev->power.entry, &dpm_list); | 98 | list_add_tail(&dev->power.entry, &dpm_list); |
| @@ -511,7 +512,14 @@ static int device_resume(struct device *dev, pm_message_t state, bool async) | |||
| 511 | dpm_wait(dev->parent, async); | 512 | dpm_wait(dev->parent, async); |
| 512 | device_lock(dev); | 513 | device_lock(dev); |
| 513 | 514 | ||
| 514 | dev->power.in_suspend = false; | 515 | /* |
| 516 | * This is a fib. But we'll allow new children to be added below | ||
| 517 | * a resumed device, even if the device hasn't been completed yet. | ||
| 518 | */ | ||
| 519 | dev->power.is_prepared = false; | ||
| 520 | |||
| 521 | if (!dev->power.is_suspended) | ||
| 522 | goto Unlock; | ||
| 515 | 523 | ||
| 516 | if (dev->pwr_domain) { | 524 | if (dev->pwr_domain) { |
| 517 | pm_dev_dbg(dev, state, "power domain "); | 525 | pm_dev_dbg(dev, state, "power domain "); |
| @@ -548,6 +556,9 @@ static int device_resume(struct device *dev, pm_message_t state, bool async) | |||
| 548 | } | 556 | } |
| 549 | 557 | ||
| 550 | End: | 558 | End: |
| 559 | dev->power.is_suspended = false; | ||
| 560 | |||
| 561 | Unlock: | ||
| 551 | device_unlock(dev); | 562 | device_unlock(dev); |
| 552 | complete_all(&dev->power.completion); | 563 | complete_all(&dev->power.completion); |
| 553 | 564 | ||
| @@ -670,7 +681,7 @@ void dpm_complete(pm_message_t state) | |||
| 670 | struct device *dev = to_device(dpm_prepared_list.prev); | 681 | struct device *dev = to_device(dpm_prepared_list.prev); |
| 671 | 682 | ||
| 672 | get_device(dev); | 683 | get_device(dev); |
| 673 | dev->power.in_suspend = false; | 684 | dev->power.is_prepared = false; |
| 674 | list_move(&dev->power.entry, &list); | 685 | list_move(&dev->power.entry, &list); |
| 675 | mutex_unlock(&dpm_list_mtx); | 686 | mutex_unlock(&dpm_list_mtx); |
| 676 | 687 | ||
| @@ -835,11 +846,11 @@ static int __device_suspend(struct device *dev, pm_message_t state, bool async) | |||
| 835 | device_lock(dev); | 846 | device_lock(dev); |
| 836 | 847 | ||
| 837 | if (async_error) | 848 | if (async_error) |
| 838 | goto End; | 849 | goto Unlock; |
| 839 | 850 | ||
| 840 | if (pm_wakeup_pending()) { | 851 | if (pm_wakeup_pending()) { |
| 841 | async_error = -EBUSY; | 852 | async_error = -EBUSY; |
| 842 | goto End; | 853 | goto Unlock; |
| 843 | } | 854 | } |
| 844 | 855 | ||
| 845 | if (dev->pwr_domain) { | 856 | if (dev->pwr_domain) { |
| @@ -877,6 +888,9 @@ static int __device_suspend(struct device *dev, pm_message_t state, bool async) | |||
| 877 | } | 888 | } |
| 878 | 889 | ||
| 879 | End: | 890 | End: |
| 891 | dev->power.is_suspended = !error; | ||
| 892 | |||
| 893 | Unlock: | ||
| 880 | device_unlock(dev); | 894 | device_unlock(dev); |
| 881 | complete_all(&dev->power.completion); | 895 | complete_all(&dev->power.completion); |
| 882 | 896 | ||
| @@ -1042,7 +1056,7 @@ int dpm_prepare(pm_message_t state) | |||
| 1042 | put_device(dev); | 1056 | put_device(dev); |
| 1043 | break; | 1057 | break; |
| 1044 | } | 1058 | } |
| 1045 | dev->power.in_suspend = true; | 1059 | dev->power.is_prepared = true; |
| 1046 | if (!list_empty(&dev->power.entry)) | 1060 | if (!list_empty(&dev->power.entry)) |
| 1047 | list_move_tail(&dev->power.entry, &dpm_prepared_list); | 1061 | list_move_tail(&dev->power.entry, &dpm_prepared_list); |
| 1048 | put_device(dev); | 1062 | put_device(dev); |
diff --git a/drivers/connector/connector.c b/drivers/connector/connector.c index 219d88a0eeae..dde6a0fad408 100644 --- a/drivers/connector/connector.c +++ b/drivers/connector/connector.c | |||
| @@ -139,6 +139,7 @@ static int cn_call_callback(struct sk_buff *skb) | |||
| 139 | spin_unlock_bh(&dev->cbdev->queue_lock); | 139 | spin_unlock_bh(&dev->cbdev->queue_lock); |
| 140 | 140 | ||
| 141 | if (cbq != NULL) { | 141 | if (cbq != NULL) { |
| 142 | err = 0; | ||
| 142 | cbq->callback(msg, nsp); | 143 | cbq->callback(msg, nsp); |
| 143 | kfree_skb(skb); | 144 | kfree_skb(skb); |
| 144 | cn_queue_release_callback(cbq); | 145 | cn_queue_release_callback(cbq); |
diff --git a/drivers/crypto/caam/caamalg.c b/drivers/crypto/caam/caamalg.c index d0e65d6ddc77..676d957c22b0 100644 --- a/drivers/crypto/caam/caamalg.c +++ b/drivers/crypto/caam/caamalg.c | |||
| @@ -238,9 +238,9 @@ static int build_sh_desc_ipsec(struct caam_ctx *ctx) | |||
| 238 | 238 | ||
| 239 | /* build shared descriptor for this session */ | 239 | /* build shared descriptor for this session */ |
| 240 | sh_desc = kmalloc(CAAM_CMD_SZ * DESC_AEAD_SHARED_TEXT_LEN + | 240 | sh_desc = kmalloc(CAAM_CMD_SZ * DESC_AEAD_SHARED_TEXT_LEN + |
| 241 | keys_fit_inline ? | 241 | (keys_fit_inline ? |
| 242 | ctx->split_key_pad_len + ctx->enckeylen : | 242 | ctx->split_key_pad_len + ctx->enckeylen : |
| 243 | CAAM_PTR_SZ * 2, GFP_DMA | GFP_KERNEL); | 243 | CAAM_PTR_SZ * 2), GFP_DMA | GFP_KERNEL); |
| 244 | if (!sh_desc) { | 244 | if (!sh_desc) { |
| 245 | dev_err(jrdev, "could not allocate shared descriptor\n"); | 245 | dev_err(jrdev, "could not allocate shared descriptor\n"); |
| 246 | return -ENOMEM; | 246 | return -ENOMEM; |
diff --git a/drivers/firmware/google/Kconfig b/drivers/firmware/google/Kconfig index 87096b6ca5c9..2f21b0bfe653 100644 --- a/drivers/firmware/google/Kconfig +++ b/drivers/firmware/google/Kconfig | |||
| @@ -13,6 +13,7 @@ menu "Google Firmware Drivers" | |||
| 13 | config GOOGLE_SMI | 13 | config GOOGLE_SMI |
| 14 | tristate "SMI interface for Google platforms" | 14 | tristate "SMI interface for Google platforms" |
| 15 | depends on ACPI && DMI | 15 | depends on ACPI && DMI |
| 16 | select EFI | ||
| 16 | select EFI_VARS | 17 | select EFI_VARS |
| 17 | help | 18 | help |
| 18 | Say Y here if you want to enable SMI callbacks for Google | 19 | Say Y here if you want to enable SMI callbacks for Google |
diff --git a/drivers/gpu/drm/drm_gem.c b/drivers/gpu/drm/drm_gem.c index 74e4ff578017..4012fe423460 100644 --- a/drivers/gpu/drm/drm_gem.c +++ b/drivers/gpu/drm/drm_gem.c | |||
| @@ -34,6 +34,7 @@ | |||
| 34 | #include <linux/module.h> | 34 | #include <linux/module.h> |
| 35 | #include <linux/mman.h> | 35 | #include <linux/mman.h> |
| 36 | #include <linux/pagemap.h> | 36 | #include <linux/pagemap.h> |
| 37 | #include <linux/shmem_fs.h> | ||
| 37 | #include "drmP.h" | 38 | #include "drmP.h" |
| 38 | 39 | ||
| 39 | /** @file drm_gem.c | 40 | /** @file drm_gem.c |
diff --git a/drivers/gpu/drm/i915/i915_dma.c b/drivers/gpu/drm/i915/i915_dma.c index 0239e9974bf2..2b79588541e7 100644 --- a/drivers/gpu/drm/i915/i915_dma.c +++ b/drivers/gpu/drm/i915/i915_dma.c | |||
| @@ -2182,9 +2182,8 @@ int i915_driver_unload(struct drm_device *dev) | |||
| 2182 | /* Flush any outstanding unpin_work. */ | 2182 | /* Flush any outstanding unpin_work. */ |
| 2183 | flush_workqueue(dev_priv->wq); | 2183 | flush_workqueue(dev_priv->wq); |
| 2184 | 2184 | ||
| 2185 | i915_gem_free_all_phys_object(dev); | ||
| 2186 | |||
| 2187 | mutex_lock(&dev->struct_mutex); | 2185 | mutex_lock(&dev->struct_mutex); |
| 2186 | i915_gem_free_all_phys_object(dev); | ||
| 2188 | i915_gem_cleanup_ringbuffer(dev); | 2187 | i915_gem_cleanup_ringbuffer(dev); |
| 2189 | mutex_unlock(&dev->struct_mutex); | 2188 | mutex_unlock(&dev->struct_mutex); |
| 2190 | if (I915_HAS_FBC(dev) && i915_powersave) | 2189 | if (I915_HAS_FBC(dev) && i915_powersave) |
diff --git a/drivers/gpu/drm/i915/i915_drv.c b/drivers/gpu/drm/i915/i915_drv.c index 0defd4270594..609358faaa90 100644 --- a/drivers/gpu/drm/i915/i915_drv.c +++ b/drivers/gpu/drm/i915/i915_drv.c | |||
| @@ -579,6 +579,9 @@ int i915_reset(struct drm_device *dev, u8 flags) | |||
| 579 | } else switch (INTEL_INFO(dev)->gen) { | 579 | } else switch (INTEL_INFO(dev)->gen) { |
| 580 | case 6: | 580 | case 6: |
| 581 | ret = gen6_do_reset(dev, flags); | 581 | ret = gen6_do_reset(dev, flags); |
| 582 | /* If reset with a user forcewake, try to restore */ | ||
| 583 | if (atomic_read(&dev_priv->forcewake_count)) | ||
| 584 | __gen6_gt_force_wake_get(dev_priv); | ||
| 582 | break; | 585 | break; |
| 583 | case 5: | 586 | case 5: |
| 584 | ret = ironlake_do_reset(dev, flags); | 587 | ret = ironlake_do_reset(dev, flags); |
diff --git a/drivers/gpu/drm/i915/i915_drv.h b/drivers/gpu/drm/i915/i915_drv.h index f63ee162f124..eddabf68e97a 100644 --- a/drivers/gpu/drm/i915/i915_drv.h +++ b/drivers/gpu/drm/i915/i915_drv.h | |||
| @@ -211,6 +211,9 @@ struct drm_i915_display_funcs { | |||
| 211 | void (*fdi_link_train)(struct drm_crtc *crtc); | 211 | void (*fdi_link_train)(struct drm_crtc *crtc); |
| 212 | void (*init_clock_gating)(struct drm_device *dev); | 212 | void (*init_clock_gating)(struct drm_device *dev); |
| 213 | void (*init_pch_clock_gating)(struct drm_device *dev); | 213 | void (*init_pch_clock_gating)(struct drm_device *dev); |
| 214 | int (*queue_flip)(struct drm_device *dev, struct drm_crtc *crtc, | ||
| 215 | struct drm_framebuffer *fb, | ||
| 216 | struct drm_i915_gem_object *obj); | ||
| 214 | /* clock updates for mode set */ | 217 | /* clock updates for mode set */ |
| 215 | /* cursor updates */ | 218 | /* cursor updates */ |
| 216 | /* render clock increase/decrease */ | 219 | /* render clock increase/decrease */ |
diff --git a/drivers/gpu/drm/i915/i915_gem.c b/drivers/gpu/drm/i915/i915_gem.c index 94c84d744100..5c0d1247f453 100644 --- a/drivers/gpu/drm/i915/i915_gem.c +++ b/drivers/gpu/drm/i915/i915_gem.c | |||
| @@ -31,6 +31,7 @@ | |||
| 31 | #include "i915_drv.h" | 31 | #include "i915_drv.h" |
| 32 | #include "i915_trace.h" | 32 | #include "i915_trace.h" |
| 33 | #include "intel_drv.h" | 33 | #include "intel_drv.h" |
| 34 | #include <linux/shmem_fs.h> | ||
| 34 | #include <linux/slab.h> | 35 | #include <linux/slab.h> |
| 35 | #include <linux/swap.h> | 36 | #include <linux/swap.h> |
| 36 | #include <linux/pci.h> | 37 | #include <linux/pci.h> |
| @@ -359,8 +360,7 @@ i915_gem_shmem_pread_fast(struct drm_device *dev, | |||
| 359 | if ((page_offset + remain) > PAGE_SIZE) | 360 | if ((page_offset + remain) > PAGE_SIZE) |
| 360 | page_length = PAGE_SIZE - page_offset; | 361 | page_length = PAGE_SIZE - page_offset; |
| 361 | 362 | ||
| 362 | page = read_cache_page_gfp(mapping, offset >> PAGE_SHIFT, | 363 | page = shmem_read_mapping_page(mapping, offset >> PAGE_SHIFT); |
| 363 | GFP_HIGHUSER | __GFP_RECLAIMABLE); | ||
| 364 | if (IS_ERR(page)) | 364 | if (IS_ERR(page)) |
| 365 | return PTR_ERR(page); | 365 | return PTR_ERR(page); |
| 366 | 366 | ||
| @@ -463,8 +463,7 @@ i915_gem_shmem_pread_slow(struct drm_device *dev, | |||
| 463 | if ((data_page_offset + page_length) > PAGE_SIZE) | 463 | if ((data_page_offset + page_length) > PAGE_SIZE) |
| 464 | page_length = PAGE_SIZE - data_page_offset; | 464 | page_length = PAGE_SIZE - data_page_offset; |
| 465 | 465 | ||
| 466 | page = read_cache_page_gfp(mapping, offset >> PAGE_SHIFT, | 466 | page = shmem_read_mapping_page(mapping, offset >> PAGE_SHIFT); |
| 467 | GFP_HIGHUSER | __GFP_RECLAIMABLE); | ||
| 468 | if (IS_ERR(page)) { | 467 | if (IS_ERR(page)) { |
| 469 | ret = PTR_ERR(page); | 468 | ret = PTR_ERR(page); |
| 470 | goto out; | 469 | goto out; |
| @@ -797,8 +796,7 @@ i915_gem_shmem_pwrite_fast(struct drm_device *dev, | |||
| 797 | if ((page_offset + remain) > PAGE_SIZE) | 796 | if ((page_offset + remain) > PAGE_SIZE) |
| 798 | page_length = PAGE_SIZE - page_offset; | 797 | page_length = PAGE_SIZE - page_offset; |
| 799 | 798 | ||
| 800 | page = read_cache_page_gfp(mapping, offset >> PAGE_SHIFT, | 799 | page = shmem_read_mapping_page(mapping, offset >> PAGE_SHIFT); |
| 801 | GFP_HIGHUSER | __GFP_RECLAIMABLE); | ||
| 802 | if (IS_ERR(page)) | 800 | if (IS_ERR(page)) |
| 803 | return PTR_ERR(page); | 801 | return PTR_ERR(page); |
| 804 | 802 | ||
| @@ -907,8 +905,7 @@ i915_gem_shmem_pwrite_slow(struct drm_device *dev, | |||
| 907 | if ((data_page_offset + page_length) > PAGE_SIZE) | 905 | if ((data_page_offset + page_length) > PAGE_SIZE) |
| 908 | page_length = PAGE_SIZE - data_page_offset; | 906 | page_length = PAGE_SIZE - data_page_offset; |
| 909 | 907 | ||
| 910 | page = read_cache_page_gfp(mapping, offset >> PAGE_SHIFT, | 908 | page = shmem_read_mapping_page(mapping, offset >> PAGE_SHIFT); |
| 911 | GFP_HIGHUSER | __GFP_RECLAIMABLE); | ||
| 912 | if (IS_ERR(page)) { | 909 | if (IS_ERR(page)) { |
| 913 | ret = PTR_ERR(page); | 910 | ret = PTR_ERR(page); |
| 914 | goto out; | 911 | goto out; |
| @@ -1219,11 +1216,11 @@ int i915_gem_fault(struct vm_area_struct *vma, struct vm_fault *vmf) | |||
| 1219 | ret = i915_gem_object_bind_to_gtt(obj, 0, true); | 1216 | ret = i915_gem_object_bind_to_gtt(obj, 0, true); |
| 1220 | if (ret) | 1217 | if (ret) |
| 1221 | goto unlock; | 1218 | goto unlock; |
| 1222 | } | ||
| 1223 | 1219 | ||
| 1224 | ret = i915_gem_object_set_to_gtt_domain(obj, write); | 1220 | ret = i915_gem_object_set_to_gtt_domain(obj, write); |
| 1225 | if (ret) | 1221 | if (ret) |
| 1226 | goto unlock; | 1222 | goto unlock; |
| 1223 | } | ||
| 1227 | 1224 | ||
| 1228 | if (obj->tiling_mode == I915_TILING_NONE) | 1225 | if (obj->tiling_mode == I915_TILING_NONE) |
| 1229 | ret = i915_gem_object_put_fence(obj); | 1226 | ret = i915_gem_object_put_fence(obj); |
| @@ -1558,12 +1555,10 @@ i915_gem_object_get_pages_gtt(struct drm_i915_gem_object *obj, | |||
| 1558 | 1555 | ||
| 1559 | inode = obj->base.filp->f_path.dentry->d_inode; | 1556 | inode = obj->base.filp->f_path.dentry->d_inode; |
| 1560 | mapping = inode->i_mapping; | 1557 | mapping = inode->i_mapping; |
| 1558 | gfpmask |= mapping_gfp_mask(mapping); | ||
| 1559 | |||
| 1561 | for (i = 0; i < page_count; i++) { | 1560 | for (i = 0; i < page_count; i++) { |
| 1562 | page = read_cache_page_gfp(mapping, i, | 1561 | page = shmem_read_mapping_page_gfp(mapping, i, gfpmask); |
| 1563 | GFP_HIGHUSER | | ||
| 1564 | __GFP_COLD | | ||
| 1565 | __GFP_RECLAIMABLE | | ||
| 1566 | gfpmask); | ||
| 1567 | if (IS_ERR(page)) | 1562 | if (IS_ERR(page)) |
| 1568 | goto err_pages; | 1563 | goto err_pages; |
| 1569 | 1564 | ||
| @@ -1701,13 +1696,10 @@ i915_gem_object_truncate(struct drm_i915_gem_object *obj) | |||
| 1701 | /* Our goal here is to return as much of the memory as | 1696 | /* Our goal here is to return as much of the memory as |
| 1702 | * is possible back to the system as we are called from OOM. | 1697 | * is possible back to the system as we are called from OOM. |
| 1703 | * To do this we must instruct the shmfs to drop all of its | 1698 | * To do this we must instruct the shmfs to drop all of its |
| 1704 | * backing pages, *now*. Here we mirror the actions taken | 1699 | * backing pages, *now*. |
| 1705 | * when by shmem_delete_inode() to release the backing store. | ||
| 1706 | */ | 1700 | */ |
| 1707 | inode = obj->base.filp->f_path.dentry->d_inode; | 1701 | inode = obj->base.filp->f_path.dentry->d_inode; |
| 1708 | truncate_inode_pages(inode->i_mapping, 0); | 1702 | shmem_truncate_range(inode, 0, (loff_t)-1); |
| 1709 | if (inode->i_op->truncate_range) | ||
| 1710 | inode->i_op->truncate_range(inode, 0, (loff_t)-1); | ||
| 1711 | 1703 | ||
| 1712 | obj->madv = __I915_MADV_PURGED; | 1704 | obj->madv = __I915_MADV_PURGED; |
| 1713 | } | 1705 | } |
| @@ -2080,8 +2072,8 @@ i915_wait_request(struct intel_ring_buffer *ring, | |||
| 2080 | if (!ier) { | 2072 | if (!ier) { |
| 2081 | DRM_ERROR("something (likely vbetool) disabled " | 2073 | DRM_ERROR("something (likely vbetool) disabled " |
| 2082 | "interrupts, re-enabling\n"); | 2074 | "interrupts, re-enabling\n"); |
| 2083 | i915_driver_irq_preinstall(ring->dev); | 2075 | ring->dev->driver->irq_preinstall(ring->dev); |
| 2084 | i915_driver_irq_postinstall(ring->dev); | 2076 | ring->dev->driver->irq_postinstall(ring->dev); |
| 2085 | } | 2077 | } |
| 2086 | 2078 | ||
| 2087 | trace_i915_gem_request_wait_begin(ring, seqno); | 2079 | trace_i915_gem_request_wait_begin(ring, seqno); |
| @@ -2926,8 +2918,6 @@ i915_gem_object_flush_gtt_write_domain(struct drm_i915_gem_object *obj) | |||
| 2926 | */ | 2918 | */ |
| 2927 | wmb(); | 2919 | wmb(); |
| 2928 | 2920 | ||
| 2929 | i915_gem_release_mmap(obj); | ||
| 2930 | |||
| 2931 | old_write_domain = obj->base.write_domain; | 2921 | old_write_domain = obj->base.write_domain; |
| 2932 | obj->base.write_domain = 0; | 2922 | obj->base.write_domain = 0; |
| 2933 | 2923 | ||
| @@ -3567,6 +3557,7 @@ struct drm_i915_gem_object *i915_gem_alloc_object(struct drm_device *dev, | |||
| 3567 | { | 3557 | { |
| 3568 | struct drm_i915_private *dev_priv = dev->dev_private; | 3558 | struct drm_i915_private *dev_priv = dev->dev_private; |
| 3569 | struct drm_i915_gem_object *obj; | 3559 | struct drm_i915_gem_object *obj; |
| 3560 | struct address_space *mapping; | ||
| 3570 | 3561 | ||
| 3571 | obj = kzalloc(sizeof(*obj), GFP_KERNEL); | 3562 | obj = kzalloc(sizeof(*obj), GFP_KERNEL); |
| 3572 | if (obj == NULL) | 3563 | if (obj == NULL) |
| @@ -3577,6 +3568,9 @@ struct drm_i915_gem_object *i915_gem_alloc_object(struct drm_device *dev, | |||
| 3577 | return NULL; | 3568 | return NULL; |
| 3578 | } | 3569 | } |
| 3579 | 3570 | ||
| 3571 | mapping = obj->base.filp->f_path.dentry->d_inode->i_mapping; | ||
| 3572 | mapping_set_gfp_mask(mapping, GFP_HIGHUSER | __GFP_RECLAIMABLE); | ||
| 3573 | |||
| 3580 | i915_gem_info_add_obj(dev_priv, size); | 3574 | i915_gem_info_add_obj(dev_priv, size); |
| 3581 | 3575 | ||
| 3582 | obj->base.write_domain = I915_GEM_DOMAIN_CPU; | 3576 | obj->base.write_domain = I915_GEM_DOMAIN_CPU; |
| @@ -3952,8 +3946,7 @@ void i915_gem_detach_phys_object(struct drm_device *dev, | |||
| 3952 | 3946 | ||
| 3953 | page_count = obj->base.size / PAGE_SIZE; | 3947 | page_count = obj->base.size / PAGE_SIZE; |
| 3954 | for (i = 0; i < page_count; i++) { | 3948 | for (i = 0; i < page_count; i++) { |
| 3955 | struct page *page = read_cache_page_gfp(mapping, i, | 3949 | struct page *page = shmem_read_mapping_page(mapping, i); |
| 3956 | GFP_HIGHUSER | __GFP_RECLAIMABLE); | ||
| 3957 | if (!IS_ERR(page)) { | 3950 | if (!IS_ERR(page)) { |
| 3958 | char *dst = kmap_atomic(page); | 3951 | char *dst = kmap_atomic(page); |
| 3959 | memcpy(dst, vaddr + i*PAGE_SIZE, PAGE_SIZE); | 3952 | memcpy(dst, vaddr + i*PAGE_SIZE, PAGE_SIZE); |
| @@ -4014,8 +4007,7 @@ i915_gem_attach_phys_object(struct drm_device *dev, | |||
| 4014 | struct page *page; | 4007 | struct page *page; |
| 4015 | char *dst, *src; | 4008 | char *dst, *src; |
| 4016 | 4009 | ||
| 4017 | page = read_cache_page_gfp(mapping, i, | 4010 | page = shmem_read_mapping_page(mapping, i); |
| 4018 | GFP_HIGHUSER | __GFP_RECLAIMABLE); | ||
| 4019 | if (IS_ERR(page)) | 4011 | if (IS_ERR(page)) |
| 4020 | return PTR_ERR(page); | 4012 | return PTR_ERR(page); |
| 4021 | 4013 | ||
diff --git a/drivers/gpu/drm/i915/i915_gem_execbuffer.c b/drivers/gpu/drm/i915/i915_gem_execbuffer.c index 20a4cc5b818f..4934cf84c320 100644 --- a/drivers/gpu/drm/i915/i915_gem_execbuffer.c +++ b/drivers/gpu/drm/i915/i915_gem_execbuffer.c | |||
| @@ -187,10 +187,6 @@ i915_gem_object_set_to_gpu_domain(struct drm_i915_gem_object *obj, | |||
| 187 | if ((flush_domains | invalidate_domains) & I915_GEM_DOMAIN_CPU) | 187 | if ((flush_domains | invalidate_domains) & I915_GEM_DOMAIN_CPU) |
| 188 | i915_gem_clflush_object(obj); | 188 | i915_gem_clflush_object(obj); |
| 189 | 189 | ||
| 190 | /* blow away mappings if mapped through GTT */ | ||
| 191 | if ((flush_domains | invalidate_domains) & I915_GEM_DOMAIN_GTT) | ||
| 192 | i915_gem_release_mmap(obj); | ||
| 193 | |||
| 194 | if (obj->base.pending_write_domain) | 190 | if (obj->base.pending_write_domain) |
| 195 | cd->flips |= atomic_read(&obj->pending_flip); | 191 | cd->flips |= atomic_read(&obj->pending_flip); |
| 196 | 192 | ||
diff --git a/drivers/gpu/drm/i915/i915_irq.c b/drivers/gpu/drm/i915/i915_irq.c index 9e34a1abeb61..ae2b49969b99 100644 --- a/drivers/gpu/drm/i915/i915_irq.c +++ b/drivers/gpu/drm/i915/i915_irq.c | |||
| @@ -1749,6 +1749,7 @@ void ironlake_irq_preinstall(struct drm_device *dev) | |||
| 1749 | * happens. | 1749 | * happens. |
| 1750 | */ | 1750 | */ |
| 1751 | I915_WRITE(GEN6_BLITTER_HWSTAM, ~GEN6_BLITTER_USER_INTERRUPT); | 1751 | I915_WRITE(GEN6_BLITTER_HWSTAM, ~GEN6_BLITTER_USER_INTERRUPT); |
| 1752 | I915_WRITE(GEN6_BSD_HWSTAM, ~GEN6_BSD_USER_INTERRUPT); | ||
| 1752 | } | 1753 | } |
| 1753 | 1754 | ||
| 1754 | /* XXX hotplug from PCH */ | 1755 | /* XXX hotplug from PCH */ |
diff --git a/drivers/gpu/drm/i915/i915_reg.h b/drivers/gpu/drm/i915/i915_reg.h index 2f967af8e62e..5d5def756c9e 100644 --- a/drivers/gpu/drm/i915/i915_reg.h +++ b/drivers/gpu/drm/i915/i915_reg.h | |||
| @@ -531,6 +531,7 @@ | |||
| 531 | #define GEN6_BSD_SLEEP_PSMI_CONTROL_RC_ILDL_MESSAGE_ENABLE 0 | 531 | #define GEN6_BSD_SLEEP_PSMI_CONTROL_RC_ILDL_MESSAGE_ENABLE 0 |
| 532 | #define GEN6_BSD_SLEEP_PSMI_CONTROL_IDLE_INDICATOR (1 << 3) | 532 | #define GEN6_BSD_SLEEP_PSMI_CONTROL_IDLE_INDICATOR (1 << 3) |
| 533 | 533 | ||
| 534 | #define GEN6_BSD_HWSTAM 0x12098 | ||
| 534 | #define GEN6_BSD_IMR 0x120a8 | 535 | #define GEN6_BSD_IMR 0x120a8 |
| 535 | #define GEN6_BSD_USER_INTERRUPT (1 << 12) | 536 | #define GEN6_BSD_USER_INTERRUPT (1 << 12) |
| 536 | 537 | ||
diff --git a/drivers/gpu/drm/i915/i915_suspend.c b/drivers/gpu/drm/i915/i915_suspend.c index 60a94d2b5264..e8152d23d5b6 100644 --- a/drivers/gpu/drm/i915/i915_suspend.c +++ b/drivers/gpu/drm/i915/i915_suspend.c | |||
| @@ -678,6 +678,7 @@ void i915_save_display(struct drm_device *dev) | |||
| 678 | } | 678 | } |
| 679 | 679 | ||
| 680 | /* VGA state */ | 680 | /* VGA state */ |
| 681 | mutex_lock(&dev->struct_mutex); | ||
| 681 | dev_priv->saveVGA0 = I915_READ(VGA0); | 682 | dev_priv->saveVGA0 = I915_READ(VGA0); |
| 682 | dev_priv->saveVGA1 = I915_READ(VGA1); | 683 | dev_priv->saveVGA1 = I915_READ(VGA1); |
| 683 | dev_priv->saveVGA_PD = I915_READ(VGA_PD); | 684 | dev_priv->saveVGA_PD = I915_READ(VGA_PD); |
| @@ -687,6 +688,7 @@ void i915_save_display(struct drm_device *dev) | |||
| 687 | dev_priv->saveVGACNTRL = I915_READ(VGACNTRL); | 688 | dev_priv->saveVGACNTRL = I915_READ(VGACNTRL); |
| 688 | 689 | ||
| 689 | i915_save_vga(dev); | 690 | i915_save_vga(dev); |
| 691 | mutex_unlock(&dev->struct_mutex); | ||
| 690 | } | 692 | } |
| 691 | 693 | ||
| 692 | void i915_restore_display(struct drm_device *dev) | 694 | void i915_restore_display(struct drm_device *dev) |
| @@ -780,6 +782,8 @@ void i915_restore_display(struct drm_device *dev) | |||
| 780 | I915_WRITE(CPU_VGACNTRL, dev_priv->saveVGACNTRL); | 782 | I915_WRITE(CPU_VGACNTRL, dev_priv->saveVGACNTRL); |
| 781 | else | 783 | else |
| 782 | I915_WRITE(VGACNTRL, dev_priv->saveVGACNTRL); | 784 | I915_WRITE(VGACNTRL, dev_priv->saveVGACNTRL); |
| 785 | |||
| 786 | mutex_lock(&dev->struct_mutex); | ||
| 783 | I915_WRITE(VGA0, dev_priv->saveVGA0); | 787 | I915_WRITE(VGA0, dev_priv->saveVGA0); |
| 784 | I915_WRITE(VGA1, dev_priv->saveVGA1); | 788 | I915_WRITE(VGA1, dev_priv->saveVGA1); |
| 785 | I915_WRITE(VGA_PD, dev_priv->saveVGA_PD); | 789 | I915_WRITE(VGA_PD, dev_priv->saveVGA_PD); |
| @@ -787,6 +791,7 @@ void i915_restore_display(struct drm_device *dev) | |||
| 787 | udelay(150); | 791 | udelay(150); |
| 788 | 792 | ||
| 789 | i915_restore_vga(dev); | 793 | i915_restore_vga(dev); |
| 794 | mutex_unlock(&dev->struct_mutex); | ||
| 790 | } | 795 | } |
| 791 | 796 | ||
| 792 | int i915_save_state(struct drm_device *dev) | 797 | int i915_save_state(struct drm_device *dev) |
diff --git a/drivers/gpu/drm/i915/intel_display.c b/drivers/gpu/drm/i915/intel_display.c index 81a9059b6a94..21b6f93fe919 100644 --- a/drivers/gpu/drm/i915/intel_display.c +++ b/drivers/gpu/drm/i915/intel_display.c | |||
| @@ -4687,6 +4687,7 @@ static int i9xx_crtc_mode_set(struct drm_crtc *crtc, | |||
| 4687 | 4687 | ||
| 4688 | I915_WRITE(DSPCNTR(plane), dspcntr); | 4688 | I915_WRITE(DSPCNTR(plane), dspcntr); |
| 4689 | POSTING_READ(DSPCNTR(plane)); | 4689 | POSTING_READ(DSPCNTR(plane)); |
| 4690 | intel_enable_plane(dev_priv, plane, pipe); | ||
| 4690 | 4691 | ||
| 4691 | ret = intel_pipe_set_base(crtc, x, y, old_fb); | 4692 | ret = intel_pipe_set_base(crtc, x, y, old_fb); |
| 4692 | 4693 | ||
| @@ -5217,8 +5218,6 @@ static int ironlake_crtc_mode_set(struct drm_crtc *crtc, | |||
| 5217 | 5218 | ||
| 5218 | I915_WRITE(DSPCNTR(plane), dspcntr); | 5219 | I915_WRITE(DSPCNTR(plane), dspcntr); |
| 5219 | POSTING_READ(DSPCNTR(plane)); | 5220 | POSTING_READ(DSPCNTR(plane)); |
| 5220 | if (!HAS_PCH_SPLIT(dev)) | ||
| 5221 | intel_enable_plane(dev_priv, plane, pipe); | ||
| 5222 | 5221 | ||
| 5223 | ret = intel_pipe_set_base(crtc, x, y, old_fb); | 5222 | ret = intel_pipe_set_base(crtc, x, y, old_fb); |
| 5224 | 5223 | ||
| @@ -6262,6 +6261,197 @@ void intel_prepare_page_flip(struct drm_device *dev, int plane) | |||
| 6262 | spin_unlock_irqrestore(&dev->event_lock, flags); | 6261 | spin_unlock_irqrestore(&dev->event_lock, flags); |
| 6263 | } | 6262 | } |
| 6264 | 6263 | ||
| 6264 | static int intel_gen2_queue_flip(struct drm_device *dev, | ||
| 6265 | struct drm_crtc *crtc, | ||
| 6266 | struct drm_framebuffer *fb, | ||
| 6267 | struct drm_i915_gem_object *obj) | ||
| 6268 | { | ||
| 6269 | struct drm_i915_private *dev_priv = dev->dev_private; | ||
| 6270 | struct intel_crtc *intel_crtc = to_intel_crtc(crtc); | ||
| 6271 | unsigned long offset; | ||
| 6272 | u32 flip_mask; | ||
| 6273 | int ret; | ||
| 6274 | |||
| 6275 | ret = intel_pin_and_fence_fb_obj(dev, obj, LP_RING(dev_priv)); | ||
| 6276 | if (ret) | ||
| 6277 | goto out; | ||
| 6278 | |||
| 6279 | /* Offset into the new buffer for cases of shared fbs between CRTCs */ | ||
| 6280 | offset = crtc->y * fb->pitch + crtc->x * fb->bits_per_pixel/8; | ||
| 6281 | |||
| 6282 | ret = BEGIN_LP_RING(6); | ||
| 6283 | if (ret) | ||
| 6284 | goto out; | ||
| 6285 | |||
| 6286 | /* Can't queue multiple flips, so wait for the previous | ||
| 6287 | * one to finish before executing the next. | ||
| 6288 | */ | ||
| 6289 | if (intel_crtc->plane) | ||
| 6290 | flip_mask = MI_WAIT_FOR_PLANE_B_FLIP; | ||
| 6291 | else | ||
| 6292 | flip_mask = MI_WAIT_FOR_PLANE_A_FLIP; | ||
| 6293 | OUT_RING(MI_WAIT_FOR_EVENT | flip_mask); | ||
| 6294 | OUT_RING(MI_NOOP); | ||
| 6295 | OUT_RING(MI_DISPLAY_FLIP | | ||
| 6296 | MI_DISPLAY_FLIP_PLANE(intel_crtc->plane)); | ||
| 6297 | OUT_RING(fb->pitch); | ||
| 6298 | OUT_RING(obj->gtt_offset + offset); | ||
| 6299 | OUT_RING(MI_NOOP); | ||
| 6300 | ADVANCE_LP_RING(); | ||
| 6301 | out: | ||
| 6302 | return ret; | ||
| 6303 | } | ||
| 6304 | |||
| 6305 | static int intel_gen3_queue_flip(struct drm_device *dev, | ||
| 6306 | struct drm_crtc *crtc, | ||
| 6307 | struct drm_framebuffer *fb, | ||
| 6308 | struct drm_i915_gem_object *obj) | ||
| 6309 | { | ||
| 6310 | struct drm_i915_private *dev_priv = dev->dev_private; | ||
| 6311 | struct intel_crtc *intel_crtc = to_intel_crtc(crtc); | ||
| 6312 | unsigned long offset; | ||
| 6313 | u32 flip_mask; | ||
| 6314 | int ret; | ||
| 6315 | |||
| 6316 | ret = intel_pin_and_fence_fb_obj(dev, obj, LP_RING(dev_priv)); | ||
| 6317 | if (ret) | ||
| 6318 | goto out; | ||
| 6319 | |||
| 6320 | /* Offset into the new buffer for cases of shared fbs between CRTCs */ | ||
| 6321 | offset = crtc->y * fb->pitch + crtc->x * fb->bits_per_pixel/8; | ||
| 6322 | |||
| 6323 | ret = BEGIN_LP_RING(6); | ||
| 6324 | if (ret) | ||
| 6325 | goto out; | ||
| 6326 | |||
| 6327 | if (intel_crtc->plane) | ||
| 6328 | flip_mask = MI_WAIT_FOR_PLANE_B_FLIP; | ||
| 6329 | else | ||
| 6330 | flip_mask = MI_WAIT_FOR_PLANE_A_FLIP; | ||
| 6331 | OUT_RING(MI_WAIT_FOR_EVENT | flip_mask); | ||
| 6332 | OUT_RING(MI_NOOP); | ||
| 6333 | OUT_RING(MI_DISPLAY_FLIP_I915 | | ||
| 6334 | MI_DISPLAY_FLIP_PLANE(intel_crtc->plane)); | ||
| 6335 | OUT_RING(fb->pitch); | ||
| 6336 | OUT_RING(obj->gtt_offset + offset); | ||
| 6337 | OUT_RING(MI_NOOP); | ||
| 6338 | |||
| 6339 | ADVANCE_LP_RING(); | ||
| 6340 | out: | ||
| 6341 | return ret; | ||
| 6342 | } | ||
| 6343 | |||
| 6344 | static int intel_gen4_queue_flip(struct drm_device *dev, | ||
| 6345 | struct drm_crtc *crtc, | ||
| 6346 | struct drm_framebuffer *fb, | ||
| 6347 | struct drm_i915_gem_object *obj) | ||
| 6348 | { | ||
| 6349 | struct drm_i915_private *dev_priv = dev->dev_private; | ||
| 6350 | struct intel_crtc *intel_crtc = to_intel_crtc(crtc); | ||
| 6351 | uint32_t pf, pipesrc; | ||
| 6352 | int ret; | ||
| 6353 | |||
| 6354 | ret = intel_pin_and_fence_fb_obj(dev, obj, LP_RING(dev_priv)); | ||
| 6355 | if (ret) | ||
| 6356 | goto out; | ||
| 6357 | |||
| 6358 | ret = BEGIN_LP_RING(4); | ||
| 6359 | if (ret) | ||
| 6360 | goto out; | ||
| 6361 | |||
| 6362 | /* i965+ uses the linear or tiled offsets from the | ||
| 6363 | * Display Registers (which do not change across a page-flip) | ||
| 6364 | * so we need only reprogram the base address. | ||
| 6365 | */ | ||
| 6366 | OUT_RING(MI_DISPLAY_FLIP | | ||
| 6367 | MI_DISPLAY_FLIP_PLANE(intel_crtc->plane)); | ||
| 6368 | OUT_RING(fb->pitch); | ||
| 6369 | OUT_RING(obj->gtt_offset | obj->tiling_mode); | ||
| 6370 | |||
| 6371 | /* XXX Enabling the panel-fitter across page-flip is so far | ||
| 6372 | * untested on non-native modes, so ignore it for now. | ||
| 6373 | * pf = I915_READ(pipe == 0 ? PFA_CTL_1 : PFB_CTL_1) & PF_ENABLE; | ||
| 6374 | */ | ||
| 6375 | pf = 0; | ||
| 6376 | pipesrc = I915_READ(PIPESRC(intel_crtc->pipe)) & 0x0fff0fff; | ||
| 6377 | OUT_RING(pf | pipesrc); | ||
| 6378 | ADVANCE_LP_RING(); | ||
| 6379 | out: | ||
| 6380 | return ret; | ||
| 6381 | } | ||
| 6382 | |||
| 6383 | static int intel_gen6_queue_flip(struct drm_device *dev, | ||
| 6384 | struct drm_crtc *crtc, | ||
| 6385 | struct drm_framebuffer *fb, | ||
| 6386 | struct drm_i915_gem_object *obj) | ||
| 6387 | { | ||
| 6388 | struct drm_i915_private *dev_priv = dev->dev_private; | ||
| 6389 | struct intel_crtc *intel_crtc = to_intel_crtc(crtc); | ||
| 6390 | uint32_t pf, pipesrc; | ||
| 6391 | int ret; | ||
| 6392 | |||
| 6393 | ret = intel_pin_and_fence_fb_obj(dev, obj, LP_RING(dev_priv)); | ||
| 6394 | if (ret) | ||
| 6395 | goto out; | ||
| 6396 | |||
| 6397 | ret = BEGIN_LP_RING(4); | ||
| 6398 | if (ret) | ||
| 6399 | goto out; | ||
| 6400 | |||
| 6401 | OUT_RING(MI_DISPLAY_FLIP | | ||
| 6402 | MI_DISPLAY_FLIP_PLANE(intel_crtc->plane)); | ||
| 6403 | OUT_RING(fb->pitch | obj->tiling_mode); | ||
| 6404 | OUT_RING(obj->gtt_offset); | ||
| 6405 | |||
| 6406 | pf = I915_READ(PF_CTL(intel_crtc->pipe)) & PF_ENABLE; | ||
| 6407 | pipesrc = I915_READ(PIPESRC(intel_crtc->pipe)) & 0x0fff0fff; | ||
| 6408 | OUT_RING(pf | pipesrc); | ||
| 6409 | ADVANCE_LP_RING(); | ||
| 6410 | out: | ||
| 6411 | return ret; | ||
| 6412 | } | ||
| 6413 | |||
| 6414 | /* | ||
| 6415 | * On gen7 we currently use the blit ring because (in early silicon at least) | ||
| 6416 | * the render ring doesn't give us interrpts for page flip completion, which | ||
| 6417 | * means clients will hang after the first flip is queued. Fortunately the | ||
| 6418 | * blit ring generates interrupts properly, so use it instead. | ||
| 6419 | */ | ||
| 6420 | static int intel_gen7_queue_flip(struct drm_device *dev, | ||
| 6421 | struct drm_crtc *crtc, | ||
| 6422 | struct drm_framebuffer *fb, | ||
| 6423 | struct drm_i915_gem_object *obj) | ||
| 6424 | { | ||
| 6425 | struct drm_i915_private *dev_priv = dev->dev_private; | ||
| 6426 | struct intel_crtc *intel_crtc = to_intel_crtc(crtc); | ||
| 6427 | struct intel_ring_buffer *ring = &dev_priv->ring[BCS]; | ||
| 6428 | int ret; | ||
| 6429 | |||
| 6430 | ret = intel_pin_and_fence_fb_obj(dev, obj, ring); | ||
| 6431 | if (ret) | ||
| 6432 | goto out; | ||
| 6433 | |||
| 6434 | ret = intel_ring_begin(ring, 4); | ||
| 6435 | if (ret) | ||
| 6436 | goto out; | ||
| 6437 | |||
| 6438 | intel_ring_emit(ring, MI_DISPLAY_FLIP_I915 | (intel_crtc->plane << 19)); | ||
| 6439 | intel_ring_emit(ring, (fb->pitch | obj->tiling_mode)); | ||
| 6440 | intel_ring_emit(ring, (obj->gtt_offset)); | ||
| 6441 | intel_ring_emit(ring, (MI_NOOP)); | ||
| 6442 | intel_ring_advance(ring); | ||
| 6443 | out: | ||
| 6444 | return ret; | ||
| 6445 | } | ||
| 6446 | |||
| 6447 | static int intel_default_queue_flip(struct drm_device *dev, | ||
| 6448 | struct drm_crtc *crtc, | ||
| 6449 | struct drm_framebuffer *fb, | ||
| 6450 | struct drm_i915_gem_object *obj) | ||
| 6451 | { | ||
| 6452 | return -ENODEV; | ||
| 6453 | } | ||
| 6454 | |||
| 6265 | static int intel_crtc_page_flip(struct drm_crtc *crtc, | 6455 | static int intel_crtc_page_flip(struct drm_crtc *crtc, |
| 6266 | struct drm_framebuffer *fb, | 6456 | struct drm_framebuffer *fb, |
| 6267 | struct drm_pending_vblank_event *event) | 6457 | struct drm_pending_vblank_event *event) |
| @@ -6272,9 +6462,7 @@ static int intel_crtc_page_flip(struct drm_crtc *crtc, | |||
| 6272 | struct drm_i915_gem_object *obj; | 6462 | struct drm_i915_gem_object *obj; |
| 6273 | struct intel_crtc *intel_crtc = to_intel_crtc(crtc); | 6463 | struct intel_crtc *intel_crtc = to_intel_crtc(crtc); |
| 6274 | struct intel_unpin_work *work; | 6464 | struct intel_unpin_work *work; |
| 6275 | unsigned long flags, offset; | 6465 | unsigned long flags; |
| 6276 | int pipe = intel_crtc->pipe; | ||
| 6277 | u32 pf, pipesrc; | ||
| 6278 | int ret; | 6466 | int ret; |
| 6279 | 6467 | ||
| 6280 | work = kzalloc(sizeof *work, GFP_KERNEL); | 6468 | work = kzalloc(sizeof *work, GFP_KERNEL); |
| @@ -6303,9 +6491,6 @@ static int intel_crtc_page_flip(struct drm_crtc *crtc, | |||
| 6303 | obj = intel_fb->obj; | 6491 | obj = intel_fb->obj; |
| 6304 | 6492 | ||
| 6305 | mutex_lock(&dev->struct_mutex); | 6493 | mutex_lock(&dev->struct_mutex); |
| 6306 | ret = intel_pin_and_fence_fb_obj(dev, obj, LP_RING(dev_priv)); | ||
| 6307 | if (ret) | ||
| 6308 | goto cleanup_work; | ||
| 6309 | 6494 | ||
| 6310 | /* Reference the objects for the scheduled work. */ | 6495 | /* Reference the objects for the scheduled work. */ |
| 6311 | drm_gem_object_reference(&work->old_fb_obj->base); | 6496 | drm_gem_object_reference(&work->old_fb_obj->base); |
| @@ -6317,91 +6502,18 @@ static int intel_crtc_page_flip(struct drm_crtc *crtc, | |||
| 6317 | if (ret) | 6502 | if (ret) |
| 6318 | goto cleanup_objs; | 6503 | goto cleanup_objs; |
| 6319 | 6504 | ||
| 6320 | if (IS_GEN3(dev) || IS_GEN2(dev)) { | ||
| 6321 | u32 flip_mask; | ||
| 6322 | |||
| 6323 | /* Can't queue multiple flips, so wait for the previous | ||
| 6324 | * one to finish before executing the next. | ||
| 6325 | */ | ||
| 6326 | ret = BEGIN_LP_RING(2); | ||
| 6327 | if (ret) | ||
| 6328 | goto cleanup_objs; | ||
| 6329 | |||
| 6330 | if (intel_crtc->plane) | ||
| 6331 | flip_mask = MI_WAIT_FOR_PLANE_B_FLIP; | ||
| 6332 | else | ||
| 6333 | flip_mask = MI_WAIT_FOR_PLANE_A_FLIP; | ||
| 6334 | OUT_RING(MI_WAIT_FOR_EVENT | flip_mask); | ||
| 6335 | OUT_RING(MI_NOOP); | ||
| 6336 | ADVANCE_LP_RING(); | ||
| 6337 | } | ||
| 6338 | |||
| 6339 | work->pending_flip_obj = obj; | 6505 | work->pending_flip_obj = obj; |
| 6340 | 6506 | ||
| 6341 | work->enable_stall_check = true; | 6507 | work->enable_stall_check = true; |
| 6342 | 6508 | ||
| 6343 | /* Offset into the new buffer for cases of shared fbs between CRTCs */ | ||
| 6344 | offset = crtc->y * fb->pitch + crtc->x * fb->bits_per_pixel/8; | ||
| 6345 | |||
| 6346 | ret = BEGIN_LP_RING(4); | ||
| 6347 | if (ret) | ||
| 6348 | goto cleanup_objs; | ||
| 6349 | |||
| 6350 | /* Block clients from rendering to the new back buffer until | 6509 | /* Block clients from rendering to the new back buffer until |
| 6351 | * the flip occurs and the object is no longer visible. | 6510 | * the flip occurs and the object is no longer visible. |
| 6352 | */ | 6511 | */ |
| 6353 | atomic_add(1 << intel_crtc->plane, &work->old_fb_obj->pending_flip); | 6512 | atomic_add(1 << intel_crtc->plane, &work->old_fb_obj->pending_flip); |
| 6354 | 6513 | ||
| 6355 | switch (INTEL_INFO(dev)->gen) { | 6514 | ret = dev_priv->display.queue_flip(dev, crtc, fb, obj); |
| 6356 | case 2: | 6515 | if (ret) |
| 6357 | OUT_RING(MI_DISPLAY_FLIP | | 6516 | goto cleanup_pending; |
| 6358 | MI_DISPLAY_FLIP_PLANE(intel_crtc->plane)); | ||
| 6359 | OUT_RING(fb->pitch); | ||
| 6360 | OUT_RING(obj->gtt_offset + offset); | ||
| 6361 | OUT_RING(MI_NOOP); | ||
| 6362 | break; | ||
| 6363 | |||
| 6364 | case 3: | ||
| 6365 | OUT_RING(MI_DISPLAY_FLIP_I915 | | ||
| 6366 | MI_DISPLAY_FLIP_PLANE(intel_crtc->plane)); | ||
| 6367 | OUT_RING(fb->pitch); | ||
| 6368 | OUT_RING(obj->gtt_offset + offset); | ||
| 6369 | OUT_RING(MI_NOOP); | ||
| 6370 | break; | ||
| 6371 | |||
| 6372 | case 4: | ||
| 6373 | case 5: | ||
| 6374 | /* i965+ uses the linear or tiled offsets from the | ||
| 6375 | * Display Registers (which do not change across a page-flip) | ||
| 6376 | * so we need only reprogram the base address. | ||
| 6377 | */ | ||
| 6378 | OUT_RING(MI_DISPLAY_FLIP | | ||
| 6379 | MI_DISPLAY_FLIP_PLANE(intel_crtc->plane)); | ||
| 6380 | OUT_RING(fb->pitch); | ||
| 6381 | OUT_RING(obj->gtt_offset | obj->tiling_mode); | ||
| 6382 | |||
| 6383 | /* XXX Enabling the panel-fitter across page-flip is so far | ||
| 6384 | * untested on non-native modes, so ignore it for now. | ||
| 6385 | * pf = I915_READ(pipe == 0 ? PFA_CTL_1 : PFB_CTL_1) & PF_ENABLE; | ||
| 6386 | */ | ||
| 6387 | pf = 0; | ||
| 6388 | pipesrc = I915_READ(PIPESRC(pipe)) & 0x0fff0fff; | ||
| 6389 | OUT_RING(pf | pipesrc); | ||
| 6390 | break; | ||
| 6391 | |||
| 6392 | case 6: | ||
| 6393 | case 7: | ||
| 6394 | OUT_RING(MI_DISPLAY_FLIP | | ||
| 6395 | MI_DISPLAY_FLIP_PLANE(intel_crtc->plane)); | ||
| 6396 | OUT_RING(fb->pitch | obj->tiling_mode); | ||
| 6397 | OUT_RING(obj->gtt_offset); | ||
| 6398 | |||
| 6399 | pf = I915_READ(PF_CTL(pipe)) & PF_ENABLE; | ||
| 6400 | pipesrc = I915_READ(PIPESRC(pipe)) & 0x0fff0fff; | ||
| 6401 | OUT_RING(pf | pipesrc); | ||
| 6402 | break; | ||
| 6403 | } | ||
| 6404 | ADVANCE_LP_RING(); | ||
| 6405 | 6517 | ||
| 6406 | mutex_unlock(&dev->struct_mutex); | 6518 | mutex_unlock(&dev->struct_mutex); |
| 6407 | 6519 | ||
| @@ -6409,10 +6521,11 @@ static int intel_crtc_page_flip(struct drm_crtc *crtc, | |||
| 6409 | 6521 | ||
| 6410 | return 0; | 6522 | return 0; |
| 6411 | 6523 | ||
| 6524 | cleanup_pending: | ||
| 6525 | atomic_sub(1 << intel_crtc->plane, &work->old_fb_obj->pending_flip); | ||
| 6412 | cleanup_objs: | 6526 | cleanup_objs: |
| 6413 | drm_gem_object_unreference(&work->old_fb_obj->base); | 6527 | drm_gem_object_unreference(&work->old_fb_obj->base); |
| 6414 | drm_gem_object_unreference(&obj->base); | 6528 | drm_gem_object_unreference(&obj->base); |
| 6415 | cleanup_work: | ||
| 6416 | mutex_unlock(&dev->struct_mutex); | 6529 | mutex_unlock(&dev->struct_mutex); |
| 6417 | 6530 | ||
| 6418 | spin_lock_irqsave(&dev->event_lock, flags); | 6531 | spin_lock_irqsave(&dev->event_lock, flags); |
| @@ -7657,6 +7770,31 @@ static void intel_init_display(struct drm_device *dev) | |||
| 7657 | else | 7770 | else |
| 7658 | dev_priv->display.get_fifo_size = i830_get_fifo_size; | 7771 | dev_priv->display.get_fifo_size = i830_get_fifo_size; |
| 7659 | } | 7772 | } |
| 7773 | |||
| 7774 | /* Default just returns -ENODEV to indicate unsupported */ | ||
| 7775 | dev_priv->display.queue_flip = intel_default_queue_flip; | ||
| 7776 | |||
| 7777 | switch (INTEL_INFO(dev)->gen) { | ||
| 7778 | case 2: | ||
| 7779 | dev_priv->display.queue_flip = intel_gen2_queue_flip; | ||
| 7780 | break; | ||
| 7781 | |||
| 7782 | case 3: | ||
| 7783 | dev_priv->display.queue_flip = intel_gen3_queue_flip; | ||
| 7784 | break; | ||
| 7785 | |||
| 7786 | case 4: | ||
| 7787 | case 5: | ||
| 7788 | dev_priv->display.queue_flip = intel_gen4_queue_flip; | ||
| 7789 | break; | ||
| 7790 | |||
| 7791 | case 6: | ||
| 7792 | dev_priv->display.queue_flip = intel_gen6_queue_flip; | ||
| 7793 | break; | ||
| 7794 | case 7: | ||
| 7795 | dev_priv->display.queue_flip = intel_gen7_queue_flip; | ||
| 7796 | break; | ||
| 7797 | } | ||
| 7660 | } | 7798 | } |
| 7661 | 7799 | ||
| 7662 | /* | 7800 | /* |
diff --git a/drivers/gpu/drm/i915/intel_overlay.c b/drivers/gpu/drm/i915/intel_overlay.c index a670c006982e..56a8e2aea19c 100644 --- a/drivers/gpu/drm/i915/intel_overlay.c +++ b/drivers/gpu/drm/i915/intel_overlay.c | |||
| @@ -1416,6 +1416,8 @@ void intel_setup_overlay(struct drm_device *dev) | |||
| 1416 | goto out_free; | 1416 | goto out_free; |
| 1417 | overlay->reg_bo = reg_bo; | 1417 | overlay->reg_bo = reg_bo; |
| 1418 | 1418 | ||
| 1419 | mutex_lock(&dev->struct_mutex); | ||
| 1420 | |||
| 1419 | if (OVERLAY_NEEDS_PHYSICAL(dev)) { | 1421 | if (OVERLAY_NEEDS_PHYSICAL(dev)) { |
| 1420 | ret = i915_gem_attach_phys_object(dev, reg_bo, | 1422 | ret = i915_gem_attach_phys_object(dev, reg_bo, |
| 1421 | I915_GEM_PHYS_OVERLAY_REGS, | 1423 | I915_GEM_PHYS_OVERLAY_REGS, |
| @@ -1440,6 +1442,8 @@ void intel_setup_overlay(struct drm_device *dev) | |||
| 1440 | } | 1442 | } |
| 1441 | } | 1443 | } |
| 1442 | 1444 | ||
| 1445 | mutex_unlock(&dev->struct_mutex); | ||
| 1446 | |||
| 1443 | /* init all values */ | 1447 | /* init all values */ |
| 1444 | overlay->color_key = 0x0101fe; | 1448 | overlay->color_key = 0x0101fe; |
| 1445 | overlay->brightness = -19; | 1449 | overlay->brightness = -19; |
| @@ -1464,6 +1468,7 @@ out_unpin_bo: | |||
| 1464 | i915_gem_object_unpin(reg_bo); | 1468 | i915_gem_object_unpin(reg_bo); |
| 1465 | out_free_bo: | 1469 | out_free_bo: |
| 1466 | drm_gem_object_unreference(®_bo->base); | 1470 | drm_gem_object_unreference(®_bo->base); |
| 1471 | mutex_unlock(&dev->struct_mutex); | ||
| 1467 | out_free: | 1472 | out_free: |
| 1468 | kfree(overlay); | 1473 | kfree(overlay); |
| 1469 | return; | 1474 | return; |
diff --git a/drivers/gpu/drm/radeon/evergreen.c b/drivers/gpu/drm/radeon/evergreen.c index 445af7981637..12d2fdc52414 100644 --- a/drivers/gpu/drm/radeon/evergreen.c +++ b/drivers/gpu/drm/radeon/evergreen.c | |||
| @@ -2013,9 +2013,9 @@ static void evergreen_gpu_init(struct radeon_device *rdev) | |||
| 2013 | rdev->config.evergreen.tile_config |= (3 << 0); | 2013 | rdev->config.evergreen.tile_config |= (3 << 0); |
| 2014 | break; | 2014 | break; |
| 2015 | } | 2015 | } |
| 2016 | /* num banks is 8 on all fusion asics */ | 2016 | /* num banks is 8 on all fusion asics. 0 = 4, 1 = 8, 2 = 16 */ |
| 2017 | if (rdev->flags & RADEON_IS_IGP) | 2017 | if (rdev->flags & RADEON_IS_IGP) |
| 2018 | rdev->config.evergreen.tile_config |= 8 << 4; | 2018 | rdev->config.evergreen.tile_config |= 1 << 4; |
| 2019 | else | 2019 | else |
| 2020 | rdev->config.evergreen.tile_config |= | 2020 | rdev->config.evergreen.tile_config |= |
| 2021 | ((mc_arb_ramcfg & NOOFBANK_MASK) >> NOOFBANK_SHIFT) << 4; | 2021 | ((mc_arb_ramcfg & NOOFBANK_MASK) >> NOOFBANK_SHIFT) << 4; |
diff --git a/drivers/gpu/drm/radeon/radeon.h b/drivers/gpu/drm/radeon/radeon.h index 27f45579e64b..ef0e0e016914 100644 --- a/drivers/gpu/drm/radeon/radeon.h +++ b/drivers/gpu/drm/radeon/radeon.h | |||
| @@ -179,6 +179,7 @@ void radeon_pm_resume(struct radeon_device *rdev); | |||
| 179 | void radeon_combios_get_power_modes(struct radeon_device *rdev); | 179 | void radeon_combios_get_power_modes(struct radeon_device *rdev); |
| 180 | void radeon_atombios_get_power_modes(struct radeon_device *rdev); | 180 | void radeon_atombios_get_power_modes(struct radeon_device *rdev); |
| 181 | void radeon_atom_set_voltage(struct radeon_device *rdev, u16 voltage_level, u8 voltage_type); | 181 | void radeon_atom_set_voltage(struct radeon_device *rdev, u16 voltage_level, u8 voltage_type); |
| 182 | int radeon_atom_get_max_vddc(struct radeon_device *rdev, u16 *voltage); | ||
| 182 | void rs690_pm_info(struct radeon_device *rdev); | 183 | void rs690_pm_info(struct radeon_device *rdev); |
| 183 | extern int rv6xx_get_temp(struct radeon_device *rdev); | 184 | extern int rv6xx_get_temp(struct radeon_device *rdev); |
| 184 | extern int rv770_get_temp(struct radeon_device *rdev); | 185 | extern int rv770_get_temp(struct radeon_device *rdev); |
diff --git a/drivers/gpu/drm/radeon/radeon_atombios.c b/drivers/gpu/drm/radeon/radeon_atombios.c index 1e725d9f767f..bf2b61584cdb 100644 --- a/drivers/gpu/drm/radeon/radeon_atombios.c +++ b/drivers/gpu/drm/radeon/radeon_atombios.c | |||
| @@ -2320,6 +2320,14 @@ static bool radeon_atombios_parse_pplib_clock_info(struct radeon_device *rdev, | |||
| 2320 | le16_to_cpu(clock_info->r600.usVDDC); | 2320 | le16_to_cpu(clock_info->r600.usVDDC); |
| 2321 | } | 2321 | } |
| 2322 | 2322 | ||
| 2323 | /* patch up vddc if necessary */ | ||
| 2324 | if (rdev->pm.power_state[state_index].clock_info[mode_index].voltage.voltage == 0xff01) { | ||
| 2325 | u16 vddc; | ||
| 2326 | |||
| 2327 | if (radeon_atom_get_max_vddc(rdev, &vddc) == 0) | ||
| 2328 | rdev->pm.power_state[state_index].clock_info[mode_index].voltage.voltage = vddc; | ||
| 2329 | } | ||
| 2330 | |||
| 2323 | if (rdev->flags & RADEON_IS_IGP) { | 2331 | if (rdev->flags & RADEON_IS_IGP) { |
| 2324 | /* skip invalid modes */ | 2332 | /* skip invalid modes */ |
| 2325 | if (rdev->pm.power_state[state_index].clock_info[mode_index].sclk == 0) | 2333 | if (rdev->pm.power_state[state_index].clock_info[mode_index].sclk == 0) |
| @@ -2630,7 +2638,35 @@ void radeon_atom_set_voltage(struct radeon_device *rdev, u16 voltage_level, u8 v | |||
| 2630 | atom_execute_table(rdev->mode_info.atom_context, index, (uint32_t *)&args); | 2638 | atom_execute_table(rdev->mode_info.atom_context, index, (uint32_t *)&args); |
| 2631 | } | 2639 | } |
| 2632 | 2640 | ||
| 2641 | int radeon_atom_get_max_vddc(struct radeon_device *rdev, | ||
| 2642 | u16 *voltage) | ||
| 2643 | { | ||
| 2644 | union set_voltage args; | ||
| 2645 | int index = GetIndexIntoMasterTable(COMMAND, SetVoltage); | ||
| 2646 | u8 frev, crev; | ||
| 2647 | |||
| 2648 | if (!atom_parse_cmd_header(rdev->mode_info.atom_context, index, &frev, &crev)) | ||
| 2649 | return -EINVAL; | ||
| 2650 | |||
| 2651 | switch (crev) { | ||
| 2652 | case 1: | ||
| 2653 | return -EINVAL; | ||
| 2654 | case 2: | ||
| 2655 | args.v2.ucVoltageType = SET_VOLTAGE_GET_MAX_VOLTAGE; | ||
| 2656 | args.v2.ucVoltageMode = 0; | ||
| 2657 | args.v2.usVoltageLevel = 0; | ||
| 2658 | |||
| 2659 | atom_execute_table(rdev->mode_info.atom_context, index, (uint32_t *)&args); | ||
| 2660 | |||
| 2661 | *voltage = le16_to_cpu(args.v2.usVoltageLevel); | ||
| 2662 | break; | ||
| 2663 | default: | ||
| 2664 | DRM_ERROR("Unknown table version %d, %d\n", frev, crev); | ||
| 2665 | return -EINVAL; | ||
| 2666 | } | ||
| 2633 | 2667 | ||
| 2668 | return 0; | ||
| 2669 | } | ||
| 2634 | 2670 | ||
| 2635 | void radeon_atom_initialize_bios_scratch_regs(struct drm_device *dev) | 2671 | void radeon_atom_initialize_bios_scratch_regs(struct drm_device *dev) |
| 2636 | { | 2672 | { |
diff --git a/drivers/gpu/drm/radeon/radeon_bios.c b/drivers/gpu/drm/radeon/radeon_bios.c index 1aba85cad1a8..3fc5fa1aefd0 100644 --- a/drivers/gpu/drm/radeon/radeon_bios.c +++ b/drivers/gpu/drm/radeon/radeon_bios.c | |||
| @@ -104,7 +104,7 @@ static bool radeon_read_bios(struct radeon_device *rdev) | |||
| 104 | static bool radeon_atrm_get_bios(struct radeon_device *rdev) | 104 | static bool radeon_atrm_get_bios(struct radeon_device *rdev) |
| 105 | { | 105 | { |
| 106 | int ret; | 106 | int ret; |
| 107 | int size = 64 * 1024; | 107 | int size = 256 * 1024; |
| 108 | int i; | 108 | int i; |
| 109 | 109 | ||
| 110 | if (!radeon_atrm_supported(rdev->pdev)) | 110 | if (!radeon_atrm_supported(rdev->pdev)) |
diff --git a/drivers/gpu/drm/ttm/ttm_tt.c b/drivers/gpu/drm/ttm/ttm_tt.c index 90e23e0bfadb..58c271ebc0f7 100644 --- a/drivers/gpu/drm/ttm/ttm_tt.c +++ b/drivers/gpu/drm/ttm/ttm_tt.c | |||
| @@ -31,6 +31,7 @@ | |||
| 31 | #include <linux/sched.h> | 31 | #include <linux/sched.h> |
| 32 | #include <linux/highmem.h> | 32 | #include <linux/highmem.h> |
| 33 | #include <linux/pagemap.h> | 33 | #include <linux/pagemap.h> |
| 34 | #include <linux/shmem_fs.h> | ||
| 34 | #include <linux/file.h> | 35 | #include <linux/file.h> |
| 35 | #include <linux/swap.h> | 36 | #include <linux/swap.h> |
| 36 | #include <linux/slab.h> | 37 | #include <linux/slab.h> |
| @@ -484,7 +485,7 @@ static int ttm_tt_swapin(struct ttm_tt *ttm) | |||
| 484 | swap_space = swap_storage->f_path.dentry->d_inode->i_mapping; | 485 | swap_space = swap_storage->f_path.dentry->d_inode->i_mapping; |
| 485 | 486 | ||
| 486 | for (i = 0; i < ttm->num_pages; ++i) { | 487 | for (i = 0; i < ttm->num_pages; ++i) { |
| 487 | from_page = read_mapping_page(swap_space, i, NULL); | 488 | from_page = shmem_read_mapping_page(swap_space, i); |
| 488 | if (IS_ERR(from_page)) { | 489 | if (IS_ERR(from_page)) { |
| 489 | ret = PTR_ERR(from_page); | 490 | ret = PTR_ERR(from_page); |
| 490 | goto out_err; | 491 | goto out_err; |
| @@ -557,7 +558,7 @@ int ttm_tt_swapout(struct ttm_tt *ttm, struct file *persistent_swap_storage) | |||
| 557 | from_page = ttm->pages[i]; | 558 | from_page = ttm->pages[i]; |
| 558 | if (unlikely(from_page == NULL)) | 559 | if (unlikely(from_page == NULL)) |
| 559 | continue; | 560 | continue; |
| 560 | to_page = read_mapping_page(swap_space, i, NULL); | 561 | to_page = shmem_read_mapping_page(swap_space, i); |
| 561 | if (unlikely(IS_ERR(to_page))) { | 562 | if (unlikely(IS_ERR(to_page))) { |
| 562 | ret = PTR_ERR(to_page); | 563 | ret = PTR_ERR(to_page); |
| 563 | goto out_err; | 564 | goto out_err; |
diff --git a/drivers/hid/hid-core.c b/drivers/hid/hid-core.c index f7440e8ce3e7..6f3289a57888 100644 --- a/drivers/hid/hid-core.c +++ b/drivers/hid/hid-core.c | |||
| @@ -1423,6 +1423,7 @@ static const struct hid_device_id hid_have_special_driver[] = { | |||
| 1423 | { HID_USB_DEVICE(USB_VENDOR_ID_LOGITECH, USB_DEVICE_ID_SPACETRAVELLER) }, | 1423 | { HID_USB_DEVICE(USB_VENDOR_ID_LOGITECH, USB_DEVICE_ID_SPACETRAVELLER) }, |
| 1424 | { HID_USB_DEVICE(USB_VENDOR_ID_LOGITECH, USB_DEVICE_ID_SPACENAVIGATOR) }, | 1424 | { HID_USB_DEVICE(USB_VENDOR_ID_LOGITECH, USB_DEVICE_ID_SPACENAVIGATOR) }, |
| 1425 | { HID_USB_DEVICE(USB_VENDOR_ID_LUMIO, USB_DEVICE_ID_CRYSTALTOUCH) }, | 1425 | { HID_USB_DEVICE(USB_VENDOR_ID_LUMIO, USB_DEVICE_ID_CRYSTALTOUCH) }, |
| 1426 | { HID_USB_DEVICE(USB_VENDOR_ID_LUMIO, USB_DEVICE_ID_CRYSTALTOUCH_DUAL) }, | ||
| 1426 | { HID_USB_DEVICE(USB_VENDOR_ID_MICROCHIP, USB_DEVICE_ID_PICOLCD) }, | 1427 | { HID_USB_DEVICE(USB_VENDOR_ID_MICROCHIP, USB_DEVICE_ID_PICOLCD) }, |
| 1427 | { HID_USB_DEVICE(USB_VENDOR_ID_MICROCHIP, USB_DEVICE_ID_PICOLCD_BOOTLOADER) }, | 1428 | { HID_USB_DEVICE(USB_VENDOR_ID_MICROCHIP, USB_DEVICE_ID_PICOLCD_BOOTLOADER) }, |
| 1428 | { HID_USB_DEVICE(USB_VENDOR_ID_MICROSOFT, USB_DEVICE_ID_SIDEWINDER_GV) }, | 1429 | { HID_USB_DEVICE(USB_VENDOR_ID_MICROSOFT, USB_DEVICE_ID_SIDEWINDER_GV) }, |
diff --git a/drivers/hid/hid-ids.h b/drivers/hid/hid-ids.h index aecb5a4b8d6d..a756ee6c7df5 100644 --- a/drivers/hid/hid-ids.h +++ b/drivers/hid/hid-ids.h | |||
| @@ -449,6 +449,7 @@ | |||
| 449 | 449 | ||
| 450 | #define USB_VENDOR_ID_LUMIO 0x202e | 450 | #define USB_VENDOR_ID_LUMIO 0x202e |
| 451 | #define USB_DEVICE_ID_CRYSTALTOUCH 0x0006 | 451 | #define USB_DEVICE_ID_CRYSTALTOUCH 0x0006 |
| 452 | #define USB_DEVICE_ID_CRYSTALTOUCH_DUAL 0x0007 | ||
| 452 | 453 | ||
| 453 | #define USB_VENDOR_ID_MCC 0x09db | 454 | #define USB_VENDOR_ID_MCC 0x09db |
| 454 | #define USB_DEVICE_ID_MCC_PMD1024LS 0x0076 | 455 | #define USB_DEVICE_ID_MCC_PMD1024LS 0x0076 |
diff --git a/drivers/hid/hid-multitouch.c b/drivers/hid/hid-multitouch.c index 0b2dcd0ee591..62cac4dc3b62 100644 --- a/drivers/hid/hid-multitouch.c +++ b/drivers/hid/hid-multitouch.c | |||
| @@ -271,6 +271,8 @@ static int mt_input_mapping(struct hid_device *hdev, struct hid_input *hi, | |||
| 271 | } | 271 | } |
| 272 | return 1; | 272 | return 1; |
| 273 | case HID_DG_CONTACTID: | 273 | case HID_DG_CONTACTID: |
| 274 | if (!td->maxcontacts) | ||
| 275 | td->maxcontacts = MT_DEFAULT_MAXCONTACT; | ||
| 274 | input_mt_init_slots(hi->input, td->maxcontacts); | 276 | input_mt_init_slots(hi->input, td->maxcontacts); |
| 275 | td->last_slot_field = usage->hid; | 277 | td->last_slot_field = usage->hid; |
| 276 | td->last_field_index = field->index; | 278 | td->last_field_index = field->index; |
| @@ -547,9 +549,6 @@ static int mt_probe(struct hid_device *hdev, const struct hid_device_id *id) | |||
| 547 | if (ret) | 549 | if (ret) |
| 548 | goto fail; | 550 | goto fail; |
| 549 | 551 | ||
| 550 | if (!td->maxcontacts) | ||
| 551 | td->maxcontacts = MT_DEFAULT_MAXCONTACT; | ||
| 552 | |||
| 553 | td->slots = kzalloc(td->maxcontacts * sizeof(struct mt_slot), | 552 | td->slots = kzalloc(td->maxcontacts * sizeof(struct mt_slot), |
| 554 | GFP_KERNEL); | 553 | GFP_KERNEL); |
| 555 | if (!td->slots) { | 554 | if (!td->slots) { |
| @@ -677,6 +676,9 @@ static const struct hid_device_id mt_devices[] = { | |||
| 677 | { .driver_data = MT_CLS_CONFIDENCE_MINUS_ONE, | 676 | { .driver_data = MT_CLS_CONFIDENCE_MINUS_ONE, |
| 678 | HID_USB_DEVICE(USB_VENDOR_ID_LUMIO, | 677 | HID_USB_DEVICE(USB_VENDOR_ID_LUMIO, |
| 679 | USB_DEVICE_ID_CRYSTALTOUCH) }, | 678 | USB_DEVICE_ID_CRYSTALTOUCH) }, |
| 679 | { .driver_data = MT_CLS_CONFIDENCE_MINUS_ONE, | ||
| 680 | HID_USB_DEVICE(USB_VENDOR_ID_LUMIO, | ||
| 681 | USB_DEVICE_ID_CRYSTALTOUCH_DUAL) }, | ||
| 680 | 682 | ||
| 681 | /* MosArt panels */ | 683 | /* MosArt panels */ |
| 682 | { .driver_data = MT_CLS_CONFIDENCE_MINUS_ONE, | 684 | { .driver_data = MT_CLS_CONFIDENCE_MINUS_ONE, |
| @@ -707,10 +709,10 @@ static const struct hid_device_id mt_devices[] = { | |||
| 707 | HID_USB_DEVICE(USB_VENDOR_ID_STANTUM, | 709 | HID_USB_DEVICE(USB_VENDOR_ID_STANTUM, |
| 708 | USB_DEVICE_ID_MTP)}, | 710 | USB_DEVICE_ID_MTP)}, |
| 709 | { .driver_data = MT_CLS_CONFIDENCE, | 711 | { .driver_data = MT_CLS_CONFIDENCE, |
| 710 | HID_USB_DEVICE(USB_VENDOR_ID_STANTUM, | 712 | HID_USB_DEVICE(USB_VENDOR_ID_STANTUM_STM, |
| 711 | USB_DEVICE_ID_MTP_STM)}, | 713 | USB_DEVICE_ID_MTP_STM)}, |
| 712 | { .driver_data = MT_CLS_CONFIDENCE, | 714 | { .driver_data = MT_CLS_CONFIDENCE, |
| 713 | HID_USB_DEVICE(USB_VENDOR_ID_STANTUM, | 715 | HID_USB_DEVICE(USB_VENDOR_ID_STANTUM_SITRONIX, |
| 714 | USB_DEVICE_ID_MTP_SITRONIX)}, | 716 | USB_DEVICE_ID_MTP_SITRONIX)}, |
| 715 | 717 | ||
| 716 | /* Touch International panels */ | 718 | /* Touch International panels */ |
diff --git a/drivers/i2c/busses/i2c-taos-evm.c b/drivers/i2c/busses/i2c-taos-evm.c index dd39c1eb03ed..26c352a09298 100644 --- a/drivers/i2c/busses/i2c-taos-evm.c +++ b/drivers/i2c/busses/i2c-taos-evm.c | |||
| @@ -234,7 +234,7 @@ static int taos_connect(struct serio *serio, struct serio_driver *drv) | |||
| 234 | 234 | ||
| 235 | if (taos->state != TAOS_STATE_IDLE) { | 235 | if (taos->state != TAOS_STATE_IDLE) { |
| 236 | err = -ENODEV; | 236 | err = -ENODEV; |
| 237 | dev_dbg(&serio->dev, "TAOS EVM reset failed (state=%d, " | 237 | dev_err(&serio->dev, "TAOS EVM reset failed (state=%d, " |
| 238 | "pos=%d)\n", taos->state, taos->pos); | 238 | "pos=%d)\n", taos->state, taos->pos); |
| 239 | goto exit_close; | 239 | goto exit_close; |
| 240 | } | 240 | } |
| @@ -255,7 +255,7 @@ static int taos_connect(struct serio *serio, struct serio_driver *drv) | |||
| 255 | msecs_to_jiffies(250)); | 255 | msecs_to_jiffies(250)); |
| 256 | if (taos->state != TAOS_STATE_IDLE) { | 256 | if (taos->state != TAOS_STATE_IDLE) { |
| 257 | err = -ENODEV; | 257 | err = -ENODEV; |
| 258 | dev_err(&adapter->dev, "Echo off failed " | 258 | dev_err(&serio->dev, "TAOS EVM echo off failed " |
| 259 | "(state=%d)\n", taos->state); | 259 | "(state=%d)\n", taos->state); |
| 260 | goto exit_close; | 260 | goto exit_close; |
| 261 | } | 261 | } |
| @@ -263,7 +263,7 @@ static int taos_connect(struct serio *serio, struct serio_driver *drv) | |||
| 263 | err = i2c_add_adapter(adapter); | 263 | err = i2c_add_adapter(adapter); |
| 264 | if (err) | 264 | if (err) |
| 265 | goto exit_close; | 265 | goto exit_close; |
| 266 | dev_dbg(&serio->dev, "Connected to TAOS EVM\n"); | 266 | dev_info(&serio->dev, "Connected to TAOS EVM\n"); |
| 267 | 267 | ||
| 268 | taos->client = taos_instantiate_device(adapter); | 268 | taos->client = taos_instantiate_device(adapter); |
| 269 | return 0; | 269 | return 0; |
| @@ -288,7 +288,7 @@ static void taos_disconnect(struct serio *serio) | |||
| 288 | serio_set_drvdata(serio, NULL); | 288 | serio_set_drvdata(serio, NULL); |
| 289 | kfree(taos); | 289 | kfree(taos); |
| 290 | 290 | ||
| 291 | dev_dbg(&serio->dev, "Disconnected from TAOS EVM\n"); | 291 | dev_info(&serio->dev, "Disconnected from TAOS EVM\n"); |
| 292 | } | 292 | } |
| 293 | 293 | ||
| 294 | static struct serio_device_id taos_serio_ids[] = { | 294 | static struct serio_device_id taos_serio_ids[] = { |
diff --git a/drivers/i2c/muxes/pca954x.c b/drivers/i2c/muxes/pca954x.c index 54e1ce73534b..6f8953664636 100644 --- a/drivers/i2c/muxes/pca954x.c +++ b/drivers/i2c/muxes/pca954x.c | |||
| @@ -201,10 +201,11 @@ static int pca954x_probe(struct i2c_client *client, | |||
| 201 | 201 | ||
| 202 | i2c_set_clientdata(client, data); | 202 | i2c_set_clientdata(client, data); |
| 203 | 203 | ||
| 204 | /* Read the mux register at addr to verify | 204 | /* Write the mux register at addr to verify |
| 205 | * that the mux is in fact present. | 205 | * that the mux is in fact present. This also |
| 206 | * initializes the mux to disconnected state. | ||
| 206 | */ | 207 | */ |
| 207 | if (i2c_smbus_read_byte(client) < 0) { | 208 | if (i2c_smbus_write_byte(client, 0) < 0) { |
| 208 | dev_warn(&client->dev, "probe failed\n"); | 209 | dev_warn(&client->dev, "probe failed\n"); |
| 209 | goto exit_free; | 210 | goto exit_free; |
| 210 | } | 211 | } |
diff --git a/drivers/infiniband/hw/cxgb4/cm.c b/drivers/infiniband/hw/cxgb4/cm.c index f660cd04ec2f..31fb44085c9b 100644 --- a/drivers/infiniband/hw/cxgb4/cm.c +++ b/drivers/infiniband/hw/cxgb4/cm.c | |||
| @@ -1463,9 +1463,9 @@ static int peer_close(struct c4iw_dev *dev, struct sk_buff *skb) | |||
| 1463 | struct c4iw_qp_attributes attrs; | 1463 | struct c4iw_qp_attributes attrs; |
| 1464 | int disconnect = 1; | 1464 | int disconnect = 1; |
| 1465 | int release = 0; | 1465 | int release = 0; |
| 1466 | int abort = 0; | ||
| 1467 | struct tid_info *t = dev->rdev.lldi.tids; | 1466 | struct tid_info *t = dev->rdev.lldi.tids; |
| 1468 | unsigned int tid = GET_TID(hdr); | 1467 | unsigned int tid = GET_TID(hdr); |
| 1468 | int ret; | ||
| 1469 | 1469 | ||
| 1470 | ep = lookup_tid(t, tid); | 1470 | ep = lookup_tid(t, tid); |
| 1471 | PDBG("%s ep %p tid %u\n", __func__, ep, ep->hwtid); | 1471 | PDBG("%s ep %p tid %u\n", __func__, ep, ep->hwtid); |
| @@ -1501,10 +1501,12 @@ static int peer_close(struct c4iw_dev *dev, struct sk_buff *skb) | |||
| 1501 | start_ep_timer(ep); | 1501 | start_ep_timer(ep); |
| 1502 | __state_set(&ep->com, CLOSING); | 1502 | __state_set(&ep->com, CLOSING); |
| 1503 | attrs.next_state = C4IW_QP_STATE_CLOSING; | 1503 | attrs.next_state = C4IW_QP_STATE_CLOSING; |
| 1504 | abort = c4iw_modify_qp(ep->com.qp->rhp, ep->com.qp, | 1504 | ret = c4iw_modify_qp(ep->com.qp->rhp, ep->com.qp, |
| 1505 | C4IW_QP_ATTR_NEXT_STATE, &attrs, 1); | 1505 | C4IW_QP_ATTR_NEXT_STATE, &attrs, 1); |
| 1506 | peer_close_upcall(ep); | 1506 | if (ret != -ECONNRESET) { |
| 1507 | disconnect = 1; | 1507 | peer_close_upcall(ep); |
| 1508 | disconnect = 1; | ||
| 1509 | } | ||
| 1508 | break; | 1510 | break; |
| 1509 | case ABORTING: | 1511 | case ABORTING: |
| 1510 | disconnect = 0; | 1512 | disconnect = 0; |
| @@ -2109,15 +2111,16 @@ int c4iw_ep_disconnect(struct c4iw_ep *ep, int abrupt, gfp_t gfp) | |||
| 2109 | break; | 2111 | break; |
| 2110 | } | 2112 | } |
| 2111 | 2113 | ||
| 2112 | mutex_unlock(&ep->com.mutex); | ||
| 2113 | if (close) { | 2114 | if (close) { |
| 2114 | if (abrupt) | 2115 | if (abrupt) { |
| 2115 | ret = abort_connection(ep, NULL, gfp); | 2116 | close_complete_upcall(ep); |
| 2116 | else | 2117 | ret = send_abort(ep, NULL, gfp); |
| 2118 | } else | ||
| 2117 | ret = send_halfclose(ep, gfp); | 2119 | ret = send_halfclose(ep, gfp); |
| 2118 | if (ret) | 2120 | if (ret) |
| 2119 | fatal = 1; | 2121 | fatal = 1; |
| 2120 | } | 2122 | } |
| 2123 | mutex_unlock(&ep->com.mutex); | ||
| 2121 | if (fatal) | 2124 | if (fatal) |
| 2122 | release_ep_resources(ep); | 2125 | release_ep_resources(ep); |
| 2123 | return ret; | 2126 | return ret; |
| @@ -2301,6 +2304,31 @@ static int fw6_msg(struct c4iw_dev *dev, struct sk_buff *skb) | |||
| 2301 | return 0; | 2304 | return 0; |
| 2302 | } | 2305 | } |
| 2303 | 2306 | ||
| 2307 | static int peer_abort_intr(struct c4iw_dev *dev, struct sk_buff *skb) | ||
| 2308 | { | ||
| 2309 | struct cpl_abort_req_rss *req = cplhdr(skb); | ||
| 2310 | struct c4iw_ep *ep; | ||
| 2311 | struct tid_info *t = dev->rdev.lldi.tids; | ||
| 2312 | unsigned int tid = GET_TID(req); | ||
| 2313 | |||
| 2314 | ep = lookup_tid(t, tid); | ||
| 2315 | if (is_neg_adv_abort(req->status)) { | ||
| 2316 | PDBG("%s neg_adv_abort ep %p tid %u\n", __func__, ep, | ||
| 2317 | ep->hwtid); | ||
| 2318 | kfree_skb(skb); | ||
| 2319 | return 0; | ||
| 2320 | } | ||
| 2321 | PDBG("%s ep %p tid %u state %u\n", __func__, ep, ep->hwtid, | ||
| 2322 | ep->com.state); | ||
| 2323 | |||
| 2324 | /* | ||
| 2325 | * Wake up any threads in rdma_init() or rdma_fini(). | ||
| 2326 | */ | ||
| 2327 | c4iw_wake_up(&ep->com.wr_wait, -ECONNRESET); | ||
| 2328 | sched(dev, skb); | ||
| 2329 | return 0; | ||
| 2330 | } | ||
| 2331 | |||
| 2304 | /* | 2332 | /* |
| 2305 | * Most upcalls from the T4 Core go to sched() to | 2333 | * Most upcalls from the T4 Core go to sched() to |
| 2306 | * schedule the processing on a work queue. | 2334 | * schedule the processing on a work queue. |
| @@ -2317,7 +2345,7 @@ c4iw_handler_func c4iw_handlers[NUM_CPL_CMDS] = { | |||
| 2317 | [CPL_PASS_ESTABLISH] = sched, | 2345 | [CPL_PASS_ESTABLISH] = sched, |
| 2318 | [CPL_PEER_CLOSE] = sched, | 2346 | [CPL_PEER_CLOSE] = sched, |
| 2319 | [CPL_CLOSE_CON_RPL] = sched, | 2347 | [CPL_CLOSE_CON_RPL] = sched, |
| 2320 | [CPL_ABORT_REQ_RSS] = sched, | 2348 | [CPL_ABORT_REQ_RSS] = peer_abort_intr, |
| 2321 | [CPL_RDMA_TERMINATE] = sched, | 2349 | [CPL_RDMA_TERMINATE] = sched, |
| 2322 | [CPL_FW4_ACK] = sched, | 2350 | [CPL_FW4_ACK] = sched, |
| 2323 | [CPL_SET_TCB_RPL] = set_tcb_rpl, | 2351 | [CPL_SET_TCB_RPL] = set_tcb_rpl, |
diff --git a/drivers/infiniband/hw/cxgb4/cq.c b/drivers/infiniband/hw/cxgb4/cq.c index 8d8f8add6fcd..1720dc790d13 100644 --- a/drivers/infiniband/hw/cxgb4/cq.c +++ b/drivers/infiniband/hw/cxgb4/cq.c | |||
| @@ -801,6 +801,10 @@ struct ib_cq *c4iw_create_cq(struct ib_device *ibdev, int entries, | |||
| 801 | if (ucontext) { | 801 | if (ucontext) { |
| 802 | memsize = roundup(memsize, PAGE_SIZE); | 802 | memsize = roundup(memsize, PAGE_SIZE); |
| 803 | hwentries = memsize / sizeof *chp->cq.queue; | 803 | hwentries = memsize / sizeof *chp->cq.queue; |
| 804 | while (hwentries > T4_MAX_IQ_SIZE) { | ||
| 805 | memsize -= PAGE_SIZE; | ||
| 806 | hwentries = memsize / sizeof *chp->cq.queue; | ||
| 807 | } | ||
| 804 | } | 808 | } |
| 805 | chp->cq.size = hwentries; | 809 | chp->cq.size = hwentries; |
| 806 | chp->cq.memsize = memsize; | 810 | chp->cq.memsize = memsize; |
diff --git a/drivers/infiniband/hw/cxgb4/mem.c b/drivers/infiniband/hw/cxgb4/mem.c index 273ffe49525a..0347eed4a167 100644 --- a/drivers/infiniband/hw/cxgb4/mem.c +++ b/drivers/infiniband/hw/cxgb4/mem.c | |||
| @@ -625,7 +625,7 @@ pbl_done: | |||
| 625 | mhp->attr.perms = c4iw_ib_to_tpt_access(acc); | 625 | mhp->attr.perms = c4iw_ib_to_tpt_access(acc); |
| 626 | mhp->attr.va_fbo = virt; | 626 | mhp->attr.va_fbo = virt; |
| 627 | mhp->attr.page_size = shift - 12; | 627 | mhp->attr.page_size = shift - 12; |
| 628 | mhp->attr.len = (u32) length; | 628 | mhp->attr.len = length; |
| 629 | 629 | ||
| 630 | err = register_mem(rhp, php, mhp, shift); | 630 | err = register_mem(rhp, php, mhp, shift); |
| 631 | if (err) | 631 | if (err) |
diff --git a/drivers/infiniband/hw/cxgb4/qp.c b/drivers/infiniband/hw/cxgb4/qp.c index 3b773b05a898..a41578e48c7b 100644 --- a/drivers/infiniband/hw/cxgb4/qp.c +++ b/drivers/infiniband/hw/cxgb4/qp.c | |||
| @@ -1207,11 +1207,8 @@ int c4iw_modify_qp(struct c4iw_dev *rhp, struct c4iw_qp *qhp, | |||
| 1207 | c4iw_get_ep(&qhp->ep->com); | 1207 | c4iw_get_ep(&qhp->ep->com); |
| 1208 | } | 1208 | } |
| 1209 | ret = rdma_fini(rhp, qhp, ep); | 1209 | ret = rdma_fini(rhp, qhp, ep); |
| 1210 | if (ret) { | 1210 | if (ret) |
| 1211 | if (internal) | ||
| 1212 | c4iw_get_ep(&qhp->ep->com); | ||
| 1213 | goto err; | 1211 | goto err; |
| 1214 | } | ||
| 1215 | break; | 1212 | break; |
| 1216 | case C4IW_QP_STATE_TERMINATE: | 1213 | case C4IW_QP_STATE_TERMINATE: |
| 1217 | set_state(qhp, C4IW_QP_STATE_TERMINATE); | 1214 | set_state(qhp, C4IW_QP_STATE_TERMINATE); |
diff --git a/drivers/infiniband/hw/qib/qib_iba7322.c b/drivers/infiniband/hw/qib/qib_iba7322.c index 9f53e68a096a..8ec5237031a0 100644 --- a/drivers/infiniband/hw/qib/qib_iba7322.c +++ b/drivers/infiniband/hw/qib/qib_iba7322.c | |||
| @@ -469,6 +469,8 @@ static u8 ib_rate_to_delay[IB_RATE_120_GBPS + 1] = { | |||
| 469 | #define IB_7322_LT_STATE_RECOVERIDLE 0x0f | 469 | #define IB_7322_LT_STATE_RECOVERIDLE 0x0f |
| 470 | #define IB_7322_LT_STATE_CFGENH 0x10 | 470 | #define IB_7322_LT_STATE_CFGENH 0x10 |
| 471 | #define IB_7322_LT_STATE_CFGTEST 0x11 | 471 | #define IB_7322_LT_STATE_CFGTEST 0x11 |
| 472 | #define IB_7322_LT_STATE_CFGWAITRMTTEST 0x12 | ||
| 473 | #define IB_7322_LT_STATE_CFGWAITENH 0x13 | ||
| 472 | 474 | ||
| 473 | /* link state machine states from IBC */ | 475 | /* link state machine states from IBC */ |
| 474 | #define IB_7322_L_STATE_DOWN 0x0 | 476 | #define IB_7322_L_STATE_DOWN 0x0 |
| @@ -498,8 +500,10 @@ static const u8 qib_7322_physportstate[0x20] = { | |||
| 498 | IB_PHYSPORTSTATE_LINK_ERR_RECOVER, | 500 | IB_PHYSPORTSTATE_LINK_ERR_RECOVER, |
| 499 | [IB_7322_LT_STATE_CFGENH] = IB_PHYSPORTSTATE_CFG_ENH, | 501 | [IB_7322_LT_STATE_CFGENH] = IB_PHYSPORTSTATE_CFG_ENH, |
| 500 | [IB_7322_LT_STATE_CFGTEST] = IB_PHYSPORTSTATE_CFG_TRAIN, | 502 | [IB_7322_LT_STATE_CFGTEST] = IB_PHYSPORTSTATE_CFG_TRAIN, |
| 501 | [0x12] = IB_PHYSPORTSTATE_CFG_TRAIN, | 503 | [IB_7322_LT_STATE_CFGWAITRMTTEST] = |
| 502 | [0x13] = IB_PHYSPORTSTATE_CFG_WAIT_ENH, | 504 | IB_PHYSPORTSTATE_CFG_TRAIN, |
| 505 | [IB_7322_LT_STATE_CFGWAITENH] = | ||
| 506 | IB_PHYSPORTSTATE_CFG_WAIT_ENH, | ||
| 503 | [0x14] = IB_PHYSPORTSTATE_CFG_TRAIN, | 507 | [0x14] = IB_PHYSPORTSTATE_CFG_TRAIN, |
| 504 | [0x15] = IB_PHYSPORTSTATE_CFG_TRAIN, | 508 | [0x15] = IB_PHYSPORTSTATE_CFG_TRAIN, |
| 505 | [0x16] = IB_PHYSPORTSTATE_CFG_TRAIN, | 509 | [0x16] = IB_PHYSPORTSTATE_CFG_TRAIN, |
| @@ -1692,7 +1696,9 @@ static void handle_serdes_issues(struct qib_pportdata *ppd, u64 ibcst) | |||
| 1692 | break; | 1696 | break; |
| 1693 | } | 1697 | } |
| 1694 | 1698 | ||
| 1695 | if (ibclt == IB_7322_LT_STATE_CFGTEST && | 1699 | if (((ibclt >= IB_7322_LT_STATE_CFGTEST && |
| 1700 | ibclt <= IB_7322_LT_STATE_CFGWAITENH) || | ||
| 1701 | ibclt == IB_7322_LT_STATE_LINKUP) && | ||
| 1696 | (ibcst & SYM_MASK(IBCStatusA_0, LinkSpeedQDR))) { | 1702 | (ibcst & SYM_MASK(IBCStatusA_0, LinkSpeedQDR))) { |
| 1697 | force_h1(ppd); | 1703 | force_h1(ppd); |
| 1698 | ppd->cpspec->qdr_reforce = 1; | 1704 | ppd->cpspec->qdr_reforce = 1; |
| @@ -7301,12 +7307,17 @@ static void ibsd_wr_allchans(struct qib_pportdata *ppd, int addr, unsigned data, | |||
| 7301 | static void serdes_7322_los_enable(struct qib_pportdata *ppd, int enable) | 7307 | static void serdes_7322_los_enable(struct qib_pportdata *ppd, int enable) |
| 7302 | { | 7308 | { |
| 7303 | u64 data = qib_read_kreg_port(ppd, krp_serdesctrl); | 7309 | u64 data = qib_read_kreg_port(ppd, krp_serdesctrl); |
| 7304 | printk(KERN_INFO QIB_DRV_NAME " IB%u:%u Turning LOS %s\n", | 7310 | u8 state = SYM_FIELD(data, IBSerdesCtrl_0, RXLOSEN); |
| 7305 | ppd->dd->unit, ppd->port, (enable ? "on" : "off")); | 7311 | |
| 7306 | if (enable) | 7312 | if (enable && !state) { |
| 7313 | printk(KERN_INFO QIB_DRV_NAME " IB%u:%u Turning LOS on\n", | ||
| 7314 | ppd->dd->unit, ppd->port); | ||
| 7307 | data |= SYM_MASK(IBSerdesCtrl_0, RXLOSEN); | 7315 | data |= SYM_MASK(IBSerdesCtrl_0, RXLOSEN); |
| 7308 | else | 7316 | } else if (!enable && state) { |
| 7317 | printk(KERN_INFO QIB_DRV_NAME " IB%u:%u Turning LOS off\n", | ||
| 7318 | ppd->dd->unit, ppd->port); | ||
| 7309 | data &= ~SYM_MASK(IBSerdesCtrl_0, RXLOSEN); | 7319 | data &= ~SYM_MASK(IBSerdesCtrl_0, RXLOSEN); |
| 7320 | } | ||
| 7310 | qib_write_kreg_port(ppd, krp_serdesctrl, data); | 7321 | qib_write_kreg_port(ppd, krp_serdesctrl, data); |
| 7311 | } | 7322 | } |
| 7312 | 7323 | ||
diff --git a/drivers/infiniband/hw/qib/qib_intr.c b/drivers/infiniband/hw/qib/qib_intr.c index a693c56ec8a6..6ae57d23004a 100644 --- a/drivers/infiniband/hw/qib/qib_intr.c +++ b/drivers/infiniband/hw/qib/qib_intr.c | |||
| @@ -96,8 +96,12 @@ void qib_handle_e_ibstatuschanged(struct qib_pportdata *ppd, u64 ibcs) | |||
| 96 | * states, or if it transitions from any of the up (INIT or better) | 96 | * states, or if it transitions from any of the up (INIT or better) |
| 97 | * states into any of the down states (except link recovery), then | 97 | * states into any of the down states (except link recovery), then |
| 98 | * call the chip-specific code to take appropriate actions. | 98 | * call the chip-specific code to take appropriate actions. |
| 99 | * | ||
| 100 | * ppd->lflags could be 0 if this is the first time the interrupt | ||
| 101 | * handlers has been called but the link is already up. | ||
| 99 | */ | 102 | */ |
| 100 | if (lstate >= IB_PORT_INIT && (ppd->lflags & QIBL_LINKDOWN) && | 103 | if (lstate >= IB_PORT_INIT && |
| 104 | (!ppd->lflags || (ppd->lflags & QIBL_LINKDOWN)) && | ||
| 101 | ltstate == IB_PHYSPORTSTATE_LINKUP) { | 105 | ltstate == IB_PHYSPORTSTATE_LINKUP) { |
| 102 | /* transitioned to UP */ | 106 | /* transitioned to UP */ |
| 103 | if (dd->f_ib_updown(ppd, 1, ibcs)) | 107 | if (dd->f_ib_updown(ppd, 1, ibcs)) |
diff --git a/drivers/leds/leds-lp5521.c b/drivers/leds/leds-lp5521.c index c0cff64a1ae6..cc1dc4817fac 100644 --- a/drivers/leds/leds-lp5521.c +++ b/drivers/leds/leds-lp5521.c | |||
| @@ -593,7 +593,7 @@ static void lp5521_unregister_sysfs(struct i2c_client *client) | |||
| 593 | &lp5521_led_attribute_group); | 593 | &lp5521_led_attribute_group); |
| 594 | } | 594 | } |
| 595 | 595 | ||
| 596 | static int __init lp5521_init_led(struct lp5521_led *led, | 596 | static int __devinit lp5521_init_led(struct lp5521_led *led, |
| 597 | struct i2c_client *client, | 597 | struct i2c_client *client, |
| 598 | int chan, struct lp5521_platform_data *pdata) | 598 | int chan, struct lp5521_platform_data *pdata) |
| 599 | { | 599 | { |
| @@ -637,7 +637,7 @@ static int __init lp5521_init_led(struct lp5521_led *led, | |||
| 637 | return 0; | 637 | return 0; |
| 638 | } | 638 | } |
| 639 | 639 | ||
| 640 | static int lp5521_probe(struct i2c_client *client, | 640 | static int __devinit lp5521_probe(struct i2c_client *client, |
| 641 | const struct i2c_device_id *id) | 641 | const struct i2c_device_id *id) |
| 642 | { | 642 | { |
| 643 | struct lp5521_chip *chip; | 643 | struct lp5521_chip *chip; |
diff --git a/drivers/leds/leds-lp5523.c b/drivers/leds/leds-lp5523.c index e19fed25f137..5971e309b234 100644 --- a/drivers/leds/leds-lp5523.c +++ b/drivers/leds/leds-lp5523.c | |||
| @@ -826,7 +826,7 @@ static int __init lp5523_init_engine(struct lp5523_engine *engine, int id) | |||
| 826 | return 0; | 826 | return 0; |
| 827 | } | 827 | } |
| 828 | 828 | ||
| 829 | static int __init lp5523_init_led(struct lp5523_led *led, struct device *dev, | 829 | static int __devinit lp5523_init_led(struct lp5523_led *led, struct device *dev, |
| 830 | int chan, struct lp5523_platform_data *pdata) | 830 | int chan, struct lp5523_platform_data *pdata) |
| 831 | { | 831 | { |
| 832 | char name[32]; | 832 | char name[32]; |
| @@ -872,7 +872,7 @@ static int __init lp5523_init_led(struct lp5523_led *led, struct device *dev, | |||
| 872 | 872 | ||
| 873 | static struct i2c_driver lp5523_driver; | 873 | static struct i2c_driver lp5523_driver; |
| 874 | 874 | ||
| 875 | static int lp5523_probe(struct i2c_client *client, | 875 | static int __devinit lp5523_probe(struct i2c_client *client, |
| 876 | const struct i2c_device_id *id) | 876 | const struct i2c_device_id *id) |
| 877 | { | 877 | { |
| 878 | struct lp5523_chip *chip; | 878 | struct lp5523_chip *chip; |
diff --git a/drivers/md/md.c b/drivers/md/md.c index 4332fc2f25d4..91e31e260b4a 100644 --- a/drivers/md/md.c +++ b/drivers/md/md.c | |||
| @@ -7088,6 +7088,7 @@ static int remove_and_add_spares(mddev_t *mddev) | |||
| 7088 | list_for_each_entry(rdev, &mddev->disks, same_set) { | 7088 | list_for_each_entry(rdev, &mddev->disks, same_set) { |
| 7089 | if (rdev->raid_disk >= 0 && | 7089 | if (rdev->raid_disk >= 0 && |
| 7090 | !test_bit(In_sync, &rdev->flags) && | 7090 | !test_bit(In_sync, &rdev->flags) && |
| 7091 | !test_bit(Faulty, &rdev->flags) && | ||
| 7091 | !test_bit(Blocked, &rdev->flags)) | 7092 | !test_bit(Blocked, &rdev->flags)) |
| 7092 | spares++; | 7093 | spares++; |
| 7093 | if (rdev->raid_disk < 0 | 7094 | if (rdev->raid_disk < 0 |
diff --git a/drivers/misc/cb710/sgbuf2.c b/drivers/misc/cb710/sgbuf2.c index d019746551f3..2a40d0efdff5 100644 --- a/drivers/misc/cb710/sgbuf2.c +++ b/drivers/misc/cb710/sgbuf2.c | |||
| @@ -47,7 +47,7 @@ static uint32_t sg_dwiter_read_buffer(struct sg_mapping_iter *miter) | |||
| 47 | 47 | ||
| 48 | static inline bool needs_unaligned_copy(const void *ptr) | 48 | static inline bool needs_unaligned_copy(const void *ptr) |
| 49 | { | 49 | { |
| 50 | #ifdef HAVE_EFFICIENT_UNALIGNED_ACCESS | 50 | #ifdef CONFIG_HAVE_EFFICIENT_UNALIGNED_ACCESS |
| 51 | return false; | 51 | return false; |
| 52 | #else | 52 | #else |
| 53 | return ((ptr - NULL) & 3) != 0; | 53 | return ((ptr - NULL) & 3) != 0; |
diff --git a/drivers/misc/ioc4.c b/drivers/misc/ioc4.c index 668d41e594a9..df03dd3bd0e2 100644 --- a/drivers/misc/ioc4.c +++ b/drivers/misc/ioc4.c | |||
| @@ -270,7 +270,7 @@ ioc4_variant(struct ioc4_driver_data *idd) | |||
| 270 | return IOC4_VARIANT_PCI_RT; | 270 | return IOC4_VARIANT_PCI_RT; |
| 271 | } | 271 | } |
| 272 | 272 | ||
| 273 | static void __devinit | 273 | static void |
| 274 | ioc4_load_modules(struct work_struct *work) | 274 | ioc4_load_modules(struct work_struct *work) |
| 275 | { | 275 | { |
| 276 | request_module("sgiioc4"); | 276 | request_module("sgiioc4"); |
diff --git a/drivers/misc/lkdtm.c b/drivers/misc/lkdtm.c index 81d7fa4ec0db..150cd7061b80 100644 --- a/drivers/misc/lkdtm.c +++ b/drivers/misc/lkdtm.c | |||
| @@ -120,6 +120,7 @@ static int recur_count = REC_NUM_DEFAULT; | |||
| 120 | static enum cname cpoint = CN_INVALID; | 120 | static enum cname cpoint = CN_INVALID; |
| 121 | static enum ctype cptype = CT_NONE; | 121 | static enum ctype cptype = CT_NONE; |
| 122 | static int count = DEFAULT_COUNT; | 122 | static int count = DEFAULT_COUNT; |
| 123 | static DEFINE_SPINLOCK(count_lock); | ||
| 123 | 124 | ||
| 124 | module_param(recur_count, int, 0644); | 125 | module_param(recur_count, int, 0644); |
| 125 | MODULE_PARM_DESC(recur_count, " Recursion level for the stack overflow test, "\ | 126 | MODULE_PARM_DESC(recur_count, " Recursion level for the stack overflow test, "\ |
| @@ -230,11 +231,14 @@ static const char *cp_name_to_str(enum cname name) | |||
| 230 | static int lkdtm_parse_commandline(void) | 231 | static int lkdtm_parse_commandline(void) |
| 231 | { | 232 | { |
| 232 | int i; | 233 | int i; |
| 234 | unsigned long flags; | ||
| 233 | 235 | ||
| 234 | if (cpoint_count < 1 || recur_count < 1) | 236 | if (cpoint_count < 1 || recur_count < 1) |
| 235 | return -EINVAL; | 237 | return -EINVAL; |
| 236 | 238 | ||
| 239 | spin_lock_irqsave(&count_lock, flags); | ||
| 237 | count = cpoint_count; | 240 | count = cpoint_count; |
| 241 | spin_unlock_irqrestore(&count_lock, flags); | ||
| 238 | 242 | ||
| 239 | /* No special parameters */ | 243 | /* No special parameters */ |
| 240 | if (!cpoint_type && !cpoint_name) | 244 | if (!cpoint_type && !cpoint_name) |
| @@ -349,6 +353,9 @@ static void lkdtm_do_action(enum ctype which) | |||
| 349 | 353 | ||
| 350 | static void lkdtm_handler(void) | 354 | static void lkdtm_handler(void) |
| 351 | { | 355 | { |
| 356 | unsigned long flags; | ||
| 357 | |||
| 358 | spin_lock_irqsave(&count_lock, flags); | ||
| 352 | count--; | 359 | count--; |
| 353 | printk(KERN_INFO "lkdtm: Crash point %s of type %s hit, trigger in %d rounds\n", | 360 | printk(KERN_INFO "lkdtm: Crash point %s of type %s hit, trigger in %d rounds\n", |
| 354 | cp_name_to_str(cpoint), cp_type_to_str(cptype), count); | 361 | cp_name_to_str(cpoint), cp_type_to_str(cptype), count); |
| @@ -357,6 +364,7 @@ static void lkdtm_handler(void) | |||
| 357 | lkdtm_do_action(cptype); | 364 | lkdtm_do_action(cptype); |
| 358 | count = cpoint_count; | 365 | count = cpoint_count; |
| 359 | } | 366 | } |
| 367 | spin_unlock_irqrestore(&count_lock, flags); | ||
| 360 | } | 368 | } |
| 361 | 369 | ||
| 362 | static int lkdtm_register_cpoint(enum cname which) | 370 | static int lkdtm_register_cpoint(enum cname which) |
diff --git a/drivers/misc/pti.c b/drivers/misc/pti.c index bb6f9255c17c..374dfcfccd07 100644 --- a/drivers/misc/pti.c +++ b/drivers/misc/pti.c | |||
| @@ -317,7 +317,8 @@ EXPORT_SYMBOL_GPL(pti_request_masterchannel); | |||
| 317 | * a master, channel ID address | 317 | * a master, channel ID address |
| 318 | * used to write to PTI HW. | 318 | * used to write to PTI HW. |
| 319 | * | 319 | * |
| 320 | * @mc: master, channel apeture ID address to be released. | 320 | * @mc: master, channel apeture ID address to be released. This |
| 321 | * will de-allocate the structure via kfree(). | ||
| 321 | */ | 322 | */ |
| 322 | void pti_release_masterchannel(struct pti_masterchannel *mc) | 323 | void pti_release_masterchannel(struct pti_masterchannel *mc) |
| 323 | { | 324 | { |
| @@ -475,8 +476,10 @@ static int pti_tty_install(struct tty_driver *driver, struct tty_struct *tty) | |||
| 475 | else | 476 | else |
| 476 | pti_tty_data->mc = pti_request_masterchannel(2); | 477 | pti_tty_data->mc = pti_request_masterchannel(2); |
| 477 | 478 | ||
| 478 | if (pti_tty_data->mc == NULL) | 479 | if (pti_tty_data->mc == NULL) { |
| 480 | kfree(pti_tty_data); | ||
| 479 | return -ENXIO; | 481 | return -ENXIO; |
| 482 | } | ||
| 480 | tty->driver_data = pti_tty_data; | 483 | tty->driver_data = pti_tty_data; |
| 481 | } | 484 | } |
| 482 | 485 | ||
| @@ -495,7 +498,7 @@ static void pti_tty_cleanup(struct tty_struct *tty) | |||
| 495 | if (pti_tty_data == NULL) | 498 | if (pti_tty_data == NULL) |
| 496 | return; | 499 | return; |
| 497 | pti_release_masterchannel(pti_tty_data->mc); | 500 | pti_release_masterchannel(pti_tty_data->mc); |
| 498 | kfree(tty->driver_data); | 501 | kfree(pti_tty_data); |
| 499 | tty->driver_data = NULL; | 502 | tty->driver_data = NULL; |
| 500 | } | 503 | } |
| 501 | 504 | ||
| @@ -581,7 +584,7 @@ static int pti_char_open(struct inode *inode, struct file *filp) | |||
| 581 | static int pti_char_release(struct inode *inode, struct file *filp) | 584 | static int pti_char_release(struct inode *inode, struct file *filp) |
| 582 | { | 585 | { |
| 583 | pti_release_masterchannel(filp->private_data); | 586 | pti_release_masterchannel(filp->private_data); |
| 584 | kfree(filp->private_data); | 587 | filp->private_data = NULL; |
| 585 | return 0; | 588 | return 0; |
| 586 | } | 589 | } |
| 587 | 590 | ||
diff --git a/drivers/misc/ti-st/st_core.c b/drivers/misc/ti-st/st_core.c index f91f82eabda7..54c91ffe4a91 100644 --- a/drivers/misc/ti-st/st_core.c +++ b/drivers/misc/ti-st/st_core.c | |||
| @@ -605,7 +605,7 @@ long st_unregister(struct st_proto_s *proto) | |||
| 605 | pr_debug("%s: %d ", __func__, proto->chnl_id); | 605 | pr_debug("%s: %d ", __func__, proto->chnl_id); |
| 606 | 606 | ||
| 607 | st_kim_ref(&st_gdata, 0); | 607 | st_kim_ref(&st_gdata, 0); |
| 608 | if (proto->chnl_id >= ST_MAX_CHANNELS) { | 608 | if (!st_gdata || proto->chnl_id >= ST_MAX_CHANNELS) { |
| 609 | pr_err(" chnl_id %d not supported", proto->chnl_id); | 609 | pr_err(" chnl_id %d not supported", proto->chnl_id); |
| 610 | return -EPROTONOSUPPORT; | 610 | return -EPROTONOSUPPORT; |
| 611 | } | 611 | } |
diff --git a/drivers/misc/ti-st/st_kim.c b/drivers/misc/ti-st/st_kim.c index 5da93ee6f6be..38fd2f04c07e 100644 --- a/drivers/misc/ti-st/st_kim.c +++ b/drivers/misc/ti-st/st_kim.c | |||
| @@ -245,9 +245,9 @@ void skip_change_remote_baud(unsigned char **ptr, long *len) | |||
| 245 | pr_err("invalid action after change remote baud command"); | 245 | pr_err("invalid action after change remote baud command"); |
| 246 | } else { | 246 | } else { |
| 247 | *ptr = *ptr + sizeof(struct bts_action) + | 247 | *ptr = *ptr + sizeof(struct bts_action) + |
| 248 | ((struct bts_action *)nxt_action)->size; | 248 | ((struct bts_action *)cur_action)->size; |
| 249 | *len = *len - (sizeof(struct bts_action) + | 249 | *len = *len - (sizeof(struct bts_action) + |
| 250 | ((struct bts_action *)nxt_action)->size); | 250 | ((struct bts_action *)cur_action)->size); |
| 251 | /* warn user on not commenting these in firmware */ | 251 | /* warn user on not commenting these in firmware */ |
| 252 | pr_warn("skipping the wait event of change remote baud"); | 252 | pr_warn("skipping the wait event of change remote baud"); |
| 253 | } | 253 | } |
| @@ -604,6 +604,10 @@ void st_kim_ref(struct st_data_s **core_data, int id) | |||
| 604 | struct kim_data_s *kim_gdata; | 604 | struct kim_data_s *kim_gdata; |
| 605 | /* get kim_gdata reference from platform device */ | 605 | /* get kim_gdata reference from platform device */ |
| 606 | pdev = st_get_plat_device(id); | 606 | pdev = st_get_plat_device(id); |
| 607 | if (!pdev) { | ||
| 608 | *core_data = NULL; | ||
| 609 | return; | ||
| 610 | } | ||
| 607 | kim_gdata = dev_get_drvdata(&pdev->dev); | 611 | kim_gdata = dev_get_drvdata(&pdev->dev); |
| 608 | *core_data = kim_gdata->core_data; | 612 | *core_data = kim_gdata->core_data; |
| 609 | } | 613 | } |
diff --git a/drivers/mmc/card/block.c b/drivers/mmc/card/block.c index 71da5641e258..f85e42224559 100644 --- a/drivers/mmc/card/block.c +++ b/drivers/mmc/card/block.c | |||
| @@ -1024,7 +1024,7 @@ static struct mmc_blk_data *mmc_blk_alloc_req(struct mmc_card *card, | |||
| 1024 | INIT_LIST_HEAD(&md->part); | 1024 | INIT_LIST_HEAD(&md->part); |
| 1025 | md->usage = 1; | 1025 | md->usage = 1; |
| 1026 | 1026 | ||
| 1027 | ret = mmc_init_queue(&md->queue, card, &md->lock); | 1027 | ret = mmc_init_queue(&md->queue, card, &md->lock, subname); |
| 1028 | if (ret) | 1028 | if (ret) |
| 1029 | goto err_putdisk; | 1029 | goto err_putdisk; |
| 1030 | 1030 | ||
| @@ -1297,6 +1297,9 @@ static void mmc_blk_remove(struct mmc_card *card) | |||
| 1297 | struct mmc_blk_data *md = mmc_get_drvdata(card); | 1297 | struct mmc_blk_data *md = mmc_get_drvdata(card); |
| 1298 | 1298 | ||
| 1299 | mmc_blk_remove_parts(card, md); | 1299 | mmc_blk_remove_parts(card, md); |
| 1300 | mmc_claim_host(card->host); | ||
| 1301 | mmc_blk_part_switch(card, md); | ||
| 1302 | mmc_release_host(card->host); | ||
| 1300 | mmc_blk_remove_req(md); | 1303 | mmc_blk_remove_req(md); |
| 1301 | mmc_set_drvdata(card, NULL); | 1304 | mmc_set_drvdata(card, NULL); |
| 1302 | } | 1305 | } |
diff --git a/drivers/mmc/card/queue.c b/drivers/mmc/card/queue.c index c07322c2658c..6413afa318d2 100644 --- a/drivers/mmc/card/queue.c +++ b/drivers/mmc/card/queue.c | |||
| @@ -106,10 +106,12 @@ static void mmc_request(struct request_queue *q) | |||
| 106 | * @mq: mmc queue | 106 | * @mq: mmc queue |
| 107 | * @card: mmc card to attach this queue | 107 | * @card: mmc card to attach this queue |
| 108 | * @lock: queue lock | 108 | * @lock: queue lock |
| 109 | * @subname: partition subname | ||
| 109 | * | 110 | * |
| 110 | * Initialise a MMC card request queue. | 111 | * Initialise a MMC card request queue. |
| 111 | */ | 112 | */ |
| 112 | int mmc_init_queue(struct mmc_queue *mq, struct mmc_card *card, spinlock_t *lock) | 113 | int mmc_init_queue(struct mmc_queue *mq, struct mmc_card *card, |
| 114 | spinlock_t *lock, const char *subname) | ||
| 113 | { | 115 | { |
| 114 | struct mmc_host *host = card->host; | 116 | struct mmc_host *host = card->host; |
| 115 | u64 limit = BLK_BOUNCE_HIGH; | 117 | u64 limit = BLK_BOUNCE_HIGH; |
| @@ -133,12 +135,7 @@ int mmc_init_queue(struct mmc_queue *mq, struct mmc_card *card, spinlock_t *lock | |||
| 133 | mq->queue->limits.max_discard_sectors = UINT_MAX; | 135 | mq->queue->limits.max_discard_sectors = UINT_MAX; |
| 134 | if (card->erased_byte == 0) | 136 | if (card->erased_byte == 0) |
| 135 | mq->queue->limits.discard_zeroes_data = 1; | 137 | mq->queue->limits.discard_zeroes_data = 1; |
| 136 | if (!mmc_can_trim(card) && is_power_of_2(card->erase_size)) { | 138 | mq->queue->limits.discard_granularity = card->pref_erase << 9; |
| 137 | mq->queue->limits.discard_granularity = | ||
| 138 | card->erase_size << 9; | ||
| 139 | mq->queue->limits.discard_alignment = | ||
| 140 | card->erase_size << 9; | ||
| 141 | } | ||
| 142 | if (mmc_can_secure_erase_trim(card)) | 139 | if (mmc_can_secure_erase_trim(card)) |
| 143 | queue_flag_set_unlocked(QUEUE_FLAG_SECDISCARD, | 140 | queue_flag_set_unlocked(QUEUE_FLAG_SECDISCARD, |
| 144 | mq->queue); | 141 | mq->queue); |
| @@ -209,8 +206,8 @@ int mmc_init_queue(struct mmc_queue *mq, struct mmc_card *card, spinlock_t *lock | |||
| 209 | 206 | ||
| 210 | sema_init(&mq->thread_sem, 1); | 207 | sema_init(&mq->thread_sem, 1); |
| 211 | 208 | ||
| 212 | mq->thread = kthread_run(mmc_queue_thread, mq, "mmcqd/%d", | 209 | mq->thread = kthread_run(mmc_queue_thread, mq, "mmcqd/%d%s", |
| 213 | host->index); | 210 | host->index, subname ? subname : ""); |
| 214 | 211 | ||
| 215 | if (IS_ERR(mq->thread)) { | 212 | if (IS_ERR(mq->thread)) { |
| 216 | ret = PTR_ERR(mq->thread); | 213 | ret = PTR_ERR(mq->thread); |
diff --git a/drivers/mmc/card/queue.h b/drivers/mmc/card/queue.h index 64e66e0d4994..6223ef8dc9cd 100644 --- a/drivers/mmc/card/queue.h +++ b/drivers/mmc/card/queue.h | |||
| @@ -19,7 +19,8 @@ struct mmc_queue { | |||
| 19 | unsigned int bounce_sg_len; | 19 | unsigned int bounce_sg_len; |
| 20 | }; | 20 | }; |
| 21 | 21 | ||
| 22 | extern int mmc_init_queue(struct mmc_queue *, struct mmc_card *, spinlock_t *); | 22 | extern int mmc_init_queue(struct mmc_queue *, struct mmc_card *, spinlock_t *, |
| 23 | const char *); | ||
| 23 | extern void mmc_cleanup_queue(struct mmc_queue *); | 24 | extern void mmc_cleanup_queue(struct mmc_queue *); |
| 24 | extern void mmc_queue_suspend(struct mmc_queue *); | 25 | extern void mmc_queue_suspend(struct mmc_queue *); |
| 25 | extern void mmc_queue_resume(struct mmc_queue *); | 26 | extern void mmc_queue_resume(struct mmc_queue *); |
diff --git a/drivers/mmc/core/core.c b/drivers/mmc/core/core.c index 68091dda3f31..7843efe22359 100644 --- a/drivers/mmc/core/core.c +++ b/drivers/mmc/core/core.c | |||
| @@ -1245,7 +1245,7 @@ static unsigned int mmc_mmc_erase_timeout(struct mmc_card *card, | |||
| 1245 | */ | 1245 | */ |
| 1246 | timeout_clks <<= 1; | 1246 | timeout_clks <<= 1; |
| 1247 | timeout_us += (timeout_clks * 1000) / | 1247 | timeout_us += (timeout_clks * 1000) / |
| 1248 | (card->host->ios.clock / 1000); | 1248 | (mmc_host_clk_rate(card->host) / 1000); |
| 1249 | 1249 | ||
| 1250 | erase_timeout = timeout_us / 1000; | 1250 | erase_timeout = timeout_us / 1000; |
| 1251 | 1251 | ||
diff --git a/drivers/mmc/core/sdio.c b/drivers/mmc/core/sdio.c index 4d0c15bfa514..262fff019177 100644 --- a/drivers/mmc/core/sdio.c +++ b/drivers/mmc/core/sdio.c | |||
| @@ -691,15 +691,54 @@ static int mmc_sdio_resume(struct mmc_host *host) | |||
| 691 | static int mmc_sdio_power_restore(struct mmc_host *host) | 691 | static int mmc_sdio_power_restore(struct mmc_host *host) |
| 692 | { | 692 | { |
| 693 | int ret; | 693 | int ret; |
| 694 | u32 ocr; | ||
| 694 | 695 | ||
| 695 | BUG_ON(!host); | 696 | BUG_ON(!host); |
| 696 | BUG_ON(!host->card); | 697 | BUG_ON(!host->card); |
| 697 | 698 | ||
| 698 | mmc_claim_host(host); | 699 | mmc_claim_host(host); |
| 700 | |||
| 701 | /* | ||
| 702 | * Reset the card by performing the same steps that are taken by | ||
| 703 | * mmc_rescan_try_freq() and mmc_attach_sdio() during a "normal" probe. | ||
| 704 | * | ||
| 705 | * sdio_reset() is technically not needed. Having just powered up the | ||
| 706 | * hardware, it should already be in reset state. However, some | ||
| 707 | * platforms (such as SD8686 on OLPC) do not instantly cut power, | ||
| 708 | * meaning that a reset is required when restoring power soon after | ||
| 709 | * powering off. It is harmless in other cases. | ||
| 710 | * | ||
| 711 | * The CMD5 reset (mmc_send_io_op_cond()), according to the SDIO spec, | ||
| 712 | * is not necessary for non-removable cards. However, it is required | ||
| 713 | * for OLPC SD8686 (which expects a [CMD5,5,3,7] init sequence), and | ||
| 714 | * harmless in other situations. | ||
| 715 | * | ||
| 716 | * With these steps taken, mmc_select_voltage() is also required to | ||
| 717 | * restore the correct voltage setting of the card. | ||
| 718 | */ | ||
| 719 | sdio_reset(host); | ||
| 720 | mmc_go_idle(host); | ||
| 721 | mmc_send_if_cond(host, host->ocr_avail); | ||
| 722 | |||
| 723 | ret = mmc_send_io_op_cond(host, 0, &ocr); | ||
| 724 | if (ret) | ||
| 725 | goto out; | ||
| 726 | |||
| 727 | if (host->ocr_avail_sdio) | ||
| 728 | host->ocr_avail = host->ocr_avail_sdio; | ||
| 729 | |||
| 730 | host->ocr = mmc_select_voltage(host, ocr & ~0x7F); | ||
| 731 | if (!host->ocr) { | ||
| 732 | ret = -EINVAL; | ||
| 733 | goto out; | ||
| 734 | } | ||
| 735 | |||
| 699 | ret = mmc_sdio_init_card(host, host->ocr, host->card, | 736 | ret = mmc_sdio_init_card(host, host->ocr, host->card, |
| 700 | mmc_card_keep_power(host)); | 737 | mmc_card_keep_power(host)); |
| 701 | if (!ret && host->sdio_irqs) | 738 | if (!ret && host->sdio_irqs) |
| 702 | mmc_signal_sdio_irq(host); | 739 | mmc_signal_sdio_irq(host); |
| 740 | |||
| 741 | out: | ||
| 703 | mmc_release_host(host); | 742 | mmc_release_host(host); |
| 704 | 743 | ||
| 705 | return ret; | 744 | return ret; |
diff --git a/drivers/mmc/core/sdio_bus.c b/drivers/mmc/core/sdio_bus.c index d29b9c36919a..d2565df8a7fb 100644 --- a/drivers/mmc/core/sdio_bus.c +++ b/drivers/mmc/core/sdio_bus.c | |||
| @@ -189,7 +189,7 @@ static int sdio_bus_remove(struct device *dev) | |||
| 189 | 189 | ||
| 190 | /* Then undo the runtime PM settings in sdio_bus_probe() */ | 190 | /* Then undo the runtime PM settings in sdio_bus_probe() */ |
| 191 | if (func->card->host->caps & MMC_CAP_POWER_OFF_CARD) | 191 | if (func->card->host->caps & MMC_CAP_POWER_OFF_CARD) |
| 192 | pm_runtime_put_noidle(dev); | 192 | pm_runtime_put_sync(dev); |
| 193 | 193 | ||
| 194 | out: | 194 | out: |
| 195 | return ret; | 195 | return ret; |
diff --git a/drivers/mmc/host/of_mmc_spi.c b/drivers/mmc/host/of_mmc_spi.c index e2aecb7f1d5c..ab66f2454dc4 100644 --- a/drivers/mmc/host/of_mmc_spi.c +++ b/drivers/mmc/host/of_mmc_spi.c | |||
| @@ -25,6 +25,11 @@ | |||
| 25 | #include <linux/mmc/core.h> | 25 | #include <linux/mmc/core.h> |
| 26 | #include <linux/mmc/host.h> | 26 | #include <linux/mmc/host.h> |
| 27 | 27 | ||
| 28 | /* For archs that don't support NO_IRQ (such as mips), provide a dummy value */ | ||
| 29 | #ifndef NO_IRQ | ||
| 30 | #define NO_IRQ 0 | ||
| 31 | #endif | ||
| 32 | |||
| 28 | MODULE_LICENSE("GPL"); | 33 | MODULE_LICENSE("GPL"); |
| 29 | 34 | ||
| 30 | enum { | 35 | enum { |
diff --git a/drivers/mmc/host/omap_hsmmc.c b/drivers/mmc/host/omap_hsmmc.c index 5b2e2155b413..dedf3dab8a3b 100644 --- a/drivers/mmc/host/omap_hsmmc.c +++ b/drivers/mmc/host/omap_hsmmc.c | |||
| @@ -429,7 +429,6 @@ static int omap_hsmmc_reg_get(struct omap_hsmmc_host *host) | |||
| 429 | return -EINVAL; | 429 | return -EINVAL; |
| 430 | } | 430 | } |
| 431 | } | 431 | } |
| 432 | mmc_slot(host).ocr_mask = mmc_regulator_get_ocrmask(reg); | ||
| 433 | 432 | ||
| 434 | /* Allow an aux regulator */ | 433 | /* Allow an aux regulator */ |
| 435 | reg = regulator_get(host->dev, "vmmc_aux"); | 434 | reg = regulator_get(host->dev, "vmmc_aux"); |
| @@ -962,7 +961,8 @@ static void omap_hsmmc_dma_cleanup(struct omap_hsmmc_host *host, int errno) | |||
| 962 | spin_unlock(&host->irq_lock); | 961 | spin_unlock(&host->irq_lock); |
| 963 | 962 | ||
| 964 | if (host->use_dma && dma_ch != -1) { | 963 | if (host->use_dma && dma_ch != -1) { |
| 965 | dma_unmap_sg(mmc_dev(host->mmc), host->data->sg, host->dma_len, | 964 | dma_unmap_sg(mmc_dev(host->mmc), host->data->sg, |
| 965 | host->data->sg_len, | ||
| 966 | omap_hsmmc_get_dma_dir(host, host->data)); | 966 | omap_hsmmc_get_dma_dir(host, host->data)); |
| 967 | omap_free_dma(dma_ch); | 967 | omap_free_dma(dma_ch); |
| 968 | } | 968 | } |
| @@ -1346,7 +1346,7 @@ static void omap_hsmmc_dma_cb(int lch, u16 ch_status, void *cb_data) | |||
| 1346 | return; | 1346 | return; |
| 1347 | } | 1347 | } |
| 1348 | 1348 | ||
| 1349 | dma_unmap_sg(mmc_dev(host->mmc), data->sg, host->dma_len, | 1349 | dma_unmap_sg(mmc_dev(host->mmc), data->sg, data->sg_len, |
| 1350 | omap_hsmmc_get_dma_dir(host, data)); | 1350 | omap_hsmmc_get_dma_dir(host, data)); |
| 1351 | 1351 | ||
| 1352 | req_in_progress = host->req_in_progress; | 1352 | req_in_progress = host->req_in_progress; |
diff --git a/drivers/mmc/host/sh_mobile_sdhi.c b/drivers/mmc/host/sh_mobile_sdhi.c index b3654293017b..ce500f03df85 100644 --- a/drivers/mmc/host/sh_mobile_sdhi.c +++ b/drivers/mmc/host/sh_mobile_sdhi.c | |||
| @@ -92,7 +92,7 @@ static int __devinit sh_mobile_sdhi_probe(struct platform_device *pdev) | |||
| 92 | mmc_data->ocr_mask = p->tmio_ocr_mask; | 92 | mmc_data->ocr_mask = p->tmio_ocr_mask; |
| 93 | mmc_data->capabilities |= p->tmio_caps; | 93 | mmc_data->capabilities |= p->tmio_caps; |
| 94 | 94 | ||
| 95 | if (p->dma_slave_tx >= 0 && p->dma_slave_rx >= 0) { | 95 | if (p->dma_slave_tx > 0 && p->dma_slave_rx > 0) { |
| 96 | priv->param_tx.slave_id = p->dma_slave_tx; | 96 | priv->param_tx.slave_id = p->dma_slave_tx; |
| 97 | priv->param_rx.slave_id = p->dma_slave_rx; | 97 | priv->param_rx.slave_id = p->dma_slave_rx; |
| 98 | priv->dma_priv.chan_priv_tx = &priv->param_tx; | 98 | priv->dma_priv.chan_priv_tx = &priv->param_tx; |
| @@ -165,13 +165,14 @@ static int sh_mobile_sdhi_remove(struct platform_device *pdev) | |||
| 165 | 165 | ||
| 166 | p->pdata = NULL; | 166 | p->pdata = NULL; |
| 167 | 167 | ||
| 168 | tmio_mmc_host_remove(host); | ||
| 169 | |||
| 168 | for (i = 0; i < 3; i++) { | 170 | for (i = 0; i < 3; i++) { |
| 169 | irq = platform_get_irq(pdev, i); | 171 | irq = platform_get_irq(pdev, i); |
| 170 | if (irq >= 0) | 172 | if (irq >= 0) |
| 171 | free_irq(irq, host); | 173 | free_irq(irq, host); |
| 172 | } | 174 | } |
| 173 | 175 | ||
| 174 | tmio_mmc_host_remove(host); | ||
| 175 | clk_disable(priv->clk); | 176 | clk_disable(priv->clk); |
| 176 | clk_put(priv->clk); | 177 | clk_put(priv->clk); |
| 177 | kfree(priv); | 178 | kfree(priv); |
diff --git a/drivers/mmc/host/tmio_mmc_pio.c b/drivers/mmc/host/tmio_mmc_pio.c index ad6347bb02dd..0b09e8239aa0 100644 --- a/drivers/mmc/host/tmio_mmc_pio.c +++ b/drivers/mmc/host/tmio_mmc_pio.c | |||
| @@ -824,8 +824,8 @@ static int tmio_mmc_get_ro(struct mmc_host *mmc) | |||
| 824 | struct tmio_mmc_host *host = mmc_priv(mmc); | 824 | struct tmio_mmc_host *host = mmc_priv(mmc); |
| 825 | struct tmio_mmc_data *pdata = host->pdata; | 825 | struct tmio_mmc_data *pdata = host->pdata; |
| 826 | 826 | ||
| 827 | return ((pdata->flags & TMIO_MMC_WRPROTECT_DISABLE) || | 827 | return !((pdata->flags & TMIO_MMC_WRPROTECT_DISABLE) || |
| 828 | !(sd_ctrl_read32(host, CTL_STATUS) & TMIO_STAT_WRPROTECT)); | 828 | (sd_ctrl_read32(host, CTL_STATUS) & TMIO_STAT_WRPROTECT)); |
| 829 | } | 829 | } |
| 830 | 830 | ||
| 831 | static int tmio_mmc_get_cd(struct mmc_host *mmc) | 831 | static int tmio_mmc_get_cd(struct mmc_host *mmc) |
diff --git a/drivers/mmc/host/vub300.c b/drivers/mmc/host/vub300.c index cbb03305b77b..d4455ffbefd8 100644 --- a/drivers/mmc/host/vub300.c +++ b/drivers/mmc/host/vub300.c | |||
| @@ -2096,7 +2096,7 @@ static struct mmc_host_ops vub300_mmc_ops = { | |||
| 2096 | static int vub300_probe(struct usb_interface *interface, | 2096 | static int vub300_probe(struct usb_interface *interface, |
| 2097 | const struct usb_device_id *id) | 2097 | const struct usb_device_id *id) |
| 2098 | { /* NOT irq */ | 2098 | { /* NOT irq */ |
| 2099 | struct vub300_mmc_host *vub300 = NULL; | 2099 | struct vub300_mmc_host *vub300; |
| 2100 | struct usb_host_interface *iface_desc; | 2100 | struct usb_host_interface *iface_desc; |
| 2101 | struct usb_device *udev = usb_get_dev(interface_to_usbdev(interface)); | 2101 | struct usb_device *udev = usb_get_dev(interface_to_usbdev(interface)); |
| 2102 | int i; | 2102 | int i; |
| @@ -2118,23 +2118,20 @@ static int vub300_probe(struct usb_interface *interface, | |||
| 2118 | command_out_urb = usb_alloc_urb(0, GFP_KERNEL); | 2118 | command_out_urb = usb_alloc_urb(0, GFP_KERNEL); |
| 2119 | if (!command_out_urb) { | 2119 | if (!command_out_urb) { |
| 2120 | retval = -ENOMEM; | 2120 | retval = -ENOMEM; |
| 2121 | dev_err(&vub300->udev->dev, | 2121 | dev_err(&udev->dev, "not enough memory for command_out_urb\n"); |
| 2122 | "not enough memory for the command_out_urb\n"); | ||
| 2123 | goto error0; | 2122 | goto error0; |
| 2124 | } | 2123 | } |
| 2125 | command_res_urb = usb_alloc_urb(0, GFP_KERNEL); | 2124 | command_res_urb = usb_alloc_urb(0, GFP_KERNEL); |
| 2126 | if (!command_res_urb) { | 2125 | if (!command_res_urb) { |
| 2127 | retval = -ENOMEM; | 2126 | retval = -ENOMEM; |
| 2128 | dev_err(&vub300->udev->dev, | 2127 | dev_err(&udev->dev, "not enough memory for command_res_urb\n"); |
| 2129 | "not enough memory for the command_res_urb\n"); | ||
| 2130 | goto error1; | 2128 | goto error1; |
| 2131 | } | 2129 | } |
| 2132 | /* this also allocates memory for our VUB300 mmc host device */ | 2130 | /* this also allocates memory for our VUB300 mmc host device */ |
| 2133 | mmc = mmc_alloc_host(sizeof(struct vub300_mmc_host), &udev->dev); | 2131 | mmc = mmc_alloc_host(sizeof(struct vub300_mmc_host), &udev->dev); |
| 2134 | if (!mmc) { | 2132 | if (!mmc) { |
| 2135 | retval = -ENOMEM; | 2133 | retval = -ENOMEM; |
| 2136 | dev_err(&vub300->udev->dev, | 2134 | dev_err(&udev->dev, "not enough memory for the mmc_host\n"); |
| 2137 | "not enough memory for the mmc_host\n"); | ||
| 2138 | goto error4; | 2135 | goto error4; |
| 2139 | } | 2136 | } |
| 2140 | /* MMC core transfer sizes tunable parameters */ | 2137 | /* MMC core transfer sizes tunable parameters */ |
diff --git a/drivers/mtd/nand/fsl_elbc_nand.c b/drivers/mtd/nand/fsl_elbc_nand.c index 0bb254c7d2b1..33d8aad8bba5 100644 --- a/drivers/mtd/nand/fsl_elbc_nand.c +++ b/drivers/mtd/nand/fsl_elbc_nand.c | |||
| @@ -339,9 +339,9 @@ static void fsl_elbc_cmdfunc(struct mtd_info *mtd, unsigned int command, | |||
| 339 | (FIR_OP_UA << FIR_OP1_SHIFT) | | 339 | (FIR_OP_UA << FIR_OP1_SHIFT) | |
| 340 | (FIR_OP_RBW << FIR_OP2_SHIFT)); | 340 | (FIR_OP_RBW << FIR_OP2_SHIFT)); |
| 341 | out_be32(&lbc->fcr, NAND_CMD_READID << FCR_CMD0_SHIFT); | 341 | out_be32(&lbc->fcr, NAND_CMD_READID << FCR_CMD0_SHIFT); |
| 342 | /* 5 bytes for manuf, device and exts */ | 342 | /* nand_get_flash_type() reads 8 bytes of entire ID string */ |
| 343 | out_be32(&lbc->fbcr, 5); | 343 | out_be32(&lbc->fbcr, 8); |
| 344 | elbc_fcm_ctrl->read_bytes = 5; | 344 | elbc_fcm_ctrl->read_bytes = 8; |
| 345 | elbc_fcm_ctrl->use_mdr = 1; | 345 | elbc_fcm_ctrl->use_mdr = 1; |
| 346 | elbc_fcm_ctrl->mdr = 0; | 346 | elbc_fcm_ctrl->mdr = 0; |
| 347 | 347 | ||
diff --git a/drivers/net/8139too.c b/drivers/net/8139too.c index ed6355cc5261..c2672c692d6f 100644 --- a/drivers/net/8139too.c +++ b/drivers/net/8139too.c | |||
| @@ -993,6 +993,7 @@ static int __devinit rtl8139_init_one (struct pci_dev *pdev, | |||
| 993 | * features | 993 | * features |
| 994 | */ | 994 | */ |
| 995 | dev->features |= NETIF_F_SG | NETIF_F_HW_CSUM | NETIF_F_HIGHDMA; | 995 | dev->features |= NETIF_F_SG | NETIF_F_HW_CSUM | NETIF_F_HIGHDMA; |
| 996 | dev->vlan_features = dev->features; | ||
| 996 | 997 | ||
| 997 | dev->irq = pdev->irq; | 998 | dev->irq = pdev->irq; |
| 998 | 999 | ||
diff --git a/drivers/net/Kconfig b/drivers/net/Kconfig index f5919c28a4b8..4d68a264df9b 100644 --- a/drivers/net/Kconfig +++ b/drivers/net/Kconfig | |||
| @@ -3415,7 +3415,8 @@ config NETCONSOLE | |||
| 3415 | 3415 | ||
| 3416 | config NETCONSOLE_DYNAMIC | 3416 | config NETCONSOLE_DYNAMIC |
| 3417 | bool "Dynamic reconfiguration of logging targets" | 3417 | bool "Dynamic reconfiguration of logging targets" |
| 3418 | depends on NETCONSOLE && SYSFS && CONFIGFS_FS | 3418 | depends on NETCONSOLE && SYSFS && CONFIGFS_FS && \ |
| 3419 | !(NETCONSOLE=y && CONFIGFS_FS=m) | ||
| 3419 | help | 3420 | help |
| 3420 | This option enables the ability to dynamically reconfigure target | 3421 | This option enables the ability to dynamically reconfigure target |
| 3421 | parameters (interface, IP addresses, port numbers, MAC addresses) | 3422 | parameters (interface, IP addresses, port numbers, MAC addresses) |
diff --git a/drivers/net/bna/bnad.c b/drivers/net/bna/bnad.c index 7d25a97d33f6..44e219c910da 100644 --- a/drivers/net/bna/bnad.c +++ b/drivers/net/bna/bnad.c | |||
| @@ -1111,7 +1111,7 @@ bnad_mbox_irq_alloc(struct bnad *bnad, | |||
| 1111 | struct bna_intr_info *intr_info) | 1111 | struct bna_intr_info *intr_info) |
| 1112 | { | 1112 | { |
| 1113 | int err = 0; | 1113 | int err = 0; |
| 1114 | unsigned long flags; | 1114 | unsigned long irq_flags = 0, flags; |
| 1115 | u32 irq; | 1115 | u32 irq; |
| 1116 | irq_handler_t irq_handler; | 1116 | irq_handler_t irq_handler; |
| 1117 | 1117 | ||
| @@ -1125,18 +1125,17 @@ bnad_mbox_irq_alloc(struct bnad *bnad, | |||
| 1125 | if (bnad->cfg_flags & BNAD_CF_MSIX) { | 1125 | if (bnad->cfg_flags & BNAD_CF_MSIX) { |
| 1126 | irq_handler = (irq_handler_t)bnad_msix_mbox_handler; | 1126 | irq_handler = (irq_handler_t)bnad_msix_mbox_handler; |
| 1127 | irq = bnad->msix_table[bnad->msix_num - 1].vector; | 1127 | irq = bnad->msix_table[bnad->msix_num - 1].vector; |
| 1128 | flags = 0; | ||
| 1129 | intr_info->intr_type = BNA_INTR_T_MSIX; | 1128 | intr_info->intr_type = BNA_INTR_T_MSIX; |
| 1130 | intr_info->idl[0].vector = bnad->msix_num - 1; | 1129 | intr_info->idl[0].vector = bnad->msix_num - 1; |
| 1131 | } else { | 1130 | } else { |
| 1132 | irq_handler = (irq_handler_t)bnad_isr; | 1131 | irq_handler = (irq_handler_t)bnad_isr; |
| 1133 | irq = bnad->pcidev->irq; | 1132 | irq = bnad->pcidev->irq; |
| 1134 | flags = IRQF_SHARED; | 1133 | irq_flags = IRQF_SHARED; |
| 1135 | intr_info->intr_type = BNA_INTR_T_INTX; | 1134 | intr_info->intr_type = BNA_INTR_T_INTX; |
| 1136 | /* intr_info->idl.vector = 0 ? */ | 1135 | /* intr_info->idl.vector = 0 ? */ |
| 1137 | } | 1136 | } |
| 1138 | spin_unlock_irqrestore(&bnad->bna_lock, flags); | 1137 | spin_unlock_irqrestore(&bnad->bna_lock, flags); |
| 1139 | 1138 | flags = irq_flags; | |
| 1140 | sprintf(bnad->mbox_irq_name, "%s", BNAD_NAME); | 1139 | sprintf(bnad->mbox_irq_name, "%s", BNAD_NAME); |
| 1141 | 1140 | ||
| 1142 | /* | 1141 | /* |
diff --git a/drivers/net/bnx2x/bnx2x_main.c b/drivers/net/bnx2x/bnx2x_main.c index 98604350a811..5b4a8f34b13c 100644 --- a/drivers/net/bnx2x/bnx2x_main.c +++ b/drivers/net/bnx2x/bnx2x_main.c | |||
| @@ -50,6 +50,7 @@ | |||
| 50 | #include <linux/zlib.h> | 50 | #include <linux/zlib.h> |
| 51 | #include <linux/io.h> | 51 | #include <linux/io.h> |
| 52 | #include <linux/stringify.h> | 52 | #include <linux/stringify.h> |
| 53 | #include <linux/vmalloc.h> | ||
| 53 | 54 | ||
| 54 | #include "bnx2x.h" | 55 | #include "bnx2x.h" |
| 55 | #include "bnx2x_init.h" | 56 | #include "bnx2x_init.h" |
| @@ -5152,8 +5153,7 @@ static int bnx2x_gunzip_init(struct bnx2x *bp) | |||
| 5152 | if (bp->strm == NULL) | 5153 | if (bp->strm == NULL) |
| 5153 | goto gunzip_nomem2; | 5154 | goto gunzip_nomem2; |
| 5154 | 5155 | ||
| 5155 | bp->strm->workspace = kmalloc(zlib_inflate_workspacesize(), | 5156 | bp->strm->workspace = vmalloc(zlib_inflate_workspacesize()); |
| 5156 | GFP_KERNEL); | ||
| 5157 | if (bp->strm->workspace == NULL) | 5157 | if (bp->strm->workspace == NULL) |
| 5158 | goto gunzip_nomem3; | 5158 | goto gunzip_nomem3; |
| 5159 | 5159 | ||
| @@ -5177,7 +5177,7 @@ gunzip_nomem1: | |||
| 5177 | static void bnx2x_gunzip_end(struct bnx2x *bp) | 5177 | static void bnx2x_gunzip_end(struct bnx2x *bp) |
| 5178 | { | 5178 | { |
| 5179 | if (bp->strm) { | 5179 | if (bp->strm) { |
| 5180 | kfree(bp->strm->workspace); | 5180 | vfree(bp->strm->workspace); |
| 5181 | kfree(bp->strm); | 5181 | kfree(bp->strm); |
| 5182 | bp->strm = NULL; | 5182 | bp->strm = NULL; |
| 5183 | } | 5183 | } |
diff --git a/drivers/net/can/Kconfig b/drivers/net/can/Kconfig index 906366b54037..f6c98fb4a517 100644 --- a/drivers/net/can/Kconfig +++ b/drivers/net/can/Kconfig | |||
| @@ -34,7 +34,7 @@ config CAN_SLCAN | |||
| 34 | config CAN_DEV | 34 | config CAN_DEV |
| 35 | tristate "Platform CAN drivers with Netlink support" | 35 | tristate "Platform CAN drivers with Netlink support" |
| 36 | depends on CAN | 36 | depends on CAN |
| 37 | default Y | 37 | default y |
| 38 | ---help--- | 38 | ---help--- |
| 39 | Enables the common framework for platform CAN drivers with Netlink | 39 | Enables the common framework for platform CAN drivers with Netlink |
| 40 | support. This is the standard library for CAN drivers. | 40 | support. This is the standard library for CAN drivers. |
| @@ -43,7 +43,7 @@ config CAN_DEV | |||
| 43 | config CAN_CALC_BITTIMING | 43 | config CAN_CALC_BITTIMING |
| 44 | bool "CAN bit-timing calculation" | 44 | bool "CAN bit-timing calculation" |
| 45 | depends on CAN_DEV | 45 | depends on CAN_DEV |
| 46 | default Y | 46 | default y |
| 47 | ---help--- | 47 | ---help--- |
| 48 | If enabled, CAN bit-timing parameters will be calculated for the | 48 | If enabled, CAN bit-timing parameters will be calculated for the |
| 49 | bit-rate specified via Netlink argument "bitrate" when the device | 49 | bit-rate specified via Netlink argument "bitrate" when the device |
diff --git a/drivers/net/cxgb3/sge.c b/drivers/net/cxgb3/sge.c index 3f562ba2f0c9..76bf5892b962 100644 --- a/drivers/net/cxgb3/sge.c +++ b/drivers/net/cxgb3/sge.c | |||
| @@ -2026,7 +2026,7 @@ static void rx_eth(struct adapter *adap, struct sge_rspq *rq, | |||
| 2026 | skb->ip_summed = CHECKSUM_UNNECESSARY; | 2026 | skb->ip_summed = CHECKSUM_UNNECESSARY; |
| 2027 | } else | 2027 | } else |
| 2028 | skb_checksum_none_assert(skb); | 2028 | skb_checksum_none_assert(skb); |
| 2029 | skb_record_rx_queue(skb, qs - &adap->sge.qs[0]); | 2029 | skb_record_rx_queue(skb, qs - &adap->sge.qs[pi->first_qset]); |
| 2030 | 2030 | ||
| 2031 | if (unlikely(p->vlan_valid)) { | 2031 | if (unlikely(p->vlan_valid)) { |
| 2032 | struct vlan_group *grp = pi->vlan_grp; | 2032 | struct vlan_group *grp = pi->vlan_grp; |
| @@ -2145,7 +2145,7 @@ static void lro_add_page(struct adapter *adap, struct sge_qset *qs, | |||
| 2145 | if (!complete) | 2145 | if (!complete) |
| 2146 | return; | 2146 | return; |
| 2147 | 2147 | ||
| 2148 | skb_record_rx_queue(skb, qs - &adap->sge.qs[0]); | 2148 | skb_record_rx_queue(skb, qs - &adap->sge.qs[pi->first_qset]); |
| 2149 | 2149 | ||
| 2150 | if (unlikely(cpl->vlan_valid)) { | 2150 | if (unlikely(cpl->vlan_valid)) { |
| 2151 | struct vlan_group *grp = pi->vlan_grp; | 2151 | struct vlan_group *grp = pi->vlan_grp; |
diff --git a/drivers/net/greth.c b/drivers/net/greth.c index 82c3767ec5f8..16ce45c11934 100644 --- a/drivers/net/greth.c +++ b/drivers/net/greth.c | |||
| @@ -1017,11 +1017,10 @@ static int greth_set_mac_add(struct net_device *dev, void *p) | |||
| 1017 | return -EINVAL; | 1017 | return -EINVAL; |
| 1018 | 1018 | ||
| 1019 | memcpy(dev->dev_addr, addr->sa_data, dev->addr_len); | 1019 | memcpy(dev->dev_addr, addr->sa_data, dev->addr_len); |
| 1020 | GRETH_REGSAVE(regs->esa_msb, dev->dev_addr[0] << 8 | dev->dev_addr[1]); | ||
| 1021 | GRETH_REGSAVE(regs->esa_lsb, dev->dev_addr[2] << 24 | dev->dev_addr[3] << 16 | | ||
| 1022 | dev->dev_addr[4] << 8 | dev->dev_addr[5]); | ||
| 1020 | 1023 | ||
| 1021 | GRETH_REGSAVE(regs->esa_msb, addr->sa_data[0] << 8 | addr->sa_data[1]); | ||
| 1022 | GRETH_REGSAVE(regs->esa_lsb, | ||
| 1023 | addr->sa_data[2] << 24 | addr-> | ||
| 1024 | sa_data[3] << 16 | addr->sa_data[4] << 8 | addr->sa_data[5]); | ||
| 1025 | return 0; | 1024 | return 0; |
| 1026 | } | 1025 | } |
| 1027 | 1026 | ||
diff --git a/drivers/net/hamradio/6pack.c b/drivers/net/hamradio/6pack.c index 3e5d0b6b6516..0d283781bc5e 100644 --- a/drivers/net/hamradio/6pack.c +++ b/drivers/net/hamradio/6pack.c | |||
| @@ -692,10 +692,10 @@ static void sixpack_close(struct tty_struct *tty) | |||
| 692 | { | 692 | { |
| 693 | struct sixpack *sp; | 693 | struct sixpack *sp; |
| 694 | 694 | ||
| 695 | write_lock(&disc_data_lock); | 695 | write_lock_bh(&disc_data_lock); |
| 696 | sp = tty->disc_data; | 696 | sp = tty->disc_data; |
| 697 | tty->disc_data = NULL; | 697 | tty->disc_data = NULL; |
| 698 | write_unlock(&disc_data_lock); | 698 | write_unlock_bh(&disc_data_lock); |
| 699 | if (!sp) | 699 | if (!sp) |
| 700 | return; | 700 | return; |
| 701 | 701 | ||
diff --git a/drivers/net/hamradio/mkiss.c b/drivers/net/hamradio/mkiss.c index 4c628393c8b1..bc02968cee16 100644 --- a/drivers/net/hamradio/mkiss.c +++ b/drivers/net/hamradio/mkiss.c | |||
| @@ -813,10 +813,10 @@ static void mkiss_close(struct tty_struct *tty) | |||
| 813 | { | 813 | { |
| 814 | struct mkiss *ax; | 814 | struct mkiss *ax; |
| 815 | 815 | ||
| 816 | write_lock(&disc_data_lock); | 816 | write_lock_bh(&disc_data_lock); |
| 817 | ax = tty->disc_data; | 817 | ax = tty->disc_data; |
| 818 | tty->disc_data = NULL; | 818 | tty->disc_data = NULL; |
| 819 | write_unlock(&disc_data_lock); | 819 | write_unlock_bh(&disc_data_lock); |
| 820 | 820 | ||
| 821 | if (!ax) | 821 | if (!ax) |
| 822 | return; | 822 | return; |
diff --git a/drivers/net/natsemi.c b/drivers/net/natsemi.c index b78be088c4ad..8f8b65af9ed5 100644 --- a/drivers/net/natsemi.c +++ b/drivers/net/natsemi.c | |||
| @@ -2360,7 +2360,8 @@ static void netdev_rx(struct net_device *dev, int *work_done, int work_to_do) | |||
| 2360 | PCI_DMA_FROMDEVICE); | 2360 | PCI_DMA_FROMDEVICE); |
| 2361 | } else { | 2361 | } else { |
| 2362 | pci_unmap_single(np->pci_dev, np->rx_dma[entry], | 2362 | pci_unmap_single(np->pci_dev, np->rx_dma[entry], |
| 2363 | buflen, PCI_DMA_FROMDEVICE); | 2363 | buflen + NATSEMI_PADDING, |
| 2364 | PCI_DMA_FROMDEVICE); | ||
| 2364 | skb_put(skb = np->rx_skbuff[entry], pkt_len); | 2365 | skb_put(skb = np->rx_skbuff[entry], pkt_len); |
| 2365 | np->rx_skbuff[entry] = NULL; | 2366 | np->rx_skbuff[entry] = NULL; |
| 2366 | } | 2367 | } |
diff --git a/drivers/net/ppp_deflate.c b/drivers/net/ppp_deflate.c index 31e9407a0739..1dbdf82a6dfd 100644 --- a/drivers/net/ppp_deflate.c +++ b/drivers/net/ppp_deflate.c | |||
| @@ -305,7 +305,7 @@ static void z_decomp_free(void *arg) | |||
| 305 | 305 | ||
| 306 | if (state) { | 306 | if (state) { |
| 307 | zlib_inflateEnd(&state->strm); | 307 | zlib_inflateEnd(&state->strm); |
| 308 | kfree(state->strm.workspace); | 308 | vfree(state->strm.workspace); |
| 309 | kfree(state); | 309 | kfree(state); |
| 310 | } | 310 | } |
| 311 | } | 311 | } |
| @@ -345,8 +345,7 @@ static void *z_decomp_alloc(unsigned char *options, int opt_len) | |||
| 345 | 345 | ||
| 346 | state->w_size = w_size; | 346 | state->w_size = w_size; |
| 347 | state->strm.next_out = NULL; | 347 | state->strm.next_out = NULL; |
| 348 | state->strm.workspace = kmalloc(zlib_inflate_workspacesize(), | 348 | state->strm.workspace = vmalloc(zlib_inflate_workspacesize()); |
| 349 | GFP_KERNEL|__GFP_REPEAT); | ||
| 350 | if (state->strm.workspace == NULL) | 349 | if (state->strm.workspace == NULL) |
| 351 | goto out_free; | 350 | goto out_free; |
| 352 | 351 | ||
diff --git a/drivers/net/qlge/qlge.h b/drivers/net/qlge/qlge.h index 7d8483f9012e..794252c0aedd 100644 --- a/drivers/net/qlge/qlge.h +++ b/drivers/net/qlge/qlge.h | |||
| @@ -17,7 +17,7 @@ | |||
| 17 | */ | 17 | */ |
| 18 | #define DRV_NAME "qlge" | 18 | #define DRV_NAME "qlge" |
| 19 | #define DRV_STRING "QLogic 10 Gigabit PCI-E Ethernet Driver " | 19 | #define DRV_STRING "QLogic 10 Gigabit PCI-E Ethernet Driver " |
| 20 | #define DRV_VERSION "v1.00.00.27.00.00-01" | 20 | #define DRV_VERSION "v1.00.00.29.00.00-01" |
| 21 | 21 | ||
| 22 | #define WQ_ADDR_ALIGN 0x3 /* 4 byte alignment */ | 22 | #define WQ_ADDR_ALIGN 0x3 /* 4 byte alignment */ |
| 23 | 23 | ||
| @@ -1997,6 +1997,7 @@ enum { | |||
| 1997 | QL_LB_LINK_UP = 10, | 1997 | QL_LB_LINK_UP = 10, |
| 1998 | QL_FRC_COREDUMP = 11, | 1998 | QL_FRC_COREDUMP = 11, |
| 1999 | QL_EEH_FATAL = 12, | 1999 | QL_EEH_FATAL = 12, |
| 2000 | QL_ASIC_RECOVERY = 14, /* We are in ascic recovery. */ | ||
| 2000 | }; | 2001 | }; |
| 2001 | 2002 | ||
| 2002 | /* link_status bit definitions */ | 2003 | /* link_status bit definitions */ |
diff --git a/drivers/net/qlge/qlge_main.c b/drivers/net/qlge/qlge_main.c index be89610f16a8..68fbfac7a3bf 100644 --- a/drivers/net/qlge/qlge_main.c +++ b/drivers/net/qlge/qlge_main.c | |||
| @@ -2152,6 +2152,10 @@ void ql_queue_asic_error(struct ql_adapter *qdev) | |||
| 2152 | * thread | 2152 | * thread |
| 2153 | */ | 2153 | */ |
| 2154 | clear_bit(QL_ADAPTER_UP, &qdev->flags); | 2154 | clear_bit(QL_ADAPTER_UP, &qdev->flags); |
| 2155 | /* Set asic recovery bit to indicate reset process that we are | ||
| 2156 | * in fatal error recovery process rather than normal close | ||
| 2157 | */ | ||
| 2158 | set_bit(QL_ASIC_RECOVERY, &qdev->flags); | ||
| 2155 | queue_delayed_work(qdev->workqueue, &qdev->asic_reset_work, 0); | 2159 | queue_delayed_work(qdev->workqueue, &qdev->asic_reset_work, 0); |
| 2156 | } | 2160 | } |
| 2157 | 2161 | ||
| @@ -2166,23 +2170,20 @@ static void ql_process_chip_ae_intr(struct ql_adapter *qdev, | |||
| 2166 | return; | 2170 | return; |
| 2167 | 2171 | ||
| 2168 | case CAM_LOOKUP_ERR_EVENT: | 2172 | case CAM_LOOKUP_ERR_EVENT: |
| 2169 | netif_err(qdev, link, qdev->ndev, | 2173 | netdev_err(qdev->ndev, "Multiple CAM hits lookup occurred.\n"); |
| 2170 | "Multiple CAM hits lookup occurred.\n"); | 2174 | netdev_err(qdev->ndev, "This event shouldn't occur.\n"); |
| 2171 | netif_err(qdev, drv, qdev->ndev, | ||
| 2172 | "This event shouldn't occur.\n"); | ||
| 2173 | ql_queue_asic_error(qdev); | 2175 | ql_queue_asic_error(qdev); |
| 2174 | return; | 2176 | return; |
| 2175 | 2177 | ||
| 2176 | case SOFT_ECC_ERROR_EVENT: | 2178 | case SOFT_ECC_ERROR_EVENT: |
| 2177 | netif_err(qdev, rx_err, qdev->ndev, | 2179 | netdev_err(qdev->ndev, "Soft ECC error detected.\n"); |
| 2178 | "Soft ECC error detected.\n"); | ||
| 2179 | ql_queue_asic_error(qdev); | 2180 | ql_queue_asic_error(qdev); |
| 2180 | break; | 2181 | break; |
| 2181 | 2182 | ||
| 2182 | case PCI_ERR_ANON_BUF_RD: | 2183 | case PCI_ERR_ANON_BUF_RD: |
| 2183 | netif_err(qdev, rx_err, qdev->ndev, | 2184 | netdev_err(qdev->ndev, "PCI error occurred when reading " |
| 2184 | "PCI error occurred when reading anonymous buffers from rx_ring %d.\n", | 2185 | "anonymous buffers from rx_ring %d.\n", |
| 2185 | ib_ae_rsp->q_id); | 2186 | ib_ae_rsp->q_id); |
| 2186 | ql_queue_asic_error(qdev); | 2187 | ql_queue_asic_error(qdev); |
| 2187 | break; | 2188 | break; |
| 2188 | 2189 | ||
| @@ -2437,11 +2438,10 @@ static irqreturn_t qlge_isr(int irq, void *dev_id) | |||
| 2437 | */ | 2438 | */ |
| 2438 | if (var & STS_FE) { | 2439 | if (var & STS_FE) { |
| 2439 | ql_queue_asic_error(qdev); | 2440 | ql_queue_asic_error(qdev); |
| 2440 | netif_err(qdev, intr, qdev->ndev, | 2441 | netdev_err(qdev->ndev, "Got fatal error, STS = %x.\n", var); |
| 2441 | "Got fatal error, STS = %x.\n", var); | ||
| 2442 | var = ql_read32(qdev, ERR_STS); | 2442 | var = ql_read32(qdev, ERR_STS); |
| 2443 | netif_err(qdev, intr, qdev->ndev, | 2443 | netdev_err(qdev->ndev, "Resetting chip. " |
| 2444 | "Resetting chip. Error Status Register = 0x%x\n", var); | 2444 | "Error Status Register = 0x%x\n", var); |
| 2445 | return IRQ_HANDLED; | 2445 | return IRQ_HANDLED; |
| 2446 | } | 2446 | } |
| 2447 | 2447 | ||
| @@ -3818,11 +3818,17 @@ static int ql_adapter_reset(struct ql_adapter *qdev) | |||
| 3818 | end_jiffies = jiffies + | 3818 | end_jiffies = jiffies + |
| 3819 | max((unsigned long)1, usecs_to_jiffies(30)); | 3819 | max((unsigned long)1, usecs_to_jiffies(30)); |
| 3820 | 3820 | ||
| 3821 | /* Stop management traffic. */ | 3821 | /* Check if bit is set then skip the mailbox command and |
| 3822 | ql_mb_set_mgmnt_traffic_ctl(qdev, MB_SET_MPI_TFK_STOP); | 3822 | * clear the bit, else we are in normal reset process. |
| 3823 | */ | ||
| 3824 | if (!test_bit(QL_ASIC_RECOVERY, &qdev->flags)) { | ||
| 3825 | /* Stop management traffic. */ | ||
| 3826 | ql_mb_set_mgmnt_traffic_ctl(qdev, MB_SET_MPI_TFK_STOP); | ||
| 3823 | 3827 | ||
| 3824 | /* Wait for the NIC and MGMNT FIFOs to empty. */ | 3828 | /* Wait for the NIC and MGMNT FIFOs to empty. */ |
| 3825 | ql_wait_fifo_empty(qdev); | 3829 | ql_wait_fifo_empty(qdev); |
| 3830 | } else | ||
| 3831 | clear_bit(QL_ASIC_RECOVERY, &qdev->flags); | ||
| 3826 | 3832 | ||
| 3827 | ql_write32(qdev, RST_FO, (RST_FO_FR << 16) | RST_FO_FR); | 3833 | ql_write32(qdev, RST_FO, (RST_FO_FR << 16) | RST_FO_FR); |
| 3828 | 3834 | ||
diff --git a/drivers/net/r8169.c b/drivers/net/r8169.c index fbd68383ca60..ef1a43dd145b 100644 --- a/drivers/net/r8169.c +++ b/drivers/net/r8169.c | |||
| @@ -753,7 +753,7 @@ static void rtl8168_oob_notify(struct rtl8169_private *tp, u8 cmd) | |||
| 753 | msleep(2); | 753 | msleep(2); |
| 754 | for (i = 0; i < 5; i++) { | 754 | for (i = 0; i < 5; i++) { |
| 755 | udelay(100); | 755 | udelay(100); |
| 756 | if (!(RTL_R32(ERIDR) & ERIAR_FLAG)) | 756 | if (!(RTL_R32(ERIAR) & ERIAR_FLAG)) |
| 757 | break; | 757 | break; |
| 758 | } | 758 | } |
| 759 | 759 | ||
diff --git a/drivers/net/rionet.c b/drivers/net/rionet.c index bcdc54f2fe55..86ac38c96bcf 100644 --- a/drivers/net/rionet.c +++ b/drivers/net/rionet.c | |||
| @@ -378,7 +378,7 @@ static int rionet_close(struct net_device *ndev) | |||
| 378 | 378 | ||
| 379 | static void rionet_remove(struct rio_dev *rdev) | 379 | static void rionet_remove(struct rio_dev *rdev) |
| 380 | { | 380 | { |
| 381 | struct net_device *ndev = NULL; | 381 | struct net_device *ndev = rio_get_drvdata(rdev); |
| 382 | struct rionet_peer *peer, *tmp; | 382 | struct rionet_peer *peer, *tmp; |
| 383 | 383 | ||
| 384 | free_pages((unsigned long)rionet_active, rdev->net->hport->sys_size ? | 384 | free_pages((unsigned long)rionet_active, rdev->net->hport->sys_size ? |
| @@ -433,22 +433,12 @@ static const struct net_device_ops rionet_netdev_ops = { | |||
| 433 | .ndo_set_mac_address = eth_mac_addr, | 433 | .ndo_set_mac_address = eth_mac_addr, |
| 434 | }; | 434 | }; |
| 435 | 435 | ||
| 436 | static int rionet_setup_netdev(struct rio_mport *mport) | 436 | static int rionet_setup_netdev(struct rio_mport *mport, struct net_device *ndev) |
| 437 | { | 437 | { |
| 438 | int rc = 0; | 438 | int rc = 0; |
| 439 | struct net_device *ndev = NULL; | ||
| 440 | struct rionet_private *rnet; | 439 | struct rionet_private *rnet; |
| 441 | u16 device_id; | 440 | u16 device_id; |
| 442 | 441 | ||
| 443 | /* Allocate our net_device structure */ | ||
| 444 | ndev = alloc_etherdev(sizeof(struct rionet_private)); | ||
| 445 | if (ndev == NULL) { | ||
| 446 | printk(KERN_INFO "%s: could not allocate ethernet device.\n", | ||
| 447 | DRV_NAME); | ||
| 448 | rc = -ENOMEM; | ||
| 449 | goto out; | ||
| 450 | } | ||
| 451 | |||
| 452 | rionet_active = (struct rio_dev **)__get_free_pages(GFP_KERNEL, | 442 | rionet_active = (struct rio_dev **)__get_free_pages(GFP_KERNEL, |
| 453 | mport->sys_size ? __fls(sizeof(void *)) + 4 : 0); | 443 | mport->sys_size ? __fls(sizeof(void *)) + 4 : 0); |
| 454 | if (!rionet_active) { | 444 | if (!rionet_active) { |
| @@ -504,11 +494,21 @@ static int rionet_probe(struct rio_dev *rdev, const struct rio_device_id *id) | |||
| 504 | int rc = -ENODEV; | 494 | int rc = -ENODEV; |
| 505 | u32 lpef, lsrc_ops, ldst_ops; | 495 | u32 lpef, lsrc_ops, ldst_ops; |
| 506 | struct rionet_peer *peer; | 496 | struct rionet_peer *peer; |
| 497 | struct net_device *ndev = NULL; | ||
| 507 | 498 | ||
| 508 | /* If local device is not rionet capable, give up quickly */ | 499 | /* If local device is not rionet capable, give up quickly */ |
| 509 | if (!rionet_capable) | 500 | if (!rionet_capable) |
| 510 | goto out; | 501 | goto out; |
| 511 | 502 | ||
| 503 | /* Allocate our net_device structure */ | ||
| 504 | ndev = alloc_etherdev(sizeof(struct rionet_private)); | ||
| 505 | if (ndev == NULL) { | ||
| 506 | printk(KERN_INFO "%s: could not allocate ethernet device.\n", | ||
| 507 | DRV_NAME); | ||
| 508 | rc = -ENOMEM; | ||
| 509 | goto out; | ||
| 510 | } | ||
| 511 | |||
| 512 | /* | 512 | /* |
| 513 | * First time through, make sure local device is rionet | 513 | * First time through, make sure local device is rionet |
| 514 | * capable, setup netdev, and set flags so this is skipped | 514 | * capable, setup netdev, and set flags so this is skipped |
| @@ -529,7 +529,7 @@ static int rionet_probe(struct rio_dev *rdev, const struct rio_device_id *id) | |||
| 529 | goto out; | 529 | goto out; |
| 530 | } | 530 | } |
| 531 | 531 | ||
| 532 | rc = rionet_setup_netdev(rdev->net->hport); | 532 | rc = rionet_setup_netdev(rdev->net->hport, ndev); |
| 533 | rionet_check = 1; | 533 | rionet_check = 1; |
| 534 | } | 534 | } |
| 535 | 535 | ||
| @@ -546,6 +546,8 @@ static int rionet_probe(struct rio_dev *rdev, const struct rio_device_id *id) | |||
| 546 | list_add_tail(&peer->node, &rionet_peers); | 546 | list_add_tail(&peer->node, &rionet_peers); |
| 547 | } | 547 | } |
| 548 | 548 | ||
| 549 | rio_set_drvdata(rdev, ndev); | ||
| 550 | |||
| 549 | out: | 551 | out: |
| 550 | return rc; | 552 | return rc; |
| 551 | } | 553 | } |
diff --git a/drivers/net/usb/kalmia.c b/drivers/net/usb/kalmia.c index d965fb1e013e..a9b6c63d54e4 100644 --- a/drivers/net/usb/kalmia.c +++ b/drivers/net/usb/kalmia.c | |||
| @@ -100,34 +100,42 @@ kalmia_send_init_packet(struct usbnet *dev, u8 *init_msg, u8 init_msg_len, | |||
| 100 | static int | 100 | static int |
| 101 | kalmia_init_and_get_ethernet_addr(struct usbnet *dev, u8 *ethernet_addr) | 101 | kalmia_init_and_get_ethernet_addr(struct usbnet *dev, u8 *ethernet_addr) |
| 102 | { | 102 | { |
| 103 | char init_msg_1[] = | 103 | const static char init_msg_1[] = |
| 104 | { 0x57, 0x50, 0x04, 0x00, 0x00, 0x00, 0x00, 0x20, 0x00, 0x00, | 104 | { 0x57, 0x50, 0x04, 0x00, 0x00, 0x00, 0x00, 0x20, 0x00, 0x00, |
| 105 | 0x00, 0x00 }; | 105 | 0x00, 0x00 }; |
| 106 | char init_msg_2[] = | 106 | const static char init_msg_2[] = |
| 107 | { 0x57, 0x50, 0x04, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0xf4, | 107 | { 0x57, 0x50, 0x04, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0xf4, |
| 108 | 0x00, 0x00 }; | 108 | 0x00, 0x00 }; |
| 109 | char receive_buf[28]; | 109 | const static int buflen = 28; |
| 110 | char *usb_buf; | ||
| 110 | int status; | 111 | int status; |
| 111 | 112 | ||
| 112 | status = kalmia_send_init_packet(dev, init_msg_1, sizeof(init_msg_1) | 113 | usb_buf = kmalloc(buflen, GFP_DMA | GFP_KERNEL); |
| 113 | / sizeof(init_msg_1[0]), receive_buf, 24); | 114 | if (!usb_buf) |
| 115 | return -ENOMEM; | ||
| 116 | |||
| 117 | memcpy(usb_buf, init_msg_1, 12); | ||
| 118 | status = kalmia_send_init_packet(dev, usb_buf, sizeof(init_msg_1) | ||
| 119 | / sizeof(init_msg_1[0]), usb_buf, 24); | ||
| 114 | if (status != 0) | 120 | if (status != 0) |
| 115 | return status; | 121 | return status; |
| 116 | 122 | ||
| 117 | status = kalmia_send_init_packet(dev, init_msg_2, sizeof(init_msg_2) | 123 | memcpy(usb_buf, init_msg_2, 12); |
| 118 | / sizeof(init_msg_2[0]), receive_buf, 28); | 124 | status = kalmia_send_init_packet(dev, usb_buf, sizeof(init_msg_2) |
| 125 | / sizeof(init_msg_2[0]), usb_buf, 28); | ||
| 119 | if (status != 0) | 126 | if (status != 0) |
| 120 | return status; | 127 | return status; |
| 121 | 128 | ||
| 122 | memcpy(ethernet_addr, receive_buf + 10, ETH_ALEN); | 129 | memcpy(ethernet_addr, usb_buf + 10, ETH_ALEN); |
| 123 | 130 | ||
| 131 | kfree(usb_buf); | ||
| 124 | return status; | 132 | return status; |
| 125 | } | 133 | } |
| 126 | 134 | ||
| 127 | static int | 135 | static int |
| 128 | kalmia_bind(struct usbnet *dev, struct usb_interface *intf) | 136 | kalmia_bind(struct usbnet *dev, struct usb_interface *intf) |
| 129 | { | 137 | { |
| 130 | u8 status; | 138 | int status; |
| 131 | u8 ethernet_addr[ETH_ALEN]; | 139 | u8 ethernet_addr[ETH_ALEN]; |
| 132 | 140 | ||
| 133 | /* Don't bind to AT command interface */ | 141 | /* Don't bind to AT command interface */ |
| @@ -190,7 +198,8 @@ kalmia_tx_fixup(struct usbnet *dev, struct sk_buff *skb, gfp_t flags) | |||
| 190 | dev_kfree_skb_any(skb); | 198 | dev_kfree_skb_any(skb); |
| 191 | skb = skb2; | 199 | skb = skb2; |
| 192 | 200 | ||
| 193 | done: header_start = skb_push(skb, KALMIA_HEADER_LENGTH); | 201 | done: |
| 202 | header_start = skb_push(skb, KALMIA_HEADER_LENGTH); | ||
| 194 | ether_type_1 = header_start[KALMIA_HEADER_LENGTH + 12]; | 203 | ether_type_1 = header_start[KALMIA_HEADER_LENGTH + 12]; |
| 195 | ether_type_2 = header_start[KALMIA_HEADER_LENGTH + 13]; | 204 | ether_type_2 = header_start[KALMIA_HEADER_LENGTH + 13]; |
| 196 | 205 | ||
| @@ -201,9 +210,8 @@ kalmia_tx_fixup(struct usbnet *dev, struct sk_buff *skb, gfp_t flags) | |||
| 201 | header_start[0] = 0x57; | 210 | header_start[0] = 0x57; |
| 202 | header_start[1] = 0x44; | 211 | header_start[1] = 0x44; |
| 203 | content_len = skb->len - KALMIA_HEADER_LENGTH; | 212 | content_len = skb->len - KALMIA_HEADER_LENGTH; |
| 204 | header_start[2] = (content_len & 0xff); /* low byte */ | ||
| 205 | header_start[3] = (content_len >> 8); /* high byte */ | ||
| 206 | 213 | ||
| 214 | put_unaligned_le16(content_len, &header_start[2]); | ||
| 207 | header_start[4] = ether_type_1; | 215 | header_start[4] = ether_type_1; |
| 208 | header_start[5] = ether_type_2; | 216 | header_start[5] = ether_type_2; |
| 209 | 217 | ||
| @@ -231,13 +239,13 @@ kalmia_rx_fixup(struct usbnet *dev, struct sk_buff *skb) | |||
| 231 | * Our task here is to strip off framing, leaving skb with one | 239 | * Our task here is to strip off framing, leaving skb with one |
| 232 | * data frame for the usbnet framework code to process. | 240 | * data frame for the usbnet framework code to process. |
| 233 | */ | 241 | */ |
| 234 | const u8 HEADER_END_OF_USB_PACKET[] = | 242 | const static u8 HEADER_END_OF_USB_PACKET[] = |
| 235 | { 0x57, 0x5a, 0x00, 0x00, 0x08, 0x00 }; | 243 | { 0x57, 0x5a, 0x00, 0x00, 0x08, 0x00 }; |
| 236 | const u8 EXPECTED_UNKNOWN_HEADER_1[] = | 244 | const static u8 EXPECTED_UNKNOWN_HEADER_1[] = |
| 237 | { 0x57, 0x43, 0x1e, 0x00, 0x15, 0x02 }; | 245 | { 0x57, 0x43, 0x1e, 0x00, 0x15, 0x02 }; |
| 238 | const u8 EXPECTED_UNKNOWN_HEADER_2[] = | 246 | const static u8 EXPECTED_UNKNOWN_HEADER_2[] = |
| 239 | { 0x57, 0x50, 0x0e, 0x00, 0x00, 0x00 }; | 247 | { 0x57, 0x50, 0x0e, 0x00, 0x00, 0x00 }; |
| 240 | u8 i = 0; | 248 | int i = 0; |
| 241 | 249 | ||
| 242 | /* incomplete header? */ | 250 | /* incomplete header? */ |
| 243 | if (skb->len < KALMIA_HEADER_LENGTH) | 251 | if (skb->len < KALMIA_HEADER_LENGTH) |
| @@ -285,7 +293,7 @@ kalmia_rx_fixup(struct usbnet *dev, struct sk_buff *skb) | |||
| 285 | 293 | ||
| 286 | /* subtract start header and end header */ | 294 | /* subtract start header and end header */ |
| 287 | usb_packet_length = skb->len - (2 * KALMIA_HEADER_LENGTH); | 295 | usb_packet_length = skb->len - (2 * KALMIA_HEADER_LENGTH); |
| 288 | ether_packet_length = header_start[2] + (header_start[3] << 8); | 296 | ether_packet_length = get_unaligned_le16(&header_start[2]); |
| 289 | skb_pull(skb, KALMIA_HEADER_LENGTH); | 297 | skb_pull(skb, KALMIA_HEADER_LENGTH); |
| 290 | 298 | ||
| 291 | /* Some small packets misses end marker */ | 299 | /* Some small packets misses end marker */ |
diff --git a/drivers/net/usb/zaurus.c b/drivers/net/usb/zaurus.c index 241756e0e86f..1a2234c20514 100644 --- a/drivers/net/usb/zaurus.c +++ b/drivers/net/usb/zaurus.c | |||
| @@ -331,17 +331,7 @@ static const struct usb_device_id products [] = { | |||
| 331 | ZAURUS_MASTER_INTERFACE, | 331 | ZAURUS_MASTER_INTERFACE, |
| 332 | .driver_info = ZAURUS_PXA_INFO, | 332 | .driver_info = ZAURUS_PXA_INFO, |
| 333 | }, | 333 | }, |
| 334 | |||
| 335 | |||
| 336 | /* At least some of the newest PXA units have very different lies about | ||
| 337 | * their standards support: they claim to be cell phones offering | ||
| 338 | * direct access to their radios! (No, they don't conform to CDC MDLM.) | ||
| 339 | */ | ||
| 340 | { | 334 | { |
| 341 | USB_INTERFACE_INFO(USB_CLASS_COMM, USB_CDC_SUBCLASS_MDLM, | ||
| 342 | USB_CDC_PROTO_NONE), | ||
| 343 | .driver_info = (unsigned long) &bogus_mdlm_info, | ||
| 344 | }, { | ||
| 345 | /* Motorola MOTOMAGX phones */ | 335 | /* Motorola MOTOMAGX phones */ |
| 346 | USB_DEVICE_AND_INTERFACE_INFO(0x22b8, 0x6425, USB_CLASS_COMM, | 336 | USB_DEVICE_AND_INTERFACE_INFO(0x22b8, 0x6425, USB_CLASS_COMM, |
| 347 | USB_CDC_SUBCLASS_MDLM, USB_CDC_PROTO_NONE), | 337 | USB_CDC_SUBCLASS_MDLM, USB_CDC_PROTO_NONE), |
diff --git a/drivers/net/vmxnet3/vmxnet3_drv.c b/drivers/net/vmxnet3/vmxnet3_drv.c index 2c1473686abe..fabcded7c6a0 100644 --- a/drivers/net/vmxnet3/vmxnet3_drv.c +++ b/drivers/net/vmxnet3/vmxnet3_drv.c | |||
| @@ -573,7 +573,7 @@ vmxnet3_rq_alloc_rx_buf(struct vmxnet3_rx_queue *rq, u32 ring_idx, | |||
| 573 | struct vmxnet3_cmd_ring *ring = &rq->rx_ring[ring_idx]; | 573 | struct vmxnet3_cmd_ring *ring = &rq->rx_ring[ring_idx]; |
| 574 | u32 val; | 574 | u32 val; |
| 575 | 575 | ||
| 576 | while (num_allocated < num_to_alloc) { | 576 | while (num_allocated <= num_to_alloc) { |
| 577 | struct vmxnet3_rx_buf_info *rbi; | 577 | struct vmxnet3_rx_buf_info *rbi; |
| 578 | union Vmxnet3_GenericDesc *gd; | 578 | union Vmxnet3_GenericDesc *gd; |
| 579 | 579 | ||
| @@ -619,9 +619,15 @@ vmxnet3_rq_alloc_rx_buf(struct vmxnet3_rx_queue *rq, u32 ring_idx, | |||
| 619 | 619 | ||
| 620 | BUG_ON(rbi->dma_addr == 0); | 620 | BUG_ON(rbi->dma_addr == 0); |
| 621 | gd->rxd.addr = cpu_to_le64(rbi->dma_addr); | 621 | gd->rxd.addr = cpu_to_le64(rbi->dma_addr); |
| 622 | gd->dword[2] = cpu_to_le32((ring->gen << VMXNET3_RXD_GEN_SHIFT) | 622 | gd->dword[2] = cpu_to_le32((!ring->gen << VMXNET3_RXD_GEN_SHIFT) |
| 623 | | val | rbi->len); | 623 | | val | rbi->len); |
| 624 | 624 | ||
| 625 | /* Fill the last buffer but dont mark it ready, or else the | ||
| 626 | * device will think that the queue is full */ | ||
| 627 | if (num_allocated == num_to_alloc) | ||
| 628 | break; | ||
| 629 | |||
| 630 | gd->dword[2] |= cpu_to_le32(ring->gen << VMXNET3_RXD_GEN_SHIFT); | ||
| 625 | num_allocated++; | 631 | num_allocated++; |
| 626 | vmxnet3_cmd_ring_adv_next2fill(ring); | 632 | vmxnet3_cmd_ring_adv_next2fill(ring); |
| 627 | } | 633 | } |
| @@ -1138,6 +1144,7 @@ vmxnet3_rq_rx_complete(struct vmxnet3_rx_queue *rq, | |||
| 1138 | VMXNET3_REG_RXPROD, VMXNET3_REG_RXPROD2 | 1144 | VMXNET3_REG_RXPROD, VMXNET3_REG_RXPROD2 |
| 1139 | }; | 1145 | }; |
| 1140 | u32 num_rxd = 0; | 1146 | u32 num_rxd = 0; |
| 1147 | bool skip_page_frags = false; | ||
| 1141 | struct Vmxnet3_RxCompDesc *rcd; | 1148 | struct Vmxnet3_RxCompDesc *rcd; |
| 1142 | struct vmxnet3_rx_ctx *ctx = &rq->rx_ctx; | 1149 | struct vmxnet3_rx_ctx *ctx = &rq->rx_ctx; |
| 1143 | #ifdef __BIG_ENDIAN_BITFIELD | 1150 | #ifdef __BIG_ENDIAN_BITFIELD |
| @@ -1148,11 +1155,12 @@ vmxnet3_rq_rx_complete(struct vmxnet3_rx_queue *rq, | |||
| 1148 | &rxComp); | 1155 | &rxComp); |
| 1149 | while (rcd->gen == rq->comp_ring.gen) { | 1156 | while (rcd->gen == rq->comp_ring.gen) { |
| 1150 | struct vmxnet3_rx_buf_info *rbi; | 1157 | struct vmxnet3_rx_buf_info *rbi; |
| 1151 | struct sk_buff *skb; | 1158 | struct sk_buff *skb, *new_skb = NULL; |
| 1159 | struct page *new_page = NULL; | ||
| 1152 | int num_to_alloc; | 1160 | int num_to_alloc; |
| 1153 | struct Vmxnet3_RxDesc *rxd; | 1161 | struct Vmxnet3_RxDesc *rxd; |
| 1154 | u32 idx, ring_idx; | 1162 | u32 idx, ring_idx; |
| 1155 | 1163 | struct vmxnet3_cmd_ring *ring = NULL; | |
| 1156 | if (num_rxd >= quota) { | 1164 | if (num_rxd >= quota) { |
| 1157 | /* we may stop even before we see the EOP desc of | 1165 | /* we may stop even before we see the EOP desc of |
| 1158 | * the current pkt | 1166 | * the current pkt |
| @@ -1163,6 +1171,7 @@ vmxnet3_rq_rx_complete(struct vmxnet3_rx_queue *rq, | |||
| 1163 | BUG_ON(rcd->rqID != rq->qid && rcd->rqID != rq->qid2); | 1171 | BUG_ON(rcd->rqID != rq->qid && rcd->rqID != rq->qid2); |
| 1164 | idx = rcd->rxdIdx; | 1172 | idx = rcd->rxdIdx; |
| 1165 | ring_idx = rcd->rqID < adapter->num_rx_queues ? 0 : 1; | 1173 | ring_idx = rcd->rqID < adapter->num_rx_queues ? 0 : 1; |
| 1174 | ring = rq->rx_ring + ring_idx; | ||
| 1166 | vmxnet3_getRxDesc(rxd, &rq->rx_ring[ring_idx].base[idx].rxd, | 1175 | vmxnet3_getRxDesc(rxd, &rq->rx_ring[ring_idx].base[idx].rxd, |
| 1167 | &rxCmdDesc); | 1176 | &rxCmdDesc); |
| 1168 | rbi = rq->buf_info[ring_idx] + idx; | 1177 | rbi = rq->buf_info[ring_idx] + idx; |
| @@ -1191,37 +1200,80 @@ vmxnet3_rq_rx_complete(struct vmxnet3_rx_queue *rq, | |||
| 1191 | goto rcd_done; | 1200 | goto rcd_done; |
| 1192 | } | 1201 | } |
| 1193 | 1202 | ||
| 1203 | skip_page_frags = false; | ||
| 1194 | ctx->skb = rbi->skb; | 1204 | ctx->skb = rbi->skb; |
| 1195 | rbi->skb = NULL; | 1205 | new_skb = dev_alloc_skb(rbi->len + NET_IP_ALIGN); |
| 1206 | if (new_skb == NULL) { | ||
| 1207 | /* Skb allocation failed, do not handover this | ||
| 1208 | * skb to stack. Reuse it. Drop the existing pkt | ||
| 1209 | */ | ||
| 1210 | rq->stats.rx_buf_alloc_failure++; | ||
| 1211 | ctx->skb = NULL; | ||
| 1212 | rq->stats.drop_total++; | ||
| 1213 | skip_page_frags = true; | ||
| 1214 | goto rcd_done; | ||
| 1215 | } | ||
| 1196 | 1216 | ||
| 1197 | pci_unmap_single(adapter->pdev, rbi->dma_addr, rbi->len, | 1217 | pci_unmap_single(adapter->pdev, rbi->dma_addr, rbi->len, |
| 1198 | PCI_DMA_FROMDEVICE); | 1218 | PCI_DMA_FROMDEVICE); |
| 1199 | 1219 | ||
| 1200 | skb_put(ctx->skb, rcd->len); | 1220 | skb_put(ctx->skb, rcd->len); |
| 1221 | |||
| 1222 | /* Immediate refill */ | ||
| 1223 | new_skb->dev = adapter->netdev; | ||
| 1224 | skb_reserve(new_skb, NET_IP_ALIGN); | ||
| 1225 | rbi->skb = new_skb; | ||
| 1226 | rbi->dma_addr = pci_map_single(adapter->pdev, | ||
| 1227 | rbi->skb->data, rbi->len, | ||
| 1228 | PCI_DMA_FROMDEVICE); | ||
| 1229 | rxd->addr = cpu_to_le64(rbi->dma_addr); | ||
| 1230 | rxd->len = rbi->len; | ||
| 1231 | |||
| 1201 | } else { | 1232 | } else { |
| 1202 | BUG_ON(ctx->skb == NULL); | 1233 | BUG_ON(ctx->skb == NULL && !skip_page_frags); |
| 1234 | |||
| 1203 | /* non SOP buffer must be type 1 in most cases */ | 1235 | /* non SOP buffer must be type 1 in most cases */ |
| 1204 | if (rbi->buf_type == VMXNET3_RX_BUF_PAGE) { | 1236 | BUG_ON(rbi->buf_type != VMXNET3_RX_BUF_PAGE); |
| 1205 | BUG_ON(rxd->btype != VMXNET3_RXD_BTYPE_BODY); | 1237 | BUG_ON(rxd->btype != VMXNET3_RXD_BTYPE_BODY); |
| 1206 | 1238 | ||
| 1207 | if (rcd->len) { | 1239 | /* If an sop buffer was dropped, skip all |
| 1208 | pci_unmap_page(adapter->pdev, | 1240 | * following non-sop fragments. They will be reused. |
| 1209 | rbi->dma_addr, rbi->len, | 1241 | */ |
| 1210 | PCI_DMA_FROMDEVICE); | 1242 | if (skip_page_frags) |
| 1243 | goto rcd_done; | ||
| 1211 | 1244 | ||
| 1212 | vmxnet3_append_frag(ctx->skb, rcd, rbi); | 1245 | new_page = alloc_page(GFP_ATOMIC); |
| 1213 | rbi->page = NULL; | 1246 | if (unlikely(new_page == NULL)) { |
| 1214 | } | 1247 | /* Replacement page frag could not be allocated. |
| 1215 | } else { | 1248 | * Reuse this page. Drop the pkt and free the |
| 1216 | /* | 1249 | * skb which contained this page as a frag. Skip |
| 1217 | * The only time a non-SOP buffer is type 0 is | 1250 | * processing all the following non-sop frags. |
| 1218 | * when it's EOP and error flag is raised, which | ||
| 1219 | * has already been handled. | ||
| 1220 | */ | 1251 | */ |
| 1221 | BUG_ON(true); | 1252 | rq->stats.rx_buf_alloc_failure++; |
| 1253 | dev_kfree_skb(ctx->skb); | ||
| 1254 | ctx->skb = NULL; | ||
| 1255 | skip_page_frags = true; | ||
| 1256 | goto rcd_done; | ||
| 1257 | } | ||
| 1258 | |||
| 1259 | if (rcd->len) { | ||
| 1260 | pci_unmap_page(adapter->pdev, | ||
| 1261 | rbi->dma_addr, rbi->len, | ||
| 1262 | PCI_DMA_FROMDEVICE); | ||
| 1263 | |||
| 1264 | vmxnet3_append_frag(ctx->skb, rcd, rbi); | ||
| 1222 | } | 1265 | } |
| 1266 | |||
| 1267 | /* Immediate refill */ | ||
| 1268 | rbi->page = new_page; | ||
| 1269 | rbi->dma_addr = pci_map_page(adapter->pdev, rbi->page, | ||
| 1270 | 0, PAGE_SIZE, | ||
| 1271 | PCI_DMA_FROMDEVICE); | ||
| 1272 | rxd->addr = cpu_to_le64(rbi->dma_addr); | ||
| 1273 | rxd->len = rbi->len; | ||
| 1223 | } | 1274 | } |
| 1224 | 1275 | ||
| 1276 | |||
| 1225 | skb = ctx->skb; | 1277 | skb = ctx->skb; |
| 1226 | if (rcd->eop) { | 1278 | if (rcd->eop) { |
| 1227 | skb->len += skb->data_len; | 1279 | skb->len += skb->data_len; |
| @@ -1243,26 +1295,27 @@ vmxnet3_rq_rx_complete(struct vmxnet3_rx_queue *rq, | |||
| 1243 | } | 1295 | } |
| 1244 | 1296 | ||
| 1245 | rcd_done: | 1297 | rcd_done: |
| 1246 | /* device may skip some rx descs */ | 1298 | /* device may have skipped some rx descs */ |
| 1247 | rq->rx_ring[ring_idx].next2comp = idx; | 1299 | ring->next2comp = idx; |
| 1248 | VMXNET3_INC_RING_IDX_ONLY(rq->rx_ring[ring_idx].next2comp, | 1300 | num_to_alloc = vmxnet3_cmd_ring_desc_avail(ring); |
| 1249 | rq->rx_ring[ring_idx].size); | 1301 | ring = rq->rx_ring + ring_idx; |
| 1250 | 1302 | while (num_to_alloc) { | |
| 1251 | /* refill rx buffers frequently to avoid starving the h/w */ | 1303 | vmxnet3_getRxDesc(rxd, &ring->base[ring->next2fill].rxd, |
| 1252 | num_to_alloc = vmxnet3_cmd_ring_desc_avail(rq->rx_ring + | 1304 | &rxCmdDesc); |
| 1253 | ring_idx); | 1305 | BUG_ON(!rxd->addr); |
| 1254 | if (unlikely(num_to_alloc > VMXNET3_RX_ALLOC_THRESHOLD(rq, | 1306 | |
| 1255 | ring_idx, adapter))) { | 1307 | /* Recv desc is ready to be used by the device */ |
| 1256 | vmxnet3_rq_alloc_rx_buf(rq, ring_idx, num_to_alloc, | 1308 | rxd->gen = ring->gen; |
| 1257 | adapter); | 1309 | vmxnet3_cmd_ring_adv_next2fill(ring); |
| 1258 | 1310 | num_to_alloc--; | |
| 1259 | /* if needed, update the register */ | 1311 | } |
| 1260 | if (unlikely(rq->shared->updateRxProd)) { | 1312 | |
| 1261 | VMXNET3_WRITE_BAR0_REG(adapter, | 1313 | /* if needed, update the register */ |
| 1262 | rxprod_reg[ring_idx] + rq->qid * 8, | 1314 | if (unlikely(rq->shared->updateRxProd)) { |
| 1263 | rq->rx_ring[ring_idx].next2fill); | 1315 | VMXNET3_WRITE_BAR0_REG(adapter, |
| 1264 | rq->uncommitted[ring_idx] = 0; | 1316 | rxprod_reg[ring_idx] + rq->qid * 8, |
| 1265 | } | 1317 | ring->next2fill); |
| 1318 | rq->uncommitted[ring_idx] = 0; | ||
| 1266 | } | 1319 | } |
| 1267 | 1320 | ||
| 1268 | vmxnet3_comp_ring_adv_next2proc(&rq->comp_ring); | 1321 | vmxnet3_comp_ring_adv_next2proc(&rq->comp_ring); |
diff --git a/drivers/net/vmxnet3/vmxnet3_int.h b/drivers/net/vmxnet3/vmxnet3_int.h index 2e37985809d2..a9cb3fabb17f 100644 --- a/drivers/net/vmxnet3/vmxnet3_int.h +++ b/drivers/net/vmxnet3/vmxnet3_int.h | |||
| @@ -69,10 +69,10 @@ | |||
| 69 | /* | 69 | /* |
| 70 | * Version numbers | 70 | * Version numbers |
| 71 | */ | 71 | */ |
| 72 | #define VMXNET3_DRIVER_VERSION_STRING "1.1.9.0-k" | 72 | #define VMXNET3_DRIVER_VERSION_STRING "1.1.14.0-k" |
| 73 | 73 | ||
| 74 | /* a 32-bit int, each byte encode a verion number in VMXNET3_DRIVER_VERSION */ | 74 | /* a 32-bit int, each byte encode a verion number in VMXNET3_DRIVER_VERSION */ |
| 75 | #define VMXNET3_DRIVER_VERSION_NUM 0x01010900 | 75 | #define VMXNET3_DRIVER_VERSION_NUM 0x01010E00 |
| 76 | 76 | ||
| 77 | #if defined(CONFIG_PCI_MSI) | 77 | #if defined(CONFIG_PCI_MSI) |
| 78 | /* RSS only makes sense if MSI-X is supported. */ | 78 | /* RSS only makes sense if MSI-X is supported. */ |
diff --git a/drivers/net/wireless/ath/ath5k/eeprom.c b/drivers/net/wireless/ath/ath5k/eeprom.c index 1fef84f87c78..392771f93759 100644 --- a/drivers/net/wireless/ath/ath5k/eeprom.c +++ b/drivers/net/wireless/ath/ath5k/eeprom.c | |||
| @@ -691,14 +691,12 @@ ath5k_eeprom_free_pcal_info(struct ath5k_hw *ah, int mode) | |||
| 691 | if (!chinfo[pier].pd_curves) | 691 | if (!chinfo[pier].pd_curves) |
| 692 | continue; | 692 | continue; |
| 693 | 693 | ||
| 694 | for (pdg = 0; pdg < ee->ee_pd_gains[mode]; pdg++) { | 694 | for (pdg = 0; pdg < AR5K_EEPROM_N_PD_CURVES; pdg++) { |
| 695 | struct ath5k_pdgain_info *pd = | 695 | struct ath5k_pdgain_info *pd = |
| 696 | &chinfo[pier].pd_curves[pdg]; | 696 | &chinfo[pier].pd_curves[pdg]; |
| 697 | 697 | ||
| 698 | if (pd != NULL) { | 698 | kfree(pd->pd_step); |
| 699 | kfree(pd->pd_step); | 699 | kfree(pd->pd_pwr); |
| 700 | kfree(pd->pd_pwr); | ||
| 701 | } | ||
| 702 | } | 700 | } |
| 703 | 701 | ||
| 704 | kfree(chinfo[pier].pd_curves); | 702 | kfree(chinfo[pier].pd_curves); |
diff --git a/drivers/net/wireless/ath/ath9k/pci.c b/drivers/net/wireless/ath/ath9k/pci.c index b8cbfc707213..3bad0b2cf9a3 100644 --- a/drivers/net/wireless/ath/ath9k/pci.c +++ b/drivers/net/wireless/ath/ath9k/pci.c | |||
| @@ -278,6 +278,12 @@ static int ath_pci_suspend(struct device *device) | |||
| 278 | 278 | ||
| 279 | ath9k_hw_set_gpio(sc->sc_ah, sc->sc_ah->led_pin, 1); | 279 | ath9k_hw_set_gpio(sc->sc_ah, sc->sc_ah->led_pin, 1); |
| 280 | 280 | ||
| 281 | /* The device has to be moved to FULLSLEEP forcibly. | ||
| 282 | * Otherwise the chip never moved to full sleep, | ||
| 283 | * when no interface is up. | ||
| 284 | */ | ||
| 285 | ath9k_hw_setpower(sc->sc_ah, ATH9K_PM_FULL_SLEEP); | ||
| 286 | |||
| 281 | return 0; | 287 | return 0; |
| 282 | } | 288 | } |
| 283 | 289 | ||
diff --git a/drivers/pci/pci-driver.c b/drivers/pci/pci-driver.c index 135df164a4c1..46767c53917a 100644 --- a/drivers/pci/pci-driver.c +++ b/drivers/pci/pci-driver.c | |||
| @@ -624,7 +624,7 @@ static int pci_pm_prepare(struct device *dev) | |||
| 624 | * system from the sleep state, we'll have to prevent it from signaling | 624 | * system from the sleep state, we'll have to prevent it from signaling |
| 625 | * wake-up. | 625 | * wake-up. |
| 626 | */ | 626 | */ |
| 627 | pm_runtime_resume(dev); | 627 | pm_runtime_get_sync(dev); |
| 628 | 628 | ||
| 629 | if (drv && drv->pm && drv->pm->prepare) | 629 | if (drv && drv->pm && drv->pm->prepare) |
| 630 | error = drv->pm->prepare(dev); | 630 | error = drv->pm->prepare(dev); |
| @@ -638,6 +638,8 @@ static void pci_pm_complete(struct device *dev) | |||
| 638 | 638 | ||
| 639 | if (drv && drv->pm && drv->pm->complete) | 639 | if (drv && drv->pm && drv->pm->complete) |
| 640 | drv->pm->complete(dev); | 640 | drv->pm->complete(dev); |
| 641 | |||
| 642 | pm_runtime_put_sync(dev); | ||
| 641 | } | 643 | } |
| 642 | 644 | ||
| 643 | #else /* !CONFIG_PM_SLEEP */ | 645 | #else /* !CONFIG_PM_SLEEP */ |
diff --git a/drivers/pci/pci.c b/drivers/pci/pci.c index 5f10c23dff94..2c5b9b991279 100644 --- a/drivers/pci/pci.c +++ b/drivers/pci/pci.c | |||
| @@ -3284,7 +3284,7 @@ static int pci_set_vga_state_arch(struct pci_dev *dev, bool decode, | |||
| 3284 | * @dev: the PCI device | 3284 | * @dev: the PCI device |
| 3285 | * @decode: true = enable decoding, false = disable decoding | 3285 | * @decode: true = enable decoding, false = disable decoding |
| 3286 | * @command_bits: PCI_COMMAND_IO and/or PCI_COMMAND_MEMORY | 3286 | * @command_bits: PCI_COMMAND_IO and/or PCI_COMMAND_MEMORY |
| 3287 | * @change_bridge_flags: traverse ancestors and change bridges | 3287 | * @flags: traverse ancestors and change bridges |
| 3288 | * CHANGE_BRIDGE_ONLY / CHANGE_BRIDGE | 3288 | * CHANGE_BRIDGE_ONLY / CHANGE_BRIDGE |
| 3289 | */ | 3289 | */ |
| 3290 | int pci_set_vga_state(struct pci_dev *dev, bool decode, | 3290 | int pci_set_vga_state(struct pci_dev *dev, bool decode, |
diff --git a/drivers/pci/probe.c b/drivers/pci/probe.c index 48849ffdd672..bafb3c3d4a89 100644 --- a/drivers/pci/probe.c +++ b/drivers/pci/probe.c | |||
| @@ -168,7 +168,7 @@ int __pci_read_base(struct pci_dev *dev, enum pci_bar_type type, | |||
| 168 | res->flags |= pci_calc_resource_flags(l) | IORESOURCE_SIZEALIGN; | 168 | res->flags |= pci_calc_resource_flags(l) | IORESOURCE_SIZEALIGN; |
| 169 | if (type == pci_bar_io) { | 169 | if (type == pci_bar_io) { |
| 170 | l &= PCI_BASE_ADDRESS_IO_MASK; | 170 | l &= PCI_BASE_ADDRESS_IO_MASK; |
| 171 | mask = PCI_BASE_ADDRESS_IO_MASK & IO_SPACE_LIMIT; | 171 | mask = PCI_BASE_ADDRESS_IO_MASK & (u32) IO_SPACE_LIMIT; |
| 172 | } else { | 172 | } else { |
| 173 | l &= PCI_BASE_ADDRESS_MEM_MASK; | 173 | l &= PCI_BASE_ADDRESS_MEM_MASK; |
| 174 | mask = (u32)PCI_BASE_ADDRESS_MEM_MASK; | 174 | mask = (u32)PCI_BASE_ADDRESS_MEM_MASK; |
diff --git a/drivers/pci/quirks.c b/drivers/pci/quirks.c index e8a140669f90..02145e9697a9 100644 --- a/drivers/pci/quirks.c +++ b/drivers/pci/quirks.c | |||
| @@ -2761,6 +2761,8 @@ static void ricoh_mmc_fixup_r5c832(struct pci_dev *dev) | |||
| 2761 | } | 2761 | } |
| 2762 | DECLARE_PCI_FIXUP_EARLY(PCI_VENDOR_ID_RICOH, PCI_DEVICE_ID_RICOH_R5C832, ricoh_mmc_fixup_r5c832); | 2762 | DECLARE_PCI_FIXUP_EARLY(PCI_VENDOR_ID_RICOH, PCI_DEVICE_ID_RICOH_R5C832, ricoh_mmc_fixup_r5c832); |
| 2763 | DECLARE_PCI_FIXUP_RESUME_EARLY(PCI_VENDOR_ID_RICOH, PCI_DEVICE_ID_RICOH_R5C832, ricoh_mmc_fixup_r5c832); | 2763 | DECLARE_PCI_FIXUP_RESUME_EARLY(PCI_VENDOR_ID_RICOH, PCI_DEVICE_ID_RICOH_R5C832, ricoh_mmc_fixup_r5c832); |
| 2764 | DECLARE_PCI_FIXUP_EARLY(PCI_VENDOR_ID_RICOH, PCI_DEVICE_ID_RICOH_R5CE823, ricoh_mmc_fixup_r5c832); | ||
| 2765 | DECLARE_PCI_FIXUP_RESUME_EARLY(PCI_VENDOR_ID_RICOH, PCI_DEVICE_ID_RICOH_R5CE823, ricoh_mmc_fixup_r5c832); | ||
| 2764 | #endif /*CONFIG_MMC_RICOH_MMC*/ | 2766 | #endif /*CONFIG_MMC_RICOH_MMC*/ |
| 2765 | 2767 | ||
| 2766 | #if defined(CONFIG_DMAR) || defined(CONFIG_INTR_REMAP) | 2768 | #if defined(CONFIG_DMAR) || defined(CONFIG_INTR_REMAP) |
diff --git a/drivers/rtc/rtc-ds1307.c b/drivers/rtc/rtc-ds1307.c index 4724ba3acf1a..b2005b44e4f7 100644 --- a/drivers/rtc/rtc-ds1307.c +++ b/drivers/rtc/rtc-ds1307.c | |||
| @@ -149,6 +149,7 @@ static const struct i2c_device_id ds1307_id[] = { | |||
| 149 | { "ds1340", ds_1340 }, | 149 | { "ds1340", ds_1340 }, |
| 150 | { "ds3231", ds_3231 }, | 150 | { "ds3231", ds_3231 }, |
| 151 | { "m41t00", m41t00 }, | 151 | { "m41t00", m41t00 }, |
| 152 | { "pt7c4338", ds_1307 }, | ||
| 152 | { "rx8025", rx_8025 }, | 153 | { "rx8025", rx_8025 }, |
| 153 | { } | 154 | { } |
| 154 | }; | 155 | }; |
diff --git a/drivers/rtc/rtc-vt8500.c b/drivers/rtc/rtc-vt8500.c index b8bc862903ae..efd6066b5cd2 100644 --- a/drivers/rtc/rtc-vt8500.c +++ b/drivers/rtc/rtc-vt8500.c | |||
| @@ -78,7 +78,6 @@ struct vt8500_rtc { | |||
| 78 | void __iomem *regbase; | 78 | void __iomem *regbase; |
| 79 | struct resource *res; | 79 | struct resource *res; |
| 80 | int irq_alarm; | 80 | int irq_alarm; |
| 81 | int irq_hz; | ||
| 82 | struct rtc_device *rtc; | 81 | struct rtc_device *rtc; |
| 83 | spinlock_t lock; /* Protects this structure */ | 82 | spinlock_t lock; /* Protects this structure */ |
| 84 | }; | 83 | }; |
| @@ -100,10 +99,6 @@ static irqreturn_t vt8500_rtc_irq(int irq, void *dev_id) | |||
| 100 | if (isr & 1) | 99 | if (isr & 1) |
| 101 | events |= RTC_AF | RTC_IRQF; | 100 | events |= RTC_AF | RTC_IRQF; |
| 102 | 101 | ||
| 103 | /* Only second/minute interrupts are supported */ | ||
| 104 | if (isr & 2) | ||
| 105 | events |= RTC_UF | RTC_IRQF; | ||
| 106 | |||
| 107 | rtc_update_irq(vt8500_rtc->rtc, 1, events); | 102 | rtc_update_irq(vt8500_rtc->rtc, 1, events); |
| 108 | 103 | ||
| 109 | return IRQ_HANDLED; | 104 | return IRQ_HANDLED; |
| @@ -199,27 +194,12 @@ static int vt8500_alarm_irq_enable(struct device *dev, unsigned int enabled) | |||
| 199 | return 0; | 194 | return 0; |
| 200 | } | 195 | } |
| 201 | 196 | ||
| 202 | static int vt8500_update_irq_enable(struct device *dev, unsigned int enabled) | ||
| 203 | { | ||
| 204 | struct vt8500_rtc *vt8500_rtc = dev_get_drvdata(dev); | ||
| 205 | unsigned long tmp = readl(vt8500_rtc->regbase + VT8500_RTC_CR); | ||
| 206 | |||
| 207 | if (enabled) | ||
| 208 | tmp |= VT8500_RTC_CR_SM_SEC | VT8500_RTC_CR_SM_ENABLE; | ||
| 209 | else | ||
| 210 | tmp &= ~VT8500_RTC_CR_SM_ENABLE; | ||
| 211 | |||
| 212 | writel(tmp, vt8500_rtc->regbase + VT8500_RTC_CR); | ||
| 213 | return 0; | ||
| 214 | } | ||
| 215 | |||
| 216 | static const struct rtc_class_ops vt8500_rtc_ops = { | 197 | static const struct rtc_class_ops vt8500_rtc_ops = { |
| 217 | .read_time = vt8500_rtc_read_time, | 198 | .read_time = vt8500_rtc_read_time, |
| 218 | .set_time = vt8500_rtc_set_time, | 199 | .set_time = vt8500_rtc_set_time, |
| 219 | .read_alarm = vt8500_rtc_read_alarm, | 200 | .read_alarm = vt8500_rtc_read_alarm, |
| 220 | .set_alarm = vt8500_rtc_set_alarm, | 201 | .set_alarm = vt8500_rtc_set_alarm, |
| 221 | .alarm_irq_enable = vt8500_alarm_irq_enable, | 202 | .alarm_irq_enable = vt8500_alarm_irq_enable, |
| 222 | .update_irq_enable = vt8500_update_irq_enable, | ||
| 223 | }; | 203 | }; |
| 224 | 204 | ||
| 225 | static int __devinit vt8500_rtc_probe(struct platform_device *pdev) | 205 | static int __devinit vt8500_rtc_probe(struct platform_device *pdev) |
| @@ -248,13 +228,6 @@ static int __devinit vt8500_rtc_probe(struct platform_device *pdev) | |||
| 248 | goto err_free; | 228 | goto err_free; |
| 249 | } | 229 | } |
| 250 | 230 | ||
| 251 | vt8500_rtc->irq_hz = platform_get_irq(pdev, 1); | ||
| 252 | if (vt8500_rtc->irq_hz < 0) { | ||
| 253 | dev_err(&pdev->dev, "No 1Hz IRQ resource defined\n"); | ||
| 254 | ret = -ENXIO; | ||
| 255 | goto err_free; | ||
| 256 | } | ||
| 257 | |||
| 258 | vt8500_rtc->res = request_mem_region(vt8500_rtc->res->start, | 231 | vt8500_rtc->res = request_mem_region(vt8500_rtc->res->start, |
| 259 | resource_size(vt8500_rtc->res), | 232 | resource_size(vt8500_rtc->res), |
| 260 | "vt8500-rtc"); | 233 | "vt8500-rtc"); |
| @@ -272,9 +245,8 @@ static int __devinit vt8500_rtc_probe(struct platform_device *pdev) | |||
| 272 | goto err_release; | 245 | goto err_release; |
| 273 | } | 246 | } |
| 274 | 247 | ||
| 275 | /* Enable the second/minute interrupt generation and enable RTC */ | 248 | /* Enable RTC and set it to 24-hour mode */ |
| 276 | writel(VT8500_RTC_CR_ENABLE | VT8500_RTC_CR_24H | 249 | writel(VT8500_RTC_CR_ENABLE | VT8500_RTC_CR_24H, |
| 277 | | VT8500_RTC_CR_SM_ENABLE | VT8500_RTC_CR_SM_SEC, | ||
| 278 | vt8500_rtc->regbase + VT8500_RTC_CR); | 250 | vt8500_rtc->regbase + VT8500_RTC_CR); |
| 279 | 251 | ||
| 280 | vt8500_rtc->rtc = rtc_device_register("vt8500-rtc", &pdev->dev, | 252 | vt8500_rtc->rtc = rtc_device_register("vt8500-rtc", &pdev->dev, |
| @@ -286,26 +258,16 @@ static int __devinit vt8500_rtc_probe(struct platform_device *pdev) | |||
| 286 | goto err_unmap; | 258 | goto err_unmap; |
| 287 | } | 259 | } |
| 288 | 260 | ||
| 289 | ret = request_irq(vt8500_rtc->irq_hz, vt8500_rtc_irq, 0, | ||
| 290 | "rtc 1Hz", vt8500_rtc); | ||
| 291 | if (ret < 0) { | ||
| 292 | dev_err(&pdev->dev, "can't get irq %i, err %d\n", | ||
| 293 | vt8500_rtc->irq_hz, ret); | ||
| 294 | goto err_unreg; | ||
| 295 | } | ||
| 296 | |||
| 297 | ret = request_irq(vt8500_rtc->irq_alarm, vt8500_rtc_irq, 0, | 261 | ret = request_irq(vt8500_rtc->irq_alarm, vt8500_rtc_irq, 0, |
| 298 | "rtc alarm", vt8500_rtc); | 262 | "rtc alarm", vt8500_rtc); |
| 299 | if (ret < 0) { | 263 | if (ret < 0) { |
| 300 | dev_err(&pdev->dev, "can't get irq %i, err %d\n", | 264 | dev_err(&pdev->dev, "can't get irq %i, err %d\n", |
| 301 | vt8500_rtc->irq_alarm, ret); | 265 | vt8500_rtc->irq_alarm, ret); |
| 302 | goto err_free_hz; | 266 | goto err_unreg; |
| 303 | } | 267 | } |
| 304 | 268 | ||
| 305 | return 0; | 269 | return 0; |
| 306 | 270 | ||
| 307 | err_free_hz: | ||
| 308 | free_irq(vt8500_rtc->irq_hz, vt8500_rtc); | ||
| 309 | err_unreg: | 271 | err_unreg: |
| 310 | rtc_device_unregister(vt8500_rtc->rtc); | 272 | rtc_device_unregister(vt8500_rtc->rtc); |
| 311 | err_unmap: | 273 | err_unmap: |
| @@ -323,7 +285,6 @@ static int __devexit vt8500_rtc_remove(struct platform_device *pdev) | |||
| 323 | struct vt8500_rtc *vt8500_rtc = platform_get_drvdata(pdev); | 285 | struct vt8500_rtc *vt8500_rtc = platform_get_drvdata(pdev); |
| 324 | 286 | ||
| 325 | free_irq(vt8500_rtc->irq_alarm, vt8500_rtc); | 287 | free_irq(vt8500_rtc->irq_alarm, vt8500_rtc); |
| 326 | free_irq(vt8500_rtc->irq_hz, vt8500_rtc); | ||
| 327 | 288 | ||
| 328 | rtc_device_unregister(vt8500_rtc->rtc); | 289 | rtc_device_unregister(vt8500_rtc->rtc); |
| 329 | 290 | ||
diff --git a/drivers/staging/brcm80211/Kconfig b/drivers/staging/brcm80211/Kconfig index f4cf9b23481e..379cf16e89f7 100644 --- a/drivers/staging/brcm80211/Kconfig +++ b/drivers/staging/brcm80211/Kconfig | |||
| @@ -7,6 +7,7 @@ config BRCMSMAC | |||
| 7 | default n | 7 | default n |
| 8 | depends on PCI | 8 | depends on PCI |
| 9 | depends on WLAN && MAC80211 | 9 | depends on WLAN && MAC80211 |
| 10 | depends on X86 || MIPS | ||
| 10 | select BRCMUTIL | 11 | select BRCMUTIL |
| 11 | select FW_LOADER | 12 | select FW_LOADER |
| 12 | select CRC_CCITT | 13 | select CRC_CCITT |
| @@ -20,6 +21,7 @@ config BRCMFMAC | |||
| 20 | default n | 21 | default n |
| 21 | depends on MMC | 22 | depends on MMC |
| 22 | depends on WLAN && CFG80211 | 23 | depends on WLAN && CFG80211 |
| 24 | depends on X86 || MIPS | ||
| 23 | select BRCMUTIL | 25 | select BRCMUTIL |
| 24 | select FW_LOADER | 26 | select FW_LOADER |
| 25 | select WIRELESS_EXT | 27 | select WIRELESS_EXT |
diff --git a/drivers/staging/comedi/Kconfig b/drivers/staging/comedi/Kconfig index 1502d80f6f78..20008a4376e8 100644 --- a/drivers/staging/comedi/Kconfig +++ b/drivers/staging/comedi/Kconfig | |||
| @@ -2,6 +2,7 @@ config COMEDI | |||
| 2 | tristate "Data acquisition support (comedi)" | 2 | tristate "Data acquisition support (comedi)" |
| 3 | default N | 3 | default N |
| 4 | depends on m | 4 | depends on m |
| 5 | depends on BROKEN || FRV || M32R || MN10300 || SUPERH || TILE || X86 | ||
| 5 | ---help--- | 6 | ---help--- |
| 6 | Enable support a wide range of data acquisition devices | 7 | Enable support a wide range of data acquisition devices |
| 7 | for Linux. | 8 | for Linux. |
| @@ -160,6 +161,7 @@ config COMEDI_PCL730 | |||
| 160 | 161 | ||
| 161 | config COMEDI_PCL812 | 162 | config COMEDI_PCL812 |
| 162 | tristate "Advantech PCL-812/813 and ADlink ACL-8112/8113/8113/8216" | 163 | tristate "Advantech PCL-812/813 and ADlink ACL-8112/8113/8113/8216" |
| 164 | depends on VIRT_TO_BUS | ||
| 163 | default N | 165 | default N |
| 164 | ---help--- | 166 | ---help--- |
| 165 | Enable support for Advantech PCL-812/PG, PCL-813/B, ADLink | 167 | Enable support for Advantech PCL-812/PG, PCL-813/B, ADLink |
| @@ -171,6 +173,7 @@ config COMEDI_PCL812 | |||
| 171 | 173 | ||
| 172 | config COMEDI_PCL816 | 174 | config COMEDI_PCL816 |
| 173 | tristate "Advantech PCL-814 and PCL-816 ISA card support" | 175 | tristate "Advantech PCL-814 and PCL-816 ISA card support" |
| 176 | depends on VIRT_TO_BUS | ||
| 174 | default N | 177 | default N |
| 175 | ---help--- | 178 | ---help--- |
| 176 | Enable support for Advantech PCL-814 and PCL-816 ISA cards | 179 | Enable support for Advantech PCL-814 and PCL-816 ISA cards |
| @@ -180,6 +183,7 @@ config COMEDI_PCL816 | |||
| 180 | 183 | ||
| 181 | config COMEDI_PCL818 | 184 | config COMEDI_PCL818 |
| 182 | tristate "Advantech PCL-718 and PCL-818 ISA card support" | 185 | tristate "Advantech PCL-718 and PCL-818 ISA card support" |
| 186 | depends on VIRT_TO_BUS | ||
| 183 | default N | 187 | default N |
| 184 | ---help--- | 188 | ---help--- |
| 185 | Enable support for Advantech PCL-818 ISA cards | 189 | Enable support for Advantech PCL-818 ISA cards |
| @@ -269,6 +273,7 @@ config COMEDI_DAS800 | |||
| 269 | 273 | ||
| 270 | config COMEDI_DAS1800 | 274 | config COMEDI_DAS1800 |
| 271 | tristate "DAS1800 and compatible ISA card support" | 275 | tristate "DAS1800 and compatible ISA card support" |
| 276 | depends on VIRT_TO_BUS | ||
| 272 | select COMEDI_FC | 277 | select COMEDI_FC |
| 273 | default N | 278 | default N |
| 274 | ---help--- | 279 | ---help--- |
| @@ -340,6 +345,7 @@ config COMEDI_DT2817 | |||
| 340 | config COMEDI_DT282X | 345 | config COMEDI_DT282X |
| 341 | tristate "Data Translation DT2821 series and DT-EZ ISA card support" | 346 | tristate "Data Translation DT2821 series and DT-EZ ISA card support" |
| 342 | select COMEDI_FC | 347 | select COMEDI_FC |
| 348 | depends on VIRT_TO_BUS | ||
| 343 | default N | 349 | default N |
| 344 | ---help--- | 350 | ---help--- |
| 345 | Enable support for Data Translation DT2821 series including DT-EZ | 351 | Enable support for Data Translation DT2821 series including DT-EZ |
| @@ -419,6 +425,7 @@ config COMEDI_ADQ12B | |||
| 419 | config COMEDI_NI_AT_A2150 | 425 | config COMEDI_NI_AT_A2150 |
| 420 | tristate "NI AT-A2150 ISA card support" | 426 | tristate "NI AT-A2150 ISA card support" |
| 421 | depends on COMEDI_NI_COMMON | 427 | depends on COMEDI_NI_COMMON |
| 428 | depends on VIRT_TO_BUS | ||
| 422 | default N | 429 | default N |
| 423 | ---help--- | 430 | ---help--- |
| 424 | Enable support for National Instruments AT-A2150 cards | 431 | Enable support for National Instruments AT-A2150 cards |
| @@ -536,6 +543,7 @@ if COMEDI_PCI_DRIVERS && PCI | |||
| 536 | 543 | ||
| 537 | config COMEDI_ADDI_APCI_035 | 544 | config COMEDI_ADDI_APCI_035 |
| 538 | tristate "ADDI-DATA APCI_035 support" | 545 | tristate "ADDI-DATA APCI_035 support" |
| 546 | depends on VIRT_TO_BUS | ||
| 539 | default N | 547 | default N |
| 540 | ---help--- | 548 | ---help--- |
| 541 | Enable support for ADDI-DATA APCI_035 cards | 549 | Enable support for ADDI-DATA APCI_035 cards |
| @@ -545,6 +553,7 @@ config COMEDI_ADDI_APCI_035 | |||
| 545 | 553 | ||
| 546 | config COMEDI_ADDI_APCI_1032 | 554 | config COMEDI_ADDI_APCI_1032 |
| 547 | tristate "ADDI-DATA APCI_1032 support" | 555 | tristate "ADDI-DATA APCI_1032 support" |
| 556 | depends on VIRT_TO_BUS | ||
| 548 | default N | 557 | default N |
| 549 | ---help--- | 558 | ---help--- |
| 550 | Enable support for ADDI-DATA APCI_1032 cards | 559 | Enable support for ADDI-DATA APCI_1032 cards |
| @@ -554,6 +563,7 @@ config COMEDI_ADDI_APCI_1032 | |||
| 554 | 563 | ||
| 555 | config COMEDI_ADDI_APCI_1500 | 564 | config COMEDI_ADDI_APCI_1500 |
| 556 | tristate "ADDI-DATA APCI_1500 support" | 565 | tristate "ADDI-DATA APCI_1500 support" |
| 566 | depends on VIRT_TO_BUS | ||
| 557 | default N | 567 | default N |
| 558 | ---help--- | 568 | ---help--- |
| 559 | Enable support for ADDI-DATA APCI_1500 cards | 569 | Enable support for ADDI-DATA APCI_1500 cards |
| @@ -563,6 +573,7 @@ config COMEDI_ADDI_APCI_1500 | |||
| 563 | 573 | ||
| 564 | config COMEDI_ADDI_APCI_1516 | 574 | config COMEDI_ADDI_APCI_1516 |
| 565 | tristate "ADDI-DATA APCI_1516 support" | 575 | tristate "ADDI-DATA APCI_1516 support" |
| 576 | depends on VIRT_TO_BUS | ||
| 566 | default N | 577 | default N |
| 567 | ---help--- | 578 | ---help--- |
| 568 | Enable support for ADDI-DATA APCI_1516 cards | 579 | Enable support for ADDI-DATA APCI_1516 cards |
| @@ -572,6 +583,7 @@ config COMEDI_ADDI_APCI_1516 | |||
| 572 | 583 | ||
| 573 | config COMEDI_ADDI_APCI_1564 | 584 | config COMEDI_ADDI_APCI_1564 |
| 574 | tristate "ADDI-DATA APCI_1564 support" | 585 | tristate "ADDI-DATA APCI_1564 support" |
| 586 | depends on VIRT_TO_BUS | ||
| 575 | default N | 587 | default N |
| 576 | ---help--- | 588 | ---help--- |
| 577 | Enable support for ADDI-DATA APCI_1564 cards | 589 | Enable support for ADDI-DATA APCI_1564 cards |
| @@ -581,6 +593,7 @@ config COMEDI_ADDI_APCI_1564 | |||
| 581 | 593 | ||
| 582 | config COMEDI_ADDI_APCI_16XX | 594 | config COMEDI_ADDI_APCI_16XX |
| 583 | tristate "ADDI-DATA APCI_16xx support" | 595 | tristate "ADDI-DATA APCI_16xx support" |
| 596 | depends on VIRT_TO_BUS | ||
| 584 | default N | 597 | default N |
| 585 | ---help--- | 598 | ---help--- |
| 586 | Enable support for ADDI-DATA APCI_16xx cards | 599 | Enable support for ADDI-DATA APCI_16xx cards |
| @@ -590,6 +603,7 @@ config COMEDI_ADDI_APCI_16XX | |||
| 590 | 603 | ||
| 591 | config COMEDI_ADDI_APCI_2016 | 604 | config COMEDI_ADDI_APCI_2016 |
| 592 | tristate "ADDI-DATA APCI_2016 support" | 605 | tristate "ADDI-DATA APCI_2016 support" |
| 606 | depends on VIRT_TO_BUS | ||
| 593 | default N | 607 | default N |
| 594 | ---help--- | 608 | ---help--- |
| 595 | Enable support for ADDI-DATA APCI_2016 cards | 609 | Enable support for ADDI-DATA APCI_2016 cards |
| @@ -599,6 +613,7 @@ config COMEDI_ADDI_APCI_2016 | |||
| 599 | 613 | ||
| 600 | config COMEDI_ADDI_APCI_2032 | 614 | config COMEDI_ADDI_APCI_2032 |
| 601 | tristate "ADDI-DATA APCI_2032 support" | 615 | tristate "ADDI-DATA APCI_2032 support" |
| 616 | depends on VIRT_TO_BUS | ||
| 602 | default N | 617 | default N |
| 603 | ---help--- | 618 | ---help--- |
| 604 | Enable support for ADDI-DATA APCI_2032 cards | 619 | Enable support for ADDI-DATA APCI_2032 cards |
| @@ -608,6 +623,7 @@ config COMEDI_ADDI_APCI_2032 | |||
| 608 | 623 | ||
| 609 | config COMEDI_ADDI_APCI_2200 | 624 | config COMEDI_ADDI_APCI_2200 |
| 610 | tristate "ADDI-DATA APCI_2200 support" | 625 | tristate "ADDI-DATA APCI_2200 support" |
| 626 | depends on VIRT_TO_BUS | ||
| 611 | default N | 627 | default N |
| 612 | ---help--- | 628 | ---help--- |
| 613 | Enable support for ADDI-DATA APCI_2200 cards | 629 | Enable support for ADDI-DATA APCI_2200 cards |
| @@ -617,6 +633,7 @@ config COMEDI_ADDI_APCI_2200 | |||
| 617 | 633 | ||
| 618 | config COMEDI_ADDI_APCI_3001 | 634 | config COMEDI_ADDI_APCI_3001 |
| 619 | tristate "ADDI-DATA APCI_3001 support" | 635 | tristate "ADDI-DATA APCI_3001 support" |
| 636 | depends on VIRT_TO_BUS | ||
| 620 | select COMEDI_FC | 637 | select COMEDI_FC |
| 621 | default N | 638 | default N |
| 622 | ---help--- | 639 | ---help--- |
| @@ -627,6 +644,7 @@ config COMEDI_ADDI_APCI_3001 | |||
| 627 | 644 | ||
| 628 | config COMEDI_ADDI_APCI_3120 | 645 | config COMEDI_ADDI_APCI_3120 |
| 629 | tristate "ADDI-DATA APCI_3520 support" | 646 | tristate "ADDI-DATA APCI_3520 support" |
| 647 | depends on VIRT_TO_BUS | ||
| 630 | select COMEDI_FC | 648 | select COMEDI_FC |
| 631 | default N | 649 | default N |
| 632 | ---help--- | 650 | ---help--- |
| @@ -637,6 +655,7 @@ config COMEDI_ADDI_APCI_3120 | |||
| 637 | 655 | ||
| 638 | config COMEDI_ADDI_APCI_3501 | 656 | config COMEDI_ADDI_APCI_3501 |
| 639 | tristate "ADDI-DATA APCI_3501 support" | 657 | tristate "ADDI-DATA APCI_3501 support" |
| 658 | depends on VIRT_TO_BUS | ||
| 640 | default N | 659 | default N |
| 641 | ---help--- | 660 | ---help--- |
| 642 | Enable support for ADDI-DATA APCI_3501 cards | 661 | Enable support for ADDI-DATA APCI_3501 cards |
| @@ -646,6 +665,7 @@ config COMEDI_ADDI_APCI_3501 | |||
| 646 | 665 | ||
| 647 | config COMEDI_ADDI_APCI_3XXX | 666 | config COMEDI_ADDI_APCI_3XXX |
| 648 | tristate "ADDI-DATA APCI_3xxx support" | 667 | tristate "ADDI-DATA APCI_3xxx support" |
| 668 | depends on VIRT_TO_BUS | ||
| 649 | default N | 669 | default N |
| 650 | ---help--- | 670 | ---help--- |
| 651 | Enable support for ADDI-DATA APCI_3xxx cards | 671 | Enable support for ADDI-DATA APCI_3xxx cards |
| @@ -712,6 +732,7 @@ config COMEDI_ADL_PCI9111 | |||
| 712 | config COMEDI_ADL_PCI9118 | 732 | config COMEDI_ADL_PCI9118 |
| 713 | tristate "ADLink PCI-9118DG, PCI-9118HG, PCI-9118HR support" | 733 | tristate "ADLink PCI-9118DG, PCI-9118HG, PCI-9118HR support" |
| 714 | select COMEDI_FC | 734 | select COMEDI_FC |
| 735 | depends on VIRT_TO_BUS | ||
| 715 | default N | 736 | default N |
| 716 | ---help--- | 737 | ---help--- |
| 717 | Enable support for ADlink PCI-9118DG, PCI-9118HG, PCI-9118HR cards | 738 | Enable support for ADlink PCI-9118DG, PCI-9118HG, PCI-9118HR cards |
| @@ -1287,6 +1308,7 @@ config COMEDI_NI_LABPC | |||
| 1287 | depends on COMEDI_MITE | 1308 | depends on COMEDI_MITE |
| 1288 | select COMEDI_8255 | 1309 | select COMEDI_8255 |
| 1289 | select COMEDI_FC | 1310 | select COMEDI_FC |
| 1311 | depends on VIRT_TO_BUS | ||
| 1290 | default N | 1312 | default N |
| 1291 | ---help--- | 1313 | ---help--- |
| 1292 | Enable support for National Instruments Lab-PC and compatibles | 1314 | Enable support for National Instruments Lab-PC and compatibles |
diff --git a/drivers/staging/iio/Kconfig b/drivers/staging/iio/Kconfig index f96d5b5d5141..d329635fb5c4 100644 --- a/drivers/staging/iio/Kconfig +++ b/drivers/staging/iio/Kconfig | |||
| @@ -4,7 +4,7 @@ | |||
| 4 | 4 | ||
| 5 | menuconfig IIO | 5 | menuconfig IIO |
| 6 | tristate "Industrial I/O support" | 6 | tristate "Industrial I/O support" |
| 7 | depends on !S390 | 7 | depends on GENERIC_HARDIRQS |
| 8 | help | 8 | help |
| 9 | The industrial I/O subsystem provides a unified framework for | 9 | The industrial I/O subsystem provides a unified framework for |
| 10 | drivers for many different types of embedded sensors using a | 10 | drivers for many different types of embedded sensors using a |
diff --git a/drivers/staging/iio/accel/adis16204.h b/drivers/staging/iio/accel/adis16204.h index 5310a4297688..1690c0d15690 100644 --- a/drivers/staging/iio/accel/adis16204.h +++ b/drivers/staging/iio/accel/adis16204.h | |||
| @@ -84,7 +84,6 @@ struct adis16204_state { | |||
| 84 | 84 | ||
| 85 | int adis16204_set_irq(struct iio_dev *indio_dev, bool enable); | 85 | int adis16204_set_irq(struct iio_dev *indio_dev, bool enable); |
| 86 | 86 | ||
| 87 | #ifdef CONFIG_IIO_RING_BUFFER | ||
| 88 | enum adis16204_scan { | 87 | enum adis16204_scan { |
| 89 | ADIS16204_SCAN_SUPPLY, | 88 | ADIS16204_SCAN_SUPPLY, |
| 90 | ADIS16204_SCAN_ACC_X, | 89 | ADIS16204_SCAN_ACC_X, |
| @@ -93,6 +92,7 @@ enum adis16204_scan { | |||
| 93 | ADIS16204_SCAN_TEMP, | 92 | ADIS16204_SCAN_TEMP, |
| 94 | }; | 93 | }; |
| 95 | 94 | ||
| 95 | #ifdef CONFIG_IIO_RING_BUFFER | ||
| 96 | void adis16204_remove_trigger(struct iio_dev *indio_dev); | 96 | void adis16204_remove_trigger(struct iio_dev *indio_dev); |
| 97 | int adis16204_probe_trigger(struct iio_dev *indio_dev); | 97 | int adis16204_probe_trigger(struct iio_dev *indio_dev); |
| 98 | 98 | ||
diff --git a/drivers/staging/iio/accel/adis16209.h b/drivers/staging/iio/accel/adis16209.h index 58d08db6f9b5..3153cbee0957 100644 --- a/drivers/staging/iio/accel/adis16209.h +++ b/drivers/staging/iio/accel/adis16209.h | |||
| @@ -121,8 +121,6 @@ struct adis16209_state { | |||
| 121 | 121 | ||
| 122 | int adis16209_set_irq(struct iio_dev *indio_dev, bool enable); | 122 | int adis16209_set_irq(struct iio_dev *indio_dev, bool enable); |
| 123 | 123 | ||
| 124 | #ifdef CONFIG_IIO_RING_BUFFER | ||
| 125 | |||
| 126 | #define ADIS16209_SCAN_SUPPLY 0 | 124 | #define ADIS16209_SCAN_SUPPLY 0 |
| 127 | #define ADIS16209_SCAN_ACC_X 1 | 125 | #define ADIS16209_SCAN_ACC_X 1 |
| 128 | #define ADIS16209_SCAN_ACC_Y 2 | 126 | #define ADIS16209_SCAN_ACC_Y 2 |
| @@ -132,6 +130,8 @@ int adis16209_set_irq(struct iio_dev *indio_dev, bool enable); | |||
| 132 | #define ADIS16209_SCAN_INCLI_Y 6 | 130 | #define ADIS16209_SCAN_INCLI_Y 6 |
| 133 | #define ADIS16209_SCAN_ROT 7 | 131 | #define ADIS16209_SCAN_ROT 7 |
| 134 | 132 | ||
| 133 | #ifdef CONFIG_IIO_RING_BUFFER | ||
| 134 | |||
| 135 | void adis16209_remove_trigger(struct iio_dev *indio_dev); | 135 | void adis16209_remove_trigger(struct iio_dev *indio_dev); |
| 136 | int adis16209_probe_trigger(struct iio_dev *indio_dev); | 136 | int adis16209_probe_trigger(struct iio_dev *indio_dev); |
| 137 | 137 | ||
diff --git a/drivers/staging/iio/gyro/adis16260.h b/drivers/staging/iio/gyro/adis16260.h index 702dc982f62f..24bf70e4b29b 100644 --- a/drivers/staging/iio/gyro/adis16260.h +++ b/drivers/staging/iio/gyro/adis16260.h | |||
| @@ -104,7 +104,6 @@ struct adis16260_state { | |||
| 104 | 104 | ||
| 105 | int adis16260_set_irq(struct iio_dev *indio_dev, bool enable); | 105 | int adis16260_set_irq(struct iio_dev *indio_dev, bool enable); |
| 106 | 106 | ||
| 107 | #ifdef CONFIG_IIO_RING_BUFFER | ||
| 108 | /* At the moment triggers are only used for ring buffer | 107 | /* At the moment triggers are only used for ring buffer |
| 109 | * filling. This may change! | 108 | * filling. This may change! |
| 110 | */ | 109 | */ |
| @@ -115,6 +114,7 @@ int adis16260_set_irq(struct iio_dev *indio_dev, bool enable); | |||
| 115 | #define ADIS16260_SCAN_TEMP 3 | 114 | #define ADIS16260_SCAN_TEMP 3 |
| 116 | #define ADIS16260_SCAN_ANGL 4 | 115 | #define ADIS16260_SCAN_ANGL 4 |
| 117 | 116 | ||
| 117 | #ifdef CONFIG_IIO_RING_BUFFER | ||
| 118 | void adis16260_remove_trigger(struct iio_dev *indio_dev); | 118 | void adis16260_remove_trigger(struct iio_dev *indio_dev); |
| 119 | int adis16260_probe_trigger(struct iio_dev *indio_dev); | 119 | int adis16260_probe_trigger(struct iio_dev *indio_dev); |
| 120 | 120 | ||
diff --git a/drivers/staging/iio/imu/adis16400.h b/drivers/staging/iio/imu/adis16400.h index db184d11dfc0..e87715b9acc6 100644 --- a/drivers/staging/iio/imu/adis16400.h +++ b/drivers/staging/iio/imu/adis16400.h | |||
| @@ -158,7 +158,6 @@ struct adis16400_state { | |||
| 158 | 158 | ||
| 159 | int adis16400_set_irq(struct iio_dev *indio_dev, bool enable); | 159 | int adis16400_set_irq(struct iio_dev *indio_dev, bool enable); |
| 160 | 160 | ||
| 161 | #ifdef CONFIG_IIO_RING_BUFFER | ||
| 162 | /* At the moment triggers are only used for ring buffer | 161 | /* At the moment triggers are only used for ring buffer |
| 163 | * filling. This may change! | 162 | * filling. This may change! |
| 164 | */ | 163 | */ |
| @@ -182,6 +181,7 @@ int adis16400_set_irq(struct iio_dev *indio_dev, bool enable); | |||
| 182 | #define ADIS16300_SCAN_INCLI_X 12 | 181 | #define ADIS16300_SCAN_INCLI_X 12 |
| 183 | #define ADIS16300_SCAN_INCLI_Y 13 | 182 | #define ADIS16300_SCAN_INCLI_Y 13 |
| 184 | 183 | ||
| 184 | #ifdef CONFIG_IIO_RING_BUFFER | ||
| 185 | void adis16400_remove_trigger(struct iio_dev *indio_dev); | 185 | void adis16400_remove_trigger(struct iio_dev *indio_dev); |
| 186 | int adis16400_probe_trigger(struct iio_dev *indio_dev); | 186 | int adis16400_probe_trigger(struct iio_dev *indio_dev); |
| 187 | 187 | ||
diff --git a/drivers/staging/mei/init.c b/drivers/staging/mei/init.c index d1ffa32cd141..685fcf639644 100644 --- a/drivers/staging/mei/init.c +++ b/drivers/staging/mei/init.c | |||
| @@ -189,7 +189,7 @@ int mei_hw_init(struct mei_device *dev) | |||
| 189 | mutex_lock(&dev->device_lock); | 189 | mutex_lock(&dev->device_lock); |
| 190 | } | 190 | } |
| 191 | 191 | ||
| 192 | if (!err && !dev->recvd_msg) { | 192 | if (err <= 0 && !dev->recvd_msg) { |
| 193 | dev->mei_state = MEI_DISABLED; | 193 | dev->mei_state = MEI_DISABLED; |
| 194 | dev_dbg(&dev->pdev->dev, | 194 | dev_dbg(&dev->pdev->dev, |
| 195 | "wait_event_interruptible_timeout failed" | 195 | "wait_event_interruptible_timeout failed" |
diff --git a/drivers/staging/mei/wd.c b/drivers/staging/mei/wd.c index 2564b038636a..fff53d0b5c6e 100644 --- a/drivers/staging/mei/wd.c +++ b/drivers/staging/mei/wd.c | |||
| @@ -169,10 +169,15 @@ int mei_wd_stop(struct mei_device *dev, bool preserve) | |||
| 169 | ret = wait_event_interruptible_timeout(dev->wait_stop_wd, | 169 | ret = wait_event_interruptible_timeout(dev->wait_stop_wd, |
| 170 | dev->wd_stopped, 10 * HZ); | 170 | dev->wd_stopped, 10 * HZ); |
| 171 | mutex_lock(&dev->device_lock); | 171 | mutex_lock(&dev->device_lock); |
| 172 | if (!dev->wd_stopped) | 172 | if (dev->wd_stopped) { |
| 173 | dev_dbg(&dev->pdev->dev, "stop wd failed to complete.\n"); | 173 | dev_dbg(&dev->pdev->dev, "stop wd complete ret=%d.\n", ret); |
| 174 | else | 174 | ret = 0; |
| 175 | dev_dbg(&dev->pdev->dev, "stop wd complete.\n"); | 175 | } else { |
| 176 | if (!ret) | ||
| 177 | ret = -ETIMEDOUT; | ||
| 178 | dev_warn(&dev->pdev->dev, | ||
| 179 | "stop wd failed to complete ret=%d.\n", ret); | ||
| 180 | } | ||
| 176 | 181 | ||
| 177 | if (preserve) | 182 | if (preserve) |
| 178 | dev->wd_timeout = wd_timeout; | 183 | dev->wd_timeout = wd_timeout; |
diff --git a/drivers/target/loopback/tcm_loop.c b/drivers/target/loopback/tcm_loop.c index dee2a2c909f5..70c2e7fa6664 100644 --- a/drivers/target/loopback/tcm_loop.c +++ b/drivers/target/loopback/tcm_loop.c | |||
| @@ -386,7 +386,7 @@ static int tcm_loop_device_reset(struct scsi_cmnd *sc) | |||
| 386 | */ | 386 | */ |
| 387 | se_cmd->se_tmr_req = core_tmr_alloc_req(se_cmd, (void *)tl_tmr, | 387 | se_cmd->se_tmr_req = core_tmr_alloc_req(se_cmd, (void *)tl_tmr, |
| 388 | TMR_LUN_RESET); | 388 | TMR_LUN_RESET); |
| 389 | if (!se_cmd->se_tmr_req) | 389 | if (IS_ERR(se_cmd->se_tmr_req)) |
| 390 | goto release; | 390 | goto release; |
| 391 | /* | 391 | /* |
| 392 | * Locate the underlying TCM struct se_lun from sc->device->lun | 392 | * Locate the underlying TCM struct se_lun from sc->device->lun |
| @@ -1017,6 +1017,7 @@ static int tcm_loop_make_nexus( | |||
| 1017 | struct se_portal_group *se_tpg; | 1017 | struct se_portal_group *se_tpg; |
| 1018 | struct tcm_loop_hba *tl_hba = tl_tpg->tl_hba; | 1018 | struct tcm_loop_hba *tl_hba = tl_tpg->tl_hba; |
| 1019 | struct tcm_loop_nexus *tl_nexus; | 1019 | struct tcm_loop_nexus *tl_nexus; |
| 1020 | int ret = -ENOMEM; | ||
| 1020 | 1021 | ||
| 1021 | if (tl_tpg->tl_hba->tl_nexus) { | 1022 | if (tl_tpg->tl_hba->tl_nexus) { |
| 1022 | printk(KERN_INFO "tl_tpg->tl_hba->tl_nexus already exists\n"); | 1023 | printk(KERN_INFO "tl_tpg->tl_hba->tl_nexus already exists\n"); |
| @@ -1033,8 +1034,10 @@ static int tcm_loop_make_nexus( | |||
| 1033 | * Initialize the struct se_session pointer | 1034 | * Initialize the struct se_session pointer |
| 1034 | */ | 1035 | */ |
| 1035 | tl_nexus->se_sess = transport_init_session(); | 1036 | tl_nexus->se_sess = transport_init_session(); |
| 1036 | if (!tl_nexus->se_sess) | 1037 | if (IS_ERR(tl_nexus->se_sess)) { |
| 1038 | ret = PTR_ERR(tl_nexus->se_sess); | ||
| 1037 | goto out; | 1039 | goto out; |
| 1040 | } | ||
| 1038 | /* | 1041 | /* |
| 1039 | * Since we are running in 'demo mode' this call with generate a | 1042 | * Since we are running in 'demo mode' this call with generate a |
| 1040 | * struct se_node_acl for the tcm_loop struct se_portal_group with the SCSI | 1043 | * struct se_node_acl for the tcm_loop struct se_portal_group with the SCSI |
| @@ -1060,7 +1063,7 @@ static int tcm_loop_make_nexus( | |||
| 1060 | 1063 | ||
| 1061 | out: | 1064 | out: |
| 1062 | kfree(tl_nexus); | 1065 | kfree(tl_nexus); |
| 1063 | return -ENOMEM; | 1066 | return ret; |
| 1064 | } | 1067 | } |
| 1065 | 1068 | ||
| 1066 | static int tcm_loop_drop_nexus( | 1069 | static int tcm_loop_drop_nexus( |
| @@ -1140,7 +1143,7 @@ static ssize_t tcm_loop_tpg_store_nexus( | |||
| 1140 | * the fabric protocol_id set in tcm_loop_make_scsi_hba(), and call | 1143 | * the fabric protocol_id set in tcm_loop_make_scsi_hba(), and call |
| 1141 | * tcm_loop_make_nexus() | 1144 | * tcm_loop_make_nexus() |
| 1142 | */ | 1145 | */ |
| 1143 | if (strlen(page) > TL_WWN_ADDR_LEN) { | 1146 | if (strlen(page) >= TL_WWN_ADDR_LEN) { |
| 1144 | printk(KERN_ERR "Emulated NAA Sas Address: %s, exceeds" | 1147 | printk(KERN_ERR "Emulated NAA Sas Address: %s, exceeds" |
| 1145 | " max: %d\n", page, TL_WWN_ADDR_LEN); | 1148 | " max: %d\n", page, TL_WWN_ADDR_LEN); |
| 1146 | return -EINVAL; | 1149 | return -EINVAL; |
| @@ -1321,7 +1324,7 @@ struct se_wwn *tcm_loop_make_scsi_hba( | |||
| 1321 | return ERR_PTR(-EINVAL); | 1324 | return ERR_PTR(-EINVAL); |
| 1322 | 1325 | ||
| 1323 | check_len: | 1326 | check_len: |
| 1324 | if (strlen(name) > TL_WWN_ADDR_LEN) { | 1327 | if (strlen(name) >= TL_WWN_ADDR_LEN) { |
| 1325 | printk(KERN_ERR "Emulated NAA %s Address: %s, exceeds" | 1328 | printk(KERN_ERR "Emulated NAA %s Address: %s, exceeds" |
| 1326 | " max: %d\n", name, tcm_loop_dump_proto_id(tl_hba), | 1329 | " max: %d\n", name, tcm_loop_dump_proto_id(tl_hba), |
| 1327 | TL_WWN_ADDR_LEN); | 1330 | TL_WWN_ADDR_LEN); |
diff --git a/drivers/target/target_core_configfs.c b/drivers/target/target_core_configfs.c index ee6fad979b50..25c1f49a7d8b 100644 --- a/drivers/target/target_core_configfs.c +++ b/drivers/target/target_core_configfs.c | |||
| @@ -304,7 +304,7 @@ struct target_fabric_configfs *target_fabric_configfs_init( | |||
| 304 | printk(KERN_ERR "Unable to locate passed fabric name\n"); | 304 | printk(KERN_ERR "Unable to locate passed fabric name\n"); |
| 305 | return NULL; | 305 | return NULL; |
| 306 | } | 306 | } |
| 307 | if (strlen(name) > TARGET_FABRIC_NAME_SIZE) { | 307 | if (strlen(name) >= TARGET_FABRIC_NAME_SIZE) { |
| 308 | printk(KERN_ERR "Passed name: %s exceeds TARGET_FABRIC" | 308 | printk(KERN_ERR "Passed name: %s exceeds TARGET_FABRIC" |
| 309 | "_NAME_SIZE\n", name); | 309 | "_NAME_SIZE\n", name); |
| 310 | return NULL; | 310 | return NULL; |
| @@ -312,7 +312,7 @@ struct target_fabric_configfs *target_fabric_configfs_init( | |||
| 312 | 312 | ||
| 313 | tf = kzalloc(sizeof(struct target_fabric_configfs), GFP_KERNEL); | 313 | tf = kzalloc(sizeof(struct target_fabric_configfs), GFP_KERNEL); |
| 314 | if (!(tf)) | 314 | if (!(tf)) |
| 315 | return ERR_PTR(-ENOMEM); | 315 | return NULL; |
| 316 | 316 | ||
| 317 | INIT_LIST_HEAD(&tf->tf_list); | 317 | INIT_LIST_HEAD(&tf->tf_list); |
| 318 | atomic_set(&tf->tf_access_cnt, 0); | 318 | atomic_set(&tf->tf_access_cnt, 0); |
| @@ -851,7 +851,7 @@ static ssize_t target_core_dev_wwn_store_attr_vpd_unit_serial( | |||
| 851 | return -EOPNOTSUPP; | 851 | return -EOPNOTSUPP; |
| 852 | } | 852 | } |
| 853 | 853 | ||
| 854 | if ((strlen(page) + 1) > INQUIRY_VPD_SERIAL_LEN) { | 854 | if (strlen(page) >= INQUIRY_VPD_SERIAL_LEN) { |
| 855 | printk(KERN_ERR "Emulated VPD Unit Serial exceeds" | 855 | printk(KERN_ERR "Emulated VPD Unit Serial exceeds" |
| 856 | " INQUIRY_VPD_SERIAL_LEN: %d\n", INQUIRY_VPD_SERIAL_LEN); | 856 | " INQUIRY_VPD_SERIAL_LEN: %d\n", INQUIRY_VPD_SERIAL_LEN); |
| 857 | return -EOVERFLOW; | 857 | return -EOVERFLOW; |
| @@ -917,7 +917,7 @@ static ssize_t target_core_dev_wwn_show_attr_vpd_protocol_identifier( | |||
| 917 | 917 | ||
| 918 | transport_dump_vpd_proto_id(vpd, buf, VPD_TMP_BUF_SIZE); | 918 | transport_dump_vpd_proto_id(vpd, buf, VPD_TMP_BUF_SIZE); |
| 919 | 919 | ||
| 920 | if ((len + strlen(buf) > PAGE_SIZE)) | 920 | if ((len + strlen(buf) >= PAGE_SIZE)) |
| 921 | break; | 921 | break; |
| 922 | 922 | ||
| 923 | len += sprintf(page+len, "%s", buf); | 923 | len += sprintf(page+len, "%s", buf); |
| @@ -962,19 +962,19 @@ static ssize_t target_core_dev_wwn_show_attr_##_name( \ | |||
| 962 | \ | 962 | \ |
| 963 | memset(buf, 0, VPD_TMP_BUF_SIZE); \ | 963 | memset(buf, 0, VPD_TMP_BUF_SIZE); \ |
| 964 | transport_dump_vpd_assoc(vpd, buf, VPD_TMP_BUF_SIZE); \ | 964 | transport_dump_vpd_assoc(vpd, buf, VPD_TMP_BUF_SIZE); \ |
| 965 | if ((len + strlen(buf) > PAGE_SIZE)) \ | 965 | if ((len + strlen(buf) >= PAGE_SIZE)) \ |
| 966 | break; \ | 966 | break; \ |
| 967 | len += sprintf(page+len, "%s", buf); \ | 967 | len += sprintf(page+len, "%s", buf); \ |
| 968 | \ | 968 | \ |
| 969 | memset(buf, 0, VPD_TMP_BUF_SIZE); \ | 969 | memset(buf, 0, VPD_TMP_BUF_SIZE); \ |
| 970 | transport_dump_vpd_ident_type(vpd, buf, VPD_TMP_BUF_SIZE); \ | 970 | transport_dump_vpd_ident_type(vpd, buf, VPD_TMP_BUF_SIZE); \ |
| 971 | if ((len + strlen(buf) > PAGE_SIZE)) \ | 971 | if ((len + strlen(buf) >= PAGE_SIZE)) \ |
| 972 | break; \ | 972 | break; \ |
| 973 | len += sprintf(page+len, "%s", buf); \ | 973 | len += sprintf(page+len, "%s", buf); \ |
| 974 | \ | 974 | \ |
| 975 | memset(buf, 0, VPD_TMP_BUF_SIZE); \ | 975 | memset(buf, 0, VPD_TMP_BUF_SIZE); \ |
| 976 | transport_dump_vpd_ident(vpd, buf, VPD_TMP_BUF_SIZE); \ | 976 | transport_dump_vpd_ident(vpd, buf, VPD_TMP_BUF_SIZE); \ |
| 977 | if ((len + strlen(buf) > PAGE_SIZE)) \ | 977 | if ((len + strlen(buf) >= PAGE_SIZE)) \ |
| 978 | break; \ | 978 | break; \ |
| 979 | len += sprintf(page+len, "%s", buf); \ | 979 | len += sprintf(page+len, "%s", buf); \ |
| 980 | } \ | 980 | } \ |
| @@ -1299,7 +1299,7 @@ static ssize_t target_core_dev_pr_show_attr_res_pr_registered_i_pts( | |||
| 1299 | &i_buf[0] : "", pr_reg->pr_res_key, | 1299 | &i_buf[0] : "", pr_reg->pr_res_key, |
| 1300 | pr_reg->pr_res_generation); | 1300 | pr_reg->pr_res_generation); |
| 1301 | 1301 | ||
| 1302 | if ((len + strlen(buf) > PAGE_SIZE)) | 1302 | if ((len + strlen(buf) >= PAGE_SIZE)) |
| 1303 | break; | 1303 | break; |
| 1304 | 1304 | ||
| 1305 | len += sprintf(page+len, "%s", buf); | 1305 | len += sprintf(page+len, "%s", buf); |
| @@ -1496,7 +1496,7 @@ static ssize_t target_core_dev_pr_store_attr_res_aptpl_metadata( | |||
| 1496 | ret = -ENOMEM; | 1496 | ret = -ENOMEM; |
| 1497 | goto out; | 1497 | goto out; |
| 1498 | } | 1498 | } |
| 1499 | if (strlen(i_port) > PR_APTPL_MAX_IPORT_LEN) { | 1499 | if (strlen(i_port) >= PR_APTPL_MAX_IPORT_LEN) { |
| 1500 | printk(KERN_ERR "APTPL metadata initiator_node=" | 1500 | printk(KERN_ERR "APTPL metadata initiator_node=" |
| 1501 | " exceeds PR_APTPL_MAX_IPORT_LEN: %d\n", | 1501 | " exceeds PR_APTPL_MAX_IPORT_LEN: %d\n", |
| 1502 | PR_APTPL_MAX_IPORT_LEN); | 1502 | PR_APTPL_MAX_IPORT_LEN); |
| @@ -1510,7 +1510,7 @@ static ssize_t target_core_dev_pr_store_attr_res_aptpl_metadata( | |||
| 1510 | ret = -ENOMEM; | 1510 | ret = -ENOMEM; |
| 1511 | goto out; | 1511 | goto out; |
| 1512 | } | 1512 | } |
| 1513 | if (strlen(isid) > PR_REG_ISID_LEN) { | 1513 | if (strlen(isid) >= PR_REG_ISID_LEN) { |
| 1514 | printk(KERN_ERR "APTPL metadata initiator_isid" | 1514 | printk(KERN_ERR "APTPL metadata initiator_isid" |
| 1515 | "= exceeds PR_REG_ISID_LEN: %d\n", | 1515 | "= exceeds PR_REG_ISID_LEN: %d\n", |
| 1516 | PR_REG_ISID_LEN); | 1516 | PR_REG_ISID_LEN); |
| @@ -1571,7 +1571,7 @@ static ssize_t target_core_dev_pr_store_attr_res_aptpl_metadata( | |||
| 1571 | ret = -ENOMEM; | 1571 | ret = -ENOMEM; |
| 1572 | goto out; | 1572 | goto out; |
| 1573 | } | 1573 | } |
| 1574 | if (strlen(t_port) > PR_APTPL_MAX_TPORT_LEN) { | 1574 | if (strlen(t_port) >= PR_APTPL_MAX_TPORT_LEN) { |
| 1575 | printk(KERN_ERR "APTPL metadata target_node=" | 1575 | printk(KERN_ERR "APTPL metadata target_node=" |
| 1576 | " exceeds PR_APTPL_MAX_TPORT_LEN: %d\n", | 1576 | " exceeds PR_APTPL_MAX_TPORT_LEN: %d\n", |
| 1577 | PR_APTPL_MAX_TPORT_LEN); | 1577 | PR_APTPL_MAX_TPORT_LEN); |
| @@ -3052,7 +3052,7 @@ static struct config_group *target_core_call_addhbatotarget( | |||
| 3052 | int ret; | 3052 | int ret; |
| 3053 | 3053 | ||
| 3054 | memset(buf, 0, TARGET_CORE_NAME_MAX_LEN); | 3054 | memset(buf, 0, TARGET_CORE_NAME_MAX_LEN); |
| 3055 | if (strlen(name) > TARGET_CORE_NAME_MAX_LEN) { | 3055 | if (strlen(name) >= TARGET_CORE_NAME_MAX_LEN) { |
| 3056 | printk(KERN_ERR "Passed *name strlen(): %d exceeds" | 3056 | printk(KERN_ERR "Passed *name strlen(): %d exceeds" |
| 3057 | " TARGET_CORE_NAME_MAX_LEN: %d\n", (int)strlen(name), | 3057 | " TARGET_CORE_NAME_MAX_LEN: %d\n", (int)strlen(name), |
| 3058 | TARGET_CORE_NAME_MAX_LEN); | 3058 | TARGET_CORE_NAME_MAX_LEN); |
diff --git a/drivers/target/target_core_device.c b/drivers/target/target_core_device.c index 8407f9ca2b31..ba698ea62bb2 100644 --- a/drivers/target/target_core_device.c +++ b/drivers/target/target_core_device.c | |||
| @@ -192,7 +192,7 @@ int transport_get_lun_for_tmr( | |||
| 192 | &SE_NODE_ACL(se_sess)->device_list[unpacked_lun]; | 192 | &SE_NODE_ACL(se_sess)->device_list[unpacked_lun]; |
| 193 | if (deve->lun_flags & TRANSPORT_LUNFLAGS_INITIATOR_ACCESS) { | 193 | if (deve->lun_flags & TRANSPORT_LUNFLAGS_INITIATOR_ACCESS) { |
| 194 | se_lun = se_cmd->se_lun = se_tmr->tmr_lun = deve->se_lun; | 194 | se_lun = se_cmd->se_lun = se_tmr->tmr_lun = deve->se_lun; |
| 195 | dev = se_tmr->tmr_dev = se_lun->lun_se_dev; | 195 | dev = se_lun->lun_se_dev; |
| 196 | se_cmd->pr_res_key = deve->pr_res_key; | 196 | se_cmd->pr_res_key = deve->pr_res_key; |
| 197 | se_cmd->orig_fe_lun = unpacked_lun; | 197 | se_cmd->orig_fe_lun = unpacked_lun; |
| 198 | se_cmd->se_orig_obj_ptr = SE_LUN(se_cmd)->lun_se_dev; | 198 | se_cmd->se_orig_obj_ptr = SE_LUN(se_cmd)->lun_se_dev; |
| @@ -216,6 +216,7 @@ int transport_get_lun_for_tmr( | |||
| 216 | se_cmd->se_cmd_flags |= SCF_SCSI_CDB_EXCEPTION; | 216 | se_cmd->se_cmd_flags |= SCF_SCSI_CDB_EXCEPTION; |
| 217 | return -1; | 217 | return -1; |
| 218 | } | 218 | } |
| 219 | se_tmr->tmr_dev = dev; | ||
| 219 | 220 | ||
| 220 | spin_lock(&dev->se_tmr_lock); | 221 | spin_lock(&dev->se_tmr_lock); |
| 221 | list_add_tail(&se_tmr->tmr_list, &dev->dev_tmr_list); | 222 | list_add_tail(&se_tmr->tmr_list, &dev->dev_tmr_list); |
| @@ -1430,7 +1431,7 @@ struct se_lun_acl *core_dev_init_initiator_node_lun_acl( | |||
| 1430 | struct se_lun_acl *lacl; | 1431 | struct se_lun_acl *lacl; |
| 1431 | struct se_node_acl *nacl; | 1432 | struct se_node_acl *nacl; |
| 1432 | 1433 | ||
| 1433 | if (strlen(initiatorname) > TRANSPORT_IQN_LEN) { | 1434 | if (strlen(initiatorname) >= TRANSPORT_IQN_LEN) { |
| 1434 | printk(KERN_ERR "%s InitiatorName exceeds maximum size.\n", | 1435 | printk(KERN_ERR "%s InitiatorName exceeds maximum size.\n", |
| 1435 | TPG_TFO(tpg)->get_fabric_name()); | 1436 | TPG_TFO(tpg)->get_fabric_name()); |
| 1436 | *ret = -EOVERFLOW; | 1437 | *ret = -EOVERFLOW; |
diff --git a/drivers/target/target_core_pr.c b/drivers/target/target_core_pr.c index a79f518ca6e2..b662db3a320b 100644 --- a/drivers/target/target_core_pr.c +++ b/drivers/target/target_core_pr.c | |||
| @@ -1916,7 +1916,7 @@ static int __core_scsi3_update_aptpl_buf( | |||
| 1916 | pr_reg->pr_res_mapped_lun); | 1916 | pr_reg->pr_res_mapped_lun); |
| 1917 | } | 1917 | } |
| 1918 | 1918 | ||
| 1919 | if ((len + strlen(tmp) > pr_aptpl_buf_len)) { | 1919 | if ((len + strlen(tmp) >= pr_aptpl_buf_len)) { |
| 1920 | printk(KERN_ERR "Unable to update renaming" | 1920 | printk(KERN_ERR "Unable to update renaming" |
| 1921 | " APTPL metadata\n"); | 1921 | " APTPL metadata\n"); |
| 1922 | spin_unlock(&T10_RES(su_dev)->registration_lock); | 1922 | spin_unlock(&T10_RES(su_dev)->registration_lock); |
| @@ -1934,7 +1934,7 @@ static int __core_scsi3_update_aptpl_buf( | |||
| 1934 | TPG_TFO(tpg)->tpg_get_tag(tpg), | 1934 | TPG_TFO(tpg)->tpg_get_tag(tpg), |
| 1935 | lun->lun_sep->sep_rtpi, lun->unpacked_lun, reg_count); | 1935 | lun->lun_sep->sep_rtpi, lun->unpacked_lun, reg_count); |
| 1936 | 1936 | ||
| 1937 | if ((len + strlen(tmp) > pr_aptpl_buf_len)) { | 1937 | if ((len + strlen(tmp) >= pr_aptpl_buf_len)) { |
| 1938 | printk(KERN_ERR "Unable to update renaming" | 1938 | printk(KERN_ERR "Unable to update renaming" |
| 1939 | " APTPL metadata\n"); | 1939 | " APTPL metadata\n"); |
| 1940 | spin_unlock(&T10_RES(su_dev)->registration_lock); | 1940 | spin_unlock(&T10_RES(su_dev)->registration_lock); |
| @@ -1986,7 +1986,7 @@ static int __core_scsi3_write_aptpl_to_file( | |||
| 1986 | memset(iov, 0, sizeof(struct iovec)); | 1986 | memset(iov, 0, sizeof(struct iovec)); |
| 1987 | memset(path, 0, 512); | 1987 | memset(path, 0, 512); |
| 1988 | 1988 | ||
| 1989 | if (strlen(&wwn->unit_serial[0]) > 512) { | 1989 | if (strlen(&wwn->unit_serial[0]) >= 512) { |
| 1990 | printk(KERN_ERR "WWN value for struct se_device does not fit" | 1990 | printk(KERN_ERR "WWN value for struct se_device does not fit" |
| 1991 | " into path buffer\n"); | 1991 | " into path buffer\n"); |
| 1992 | return -1; | 1992 | return -1; |
diff --git a/drivers/target/target_core_tmr.c b/drivers/target/target_core_tmr.c index 59b8b9c5ad72..179063d81cdd 100644 --- a/drivers/target/target_core_tmr.c +++ b/drivers/target/target_core_tmr.c | |||
| @@ -75,10 +75,16 @@ void core_tmr_release_req( | |||
| 75 | { | 75 | { |
| 76 | struct se_device *dev = tmr->tmr_dev; | 76 | struct se_device *dev = tmr->tmr_dev; |
| 77 | 77 | ||
| 78 | if (!dev) { | ||
| 79 | kmem_cache_free(se_tmr_req_cache, tmr); | ||
| 80 | return; | ||
| 81 | } | ||
| 82 | |||
| 78 | spin_lock(&dev->se_tmr_lock); | 83 | spin_lock(&dev->se_tmr_lock); |
| 79 | list_del(&tmr->tmr_list); | 84 | list_del(&tmr->tmr_list); |
| 80 | kmem_cache_free(se_tmr_req_cache, tmr); | ||
| 81 | spin_unlock(&dev->se_tmr_lock); | 85 | spin_unlock(&dev->se_tmr_lock); |
| 86 | |||
| 87 | kmem_cache_free(se_tmr_req_cache, tmr); | ||
| 82 | } | 88 | } |
| 83 | 89 | ||
| 84 | static void core_tmr_handle_tas_abort( | 90 | static void core_tmr_handle_tas_abort( |
diff --git a/drivers/target/target_core_transport.c b/drivers/target/target_core_transport.c index 4dafeb8b5638..4b9b7169bdd9 100644 --- a/drivers/target/target_core_transport.c +++ b/drivers/target/target_core_transport.c | |||
| @@ -536,13 +536,13 @@ EXPORT_SYMBOL(transport_register_session); | |||
| 536 | void transport_deregister_session_configfs(struct se_session *se_sess) | 536 | void transport_deregister_session_configfs(struct se_session *se_sess) |
| 537 | { | 537 | { |
| 538 | struct se_node_acl *se_nacl; | 538 | struct se_node_acl *se_nacl; |
| 539 | 539 | unsigned long flags; | |
| 540 | /* | 540 | /* |
| 541 | * Used by struct se_node_acl's under ConfigFS to locate active struct se_session | 541 | * Used by struct se_node_acl's under ConfigFS to locate active struct se_session |
| 542 | */ | 542 | */ |
| 543 | se_nacl = se_sess->se_node_acl; | 543 | se_nacl = se_sess->se_node_acl; |
| 544 | if ((se_nacl)) { | 544 | if ((se_nacl)) { |
| 545 | spin_lock_irq(&se_nacl->nacl_sess_lock); | 545 | spin_lock_irqsave(&se_nacl->nacl_sess_lock, flags); |
| 546 | list_del(&se_sess->sess_acl_list); | 546 | list_del(&se_sess->sess_acl_list); |
| 547 | /* | 547 | /* |
| 548 | * If the session list is empty, then clear the pointer. | 548 | * If the session list is empty, then clear the pointer. |
| @@ -556,7 +556,7 @@ void transport_deregister_session_configfs(struct se_session *se_sess) | |||
| 556 | se_nacl->acl_sess_list.prev, | 556 | se_nacl->acl_sess_list.prev, |
| 557 | struct se_session, sess_acl_list); | 557 | struct se_session, sess_acl_list); |
| 558 | } | 558 | } |
| 559 | spin_unlock_irq(&se_nacl->nacl_sess_lock); | 559 | spin_unlock_irqrestore(&se_nacl->nacl_sess_lock, flags); |
| 560 | } | 560 | } |
| 561 | } | 561 | } |
| 562 | EXPORT_SYMBOL(transport_deregister_session_configfs); | 562 | EXPORT_SYMBOL(transport_deregister_session_configfs); |
diff --git a/drivers/target/tcm_fc/tcm_fc.h b/drivers/target/tcm_fc/tcm_fc.h index defff32b7880..7b82f1b7fef8 100644 --- a/drivers/target/tcm_fc/tcm_fc.h +++ b/drivers/target/tcm_fc/tcm_fc.h | |||
| @@ -144,7 +144,7 @@ enum ft_cmd_state { | |||
| 144 | */ | 144 | */ |
| 145 | struct ft_cmd { | 145 | struct ft_cmd { |
| 146 | enum ft_cmd_state state; | 146 | enum ft_cmd_state state; |
| 147 | u16 lun; /* LUN from request */ | 147 | u32 lun; /* LUN from request */ |
| 148 | struct ft_sess *sess; /* session held for cmd */ | 148 | struct ft_sess *sess; /* session held for cmd */ |
| 149 | struct fc_seq *seq; /* sequence in exchange mgr */ | 149 | struct fc_seq *seq; /* sequence in exchange mgr */ |
| 150 | struct se_cmd se_cmd; /* Local TCM I/O descriptor */ | 150 | struct se_cmd se_cmd; /* Local TCM I/O descriptor */ |
diff --git a/drivers/target/tcm_fc/tfc_cmd.c b/drivers/target/tcm_fc/tfc_cmd.c index c056a1132ae1..b2a106729d49 100644 --- a/drivers/target/tcm_fc/tfc_cmd.c +++ b/drivers/target/tcm_fc/tfc_cmd.c | |||
| @@ -94,29 +94,6 @@ void ft_dump_cmd(struct ft_cmd *cmd, const char *caller) | |||
| 94 | 16, 4, cmd->cdb, MAX_COMMAND_SIZE, 0); | 94 | 16, 4, cmd->cdb, MAX_COMMAND_SIZE, 0); |
| 95 | } | 95 | } |
| 96 | 96 | ||
| 97 | /* | ||
| 98 | * Get LUN from CDB. | ||
| 99 | */ | ||
| 100 | static int ft_get_lun_for_cmd(struct ft_cmd *cmd, u8 *lunp) | ||
| 101 | { | ||
| 102 | u64 lun; | ||
| 103 | |||
| 104 | lun = lunp[1]; | ||
| 105 | switch (lunp[0] >> 6) { | ||
| 106 | case 0: | ||
| 107 | break; | ||
| 108 | case 1: | ||
| 109 | lun |= (lunp[0] & 0x3f) << 8; | ||
| 110 | break; | ||
| 111 | default: | ||
| 112 | return -1; | ||
| 113 | } | ||
| 114 | if (lun >= TRANSPORT_MAX_LUNS_PER_TPG) | ||
| 115 | return -1; | ||
| 116 | cmd->lun = lun; | ||
| 117 | return transport_get_lun_for_cmd(&cmd->se_cmd, NULL, lun); | ||
| 118 | } | ||
| 119 | |||
| 120 | static void ft_queue_cmd(struct ft_sess *sess, struct ft_cmd *cmd) | 97 | static void ft_queue_cmd(struct ft_sess *sess, struct ft_cmd *cmd) |
| 121 | { | 98 | { |
| 122 | struct se_queue_obj *qobj; | 99 | struct se_queue_obj *qobj; |
| @@ -418,6 +395,7 @@ static void ft_send_tm(struct ft_cmd *cmd) | |||
| 418 | { | 395 | { |
| 419 | struct se_tmr_req *tmr; | 396 | struct se_tmr_req *tmr; |
| 420 | struct fcp_cmnd *fcp; | 397 | struct fcp_cmnd *fcp; |
| 398 | struct ft_sess *sess; | ||
| 421 | u8 tm_func; | 399 | u8 tm_func; |
| 422 | 400 | ||
| 423 | fcp = fc_frame_payload_get(cmd->req_frame, sizeof(*fcp)); | 401 | fcp = fc_frame_payload_get(cmd->req_frame, sizeof(*fcp)); |
| @@ -425,13 +403,6 @@ static void ft_send_tm(struct ft_cmd *cmd) | |||
| 425 | switch (fcp->fc_tm_flags) { | 403 | switch (fcp->fc_tm_flags) { |
| 426 | case FCP_TMF_LUN_RESET: | 404 | case FCP_TMF_LUN_RESET: |
| 427 | tm_func = TMR_LUN_RESET; | 405 | tm_func = TMR_LUN_RESET; |
| 428 | if (ft_get_lun_for_cmd(cmd, fcp->fc_lun) < 0) { | ||
| 429 | ft_dump_cmd(cmd, __func__); | ||
| 430 | transport_send_check_condition_and_sense(&cmd->se_cmd, | ||
| 431 | cmd->se_cmd.scsi_sense_reason, 0); | ||
| 432 | ft_sess_put(cmd->sess); | ||
| 433 | return; | ||
| 434 | } | ||
| 435 | break; | 406 | break; |
| 436 | case FCP_TMF_TGT_RESET: | 407 | case FCP_TMF_TGT_RESET: |
| 437 | tm_func = TMR_TARGET_WARM_RESET; | 408 | tm_func = TMR_TARGET_WARM_RESET; |
| @@ -463,6 +434,36 @@ static void ft_send_tm(struct ft_cmd *cmd) | |||
| 463 | return; | 434 | return; |
| 464 | } | 435 | } |
| 465 | cmd->se_cmd.se_tmr_req = tmr; | 436 | cmd->se_cmd.se_tmr_req = tmr; |
| 437 | |||
| 438 | switch (fcp->fc_tm_flags) { | ||
| 439 | case FCP_TMF_LUN_RESET: | ||
| 440 | cmd->lun = scsilun_to_int((struct scsi_lun *)fcp->fc_lun); | ||
| 441 | if (transport_get_lun_for_tmr(&cmd->se_cmd, cmd->lun) < 0) { | ||
| 442 | /* | ||
| 443 | * Make sure to clean up newly allocated TMR request | ||
| 444 | * since "unable to handle TMR request because failed | ||
| 445 | * to get to LUN" | ||
| 446 | */ | ||
| 447 | FT_TM_DBG("Failed to get LUN for TMR func %d, " | ||
| 448 | "se_cmd %p, unpacked_lun %d\n", | ||
| 449 | tm_func, &cmd->se_cmd, cmd->lun); | ||
| 450 | ft_dump_cmd(cmd, __func__); | ||
| 451 | sess = cmd->sess; | ||
| 452 | transport_send_check_condition_and_sense(&cmd->se_cmd, | ||
| 453 | cmd->se_cmd.scsi_sense_reason, 0); | ||
| 454 | transport_generic_free_cmd(&cmd->se_cmd, 0, 1, 0); | ||
| 455 | ft_sess_put(sess); | ||
| 456 | return; | ||
| 457 | } | ||
| 458 | break; | ||
| 459 | case FCP_TMF_TGT_RESET: | ||
| 460 | case FCP_TMF_CLR_TASK_SET: | ||
| 461 | case FCP_TMF_ABT_TASK_SET: | ||
| 462 | case FCP_TMF_CLR_ACA: | ||
| 463 | break; | ||
| 464 | default: | ||
| 465 | return; | ||
| 466 | } | ||
| 466 | transport_generic_handle_tmr(&cmd->se_cmd); | 467 | transport_generic_handle_tmr(&cmd->se_cmd); |
| 467 | } | 468 | } |
| 468 | 469 | ||
| @@ -635,7 +636,8 @@ static void ft_send_cmd(struct ft_cmd *cmd) | |||
| 635 | 636 | ||
| 636 | fc_seq_exch(cmd->seq)->lp->tt.seq_set_resp(cmd->seq, ft_recv_seq, cmd); | 637 | fc_seq_exch(cmd->seq)->lp->tt.seq_set_resp(cmd->seq, ft_recv_seq, cmd); |
| 637 | 638 | ||
| 638 | ret = ft_get_lun_for_cmd(cmd, fcp->fc_lun); | 639 | cmd->lun = scsilun_to_int((struct scsi_lun *)fcp->fc_lun); |
| 640 | ret = transport_get_lun_for_cmd(&cmd->se_cmd, NULL, cmd->lun); | ||
| 639 | if (ret < 0) { | 641 | if (ret < 0) { |
| 640 | ft_dump_cmd(cmd, __func__); | 642 | ft_dump_cmd(cmd, __func__); |
| 641 | transport_send_check_condition_and_sense(&cmd->se_cmd, | 643 | transport_send_check_condition_and_sense(&cmd->se_cmd, |
diff --git a/drivers/target/tcm_fc/tfc_io.c b/drivers/target/tcm_fc/tfc_io.c index 4c3c0efbe13f..8c4a24077d9d 100644 --- a/drivers/target/tcm_fc/tfc_io.c +++ b/drivers/target/tcm_fc/tfc_io.c | |||
| @@ -203,7 +203,7 @@ int ft_queue_data_in(struct se_cmd *se_cmd) | |||
| 203 | /* XXX For now, initiator will retry */ | 203 | /* XXX For now, initiator will retry */ |
| 204 | if (printk_ratelimit()) | 204 | if (printk_ratelimit()) |
| 205 | printk(KERN_ERR "%s: Failed to send frame %p, " | 205 | printk(KERN_ERR "%s: Failed to send frame %p, " |
| 206 | "xid <0x%x>, remaining <0x%x>, " | 206 | "xid <0x%x>, remaining %zu, " |
| 207 | "lso_max <0x%x>\n", | 207 | "lso_max <0x%x>\n", |
| 208 | __func__, fp, ep->xid, | 208 | __func__, fp, ep->xid, |
| 209 | remaining, lport->lso_max); | 209 | remaining, lport->lso_max); |
diff --git a/drivers/target/tcm_fc/tfc_sess.c b/drivers/target/tcm_fc/tfc_sess.c index a3bd57f2ea32..7491e21cc6ae 100644 --- a/drivers/target/tcm_fc/tfc_sess.c +++ b/drivers/target/tcm_fc/tfc_sess.c | |||
| @@ -229,7 +229,7 @@ static struct ft_sess *ft_sess_create(struct ft_tport *tport, u32 port_id, | |||
| 229 | return NULL; | 229 | return NULL; |
| 230 | 230 | ||
| 231 | sess->se_sess = transport_init_session(); | 231 | sess->se_sess = transport_init_session(); |
| 232 | if (!sess->se_sess) { | 232 | if (IS_ERR(sess->se_sess)) { |
| 233 | kfree(sess); | 233 | kfree(sess); |
| 234 | return NULL; | 234 | return NULL; |
| 235 | } | 235 | } |
| @@ -332,7 +332,7 @@ void ft_sess_close(struct se_session *se_sess) | |||
| 332 | lport = sess->tport->lport; | 332 | lport = sess->tport->lport; |
| 333 | port_id = sess->port_id; | 333 | port_id = sess->port_id; |
| 334 | if (port_id == -1) { | 334 | if (port_id == -1) { |
| 335 | mutex_lock(&ft_lport_lock); | 335 | mutex_unlock(&ft_lport_lock); |
| 336 | return; | 336 | return; |
| 337 | } | 337 | } |
| 338 | FT_SESS_DBG("port_id %x\n", port_id); | 338 | FT_SESS_DBG("port_id %x\n", port_id); |
diff --git a/drivers/tty/n_gsm.c b/drivers/tty/n_gsm.c index 09e8c7d53af3..19b4ae052af8 100644 --- a/drivers/tty/n_gsm.c +++ b/drivers/tty/n_gsm.c | |||
| @@ -875,7 +875,8 @@ static int gsm_dlci_data_output_framed(struct gsm_mux *gsm, | |||
| 875 | *dp++ = last << 7 | first << 6 | 1; /* EA */ | 875 | *dp++ = last << 7 | first << 6 | 1; /* EA */ |
| 876 | len--; | 876 | len--; |
| 877 | } | 877 | } |
| 878 | memcpy(dp, skb_pull(dlci->skb, len), len); | 878 | memcpy(dp, dlci->skb->data, len); |
| 879 | skb_pull(dlci->skb, len); | ||
| 879 | __gsm_data_queue(dlci, msg); | 880 | __gsm_data_queue(dlci, msg); |
| 880 | if (last) | 881 | if (last) |
| 881 | dlci->skb = NULL; | 882 | dlci->skb = NULL; |
| @@ -984,10 +985,22 @@ static void gsm_control_reply(struct gsm_mux *gsm, int cmd, u8 *data, | |||
| 984 | */ | 985 | */ |
| 985 | 986 | ||
| 986 | static void gsm_process_modem(struct tty_struct *tty, struct gsm_dlci *dlci, | 987 | static void gsm_process_modem(struct tty_struct *tty, struct gsm_dlci *dlci, |
| 987 | u32 modem) | 988 | u32 modem, int clen) |
| 988 | { | 989 | { |
| 989 | int mlines = 0; | 990 | int mlines = 0; |
| 990 | u8 brk = modem >> 6; | 991 | u8 brk = 0; |
| 992 | |||
| 993 | /* The modem status command can either contain one octet (v.24 signals) | ||
| 994 | or two octets (v.24 signals + break signals). The length field will | ||
| 995 | either be 2 or 3 respectively. This is specified in section | ||
| 996 | 5.4.6.3.7 of the 27.010 mux spec. */ | ||
| 997 | |||
| 998 | if (clen == 2) | ||
| 999 | modem = modem & 0x7f; | ||
| 1000 | else { | ||
| 1001 | brk = modem & 0x7f; | ||
| 1002 | modem = (modem >> 7) & 0x7f; | ||
| 1003 | }; | ||
| 991 | 1004 | ||
| 992 | /* Flow control/ready to communicate */ | 1005 | /* Flow control/ready to communicate */ |
| 993 | if (modem & MDM_FC) { | 1006 | if (modem & MDM_FC) { |
| @@ -1061,7 +1074,7 @@ static void gsm_control_modem(struct gsm_mux *gsm, u8 *data, int clen) | |||
| 1061 | return; | 1074 | return; |
| 1062 | } | 1075 | } |
| 1063 | tty = tty_port_tty_get(&dlci->port); | 1076 | tty = tty_port_tty_get(&dlci->port); |
| 1064 | gsm_process_modem(tty, dlci, modem); | 1077 | gsm_process_modem(tty, dlci, modem, clen); |
| 1065 | if (tty) { | 1078 | if (tty) { |
| 1066 | tty_wakeup(tty); | 1079 | tty_wakeup(tty); |
| 1067 | tty_kref_put(tty); | 1080 | tty_kref_put(tty); |
| @@ -1482,12 +1495,13 @@ static void gsm_dlci_begin_close(struct gsm_dlci *dlci) | |||
| 1482 | * open we shovel the bits down it, if not we drop them. | 1495 | * open we shovel the bits down it, if not we drop them. |
| 1483 | */ | 1496 | */ |
| 1484 | 1497 | ||
| 1485 | static void gsm_dlci_data(struct gsm_dlci *dlci, u8 *data, int len) | 1498 | static void gsm_dlci_data(struct gsm_dlci *dlci, u8 *data, int clen) |
| 1486 | { | 1499 | { |
| 1487 | /* krefs .. */ | 1500 | /* krefs .. */ |
| 1488 | struct tty_port *port = &dlci->port; | 1501 | struct tty_port *port = &dlci->port; |
| 1489 | struct tty_struct *tty = tty_port_tty_get(port); | 1502 | struct tty_struct *tty = tty_port_tty_get(port); |
| 1490 | unsigned int modem = 0; | 1503 | unsigned int modem = 0; |
| 1504 | int len = clen; | ||
| 1491 | 1505 | ||
| 1492 | if (debug & 16) | 1506 | if (debug & 16) |
| 1493 | pr_debug("%d bytes for tty %p\n", len, tty); | 1507 | pr_debug("%d bytes for tty %p\n", len, tty); |
| @@ -1507,7 +1521,7 @@ static void gsm_dlci_data(struct gsm_dlci *dlci, u8 *data, int len) | |||
| 1507 | if (len == 0) | 1521 | if (len == 0) |
| 1508 | return; | 1522 | return; |
| 1509 | } | 1523 | } |
| 1510 | gsm_process_modem(tty, dlci, modem); | 1524 | gsm_process_modem(tty, dlci, modem, clen); |
| 1511 | /* Line state will go via DLCI 0 controls only */ | 1525 | /* Line state will go via DLCI 0 controls only */ |
| 1512 | case 1: | 1526 | case 1: |
| 1513 | default: | 1527 | default: |
diff --git a/drivers/tty/n_tty.c b/drivers/tty/n_tty.c index 0ad32888091c..c3954fbf6ac4 100644 --- a/drivers/tty/n_tty.c +++ b/drivers/tty/n_tty.c | |||
| @@ -1815,6 +1815,7 @@ do_it_again: | |||
| 1815 | /* FIXME: does n_tty_set_room need locking ? */ | 1815 | /* FIXME: does n_tty_set_room need locking ? */ |
| 1816 | n_tty_set_room(tty); | 1816 | n_tty_set_room(tty); |
| 1817 | timeout = schedule_timeout(timeout); | 1817 | timeout = schedule_timeout(timeout); |
| 1818 | BUG_ON(!tty->read_buf); | ||
| 1818 | continue; | 1819 | continue; |
| 1819 | } | 1820 | } |
| 1820 | __set_current_state(TASK_RUNNING); | 1821 | __set_current_state(TASK_RUNNING); |
diff --git a/drivers/tty/serial/8250.c b/drivers/tty/serial/8250.c index b40f7b90c81d..b4129f53fb1b 100644 --- a/drivers/tty/serial/8250.c +++ b/drivers/tty/serial/8250.c | |||
| @@ -3318,6 +3318,7 @@ void serial8250_unregister_port(int line) | |||
| 3318 | uart->port.flags &= ~UPF_BOOT_AUTOCONF; | 3318 | uart->port.flags &= ~UPF_BOOT_AUTOCONF; |
| 3319 | uart->port.type = PORT_UNKNOWN; | 3319 | uart->port.type = PORT_UNKNOWN; |
| 3320 | uart->port.dev = &serial8250_isa_devs->dev; | 3320 | uart->port.dev = &serial8250_isa_devs->dev; |
| 3321 | uart->capabilities = uart_config[uart->port.type].flags; | ||
| 3321 | uart_add_one_port(&serial8250_reg, &uart->port); | 3322 | uart_add_one_port(&serial8250_reg, &uart->port); |
| 3322 | } else { | 3323 | } else { |
| 3323 | uart->port.dev = NULL; | 3324 | uart->port.dev = NULL; |
diff --git a/drivers/tty/serial/8250_pci.c b/drivers/tty/serial/8250_pci.c index 4b4968a294b2..f41b4259ecdd 100644 --- a/drivers/tty/serial/8250_pci.c +++ b/drivers/tty/serial/8250_pci.c | |||
| @@ -973,7 +973,7 @@ ce4100_serial_setup(struct serial_private *priv, | |||
| 973 | 973 | ||
| 974 | static int | 974 | static int |
| 975 | pci_omegapci_setup(struct serial_private *priv, | 975 | pci_omegapci_setup(struct serial_private *priv, |
| 976 | struct pciserial_board *board, | 976 | const struct pciserial_board *board, |
| 977 | struct uart_port *port, int idx) | 977 | struct uart_port *port, int idx) |
| 978 | { | 978 | { |
| 979 | return setup_port(priv, port, 2, idx * 8, 0); | 979 | return setup_port(priv, port, 2, idx * 8, 0); |
| @@ -994,6 +994,15 @@ static int skip_tx_en_setup(struct serial_private *priv, | |||
| 994 | return pci_default_setup(priv, board, port, idx); | 994 | return pci_default_setup(priv, board, port, idx); |
| 995 | } | 995 | } |
| 996 | 996 | ||
| 997 | static int pci_eg20t_init(struct pci_dev *dev) | ||
| 998 | { | ||
| 999 | #if defined(CONFIG_SERIAL_PCH_UART) || defined(CONFIG_SERIAL_PCH_UART_MODULE) | ||
| 1000 | return -ENODEV; | ||
| 1001 | #else | ||
| 1002 | return 0; | ||
| 1003 | #endif | ||
| 1004 | } | ||
| 1005 | |||
| 997 | /* This should be in linux/pci_ids.h */ | 1006 | /* This should be in linux/pci_ids.h */ |
| 998 | #define PCI_VENDOR_ID_SBSMODULARIO 0x124B | 1007 | #define PCI_VENDOR_ID_SBSMODULARIO 0x124B |
| 999 | #define PCI_SUBVENDOR_ID_SBSMODULARIO 0x124B | 1008 | #define PCI_SUBVENDOR_ID_SBSMODULARIO 0x124B |
| @@ -1446,6 +1455,56 @@ static struct pci_serial_quirk pci_serial_quirks[] __refdata = { | |||
| 1446 | .init = pci_oxsemi_tornado_init, | 1455 | .init = pci_oxsemi_tornado_init, |
| 1447 | .setup = pci_default_setup, | 1456 | .setup = pci_default_setup, |
| 1448 | }, | 1457 | }, |
| 1458 | { | ||
| 1459 | .vendor = PCI_VENDOR_ID_INTEL, | ||
| 1460 | .device = 0x8811, | ||
| 1461 | .init = pci_eg20t_init, | ||
| 1462 | }, | ||
| 1463 | { | ||
| 1464 | .vendor = PCI_VENDOR_ID_INTEL, | ||
| 1465 | .device = 0x8812, | ||
| 1466 | .init = pci_eg20t_init, | ||
| 1467 | }, | ||
| 1468 | { | ||
| 1469 | .vendor = PCI_VENDOR_ID_INTEL, | ||
| 1470 | .device = 0x8813, | ||
| 1471 | .init = pci_eg20t_init, | ||
| 1472 | }, | ||
| 1473 | { | ||
| 1474 | .vendor = PCI_VENDOR_ID_INTEL, | ||
| 1475 | .device = 0x8814, | ||
| 1476 | .init = pci_eg20t_init, | ||
| 1477 | }, | ||
| 1478 | { | ||
| 1479 | .vendor = 0x10DB, | ||
| 1480 | .device = 0x8027, | ||
| 1481 | .init = pci_eg20t_init, | ||
| 1482 | }, | ||
| 1483 | { | ||
| 1484 | .vendor = 0x10DB, | ||
| 1485 | .device = 0x8028, | ||
| 1486 | .init = pci_eg20t_init, | ||
| 1487 | }, | ||
| 1488 | { | ||
| 1489 | .vendor = 0x10DB, | ||
| 1490 | .device = 0x8029, | ||
| 1491 | .init = pci_eg20t_init, | ||
| 1492 | }, | ||
| 1493 | { | ||
| 1494 | .vendor = 0x10DB, | ||
| 1495 | .device = 0x800C, | ||
| 1496 | .init = pci_eg20t_init, | ||
| 1497 | }, | ||
| 1498 | { | ||
| 1499 | .vendor = 0x10DB, | ||
| 1500 | .device = 0x800D, | ||
| 1501 | .init = pci_eg20t_init, | ||
| 1502 | }, | ||
| 1503 | { | ||
| 1504 | .vendor = 0x10DB, | ||
| 1505 | .device = 0x800D, | ||
| 1506 | .init = pci_eg20t_init, | ||
| 1507 | }, | ||
| 1449 | /* | 1508 | /* |
| 1450 | * Cronyx Omega PCI (PLX-chip based) | 1509 | * Cronyx Omega PCI (PLX-chip based) |
| 1451 | */ | 1510 | */ |
diff --git a/drivers/tty/serial/amba-pl011.c b/drivers/tty/serial/amba-pl011.c index 8dc0541feecc..f5f6831b0a64 100644 --- a/drivers/tty/serial/amba-pl011.c +++ b/drivers/tty/serial/amba-pl011.c | |||
| @@ -50,6 +50,7 @@ | |||
| 50 | #include <linux/dmaengine.h> | 50 | #include <linux/dmaengine.h> |
| 51 | #include <linux/dma-mapping.h> | 51 | #include <linux/dma-mapping.h> |
| 52 | #include <linux/scatterlist.h> | 52 | #include <linux/scatterlist.h> |
| 53 | #include <linux/delay.h> | ||
| 53 | 54 | ||
| 54 | #include <asm/io.h> | 55 | #include <asm/io.h> |
| 55 | #include <asm/sizes.h> | 56 | #include <asm/sizes.h> |
| @@ -65,6 +66,30 @@ | |||
| 65 | #define UART_DR_ERROR (UART011_DR_OE|UART011_DR_BE|UART011_DR_PE|UART011_DR_FE) | 66 | #define UART_DR_ERROR (UART011_DR_OE|UART011_DR_BE|UART011_DR_PE|UART011_DR_FE) |
| 66 | #define UART_DUMMY_DR_RX (1 << 16) | 67 | #define UART_DUMMY_DR_RX (1 << 16) |
| 67 | 68 | ||
| 69 | |||
| 70 | #define UART_WA_SAVE_NR 14 | ||
| 71 | |||
| 72 | static void pl011_lockup_wa(unsigned long data); | ||
| 73 | static const u32 uart_wa_reg[UART_WA_SAVE_NR] = { | ||
| 74 | ST_UART011_DMAWM, | ||
| 75 | ST_UART011_TIMEOUT, | ||
| 76 | ST_UART011_LCRH_RX, | ||
| 77 | UART011_IBRD, | ||
| 78 | UART011_FBRD, | ||
| 79 | ST_UART011_LCRH_TX, | ||
| 80 | UART011_IFLS, | ||
| 81 | ST_UART011_XFCR, | ||
| 82 | ST_UART011_XON1, | ||
| 83 | ST_UART011_XON2, | ||
| 84 | ST_UART011_XOFF1, | ||
| 85 | ST_UART011_XOFF2, | ||
| 86 | UART011_CR, | ||
| 87 | UART011_IMSC | ||
| 88 | }; | ||
| 89 | |||
| 90 | static u32 uart_wa_regdata[UART_WA_SAVE_NR]; | ||
| 91 | static DECLARE_TASKLET(pl011_lockup_tlet, pl011_lockup_wa, 0); | ||
| 92 | |||
| 68 | /* There is by now at least one vendor with differing details, so handle it */ | 93 | /* There is by now at least one vendor with differing details, so handle it */ |
| 69 | struct vendor_data { | 94 | struct vendor_data { |
| 70 | unsigned int ifls; | 95 | unsigned int ifls; |
| @@ -72,6 +97,7 @@ struct vendor_data { | |||
| 72 | unsigned int lcrh_tx; | 97 | unsigned int lcrh_tx; |
| 73 | unsigned int lcrh_rx; | 98 | unsigned int lcrh_rx; |
| 74 | bool oversampling; | 99 | bool oversampling; |
| 100 | bool interrupt_may_hang; /* vendor-specific */ | ||
| 75 | bool dma_threshold; | 101 | bool dma_threshold; |
| 76 | }; | 102 | }; |
| 77 | 103 | ||
| @@ -90,9 +116,12 @@ static struct vendor_data vendor_st = { | |||
| 90 | .lcrh_tx = ST_UART011_LCRH_TX, | 116 | .lcrh_tx = ST_UART011_LCRH_TX, |
| 91 | .lcrh_rx = ST_UART011_LCRH_RX, | 117 | .lcrh_rx = ST_UART011_LCRH_RX, |
| 92 | .oversampling = true, | 118 | .oversampling = true, |
| 119 | .interrupt_may_hang = true, | ||
| 93 | .dma_threshold = true, | 120 | .dma_threshold = true, |
| 94 | }; | 121 | }; |
| 95 | 122 | ||
| 123 | static struct uart_amba_port *amba_ports[UART_NR]; | ||
| 124 | |||
| 96 | /* Deals with DMA transactions */ | 125 | /* Deals with DMA transactions */ |
| 97 | 126 | ||
| 98 | struct pl011_sgbuf { | 127 | struct pl011_sgbuf { |
| @@ -132,6 +161,7 @@ struct uart_amba_port { | |||
| 132 | unsigned int lcrh_rx; /* vendor-specific */ | 161 | unsigned int lcrh_rx; /* vendor-specific */ |
| 133 | bool autorts; | 162 | bool autorts; |
| 134 | char type[12]; | 163 | char type[12]; |
| 164 | bool interrupt_may_hang; /* vendor-specific */ | ||
| 135 | #ifdef CONFIG_DMA_ENGINE | 165 | #ifdef CONFIG_DMA_ENGINE |
| 136 | /* DMA stuff */ | 166 | /* DMA stuff */ |
| 137 | bool using_tx_dma; | 167 | bool using_tx_dma; |
| @@ -1008,6 +1038,68 @@ static inline bool pl011_dma_rx_running(struct uart_amba_port *uap) | |||
| 1008 | #endif | 1038 | #endif |
| 1009 | 1039 | ||
| 1010 | 1040 | ||
| 1041 | /* | ||
| 1042 | * pl011_lockup_wa | ||
| 1043 | * This workaround aims to break the deadlock situation | ||
| 1044 | * when after long transfer over uart in hardware flow | ||
| 1045 | * control, uart interrupt registers cannot be cleared. | ||
| 1046 | * Hence uart transfer gets blocked. | ||
| 1047 | * | ||
| 1048 | * It is seen that during such deadlock condition ICR | ||
| 1049 | * don't get cleared even on multiple write. This leads | ||
| 1050 | * pass_counter to decrease and finally reach zero. This | ||
| 1051 | * can be taken as trigger point to run this UART_BT_WA. | ||
| 1052 | * | ||
| 1053 | */ | ||
| 1054 | static void pl011_lockup_wa(unsigned long data) | ||
| 1055 | { | ||
| 1056 | struct uart_amba_port *uap = amba_ports[0]; | ||
| 1057 | void __iomem *base = uap->port.membase; | ||
| 1058 | struct circ_buf *xmit = &uap->port.state->xmit; | ||
| 1059 | struct tty_struct *tty = uap->port.state->port.tty; | ||
| 1060 | int buf_empty_retries = 200; | ||
| 1061 | int loop; | ||
| 1062 | |||
| 1063 | /* Stop HCI layer from submitting data for tx */ | ||
| 1064 | tty->hw_stopped = 1; | ||
| 1065 | while (!uart_circ_empty(xmit)) { | ||
| 1066 | if (buf_empty_retries-- == 0) | ||
| 1067 | break; | ||
| 1068 | udelay(100); | ||
| 1069 | } | ||
| 1070 | |||
| 1071 | /* Backup registers */ | ||
| 1072 | for (loop = 0; loop < UART_WA_SAVE_NR; loop++) | ||
| 1073 | uart_wa_regdata[loop] = readl(base + uart_wa_reg[loop]); | ||
| 1074 | |||
| 1075 | /* Disable UART so that FIFO data is flushed out */ | ||
| 1076 | writew(0x00, uap->port.membase + UART011_CR); | ||
| 1077 | |||
| 1078 | /* Soft reset UART module */ | ||
| 1079 | if (uap->port.dev->platform_data) { | ||
| 1080 | struct amba_pl011_data *plat; | ||
| 1081 | |||
| 1082 | plat = uap->port.dev->platform_data; | ||
| 1083 | if (plat->reset) | ||
| 1084 | plat->reset(); | ||
| 1085 | } | ||
| 1086 | |||
| 1087 | /* Restore registers */ | ||
| 1088 | for (loop = 0; loop < UART_WA_SAVE_NR; loop++) | ||
| 1089 | writew(uart_wa_regdata[loop] , | ||
| 1090 | uap->port.membase + uart_wa_reg[loop]); | ||
| 1091 | |||
| 1092 | /* Initialise the old status of the modem signals */ | ||
| 1093 | uap->old_status = readw(uap->port.membase + UART01x_FR) & | ||
| 1094 | UART01x_FR_MODEM_ANY; | ||
| 1095 | |||
| 1096 | if (readl(base + UART011_MIS) & 0x2) | ||
| 1097 | printk(KERN_EMERG "UART_BT_WA: ***FAILED***\n"); | ||
| 1098 | |||
| 1099 | /* Start Tx/Rx */ | ||
| 1100 | tty->hw_stopped = 0; | ||
| 1101 | } | ||
| 1102 | |||
| 1011 | static void pl011_stop_tx(struct uart_port *port) | 1103 | static void pl011_stop_tx(struct uart_port *port) |
| 1012 | { | 1104 | { |
| 1013 | struct uart_amba_port *uap = (struct uart_amba_port *)port; | 1105 | struct uart_amba_port *uap = (struct uart_amba_port *)port; |
| @@ -1158,8 +1250,11 @@ static irqreturn_t pl011_int(int irq, void *dev_id) | |||
| 1158 | if (status & UART011_TXIS) | 1250 | if (status & UART011_TXIS) |
| 1159 | pl011_tx_chars(uap); | 1251 | pl011_tx_chars(uap); |
| 1160 | 1252 | ||
| 1161 | if (pass_counter-- == 0) | 1253 | if (pass_counter-- == 0) { |
| 1254 | if (uap->interrupt_may_hang) | ||
| 1255 | tasklet_schedule(&pl011_lockup_tlet); | ||
| 1162 | break; | 1256 | break; |
| 1257 | } | ||
| 1163 | 1258 | ||
| 1164 | status = readw(uap->port.membase + UART011_MIS); | 1259 | status = readw(uap->port.membase + UART011_MIS); |
| 1165 | } while (status != 0); | 1260 | } while (status != 0); |
| @@ -1339,6 +1434,14 @@ static int pl011_startup(struct uart_port *port) | |||
| 1339 | writew(uap->im, uap->port.membase + UART011_IMSC); | 1434 | writew(uap->im, uap->port.membase + UART011_IMSC); |
| 1340 | spin_unlock_irq(&uap->port.lock); | 1435 | spin_unlock_irq(&uap->port.lock); |
| 1341 | 1436 | ||
| 1437 | if (uap->port.dev->platform_data) { | ||
| 1438 | struct amba_pl011_data *plat; | ||
| 1439 | |||
| 1440 | plat = uap->port.dev->platform_data; | ||
| 1441 | if (plat->init) | ||
| 1442 | plat->init(); | ||
| 1443 | } | ||
| 1444 | |||
| 1342 | return 0; | 1445 | return 0; |
| 1343 | 1446 | ||
| 1344 | clk_dis: | 1447 | clk_dis: |
| @@ -1394,6 +1497,15 @@ static void pl011_shutdown(struct uart_port *port) | |||
| 1394 | * Shut down the clock producer | 1497 | * Shut down the clock producer |
| 1395 | */ | 1498 | */ |
| 1396 | clk_disable(uap->clk); | 1499 | clk_disable(uap->clk); |
| 1500 | |||
| 1501 | if (uap->port.dev->platform_data) { | ||
| 1502 | struct amba_pl011_data *plat; | ||
| 1503 | |||
| 1504 | plat = uap->port.dev->platform_data; | ||
| 1505 | if (plat->exit) | ||
| 1506 | plat->exit(); | ||
| 1507 | } | ||
| 1508 | |||
| 1397 | } | 1509 | } |
| 1398 | 1510 | ||
| 1399 | static void | 1511 | static void |
| @@ -1700,6 +1812,14 @@ static int __init pl011_console_setup(struct console *co, char *options) | |||
| 1700 | if (!uap) | 1812 | if (!uap) |
| 1701 | return -ENODEV; | 1813 | return -ENODEV; |
| 1702 | 1814 | ||
| 1815 | if (uap->port.dev->platform_data) { | ||
| 1816 | struct amba_pl011_data *plat; | ||
| 1817 | |||
| 1818 | plat = uap->port.dev->platform_data; | ||
| 1819 | if (plat->init) | ||
| 1820 | plat->init(); | ||
| 1821 | } | ||
| 1822 | |||
| 1703 | uap->port.uartclk = clk_get_rate(uap->clk); | 1823 | uap->port.uartclk = clk_get_rate(uap->clk); |
| 1704 | 1824 | ||
| 1705 | if (options) | 1825 | if (options) |
| @@ -1774,6 +1894,7 @@ static int pl011_probe(struct amba_device *dev, const struct amba_id *id) | |||
| 1774 | uap->lcrh_rx = vendor->lcrh_rx; | 1894 | uap->lcrh_rx = vendor->lcrh_rx; |
| 1775 | uap->lcrh_tx = vendor->lcrh_tx; | 1895 | uap->lcrh_tx = vendor->lcrh_tx; |
| 1776 | uap->fifosize = vendor->fifosize; | 1896 | uap->fifosize = vendor->fifosize; |
| 1897 | uap->interrupt_may_hang = vendor->interrupt_may_hang; | ||
| 1777 | uap->port.dev = &dev->dev; | 1898 | uap->port.dev = &dev->dev; |
| 1778 | uap->port.mapbase = dev->res.start; | 1899 | uap->port.mapbase = dev->res.start; |
| 1779 | uap->port.membase = base; | 1900 | uap->port.membase = base; |
diff --git a/drivers/tty/serial/bcm63xx_uart.c b/drivers/tty/serial/bcm63xx_uart.c index a1a0e55d0807..c0b68b9cad91 100644 --- a/drivers/tty/serial/bcm63xx_uart.c +++ b/drivers/tty/serial/bcm63xx_uart.c | |||
| @@ -250,6 +250,20 @@ static void bcm_uart_do_rx(struct uart_port *port) | |||
| 250 | /* get overrun/fifo empty information from ier | 250 | /* get overrun/fifo empty information from ier |
| 251 | * register */ | 251 | * register */ |
| 252 | iestat = bcm_uart_readl(port, UART_IR_REG); | 252 | iestat = bcm_uart_readl(port, UART_IR_REG); |
| 253 | |||
| 254 | if (unlikely(iestat & UART_IR_STAT(UART_IR_RXOVER))) { | ||
| 255 | unsigned int val; | ||
| 256 | |||
| 257 | /* fifo reset is required to clear | ||
| 258 | * interrupt */ | ||
| 259 | val = bcm_uart_readl(port, UART_CTL_REG); | ||
| 260 | val |= UART_CTL_RSTRXFIFO_MASK; | ||
| 261 | bcm_uart_writel(port, val, UART_CTL_REG); | ||
| 262 | |||
| 263 | port->icount.overrun++; | ||
| 264 | tty_insert_flip_char(tty, 0, TTY_OVERRUN); | ||
| 265 | } | ||
| 266 | |||
| 253 | if (!(iestat & UART_IR_STAT(UART_IR_RXNOTEMPTY))) | 267 | if (!(iestat & UART_IR_STAT(UART_IR_RXNOTEMPTY))) |
| 254 | break; | 268 | break; |
| 255 | 269 | ||
| @@ -284,10 +298,6 @@ static void bcm_uart_do_rx(struct uart_port *port) | |||
| 284 | if (uart_handle_sysrq_char(port, c)) | 298 | if (uart_handle_sysrq_char(port, c)) |
| 285 | continue; | 299 | continue; |
| 286 | 300 | ||
| 287 | if (unlikely(iestat & UART_IR_STAT(UART_IR_RXOVER))) { | ||
| 288 | port->icount.overrun++; | ||
| 289 | tty_insert_flip_char(tty, 0, TTY_OVERRUN); | ||
| 290 | } | ||
| 291 | 301 | ||
| 292 | if ((cstat & port->ignore_status_mask) == 0) | 302 | if ((cstat & port->ignore_status_mask) == 0) |
| 293 | tty_insert_flip_char(tty, c, flag); | 303 | tty_insert_flip_char(tty, c, flag); |
diff --git a/drivers/tty/serial/jsm/jsm_driver.c b/drivers/tty/serial/jsm/jsm_driver.c index 18f548449c63..96da17868cf3 100644 --- a/drivers/tty/serial/jsm/jsm_driver.c +++ b/drivers/tty/serial/jsm/jsm_driver.c | |||
| @@ -125,7 +125,7 @@ static int __devinit jsm_probe_one(struct pci_dev *pdev, const struct pci_device | |||
| 125 | brd->bd_uart_offset = 0x200; | 125 | brd->bd_uart_offset = 0x200; |
| 126 | brd->bd_dividend = 921600; | 126 | brd->bd_dividend = 921600; |
| 127 | 127 | ||
| 128 | brd->re_map_membase = ioremap(brd->membase, 0x1000); | 128 | brd->re_map_membase = ioremap(brd->membase, pci_resource_len(pdev, 0)); |
| 129 | if (!brd->re_map_membase) { | 129 | if (!brd->re_map_membase) { |
| 130 | dev_err(&pdev->dev, | 130 | dev_err(&pdev->dev, |
| 131 | "card has no PCI Memory resources, " | 131 | "card has no PCI Memory resources, " |
diff --git a/drivers/tty/serial/mrst_max3110.c b/drivers/tty/serial/mrst_max3110.c index 1bd28450ca40..a764bf99743b 100644 --- a/drivers/tty/serial/mrst_max3110.c +++ b/drivers/tty/serial/mrst_max3110.c | |||
| @@ -421,7 +421,6 @@ static int max3110_main_thread(void *_max) | |||
| 421 | int ret = 0; | 421 | int ret = 0; |
| 422 | struct circ_buf *xmit = &max->con_xmit; | 422 | struct circ_buf *xmit = &max->con_xmit; |
| 423 | 423 | ||
| 424 | init_waitqueue_head(wq); | ||
| 425 | pr_info(PR_FMT "start main thread\n"); | 424 | pr_info(PR_FMT "start main thread\n"); |
| 426 | 425 | ||
| 427 | do { | 426 | do { |
| @@ -823,7 +822,7 @@ static int __devinit serial_m3110_probe(struct spi_device *spi) | |||
| 823 | res = RC_TAG; | 822 | res = RC_TAG; |
| 824 | ret = max3110_write_then_read(max, (u8 *)&res, (u8 *)&res, 2, 0); | 823 | ret = max3110_write_then_read(max, (u8 *)&res, (u8 *)&res, 2, 0); |
| 825 | if (ret < 0 || res == 0 || res == 0xffff) { | 824 | if (ret < 0 || res == 0 || res == 0xffff) { |
| 826 | printk(KERN_ERR "MAX3111 deemed not present (conf reg %04x)", | 825 | dev_dbg(&spi->dev, "MAX3111 deemed not present (conf reg %04x)", |
| 827 | res); | 826 | res); |
| 828 | ret = -ENODEV; | 827 | ret = -ENODEV; |
| 829 | goto err_get_page; | 828 | goto err_get_page; |
| @@ -838,6 +837,8 @@ static int __devinit serial_m3110_probe(struct spi_device *spi) | |||
| 838 | max->con_xmit.head = 0; | 837 | max->con_xmit.head = 0; |
| 839 | max->con_xmit.tail = 0; | 838 | max->con_xmit.tail = 0; |
| 840 | 839 | ||
| 840 | init_waitqueue_head(&max->wq); | ||
| 841 | |||
| 841 | max->main_thread = kthread_run(max3110_main_thread, | 842 | max->main_thread = kthread_run(max3110_main_thread, |
| 842 | max, "max3110_main"); | 843 | max, "max3110_main"); |
| 843 | if (IS_ERR(max->main_thread)) { | 844 | if (IS_ERR(max->main_thread)) { |
diff --git a/drivers/tty/serial/s5pv210.c b/drivers/tty/serial/s5pv210.c index fb2619f93d84..dd194dc80ee9 100644 --- a/drivers/tty/serial/s5pv210.c +++ b/drivers/tty/serial/s5pv210.c | |||
| @@ -30,7 +30,7 @@ static int s5pv210_serial_setsource(struct uart_port *port, | |||
| 30 | struct s3c2410_uartcfg *cfg = port->dev->platform_data; | 30 | struct s3c2410_uartcfg *cfg = port->dev->platform_data; |
| 31 | unsigned long ucon = rd_regl(port, S3C2410_UCON); | 31 | unsigned long ucon = rd_regl(port, S3C2410_UCON); |
| 32 | 32 | ||
| 33 | if ((cfg->clocks_size) == 1) | 33 | if (cfg->flags & NO_NEED_CHECK_CLKSRC) |
| 34 | return 0; | 34 | return 0; |
| 35 | 35 | ||
| 36 | if (strcmp(clk->name, "pclk") == 0) | 36 | if (strcmp(clk->name, "pclk") == 0) |
| @@ -55,7 +55,7 @@ static int s5pv210_serial_getsource(struct uart_port *port, | |||
| 55 | 55 | ||
| 56 | clk->divisor = 1; | 56 | clk->divisor = 1; |
| 57 | 57 | ||
| 58 | if ((cfg->clocks_size) == 1) | 58 | if (cfg->flags & NO_NEED_CHECK_CLKSRC) |
| 59 | return 0; | 59 | return 0; |
| 60 | 60 | ||
| 61 | switch (ucon & S5PV210_UCON_CLKMASK) { | 61 | switch (ucon & S5PV210_UCON_CLKMASK) { |
diff --git a/drivers/tty/tty_ldisc.c b/drivers/tty/tty_ldisc.c index 5d01d32e2cf0..ef925d581713 100644 --- a/drivers/tty/tty_ldisc.c +++ b/drivers/tty/tty_ldisc.c | |||
| @@ -555,7 +555,7 @@ static void tty_ldisc_flush_works(struct tty_struct *tty) | |||
| 555 | static int tty_ldisc_wait_idle(struct tty_struct *tty) | 555 | static int tty_ldisc_wait_idle(struct tty_struct *tty) |
| 556 | { | 556 | { |
| 557 | int ret; | 557 | int ret; |
| 558 | ret = wait_event_interruptible_timeout(tty_ldisc_idle, | 558 | ret = wait_event_timeout(tty_ldisc_idle, |
| 559 | atomic_read(&tty->ldisc->users) == 1, 5 * HZ); | 559 | atomic_read(&tty->ldisc->users) == 1, 5 * HZ); |
| 560 | if (ret < 0) | 560 | if (ret < 0) |
| 561 | return ret; | 561 | return ret; |
| @@ -763,6 +763,8 @@ static int tty_ldisc_reinit(struct tty_struct *tty, int ldisc) | |||
| 763 | if (IS_ERR(ld)) | 763 | if (IS_ERR(ld)) |
| 764 | return -1; | 764 | return -1; |
| 765 | 765 | ||
| 766 | WARN_ON_ONCE(tty_ldisc_wait_idle(tty)); | ||
| 767 | |||
| 766 | tty_ldisc_close(tty, tty->ldisc); | 768 | tty_ldisc_close(tty, tty->ldisc); |
| 767 | tty_ldisc_put(tty->ldisc); | 769 | tty_ldisc_put(tty->ldisc); |
| 768 | tty->ldisc = NULL; | 770 | tty->ldisc = NULL; |
diff --git a/drivers/usb/core/driver.c b/drivers/usb/core/driver.c index e35a17687c05..34e3da5aa72a 100644 --- a/drivers/usb/core/driver.c +++ b/drivers/usb/core/driver.c | |||
| @@ -375,7 +375,7 @@ static int usb_unbind_interface(struct device *dev) | |||
| 375 | * Just re-enable it without affecting the endpoint toggles. | 375 | * Just re-enable it without affecting the endpoint toggles. |
| 376 | */ | 376 | */ |
| 377 | usb_enable_interface(udev, intf, false); | 377 | usb_enable_interface(udev, intf, false); |
| 378 | } else if (!error && !intf->dev.power.in_suspend) { | 378 | } else if (!error && !intf->dev.power.is_prepared) { |
| 379 | r = usb_set_interface(udev, intf->altsetting[0]. | 379 | r = usb_set_interface(udev, intf->altsetting[0]. |
| 380 | desc.bInterfaceNumber, 0); | 380 | desc.bInterfaceNumber, 0); |
| 381 | if (r < 0) | 381 | if (r < 0) |
| @@ -960,7 +960,7 @@ void usb_rebind_intf(struct usb_interface *intf) | |||
| 960 | } | 960 | } |
| 961 | 961 | ||
| 962 | /* Try to rebind the interface */ | 962 | /* Try to rebind the interface */ |
| 963 | if (!intf->dev.power.in_suspend) { | 963 | if (!intf->dev.power.is_prepared) { |
| 964 | intf->needs_binding = 0; | 964 | intf->needs_binding = 0; |
| 965 | rc = device_attach(&intf->dev); | 965 | rc = device_attach(&intf->dev); |
| 966 | if (rc < 0) | 966 | if (rc < 0) |
| @@ -1107,7 +1107,7 @@ static int usb_resume_interface(struct usb_device *udev, | |||
| 1107 | if (intf->condition == USB_INTERFACE_UNBOUND) { | 1107 | if (intf->condition == USB_INTERFACE_UNBOUND) { |
| 1108 | 1108 | ||
| 1109 | /* Carry out a deferred switch to altsetting 0 */ | 1109 | /* Carry out a deferred switch to altsetting 0 */ |
| 1110 | if (intf->needs_altsetting0 && !intf->dev.power.in_suspend) { | 1110 | if (intf->needs_altsetting0 && !intf->dev.power.is_prepared) { |
| 1111 | usb_set_interface(udev, intf->altsetting[0]. | 1111 | usb_set_interface(udev, intf->altsetting[0]. |
| 1112 | desc.bInterfaceNumber, 0); | 1112 | desc.bInterfaceNumber, 0); |
| 1113 | intf->needs_altsetting0 = 0; | 1113 | intf->needs_altsetting0 = 0; |
| @@ -1187,13 +1187,22 @@ static int usb_suspend_both(struct usb_device *udev, pm_message_t msg) | |||
| 1187 | for (i = n - 1; i >= 0; --i) { | 1187 | for (i = n - 1; i >= 0; --i) { |
| 1188 | intf = udev->actconfig->interface[i]; | 1188 | intf = udev->actconfig->interface[i]; |
| 1189 | status = usb_suspend_interface(udev, intf, msg); | 1189 | status = usb_suspend_interface(udev, intf, msg); |
| 1190 | |||
| 1191 | /* Ignore errors during system sleep transitions */ | ||
| 1192 | if (!(msg.event & PM_EVENT_AUTO)) | ||
| 1193 | status = 0; | ||
| 1190 | if (status != 0) | 1194 | if (status != 0) |
| 1191 | break; | 1195 | break; |
| 1192 | } | 1196 | } |
| 1193 | } | 1197 | } |
| 1194 | if (status == 0) | 1198 | if (status == 0) { |
| 1195 | status = usb_suspend_device(udev, msg); | 1199 | status = usb_suspend_device(udev, msg); |
| 1196 | 1200 | ||
| 1201 | /* Again, ignore errors during system sleep transitions */ | ||
| 1202 | if (!(msg.event & PM_EVENT_AUTO)) | ||
| 1203 | status = 0; | ||
| 1204 | } | ||
| 1205 | |||
| 1197 | /* If the suspend failed, resume interfaces that did get suspended */ | 1206 | /* If the suspend failed, resume interfaces that did get suspended */ |
| 1198 | if (status != 0) { | 1207 | if (status != 0) { |
| 1199 | msg.event ^= (PM_EVENT_SUSPEND | PM_EVENT_RESUME); | 1208 | msg.event ^= (PM_EVENT_SUSPEND | PM_EVENT_RESUME); |
diff --git a/drivers/usb/core/hub.c b/drivers/usb/core/hub.c index 90ae1753dda1..a428aa080a36 100644 --- a/drivers/usb/core/hub.c +++ b/drivers/usb/core/hub.c | |||
| @@ -1634,6 +1634,7 @@ void usb_disconnect(struct usb_device **pdev) | |||
| 1634 | { | 1634 | { |
| 1635 | struct usb_device *udev = *pdev; | 1635 | struct usb_device *udev = *pdev; |
| 1636 | int i; | 1636 | int i; |
| 1637 | struct usb_hcd *hcd = bus_to_hcd(udev->bus); | ||
| 1637 | 1638 | ||
| 1638 | if (!udev) { | 1639 | if (!udev) { |
| 1639 | pr_debug ("%s nodev\n", __func__); | 1640 | pr_debug ("%s nodev\n", __func__); |
| @@ -1661,7 +1662,9 @@ void usb_disconnect(struct usb_device **pdev) | |||
| 1661 | * so that the hardware is now fully quiesced. | 1662 | * so that the hardware is now fully quiesced. |
| 1662 | */ | 1663 | */ |
| 1663 | dev_dbg (&udev->dev, "unregistering device\n"); | 1664 | dev_dbg (&udev->dev, "unregistering device\n"); |
| 1665 | mutex_lock(hcd->bandwidth_mutex); | ||
| 1664 | usb_disable_device(udev, 0); | 1666 | usb_disable_device(udev, 0); |
| 1667 | mutex_unlock(hcd->bandwidth_mutex); | ||
| 1665 | usb_hcd_synchronize_unlinks(udev); | 1668 | usb_hcd_synchronize_unlinks(udev); |
| 1666 | 1669 | ||
| 1667 | usb_remove_ep_devs(&udev->ep0); | 1670 | usb_remove_ep_devs(&udev->ep0); |
| @@ -2362,6 +2365,10 @@ int usb_port_suspend(struct usb_device *udev, pm_message_t msg) | |||
| 2362 | USB_DEVICE_REMOTE_WAKEUP, 0, | 2365 | USB_DEVICE_REMOTE_WAKEUP, 0, |
| 2363 | NULL, 0, | 2366 | NULL, 0, |
| 2364 | USB_CTRL_SET_TIMEOUT); | 2367 | USB_CTRL_SET_TIMEOUT); |
| 2368 | |||
| 2369 | /* System sleep transitions should never fail */ | ||
| 2370 | if (!(msg.event & PM_EVENT_AUTO)) | ||
| 2371 | status = 0; | ||
| 2365 | } else { | 2372 | } else { |
| 2366 | /* device has up to 10 msec to fully suspend */ | 2373 | /* device has up to 10 msec to fully suspend */ |
| 2367 | dev_dbg(&udev->dev, "usb %ssuspend\n", | 2374 | dev_dbg(&udev->dev, "usb %ssuspend\n", |
| @@ -2611,16 +2618,15 @@ static int hub_suspend(struct usb_interface *intf, pm_message_t msg) | |||
| 2611 | struct usb_device *hdev = hub->hdev; | 2618 | struct usb_device *hdev = hub->hdev; |
| 2612 | unsigned port1; | 2619 | unsigned port1; |
| 2613 | 2620 | ||
| 2614 | /* fail if children aren't already suspended */ | 2621 | /* Warn if children aren't already suspended */ |
| 2615 | for (port1 = 1; port1 <= hdev->maxchild; port1++) { | 2622 | for (port1 = 1; port1 <= hdev->maxchild; port1++) { |
| 2616 | struct usb_device *udev; | 2623 | struct usb_device *udev; |
| 2617 | 2624 | ||
| 2618 | udev = hdev->children [port1-1]; | 2625 | udev = hdev->children [port1-1]; |
| 2619 | if (udev && udev->can_submit) { | 2626 | if (udev && udev->can_submit) { |
| 2620 | if (!(msg.event & PM_EVENT_AUTO)) | 2627 | dev_warn(&intf->dev, "port %d nyet suspended\n", port1); |
| 2621 | dev_dbg(&intf->dev, "port %d nyet suspended\n", | 2628 | if (msg.event & PM_EVENT_AUTO) |
| 2622 | port1); | 2629 | return -EBUSY; |
| 2623 | return -EBUSY; | ||
| 2624 | } | 2630 | } |
| 2625 | } | 2631 | } |
| 2626 | 2632 | ||
diff --git a/drivers/usb/core/message.c b/drivers/usb/core/message.c index 5701e857392b..64c7ab4702df 100644 --- a/drivers/usb/core/message.c +++ b/drivers/usb/core/message.c | |||
| @@ -1135,10 +1135,13 @@ void usb_disable_interface(struct usb_device *dev, struct usb_interface *intf, | |||
| 1135 | * Deallocates hcd/hardware state for the endpoints (nuking all or most | 1135 | * Deallocates hcd/hardware state for the endpoints (nuking all or most |
| 1136 | * pending urbs) and usbcore state for the interfaces, so that usbcore | 1136 | * pending urbs) and usbcore state for the interfaces, so that usbcore |
| 1137 | * must usb_set_configuration() before any interfaces could be used. | 1137 | * must usb_set_configuration() before any interfaces could be used. |
| 1138 | * | ||
| 1139 | * Must be called with hcd->bandwidth_mutex held. | ||
| 1138 | */ | 1140 | */ |
| 1139 | void usb_disable_device(struct usb_device *dev, int skip_ep0) | 1141 | void usb_disable_device(struct usb_device *dev, int skip_ep0) |
| 1140 | { | 1142 | { |
| 1141 | int i; | 1143 | int i; |
| 1144 | struct usb_hcd *hcd = bus_to_hcd(dev->bus); | ||
| 1142 | 1145 | ||
| 1143 | /* getting rid of interfaces will disconnect | 1146 | /* getting rid of interfaces will disconnect |
| 1144 | * any drivers bound to them (a key side effect) | 1147 | * any drivers bound to them (a key side effect) |
| @@ -1172,6 +1175,16 @@ void usb_disable_device(struct usb_device *dev, int skip_ep0) | |||
| 1172 | 1175 | ||
| 1173 | dev_dbg(&dev->dev, "%s nuking %s URBs\n", __func__, | 1176 | dev_dbg(&dev->dev, "%s nuking %s URBs\n", __func__, |
| 1174 | skip_ep0 ? "non-ep0" : "all"); | 1177 | skip_ep0 ? "non-ep0" : "all"); |
| 1178 | if (hcd->driver->check_bandwidth) { | ||
| 1179 | /* First pass: Cancel URBs, leave endpoint pointers intact. */ | ||
| 1180 | for (i = skip_ep0; i < 16; ++i) { | ||
| 1181 | usb_disable_endpoint(dev, i, false); | ||
| 1182 | usb_disable_endpoint(dev, i + USB_DIR_IN, false); | ||
| 1183 | } | ||
| 1184 | /* Remove endpoints from the host controller internal state */ | ||
| 1185 | usb_hcd_alloc_bandwidth(dev, NULL, NULL, NULL); | ||
| 1186 | /* Second pass: remove endpoint pointers */ | ||
| 1187 | } | ||
| 1175 | for (i = skip_ep0; i < 16; ++i) { | 1188 | for (i = skip_ep0; i < 16; ++i) { |
| 1176 | usb_disable_endpoint(dev, i, true); | 1189 | usb_disable_endpoint(dev, i, true); |
| 1177 | usb_disable_endpoint(dev, i + USB_DIR_IN, true); | 1190 | usb_disable_endpoint(dev, i + USB_DIR_IN, true); |
| @@ -1727,6 +1740,7 @@ free_interfaces: | |||
| 1727 | /* if it's already configured, clear out old state first. | 1740 | /* if it's already configured, clear out old state first. |
| 1728 | * getting rid of old interfaces means unbinding their drivers. | 1741 | * getting rid of old interfaces means unbinding their drivers. |
| 1729 | */ | 1742 | */ |
| 1743 | mutex_lock(hcd->bandwidth_mutex); | ||
| 1730 | if (dev->state != USB_STATE_ADDRESS) | 1744 | if (dev->state != USB_STATE_ADDRESS) |
| 1731 | usb_disable_device(dev, 1); /* Skip ep0 */ | 1745 | usb_disable_device(dev, 1); /* Skip ep0 */ |
| 1732 | 1746 | ||
| @@ -1739,7 +1753,6 @@ free_interfaces: | |||
| 1739 | * host controller will not allow submissions to dropped endpoints. If | 1753 | * host controller will not allow submissions to dropped endpoints. If |
| 1740 | * this call fails, the device state is unchanged. | 1754 | * this call fails, the device state is unchanged. |
| 1741 | */ | 1755 | */ |
| 1742 | mutex_lock(hcd->bandwidth_mutex); | ||
| 1743 | ret = usb_hcd_alloc_bandwidth(dev, cp, NULL, NULL); | 1756 | ret = usb_hcd_alloc_bandwidth(dev, cp, NULL, NULL); |
| 1744 | if (ret < 0) { | 1757 | if (ret < 0) { |
| 1745 | mutex_unlock(hcd->bandwidth_mutex); | 1758 | mutex_unlock(hcd->bandwidth_mutex); |
diff --git a/drivers/usb/host/ehci-ath79.c b/drivers/usb/host/ehci-ath79.c index 98cc8a13169c..aa248c2f2c60 100644 --- a/drivers/usb/host/ehci-ath79.c +++ b/drivers/usb/host/ehci-ath79.c | |||
| @@ -44,7 +44,6 @@ static int ehci_ath79_init(struct usb_hcd *hcd) | |||
| 44 | struct ehci_hcd *ehci = hcd_to_ehci(hcd); | 44 | struct ehci_hcd *ehci = hcd_to_ehci(hcd); |
| 45 | struct platform_device *pdev = to_platform_device(hcd->self.controller); | 45 | struct platform_device *pdev = to_platform_device(hcd->self.controller); |
| 46 | const struct platform_device_id *id; | 46 | const struct platform_device_id *id; |
| 47 | int hclength; | ||
| 48 | int ret; | 47 | int ret; |
| 49 | 48 | ||
| 50 | id = platform_get_device_id(pdev); | 49 | id = platform_get_device_id(pdev); |
| @@ -53,20 +52,23 @@ static int ehci_ath79_init(struct usb_hcd *hcd) | |||
| 53 | return -EINVAL; | 52 | return -EINVAL; |
| 54 | } | 53 | } |
| 55 | 54 | ||
| 56 | hclength = HC_LENGTH(ehci, ehci_readl(ehci, &ehci->caps->hc_capbase)); | ||
| 57 | switch (id->driver_data) { | 55 | switch (id->driver_data) { |
| 58 | case EHCI_ATH79_IP_V1: | 56 | case EHCI_ATH79_IP_V1: |
| 59 | ehci->has_synopsys_hc_bug = 1; | 57 | ehci->has_synopsys_hc_bug = 1; |
| 60 | 58 | ||
| 61 | ehci->caps = hcd->regs; | 59 | ehci->caps = hcd->regs; |
| 62 | ehci->regs = hcd->regs + hclength; | 60 | ehci->regs = hcd->regs + |
| 61 | HC_LENGTH(ehci, | ||
| 62 | ehci_readl(ehci, &ehci->caps->hc_capbase)); | ||
| 63 | break; | 63 | break; |
| 64 | 64 | ||
| 65 | case EHCI_ATH79_IP_V2: | 65 | case EHCI_ATH79_IP_V2: |
| 66 | hcd->has_tt = 1; | 66 | hcd->has_tt = 1; |
| 67 | 67 | ||
| 68 | ehci->caps = hcd->regs + 0x100; | 68 | ehci->caps = hcd->regs + 0x100; |
| 69 | ehci->regs = hcd->regs + 0x100 + hclength; | 69 | ehci->regs = hcd->regs + 0x100 + |
| 70 | HC_LENGTH(ehci, | ||
| 71 | ehci_readl(ehci, &ehci->caps->hc_capbase)); | ||
| 70 | break; | 72 | break; |
| 71 | 73 | ||
| 72 | default: | 74 | default: |
diff --git a/drivers/usb/host/ehci-hcd.c b/drivers/usb/host/ehci-hcd.c index b435ed67dd5c..f8030ee928e8 100644 --- a/drivers/usb/host/ehci-hcd.c +++ b/drivers/usb/host/ehci-hcd.c | |||
| @@ -1,4 +1,8 @@ | |||
| 1 | /* | 1 | /* |
| 2 | * Enhanced Host Controller Interface (EHCI) driver for USB. | ||
| 3 | * | ||
| 4 | * Maintainer: Alan Stern <stern@rowland.harvard.edu> | ||
| 5 | * | ||
| 2 | * Copyright (c) 2000-2004 by David Brownell | 6 | * Copyright (c) 2000-2004 by David Brownell |
| 3 | * | 7 | * |
| 4 | * This program is free software; you can redistribute it and/or modify it | 8 | * This program is free software; you can redistribute it and/or modify it |
diff --git a/drivers/usb/host/isp1760-hcd.c b/drivers/usb/host/isp1760-hcd.c index c9e6e454c625..55d3d5859ac5 100644 --- a/drivers/usb/host/isp1760-hcd.c +++ b/drivers/usb/host/isp1760-hcd.c | |||
| @@ -1555,7 +1555,7 @@ static void kill_transfer(struct usb_hcd *hcd, struct urb *urb, | |||
| 1555 | 1555 | ||
| 1556 | /* We need to forcefully reclaim the slot since some transfers never | 1556 | /* We need to forcefully reclaim the slot since some transfers never |
| 1557 | return, e.g. interrupt transfers and NAKed bulk transfers. */ | 1557 | return, e.g. interrupt transfers and NAKed bulk transfers. */ |
| 1558 | if (usb_pipebulk(urb->pipe)) { | 1558 | if (usb_pipecontrol(urb->pipe) || usb_pipebulk(urb->pipe)) { |
| 1559 | skip_map = reg_read32(hcd->regs, HC_ATL_PTD_SKIPMAP_REG); | 1559 | skip_map = reg_read32(hcd->regs, HC_ATL_PTD_SKIPMAP_REG); |
| 1560 | skip_map |= (1 << qh->slot); | 1560 | skip_map |= (1 << qh->slot); |
| 1561 | reg_write32(hcd->regs, HC_ATL_PTD_SKIPMAP_REG, skip_map); | 1561 | reg_write32(hcd->regs, HC_ATL_PTD_SKIPMAP_REG, skip_map); |
diff --git a/drivers/usb/host/ohci-hcd.c b/drivers/usb/host/ohci-hcd.c index 9aa10bdf3918..f9cf3f04b742 100644 --- a/drivers/usb/host/ohci-hcd.c +++ b/drivers/usb/host/ohci-hcd.c | |||
| @@ -1,5 +1,7 @@ | |||
| 1 | /* | 1 | /* |
| 2 | * OHCI HCD (Host Controller Driver) for USB. | 2 | * Open Host Controller Interface (OHCI) driver for USB. |
| 3 | * | ||
| 4 | * Maintainer: Alan Stern <stern@rowland.harvard.edu> | ||
| 3 | * | 5 | * |
| 4 | * (C) Copyright 1999 Roman Weissgaerber <weissg@vienna.at> | 6 | * (C) Copyright 1999 Roman Weissgaerber <weissg@vienna.at> |
| 5 | * (C) Copyright 2000-2004 David Brownell <dbrownell@users.sourceforge.net> | 7 | * (C) Copyright 2000-2004 David Brownell <dbrownell@users.sourceforge.net> |
diff --git a/drivers/usb/host/r8a66597-hcd.c b/drivers/usb/host/r8a66597-hcd.c index db6f8b9c19b6..4586369dda00 100644 --- a/drivers/usb/host/r8a66597-hcd.c +++ b/drivers/usb/host/r8a66597-hcd.c | |||
| @@ -2517,6 +2517,7 @@ static int __devinit r8a66597_probe(struct platform_device *pdev) | |||
| 2517 | INIT_LIST_HEAD(&r8a66597->child_device); | 2517 | INIT_LIST_HEAD(&r8a66597->child_device); |
| 2518 | 2518 | ||
| 2519 | hcd->rsrc_start = res->start; | 2519 | hcd->rsrc_start = res->start; |
| 2520 | hcd->has_tt = 1; | ||
| 2520 | 2521 | ||
| 2521 | ret = usb_add_hcd(hcd, irq, IRQF_DISABLED | irq_trigger); | 2522 | ret = usb_add_hcd(hcd, irq, IRQF_DISABLED | irq_trigger); |
| 2522 | if (ret != 0) { | 2523 | if (ret != 0) { |
diff --git a/drivers/usb/host/xhci-mem.c b/drivers/usb/host/xhci-mem.c index 0f8e1d29a858..fcb7f7efc86d 100644 --- a/drivers/usb/host/xhci-mem.c +++ b/drivers/usb/host/xhci-mem.c | |||
| @@ -1215,8 +1215,6 @@ int xhci_endpoint_init(struct xhci_hcd *xhci, | |||
| 1215 | ep_ctx->ep_info2 |= cpu_to_le32(MAX_PACKET(max_packet)); | 1215 | ep_ctx->ep_info2 |= cpu_to_le32(MAX_PACKET(max_packet)); |
| 1216 | /* dig out max burst from ep companion desc */ | 1216 | /* dig out max burst from ep companion desc */ |
| 1217 | max_packet = ep->ss_ep_comp.bMaxBurst; | 1217 | max_packet = ep->ss_ep_comp.bMaxBurst; |
| 1218 | if (!max_packet) | ||
| 1219 | xhci_warn(xhci, "WARN no SS endpoint bMaxBurst\n"); | ||
| 1220 | ep_ctx->ep_info2 |= cpu_to_le32(MAX_BURST(max_packet)); | 1218 | ep_ctx->ep_info2 |= cpu_to_le32(MAX_BURST(max_packet)); |
| 1221 | break; | 1219 | break; |
| 1222 | case USB_SPEED_HIGH: | 1220 | case USB_SPEED_HIGH: |
diff --git a/drivers/usb/host/xhci-pci.c b/drivers/usb/host/xhci-pci.c index 17541d09eabb..cb16de213f64 100644 --- a/drivers/usb/host/xhci-pci.c +++ b/drivers/usb/host/xhci-pci.c | |||
| @@ -29,6 +29,9 @@ | |||
| 29 | #define PCI_VENDOR_ID_FRESCO_LOGIC 0x1b73 | 29 | #define PCI_VENDOR_ID_FRESCO_LOGIC 0x1b73 |
| 30 | #define PCI_DEVICE_ID_FRESCO_LOGIC_PDK 0x1000 | 30 | #define PCI_DEVICE_ID_FRESCO_LOGIC_PDK 0x1000 |
| 31 | 31 | ||
| 32 | #define PCI_VENDOR_ID_ETRON 0x1b6f | ||
| 33 | #define PCI_DEVICE_ID_ASROCK_P67 0x7023 | ||
| 34 | |||
| 32 | static const char hcd_name[] = "xhci_hcd"; | 35 | static const char hcd_name[] = "xhci_hcd"; |
| 33 | 36 | ||
| 34 | /* called after powerup, by probe or system-pm "wakeup" */ | 37 | /* called after powerup, by probe or system-pm "wakeup" */ |
| @@ -134,6 +137,11 @@ static int xhci_pci_setup(struct usb_hcd *hcd) | |||
| 134 | xhci->quirks |= XHCI_EP_LIMIT_QUIRK; | 137 | xhci->quirks |= XHCI_EP_LIMIT_QUIRK; |
| 135 | xhci->limit_active_eps = 64; | 138 | xhci->limit_active_eps = 64; |
| 136 | } | 139 | } |
| 140 | if (pdev->vendor == PCI_VENDOR_ID_ETRON && | ||
| 141 | pdev->device == PCI_DEVICE_ID_ASROCK_P67) { | ||
| 142 | xhci->quirks |= XHCI_RESET_ON_RESUME; | ||
| 143 | xhci_dbg(xhci, "QUIRK: Resetting on resume\n"); | ||
| 144 | } | ||
| 137 | 145 | ||
| 138 | /* Make sure the HC is halted. */ | 146 | /* Make sure the HC is halted. */ |
| 139 | retval = xhci_halt(xhci); | 147 | retval = xhci_halt(xhci); |
diff --git a/drivers/usb/host/xhci-ring.c b/drivers/usb/host/xhci-ring.c index 800f417c7309..70cacbbe7fb9 100644 --- a/drivers/usb/host/xhci-ring.c +++ b/drivers/usb/host/xhci-ring.c | |||
| @@ -1733,6 +1733,7 @@ static int process_isoc_td(struct xhci_hcd *xhci, struct xhci_td *td, | |||
| 1733 | frame->status = -EOVERFLOW; | 1733 | frame->status = -EOVERFLOW; |
| 1734 | skip_td = true; | 1734 | skip_td = true; |
| 1735 | break; | 1735 | break; |
| 1736 | case COMP_DEV_ERR: | ||
| 1736 | case COMP_STALL: | 1737 | case COMP_STALL: |
| 1737 | frame->status = -EPROTO; | 1738 | frame->status = -EPROTO; |
| 1738 | skip_td = true; | 1739 | skip_td = true; |
| @@ -1767,9 +1768,6 @@ static int process_isoc_td(struct xhci_hcd *xhci, struct xhci_td *td, | |||
| 1767 | } | 1768 | } |
| 1768 | } | 1769 | } |
| 1769 | 1770 | ||
| 1770 | if ((idx == urb_priv->length - 1) && *status == -EINPROGRESS) | ||
| 1771 | *status = 0; | ||
| 1772 | |||
| 1773 | return finish_td(xhci, td, event_trb, event, ep, status, false); | 1771 | return finish_td(xhci, td, event_trb, event, ep, status, false); |
| 1774 | } | 1772 | } |
| 1775 | 1773 | ||
| @@ -1787,8 +1785,7 @@ static int skip_isoc_td(struct xhci_hcd *xhci, struct xhci_td *td, | |||
| 1787 | idx = urb_priv->td_cnt; | 1785 | idx = urb_priv->td_cnt; |
| 1788 | frame = &td->urb->iso_frame_desc[idx]; | 1786 | frame = &td->urb->iso_frame_desc[idx]; |
| 1789 | 1787 | ||
| 1790 | /* The transfer is partly done */ | 1788 | /* The transfer is partly done. */ |
| 1791 | *status = -EXDEV; | ||
| 1792 | frame->status = -EXDEV; | 1789 | frame->status = -EXDEV; |
| 1793 | 1790 | ||
| 1794 | /* calc actual length */ | 1791 | /* calc actual length */ |
| @@ -2016,6 +2013,10 @@ static int handle_tx_event(struct xhci_hcd *xhci, | |||
| 2016 | TRB_TO_SLOT_ID(le32_to_cpu(event->flags)), | 2013 | TRB_TO_SLOT_ID(le32_to_cpu(event->flags)), |
| 2017 | ep_index); | 2014 | ep_index); |
| 2018 | goto cleanup; | 2015 | goto cleanup; |
| 2016 | case COMP_DEV_ERR: | ||
| 2017 | xhci_warn(xhci, "WARN: detect an incompatible device"); | ||
| 2018 | status = -EPROTO; | ||
| 2019 | break; | ||
| 2019 | case COMP_MISSED_INT: | 2020 | case COMP_MISSED_INT: |
| 2020 | /* | 2021 | /* |
| 2021 | * When encounter missed service error, one or more isoc tds | 2022 | * When encounter missed service error, one or more isoc tds |
| @@ -2063,6 +2064,20 @@ static int handle_tx_event(struct xhci_hcd *xhci, | |||
| 2063 | /* Is this a TRB in the currently executing TD? */ | 2064 | /* Is this a TRB in the currently executing TD? */ |
| 2064 | event_seg = trb_in_td(ep_ring->deq_seg, ep_ring->dequeue, | 2065 | event_seg = trb_in_td(ep_ring->deq_seg, ep_ring->dequeue, |
| 2065 | td->last_trb, event_dma); | 2066 | td->last_trb, event_dma); |
| 2067 | |||
| 2068 | /* | ||
| 2069 | * Skip the Force Stopped Event. The event_trb(event_dma) of FSE | ||
| 2070 | * is not in the current TD pointed by ep_ring->dequeue because | ||
| 2071 | * that the hardware dequeue pointer still at the previous TRB | ||
| 2072 | * of the current TD. The previous TRB maybe a Link TD or the | ||
| 2073 | * last TRB of the previous TD. The command completion handle | ||
| 2074 | * will take care the rest. | ||
| 2075 | */ | ||
| 2076 | if (!event_seg && trb_comp_code == COMP_STOP_INVAL) { | ||
| 2077 | ret = 0; | ||
| 2078 | goto cleanup; | ||
| 2079 | } | ||
| 2080 | |||
| 2066 | if (!event_seg) { | 2081 | if (!event_seg) { |
| 2067 | if (!ep->skip || | 2082 | if (!ep->skip || |
| 2068 | !usb_endpoint_xfer_isoc(&td->urb->ep->desc)) { | 2083 | !usb_endpoint_xfer_isoc(&td->urb->ep->desc)) { |
| @@ -2158,6 +2173,11 @@ cleanup: | |||
| 2158 | urb->transfer_buffer_length, | 2173 | urb->transfer_buffer_length, |
| 2159 | status); | 2174 | status); |
| 2160 | spin_unlock(&xhci->lock); | 2175 | spin_unlock(&xhci->lock); |
| 2176 | /* EHCI, UHCI, and OHCI always unconditionally set the | ||
| 2177 | * urb->status of an isochronous endpoint to 0. | ||
| 2178 | */ | ||
| 2179 | if (usb_pipetype(urb->pipe) == PIPE_ISOCHRONOUS) | ||
| 2180 | status = 0; | ||
| 2161 | usb_hcd_giveback_urb(bus_to_hcd(urb->dev->bus), urb, status); | 2181 | usb_hcd_giveback_urb(bus_to_hcd(urb->dev->bus), urb, status); |
| 2162 | spin_lock(&xhci->lock); | 2182 | spin_lock(&xhci->lock); |
| 2163 | } | 2183 | } |
diff --git a/drivers/usb/host/xhci.c b/drivers/usb/host/xhci.c index 06e7023258d0..f5fe1ac301ab 100644 --- a/drivers/usb/host/xhci.c +++ b/drivers/usb/host/xhci.c | |||
| @@ -759,6 +759,8 @@ int xhci_resume(struct xhci_hcd *xhci, bool hibernated) | |||
| 759 | msleep(100); | 759 | msleep(100); |
| 760 | 760 | ||
| 761 | spin_lock_irq(&xhci->lock); | 761 | spin_lock_irq(&xhci->lock); |
| 762 | if (xhci->quirks & XHCI_RESET_ON_RESUME) | ||
| 763 | hibernated = true; | ||
| 762 | 764 | ||
| 763 | if (!hibernated) { | 765 | if (!hibernated) { |
| 764 | /* step 1: restore register */ | 766 | /* step 1: restore register */ |
| @@ -1401,6 +1403,7 @@ int xhci_add_endpoint(struct usb_hcd *hcd, struct usb_device *udev, | |||
| 1401 | u32 added_ctxs; | 1403 | u32 added_ctxs; |
| 1402 | unsigned int last_ctx; | 1404 | unsigned int last_ctx; |
| 1403 | u32 new_add_flags, new_drop_flags, new_slot_info; | 1405 | u32 new_add_flags, new_drop_flags, new_slot_info; |
| 1406 | struct xhci_virt_device *virt_dev; | ||
| 1404 | int ret = 0; | 1407 | int ret = 0; |
| 1405 | 1408 | ||
| 1406 | ret = xhci_check_args(hcd, udev, ep, 1, true, __func__); | 1409 | ret = xhci_check_args(hcd, udev, ep, 1, true, __func__); |
| @@ -1425,11 +1428,25 @@ int xhci_add_endpoint(struct usb_hcd *hcd, struct usb_device *udev, | |||
| 1425 | return 0; | 1428 | return 0; |
| 1426 | } | 1429 | } |
| 1427 | 1430 | ||
| 1428 | in_ctx = xhci->devs[udev->slot_id]->in_ctx; | 1431 | virt_dev = xhci->devs[udev->slot_id]; |
| 1429 | out_ctx = xhci->devs[udev->slot_id]->out_ctx; | 1432 | in_ctx = virt_dev->in_ctx; |
| 1433 | out_ctx = virt_dev->out_ctx; | ||
| 1430 | ctrl_ctx = xhci_get_input_control_ctx(xhci, in_ctx); | 1434 | ctrl_ctx = xhci_get_input_control_ctx(xhci, in_ctx); |
| 1431 | ep_index = xhci_get_endpoint_index(&ep->desc); | 1435 | ep_index = xhci_get_endpoint_index(&ep->desc); |
| 1432 | ep_ctx = xhci_get_ep_ctx(xhci, out_ctx, ep_index); | 1436 | ep_ctx = xhci_get_ep_ctx(xhci, out_ctx, ep_index); |
| 1437 | |||
| 1438 | /* If this endpoint is already in use, and the upper layers are trying | ||
| 1439 | * to add it again without dropping it, reject the addition. | ||
| 1440 | */ | ||
| 1441 | if (virt_dev->eps[ep_index].ring && | ||
| 1442 | !(le32_to_cpu(ctrl_ctx->drop_flags) & | ||
| 1443 | xhci_get_endpoint_flag(&ep->desc))) { | ||
| 1444 | xhci_warn(xhci, "Trying to add endpoint 0x%x " | ||
| 1445 | "without dropping it.\n", | ||
| 1446 | (unsigned int) ep->desc.bEndpointAddress); | ||
| 1447 | return -EINVAL; | ||
| 1448 | } | ||
| 1449 | |||
| 1433 | /* If the HCD has already noted the endpoint is enabled, | 1450 | /* If the HCD has already noted the endpoint is enabled, |
| 1434 | * ignore this request. | 1451 | * ignore this request. |
| 1435 | */ | 1452 | */ |
| @@ -1445,8 +1462,7 @@ int xhci_add_endpoint(struct usb_hcd *hcd, struct usb_device *udev, | |||
| 1445 | * process context, not interrupt context (or so documenation | 1462 | * process context, not interrupt context (or so documenation |
| 1446 | * for usb_set_interface() and usb_set_configuration() claim). | 1463 | * for usb_set_interface() and usb_set_configuration() claim). |
| 1447 | */ | 1464 | */ |
| 1448 | if (xhci_endpoint_init(xhci, xhci->devs[udev->slot_id], | 1465 | if (xhci_endpoint_init(xhci, virt_dev, udev, ep, GFP_NOIO) < 0) { |
| 1449 | udev, ep, GFP_NOIO) < 0) { | ||
| 1450 | dev_dbg(&udev->dev, "%s - could not initialize ep %#x\n", | 1466 | dev_dbg(&udev->dev, "%s - could not initialize ep %#x\n", |
| 1451 | __func__, ep->desc.bEndpointAddress); | 1467 | __func__, ep->desc.bEndpointAddress); |
| 1452 | return -ENOMEM; | 1468 | return -ENOMEM; |
| @@ -1537,6 +1553,11 @@ static int xhci_configure_endpoint_result(struct xhci_hcd *xhci, | |||
| 1537 | "and endpoint is not disabled.\n"); | 1553 | "and endpoint is not disabled.\n"); |
| 1538 | ret = -EINVAL; | 1554 | ret = -EINVAL; |
| 1539 | break; | 1555 | break; |
| 1556 | case COMP_DEV_ERR: | ||
| 1557 | dev_warn(&udev->dev, "ERROR: Incompatible device for endpoint " | ||
| 1558 | "configure command.\n"); | ||
| 1559 | ret = -ENODEV; | ||
| 1560 | break; | ||
| 1540 | case COMP_SUCCESS: | 1561 | case COMP_SUCCESS: |
| 1541 | dev_dbg(&udev->dev, "Successful Endpoint Configure command\n"); | 1562 | dev_dbg(&udev->dev, "Successful Endpoint Configure command\n"); |
| 1542 | ret = 0; | 1563 | ret = 0; |
| @@ -1571,6 +1592,11 @@ static int xhci_evaluate_context_result(struct xhci_hcd *xhci, | |||
| 1571 | xhci_dbg_ctx(xhci, virt_dev->out_ctx, 1); | 1592 | xhci_dbg_ctx(xhci, virt_dev->out_ctx, 1); |
| 1572 | ret = -EINVAL; | 1593 | ret = -EINVAL; |
| 1573 | break; | 1594 | break; |
| 1595 | case COMP_DEV_ERR: | ||
| 1596 | dev_warn(&udev->dev, "ERROR: Incompatible device for evaluate " | ||
| 1597 | "context command.\n"); | ||
| 1598 | ret = -ENODEV; | ||
| 1599 | break; | ||
| 1574 | case COMP_MEL_ERR: | 1600 | case COMP_MEL_ERR: |
| 1575 | /* Max Exit Latency too large error */ | 1601 | /* Max Exit Latency too large error */ |
| 1576 | dev_warn(&udev->dev, "WARN: Max Exit Latency too large\n"); | 1602 | dev_warn(&udev->dev, "WARN: Max Exit Latency too large\n"); |
| @@ -2853,6 +2879,11 @@ int xhci_address_device(struct usb_hcd *hcd, struct usb_device *udev) | |||
| 2853 | dev_warn(&udev->dev, "Device not responding to set address.\n"); | 2879 | dev_warn(&udev->dev, "Device not responding to set address.\n"); |
| 2854 | ret = -EPROTO; | 2880 | ret = -EPROTO; |
| 2855 | break; | 2881 | break; |
| 2882 | case COMP_DEV_ERR: | ||
| 2883 | dev_warn(&udev->dev, "ERROR: Incompatible device for address " | ||
| 2884 | "device command.\n"); | ||
| 2885 | ret = -ENODEV; | ||
| 2886 | break; | ||
| 2856 | case COMP_SUCCESS: | 2887 | case COMP_SUCCESS: |
| 2857 | xhci_dbg(xhci, "Successful Address Device command\n"); | 2888 | xhci_dbg(xhci, "Successful Address Device command\n"); |
| 2858 | break; | 2889 | break; |
diff --git a/drivers/usb/host/xhci.h b/drivers/usb/host/xhci.h index 7d1ea3bf5e1f..d8bbf5ccb10d 100644 --- a/drivers/usb/host/xhci.h +++ b/drivers/usb/host/xhci.h | |||
| @@ -874,6 +874,8 @@ struct xhci_transfer_event { | |||
| 874 | #define COMP_PING_ERR 20 | 874 | #define COMP_PING_ERR 20 |
| 875 | /* Event Ring is full */ | 875 | /* Event Ring is full */ |
| 876 | #define COMP_ER_FULL 21 | 876 | #define COMP_ER_FULL 21 |
| 877 | /* Incompatible Device Error */ | ||
| 878 | #define COMP_DEV_ERR 22 | ||
| 877 | /* Missed Service Error - HC couldn't service an isoc ep within interval */ | 879 | /* Missed Service Error - HC couldn't service an isoc ep within interval */ |
| 878 | #define COMP_MISSED_INT 23 | 880 | #define COMP_MISSED_INT 23 |
| 879 | /* Successfully stopped command ring */ | 881 | /* Successfully stopped command ring */ |
| @@ -1308,6 +1310,7 @@ struct xhci_hcd { | |||
| 1308 | */ | 1310 | */ |
| 1309 | #define XHCI_EP_LIMIT_QUIRK (1 << 5) | 1311 | #define XHCI_EP_LIMIT_QUIRK (1 << 5) |
| 1310 | #define XHCI_BROKEN_MSI (1 << 6) | 1312 | #define XHCI_BROKEN_MSI (1 << 6) |
| 1313 | #define XHCI_RESET_ON_RESUME (1 << 7) | ||
| 1311 | unsigned int num_active_eps; | 1314 | unsigned int num_active_eps; |
| 1312 | unsigned int limit_active_eps; | 1315 | unsigned int limit_active_eps; |
| 1313 | /* There are two roothubs to keep track of bus suspend info for */ | 1316 | /* There are two roothubs to keep track of bus suspend info for */ |
diff --git a/drivers/usb/musb/musb_gadget.c b/drivers/usb/musb/musb_gadget.c index 0a50a35e1853..6aeb363e63e7 100644 --- a/drivers/usb/musb/musb_gadget.c +++ b/drivers/usb/musb/musb_gadget.c | |||
| @@ -1524,6 +1524,12 @@ static void musb_gadget_fifo_flush(struct usb_ep *ep) | |||
| 1524 | csr = musb_readw(epio, MUSB_TXCSR); | 1524 | csr = musb_readw(epio, MUSB_TXCSR); |
| 1525 | if (csr & MUSB_TXCSR_FIFONOTEMPTY) { | 1525 | if (csr & MUSB_TXCSR_FIFONOTEMPTY) { |
| 1526 | csr |= MUSB_TXCSR_FLUSHFIFO | MUSB_TXCSR_P_WZC_BITS; | 1526 | csr |= MUSB_TXCSR_FLUSHFIFO | MUSB_TXCSR_P_WZC_BITS; |
| 1527 | /* | ||
| 1528 | * Setting both TXPKTRDY and FLUSHFIFO makes controller | ||
| 1529 | * to interrupt current FIFO loading, but not flushing | ||
| 1530 | * the already loaded ones. | ||
| 1531 | */ | ||
| 1532 | csr &= ~MUSB_TXCSR_TXPKTRDY; | ||
| 1527 | musb_writew(epio, MUSB_TXCSR, csr); | 1533 | musb_writew(epio, MUSB_TXCSR, csr); |
| 1528 | /* REVISIT may be inappropriate w/o FIFONOTEMPTY ... */ | 1534 | /* REVISIT may be inappropriate w/o FIFONOTEMPTY ... */ |
| 1529 | musb_writew(epio, MUSB_TXCSR, csr); | 1535 | musb_writew(epio, MUSB_TXCSR, csr); |
diff --git a/drivers/usb/musb/musb_host.c b/drivers/usb/musb/musb_host.c index 7295e316bdfc..8b2473fa0f47 100644 --- a/drivers/usb/musb/musb_host.c +++ b/drivers/usb/musb/musb_host.c | |||
| @@ -1575,7 +1575,7 @@ void musb_host_rx(struct musb *musb, u8 epnum) | |||
| 1575 | /* even if there was an error, we did the dma | 1575 | /* even if there was an error, we did the dma |
| 1576 | * for iso_frame_desc->length | 1576 | * for iso_frame_desc->length |
| 1577 | */ | 1577 | */ |
| 1578 | if (d->status != EILSEQ && d->status != -EOVERFLOW) | 1578 | if (d->status != -EILSEQ && d->status != -EOVERFLOW) |
| 1579 | d->status = 0; | 1579 | d->status = 0; |
| 1580 | 1580 | ||
| 1581 | if (++qh->iso_idx >= urb->number_of_packets) | 1581 | if (++qh->iso_idx >= urb->number_of_packets) |
diff --git a/drivers/usb/serial/ftdi_sio.c b/drivers/usb/serial/ftdi_sio.c index 162728977553..2e06b90aa1f8 100644 --- a/drivers/usb/serial/ftdi_sio.c +++ b/drivers/usb/serial/ftdi_sio.c | |||
| @@ -179,6 +179,7 @@ static struct usb_device_id id_table_combined [] = { | |||
| 179 | { USB_DEVICE(FTDI_VID, FTDI_232RL_PID) }, | 179 | { USB_DEVICE(FTDI_VID, FTDI_232RL_PID) }, |
| 180 | { USB_DEVICE(FTDI_VID, FTDI_8U2232C_PID) }, | 180 | { USB_DEVICE(FTDI_VID, FTDI_8U2232C_PID) }, |
| 181 | { USB_DEVICE(FTDI_VID, FTDI_4232H_PID) }, | 181 | { USB_DEVICE(FTDI_VID, FTDI_4232H_PID) }, |
| 182 | { USB_DEVICE(FTDI_VID, FTDI_232H_PID) }, | ||
| 182 | { USB_DEVICE(FTDI_VID, FTDI_MICRO_CHAMELEON_PID) }, | 183 | { USB_DEVICE(FTDI_VID, FTDI_MICRO_CHAMELEON_PID) }, |
| 183 | { USB_DEVICE(FTDI_VID, FTDI_RELAIS_PID) }, | 184 | { USB_DEVICE(FTDI_VID, FTDI_RELAIS_PID) }, |
| 184 | { USB_DEVICE(FTDI_VID, FTDI_OPENDCC_PID) }, | 185 | { USB_DEVICE(FTDI_VID, FTDI_OPENDCC_PID) }, |
| @@ -848,7 +849,8 @@ static const char *ftdi_chip_name[] = { | |||
| 848 | [FT2232C] = "FT2232C", | 849 | [FT2232C] = "FT2232C", |
| 849 | [FT232RL] = "FT232RL", | 850 | [FT232RL] = "FT232RL", |
| 850 | [FT2232H] = "FT2232H", | 851 | [FT2232H] = "FT2232H", |
| 851 | [FT4232H] = "FT4232H" | 852 | [FT4232H] = "FT4232H", |
| 853 | [FT232H] = "FT232H" | ||
| 852 | }; | 854 | }; |
| 853 | 855 | ||
| 854 | 856 | ||
| @@ -1168,6 +1170,7 @@ static __u32 get_ftdi_divisor(struct tty_struct *tty, | |||
| 1168 | break; | 1170 | break; |
| 1169 | case FT2232H: /* FT2232H chip */ | 1171 | case FT2232H: /* FT2232H chip */ |
| 1170 | case FT4232H: /* FT4232H chip */ | 1172 | case FT4232H: /* FT4232H chip */ |
| 1173 | case FT232H: /* FT232H chip */ | ||
| 1171 | if ((baud <= 12000000) & (baud >= 1200)) { | 1174 | if ((baud <= 12000000) & (baud >= 1200)) { |
| 1172 | div_value = ftdi_2232h_baud_to_divisor(baud); | 1175 | div_value = ftdi_2232h_baud_to_divisor(baud); |
| 1173 | } else if (baud < 1200) { | 1176 | } else if (baud < 1200) { |
| @@ -1429,9 +1432,12 @@ static void ftdi_determine_type(struct usb_serial_port *port) | |||
| 1429 | } else if (version < 0x600) { | 1432 | } else if (version < 0x600) { |
| 1430 | /* Assume it's an FT232BM (or FT245BM) */ | 1433 | /* Assume it's an FT232BM (or FT245BM) */ |
| 1431 | priv->chip_type = FT232BM; | 1434 | priv->chip_type = FT232BM; |
| 1432 | } else { | 1435 | } else if (version < 0x900) { |
| 1433 | /* Assume it's an FT232R */ | 1436 | /* Assume it's an FT232RL */ |
| 1434 | priv->chip_type = FT232RL; | 1437 | priv->chip_type = FT232RL; |
| 1438 | } else { | ||
| 1439 | /* Assume it's an FT232H */ | ||
| 1440 | priv->chip_type = FT232H; | ||
| 1435 | } | 1441 | } |
| 1436 | dev_info(&udev->dev, "Detected %s\n", ftdi_chip_name[priv->chip_type]); | 1442 | dev_info(&udev->dev, "Detected %s\n", ftdi_chip_name[priv->chip_type]); |
| 1437 | } | 1443 | } |
| @@ -1559,7 +1565,8 @@ static int create_sysfs_attrs(struct usb_serial_port *port) | |||
| 1559 | priv->chip_type == FT2232C || | 1565 | priv->chip_type == FT2232C || |
| 1560 | priv->chip_type == FT232RL || | 1566 | priv->chip_type == FT232RL || |
| 1561 | priv->chip_type == FT2232H || | 1567 | priv->chip_type == FT2232H || |
| 1562 | priv->chip_type == FT4232H)) { | 1568 | priv->chip_type == FT4232H || |
| 1569 | priv->chip_type == FT232H)) { | ||
| 1563 | retval = device_create_file(&port->dev, | 1570 | retval = device_create_file(&port->dev, |
| 1564 | &dev_attr_latency_timer); | 1571 | &dev_attr_latency_timer); |
| 1565 | } | 1572 | } |
| @@ -1580,7 +1587,8 @@ static void remove_sysfs_attrs(struct usb_serial_port *port) | |||
| 1580 | priv->chip_type == FT2232C || | 1587 | priv->chip_type == FT2232C || |
| 1581 | priv->chip_type == FT232RL || | 1588 | priv->chip_type == FT232RL || |
| 1582 | priv->chip_type == FT2232H || | 1589 | priv->chip_type == FT2232H || |
| 1583 | priv->chip_type == FT4232H) { | 1590 | priv->chip_type == FT4232H || |
| 1591 | priv->chip_type == FT232H) { | ||
| 1584 | device_remove_file(&port->dev, &dev_attr_latency_timer); | 1592 | device_remove_file(&port->dev, &dev_attr_latency_timer); |
| 1585 | } | 1593 | } |
| 1586 | } | 1594 | } |
| @@ -2212,6 +2220,7 @@ static int ftdi_tiocmget(struct tty_struct *tty) | |||
| 2212 | case FT232RL: | 2220 | case FT232RL: |
| 2213 | case FT2232H: | 2221 | case FT2232H: |
| 2214 | case FT4232H: | 2222 | case FT4232H: |
| 2223 | case FT232H: | ||
| 2215 | len = 2; | 2224 | len = 2; |
| 2216 | break; | 2225 | break; |
| 2217 | default: | 2226 | default: |
diff --git a/drivers/usb/serial/ftdi_sio.h b/drivers/usb/serial/ftdi_sio.h index 213fe3d61282..19584faa86f9 100644 --- a/drivers/usb/serial/ftdi_sio.h +++ b/drivers/usb/serial/ftdi_sio.h | |||
| @@ -156,7 +156,8 @@ enum ftdi_chip_type { | |||
| 156 | FT2232C = 4, | 156 | FT2232C = 4, |
| 157 | FT232RL = 5, | 157 | FT232RL = 5, |
| 158 | FT2232H = 6, | 158 | FT2232H = 6, |
| 159 | FT4232H = 7 | 159 | FT4232H = 7, |
| 160 | FT232H = 8 | ||
| 160 | }; | 161 | }; |
| 161 | 162 | ||
| 162 | enum ftdi_sio_baudrate { | 163 | enum ftdi_sio_baudrate { |
diff --git a/drivers/usb/serial/ftdi_sio_ids.h b/drivers/usb/serial/ftdi_sio_ids.h index ab1fcdf3c378..19156d1049fe 100644 --- a/drivers/usb/serial/ftdi_sio_ids.h +++ b/drivers/usb/serial/ftdi_sio_ids.h | |||
| @@ -22,6 +22,7 @@ | |||
| 22 | #define FTDI_8U232AM_ALT_PID 0x6006 /* FTDI's alternate PID for above */ | 22 | #define FTDI_8U232AM_ALT_PID 0x6006 /* FTDI's alternate PID for above */ |
| 23 | #define FTDI_8U2232C_PID 0x6010 /* Dual channel device */ | 23 | #define FTDI_8U2232C_PID 0x6010 /* Dual channel device */ |
| 24 | #define FTDI_4232H_PID 0x6011 /* Quad channel hi-speed device */ | 24 | #define FTDI_4232H_PID 0x6011 /* Quad channel hi-speed device */ |
| 25 | #define FTDI_232H_PID 0x6014 /* Single channel hi-speed device */ | ||
| 25 | #define FTDI_SIO_PID 0x8372 /* Product Id SIO application of 8U100AX */ | 26 | #define FTDI_SIO_PID 0x8372 /* Product Id SIO application of 8U100AX */ |
| 26 | #define FTDI_232RL_PID 0xFBFA /* Product ID for FT232RL */ | 27 | #define FTDI_232RL_PID 0xFBFA /* Product ID for FT232RL */ |
| 27 | 28 | ||
diff --git a/drivers/usb/serial/ti_usb_3410_5052.c b/drivers/usb/serial/ti_usb_3410_5052.c index c6d92a530086..ea8445689c85 100644 --- a/drivers/usb/serial/ti_usb_3410_5052.c +++ b/drivers/usb/serial/ti_usb_3410_5052.c | |||
| @@ -1745,6 +1745,7 @@ static int ti_download_firmware(struct ti_device *tdev) | |||
| 1745 | } | 1745 | } |
| 1746 | if (fw_p->size > TI_FIRMWARE_BUF_SIZE) { | 1746 | if (fw_p->size > TI_FIRMWARE_BUF_SIZE) { |
| 1747 | dev_err(&dev->dev, "%s - firmware too large %zu\n", __func__, fw_p->size); | 1747 | dev_err(&dev->dev, "%s - firmware too large %zu\n", __func__, fw_p->size); |
| 1748 | release_firmware(fw_p); | ||
| 1748 | return -ENOENT; | 1749 | return -ENOENT; |
| 1749 | } | 1750 | } |
| 1750 | 1751 | ||
diff --git a/drivers/watchdog/Kconfig b/drivers/watchdog/Kconfig index 022f9eb0b7bf..9536d386bb38 100644 --- a/drivers/watchdog/Kconfig +++ b/drivers/watchdog/Kconfig | |||
| @@ -535,8 +535,7 @@ config I6300ESB_WDT | |||
| 535 | 535 | ||
| 536 | config INTEL_SCU_WATCHDOG | 536 | config INTEL_SCU_WATCHDOG |
| 537 | bool "Intel SCU Watchdog for Mobile Platforms" | 537 | bool "Intel SCU Watchdog for Mobile Platforms" |
| 538 | depends on WATCHDOG | 538 | depends on X86_MRST |
| 539 | depends on INTEL_SCU_IPC | ||
| 540 | ---help--- | 539 | ---help--- |
| 541 | Hardware driver for the watchdog time built into the Intel SCU | 540 | Hardware driver for the watchdog time built into the Intel SCU |
| 542 | for Intel Mobile Platforms. | 541 | for Intel Mobile Platforms. |
diff --git a/drivers/watchdog/at32ap700x_wdt.c b/drivers/watchdog/at32ap700x_wdt.c index 750bc5281d79..4ca5d40304b2 100644 --- a/drivers/watchdog/at32ap700x_wdt.c +++ b/drivers/watchdog/at32ap700x_wdt.c | |||
| @@ -448,7 +448,7 @@ static void __exit at32_wdt_exit(void) | |||
| 448 | } | 448 | } |
| 449 | module_exit(at32_wdt_exit); | 449 | module_exit(at32_wdt_exit); |
| 450 | 450 | ||
| 451 | MODULE_AUTHOR("Hans-Christian Egtvedt <hcegtvedt@atmel.com>"); | 451 | MODULE_AUTHOR("Hans-Christian Egtvedt <egtvedt@samfundet.no>"); |
| 452 | MODULE_DESCRIPTION("Watchdog driver for Atmel AT32AP700X"); | 452 | MODULE_DESCRIPTION("Watchdog driver for Atmel AT32AP700X"); |
| 453 | MODULE_LICENSE("GPL"); | 453 | MODULE_LICENSE("GPL"); |
| 454 | MODULE_ALIAS_MISCDEV(WATCHDOG_MINOR); | 454 | MODULE_ALIAS_MISCDEV(WATCHDOG_MINOR); |
diff --git a/drivers/watchdog/gef_wdt.c b/drivers/watchdog/gef_wdt.c index 29a7cd4b90c8..b146082bd85a 100644 --- a/drivers/watchdog/gef_wdt.c +++ b/drivers/watchdog/gef_wdt.c | |||
| @@ -329,4 +329,4 @@ MODULE_AUTHOR("Martyn Welch <martyn.welch@ge.com>"); | |||
| 329 | MODULE_DESCRIPTION("GE watchdog driver"); | 329 | MODULE_DESCRIPTION("GE watchdog driver"); |
| 330 | MODULE_LICENSE("GPL"); | 330 | MODULE_LICENSE("GPL"); |
| 331 | MODULE_ALIAS_MISCDEV(WATCHDOG_MINOR); | 331 | MODULE_ALIAS_MISCDEV(WATCHDOG_MINOR); |
| 332 | MODULE_ALIAS("platform: gef_wdt"); | 332 | MODULE_ALIAS("platform:gef_wdt"); |
diff --git a/drivers/watchdog/intel_scu_watchdog.c b/drivers/watchdog/intel_scu_watchdog.c index 919bdd16136f..ba4386066a42 100644 --- a/drivers/watchdog/intel_scu_watchdog.c +++ b/drivers/watchdog/intel_scu_watchdog.c | |||
| @@ -42,7 +42,6 @@ | |||
| 42 | #include <linux/sched.h> | 42 | #include <linux/sched.h> |
| 43 | #include <linux/signal.h> | 43 | #include <linux/signal.h> |
| 44 | #include <linux/sfi.h> | 44 | #include <linux/sfi.h> |
| 45 | #include <linux/types.h> | ||
| 46 | #include <asm/irq.h> | 45 | #include <asm/irq.h> |
| 47 | #include <asm/atomic.h> | 46 | #include <asm/atomic.h> |
| 48 | #include <asm/intel_scu_ipc.h> | 47 | #include <asm/intel_scu_ipc.h> |
diff --git a/drivers/watchdog/mtx-1_wdt.c b/drivers/watchdog/mtx-1_wdt.c index 1479dc4d6129..0430e093b1a0 100644 --- a/drivers/watchdog/mtx-1_wdt.c +++ b/drivers/watchdog/mtx-1_wdt.c | |||
| @@ -66,23 +66,18 @@ static struct { | |||
| 66 | int default_ticks; | 66 | int default_ticks; |
| 67 | unsigned long inuse; | 67 | unsigned long inuse; |
| 68 | unsigned gpio; | 68 | unsigned gpio; |
| 69 | int gstate; | 69 | unsigned int gstate; |
| 70 | } mtx1_wdt_device; | 70 | } mtx1_wdt_device; |
| 71 | 71 | ||
| 72 | static void mtx1_wdt_trigger(unsigned long unused) | 72 | static void mtx1_wdt_trigger(unsigned long unused) |
| 73 | { | 73 | { |
| 74 | u32 tmp; | ||
| 75 | |||
| 76 | spin_lock(&mtx1_wdt_device.lock); | 74 | spin_lock(&mtx1_wdt_device.lock); |
| 77 | if (mtx1_wdt_device.running) | 75 | if (mtx1_wdt_device.running) |
| 78 | ticks--; | 76 | ticks--; |
| 79 | 77 | ||
| 80 | /* toggle wdt gpio */ | 78 | /* toggle wdt gpio */ |
| 81 | mtx1_wdt_device.gstate = ~mtx1_wdt_device.gstate; | 79 | mtx1_wdt_device.gstate = !mtx1_wdt_device.gstate; |
| 82 | if (mtx1_wdt_device.gstate) | 80 | gpio_set_value(mtx1_wdt_device.gpio, mtx1_wdt_device.gstate); |
| 83 | gpio_direction_output(mtx1_wdt_device.gpio, 1); | ||
| 84 | else | ||
| 85 | gpio_direction_input(mtx1_wdt_device.gpio); | ||
| 86 | 81 | ||
| 87 | if (mtx1_wdt_device.queue && ticks) | 82 | if (mtx1_wdt_device.queue && ticks) |
| 88 | mod_timer(&mtx1_wdt_device.timer, jiffies + MTX1_WDT_INTERVAL); | 83 | mod_timer(&mtx1_wdt_device.timer, jiffies + MTX1_WDT_INTERVAL); |
| @@ -105,7 +100,7 @@ static void mtx1_wdt_start(void) | |||
| 105 | if (!mtx1_wdt_device.queue) { | 100 | if (!mtx1_wdt_device.queue) { |
| 106 | mtx1_wdt_device.queue = 1; | 101 | mtx1_wdt_device.queue = 1; |
| 107 | mtx1_wdt_device.gstate = 1; | 102 | mtx1_wdt_device.gstate = 1; |
| 108 | gpio_direction_output(mtx1_wdt_device.gpio, 1); | 103 | gpio_set_value(mtx1_wdt_device.gpio, 1); |
| 109 | mod_timer(&mtx1_wdt_device.timer, jiffies + MTX1_WDT_INTERVAL); | 104 | mod_timer(&mtx1_wdt_device.timer, jiffies + MTX1_WDT_INTERVAL); |
| 110 | } | 105 | } |
| 111 | mtx1_wdt_device.running++; | 106 | mtx1_wdt_device.running++; |
| @@ -120,7 +115,7 @@ static int mtx1_wdt_stop(void) | |||
| 120 | if (mtx1_wdt_device.queue) { | 115 | if (mtx1_wdt_device.queue) { |
| 121 | mtx1_wdt_device.queue = 0; | 116 | mtx1_wdt_device.queue = 0; |
| 122 | mtx1_wdt_device.gstate = 0; | 117 | mtx1_wdt_device.gstate = 0; |
| 123 | gpio_direction_output(mtx1_wdt_device.gpio, 0); | 118 | gpio_set_value(mtx1_wdt_device.gpio, 0); |
| 124 | } | 119 | } |
| 125 | ticks = mtx1_wdt_device.default_ticks; | 120 | ticks = mtx1_wdt_device.default_ticks; |
| 126 | spin_unlock_irqrestore(&mtx1_wdt_device.lock, flags); | 121 | spin_unlock_irqrestore(&mtx1_wdt_device.lock, flags); |
| @@ -214,6 +209,12 @@ static int __devinit mtx1_wdt_probe(struct platform_device *pdev) | |||
| 214 | int ret; | 209 | int ret; |
| 215 | 210 | ||
| 216 | mtx1_wdt_device.gpio = pdev->resource[0].start; | 211 | mtx1_wdt_device.gpio = pdev->resource[0].start; |
| 212 | ret = gpio_request_one(mtx1_wdt_device.gpio, | ||
| 213 | GPIOF_OUT_INIT_HIGH, "mtx1-wdt"); | ||
| 214 | if (ret < 0) { | ||
| 215 | dev_err(&pdev->dev, "failed to request gpio"); | ||
| 216 | return ret; | ||
| 217 | } | ||
| 217 | 218 | ||
| 218 | spin_lock_init(&mtx1_wdt_device.lock); | 219 | spin_lock_init(&mtx1_wdt_device.lock); |
| 219 | init_completion(&mtx1_wdt_device.stop); | 220 | init_completion(&mtx1_wdt_device.stop); |
| @@ -239,11 +240,13 @@ static int __devexit mtx1_wdt_remove(struct platform_device *pdev) | |||
| 239 | mtx1_wdt_device.queue = 0; | 240 | mtx1_wdt_device.queue = 0; |
| 240 | wait_for_completion(&mtx1_wdt_device.stop); | 241 | wait_for_completion(&mtx1_wdt_device.stop); |
| 241 | } | 242 | } |
| 243 | |||
| 244 | gpio_free(mtx1_wdt_device.gpio); | ||
| 242 | misc_deregister(&mtx1_wdt_misc); | 245 | misc_deregister(&mtx1_wdt_misc); |
| 243 | return 0; | 246 | return 0; |
| 244 | } | 247 | } |
| 245 | 248 | ||
| 246 | static struct platform_driver mtx1_wdt = { | 249 | static struct platform_driver mtx1_wdt_driver = { |
| 247 | .probe = mtx1_wdt_probe, | 250 | .probe = mtx1_wdt_probe, |
| 248 | .remove = __devexit_p(mtx1_wdt_remove), | 251 | .remove = __devexit_p(mtx1_wdt_remove), |
| 249 | .driver.name = "mtx1-wdt", | 252 | .driver.name = "mtx1-wdt", |
| @@ -252,12 +255,12 @@ static struct platform_driver mtx1_wdt = { | |||
| 252 | 255 | ||
| 253 | static int __init mtx1_wdt_init(void) | 256 | static int __init mtx1_wdt_init(void) |
| 254 | { | 257 | { |
| 255 | return platform_driver_register(&mtx1_wdt); | 258 | return platform_driver_register(&mtx1_wdt_driver); |
| 256 | } | 259 | } |
| 257 | 260 | ||
| 258 | static void __exit mtx1_wdt_exit(void) | 261 | static void __exit mtx1_wdt_exit(void) |
| 259 | { | 262 | { |
| 260 | platform_driver_unregister(&mtx1_wdt); | 263 | platform_driver_unregister(&mtx1_wdt_driver); |
| 261 | } | 264 | } |
| 262 | 265 | ||
| 263 | module_init(mtx1_wdt_init); | 266 | module_init(mtx1_wdt_init); |
diff --git a/drivers/watchdog/wm831x_wdt.c b/drivers/watchdog/wm831x_wdt.c index 8c4b2d5bb7da..871caea4e1c6 100644 --- a/drivers/watchdog/wm831x_wdt.c +++ b/drivers/watchdog/wm831x_wdt.c | |||
| @@ -320,6 +320,11 @@ static int __devinit wm831x_wdt_probe(struct platform_device *pdev) | |||
| 320 | struct wm831x_watchdog_pdata *pdata; | 320 | struct wm831x_watchdog_pdata *pdata; |
| 321 | int reg, ret; | 321 | int reg, ret; |
| 322 | 322 | ||
| 323 | if (wm831x) { | ||
| 324 | dev_err(&pdev->dev, "wm831x watchdog already registered\n"); | ||
| 325 | return -EBUSY; | ||
| 326 | } | ||
| 327 | |||
| 323 | wm831x = dev_get_drvdata(pdev->dev.parent); | 328 | wm831x = dev_get_drvdata(pdev->dev.parent); |
| 324 | 329 | ||
| 325 | ret = wm831x_reg_read(wm831x, WM831X_WATCHDOG); | 330 | ret = wm831x_reg_read(wm831x, WM831X_WATCHDOG); |
