diff options
Diffstat (limited to 'drivers')
121 files changed, 953 insertions, 467 deletions
diff --git a/drivers/acpi/acpi_ipmi.c b/drivers/acpi/acpi_ipmi.c index f40acef80269..a6977e12d574 100644 --- a/drivers/acpi/acpi_ipmi.c +++ b/drivers/acpi/acpi_ipmi.c | |||
@@ -39,6 +39,7 @@ | |||
39 | #include <linux/ipmi.h> | 39 | #include <linux/ipmi.h> |
40 | #include <linux/device.h> | 40 | #include <linux/device.h> |
41 | #include <linux/pnp.h> | 41 | #include <linux/pnp.h> |
42 | #include <linux/spinlock.h> | ||
42 | 43 | ||
43 | MODULE_AUTHOR("Zhao Yakui"); | 44 | MODULE_AUTHOR("Zhao Yakui"); |
44 | MODULE_DESCRIPTION("ACPI IPMI Opregion driver"); | 45 | MODULE_DESCRIPTION("ACPI IPMI Opregion driver"); |
@@ -57,7 +58,7 @@ struct acpi_ipmi_device { | |||
57 | struct list_head head; | 58 | struct list_head head; |
58 | /* the IPMI request message list */ | 59 | /* the IPMI request message list */ |
59 | struct list_head tx_msg_list; | 60 | struct list_head tx_msg_list; |
60 | struct mutex tx_msg_lock; | 61 | spinlock_t tx_msg_lock; |
61 | acpi_handle handle; | 62 | acpi_handle handle; |
62 | struct pnp_dev *pnp_dev; | 63 | struct pnp_dev *pnp_dev; |
63 | ipmi_user_t user_interface; | 64 | ipmi_user_t user_interface; |
@@ -147,6 +148,7 @@ static void acpi_format_ipmi_msg(struct acpi_ipmi_msg *tx_msg, | |||
147 | struct kernel_ipmi_msg *msg; | 148 | struct kernel_ipmi_msg *msg; |
148 | struct acpi_ipmi_buffer *buffer; | 149 | struct acpi_ipmi_buffer *buffer; |
149 | struct acpi_ipmi_device *device; | 150 | struct acpi_ipmi_device *device; |
151 | unsigned long flags; | ||
150 | 152 | ||
151 | msg = &tx_msg->tx_message; | 153 | msg = &tx_msg->tx_message; |
152 | /* | 154 | /* |
@@ -177,10 +179,10 @@ static void acpi_format_ipmi_msg(struct acpi_ipmi_msg *tx_msg, | |||
177 | 179 | ||
178 | /* Get the msgid */ | 180 | /* Get the msgid */ |
179 | device = tx_msg->device; | 181 | device = tx_msg->device; |
180 | mutex_lock(&device->tx_msg_lock); | 182 | spin_lock_irqsave(&device->tx_msg_lock, flags); |
181 | device->curr_msgid++; | 183 | device->curr_msgid++; |
182 | tx_msg->tx_msgid = device->curr_msgid; | 184 | tx_msg->tx_msgid = device->curr_msgid; |
183 | mutex_unlock(&device->tx_msg_lock); | 185 | spin_unlock_irqrestore(&device->tx_msg_lock, flags); |
184 | } | 186 | } |
185 | 187 | ||
186 | static void acpi_format_ipmi_response(struct acpi_ipmi_msg *msg, | 188 | static void acpi_format_ipmi_response(struct acpi_ipmi_msg *msg, |
@@ -242,6 +244,7 @@ static void ipmi_msg_handler(struct ipmi_recv_msg *msg, void *user_msg_data) | |||
242 | int msg_found = 0; | 244 | int msg_found = 0; |
243 | struct acpi_ipmi_msg *tx_msg; | 245 | struct acpi_ipmi_msg *tx_msg; |
244 | struct pnp_dev *pnp_dev = ipmi_device->pnp_dev; | 246 | struct pnp_dev *pnp_dev = ipmi_device->pnp_dev; |
247 | unsigned long flags; | ||
245 | 248 | ||
246 | if (msg->user != ipmi_device->user_interface) { | 249 | if (msg->user != ipmi_device->user_interface) { |
247 | dev_warn(&pnp_dev->dev, "Unexpected response is returned. " | 250 | dev_warn(&pnp_dev->dev, "Unexpected response is returned. " |
@@ -250,7 +253,7 @@ static void ipmi_msg_handler(struct ipmi_recv_msg *msg, void *user_msg_data) | |||
250 | ipmi_free_recv_msg(msg); | 253 | ipmi_free_recv_msg(msg); |
251 | return; | 254 | return; |
252 | } | 255 | } |
253 | mutex_lock(&ipmi_device->tx_msg_lock); | 256 | spin_lock_irqsave(&ipmi_device->tx_msg_lock, flags); |
254 | list_for_each_entry(tx_msg, &ipmi_device->tx_msg_list, head) { | 257 | list_for_each_entry(tx_msg, &ipmi_device->tx_msg_list, head) { |
255 | if (msg->msgid == tx_msg->tx_msgid) { | 258 | if (msg->msgid == tx_msg->tx_msgid) { |
256 | msg_found = 1; | 259 | msg_found = 1; |
@@ -258,7 +261,7 @@ static void ipmi_msg_handler(struct ipmi_recv_msg *msg, void *user_msg_data) | |||
258 | } | 261 | } |
259 | } | 262 | } |
260 | 263 | ||
261 | mutex_unlock(&ipmi_device->tx_msg_lock); | 264 | spin_unlock_irqrestore(&ipmi_device->tx_msg_lock, flags); |
262 | if (!msg_found) { | 265 | if (!msg_found) { |
263 | dev_warn(&pnp_dev->dev, "Unexpected response (msg id %ld) is " | 266 | dev_warn(&pnp_dev->dev, "Unexpected response (msg id %ld) is " |
264 | "returned.\n", msg->msgid); | 267 | "returned.\n", msg->msgid); |
@@ -378,6 +381,7 @@ acpi_ipmi_space_handler(u32 function, acpi_physical_address address, | |||
378 | struct acpi_ipmi_device *ipmi_device = handler_context; | 381 | struct acpi_ipmi_device *ipmi_device = handler_context; |
379 | int err, rem_time; | 382 | int err, rem_time; |
380 | acpi_status status; | 383 | acpi_status status; |
384 | unsigned long flags; | ||
381 | /* | 385 | /* |
382 | * IPMI opregion message. | 386 | * IPMI opregion message. |
383 | * IPMI message is firstly written to the BMC and system software | 387 | * IPMI message is firstly written to the BMC and system software |
@@ -395,9 +399,9 @@ acpi_ipmi_space_handler(u32 function, acpi_physical_address address, | |||
395 | return AE_NO_MEMORY; | 399 | return AE_NO_MEMORY; |
396 | 400 | ||
397 | acpi_format_ipmi_msg(tx_msg, address, value); | 401 | acpi_format_ipmi_msg(tx_msg, address, value); |
398 | mutex_lock(&ipmi_device->tx_msg_lock); | 402 | spin_lock_irqsave(&ipmi_device->tx_msg_lock, flags); |
399 | list_add_tail(&tx_msg->head, &ipmi_device->tx_msg_list); | 403 | list_add_tail(&tx_msg->head, &ipmi_device->tx_msg_list); |
400 | mutex_unlock(&ipmi_device->tx_msg_lock); | 404 | spin_unlock_irqrestore(&ipmi_device->tx_msg_lock, flags); |
401 | err = ipmi_request_settime(ipmi_device->user_interface, | 405 | err = ipmi_request_settime(ipmi_device->user_interface, |
402 | &tx_msg->addr, | 406 | &tx_msg->addr, |
403 | tx_msg->tx_msgid, | 407 | tx_msg->tx_msgid, |
@@ -413,9 +417,9 @@ acpi_ipmi_space_handler(u32 function, acpi_physical_address address, | |||
413 | status = AE_OK; | 417 | status = AE_OK; |
414 | 418 | ||
415 | end_label: | 419 | end_label: |
416 | mutex_lock(&ipmi_device->tx_msg_lock); | 420 | spin_lock_irqsave(&ipmi_device->tx_msg_lock, flags); |
417 | list_del(&tx_msg->head); | 421 | list_del(&tx_msg->head); |
418 | mutex_unlock(&ipmi_device->tx_msg_lock); | 422 | spin_unlock_irqrestore(&ipmi_device->tx_msg_lock, flags); |
419 | kfree(tx_msg); | 423 | kfree(tx_msg); |
420 | return status; | 424 | return status; |
421 | } | 425 | } |
@@ -457,7 +461,7 @@ static void acpi_add_ipmi_device(struct acpi_ipmi_device *ipmi_device) | |||
457 | 461 | ||
458 | INIT_LIST_HEAD(&ipmi_device->head); | 462 | INIT_LIST_HEAD(&ipmi_device->head); |
459 | 463 | ||
460 | mutex_init(&ipmi_device->tx_msg_lock); | 464 | spin_lock_init(&ipmi_device->tx_msg_lock); |
461 | INIT_LIST_HEAD(&ipmi_device->tx_msg_list); | 465 | INIT_LIST_HEAD(&ipmi_device->tx_msg_list); |
462 | ipmi_install_space_handler(ipmi_device); | 466 | ipmi_install_space_handler(ipmi_device); |
463 | 467 | ||
diff --git a/drivers/acpi/scan.c b/drivers/acpi/scan.c index fbdb82e70d10..611ce9061dc5 100644 --- a/drivers/acpi/scan.c +++ b/drivers/acpi/scan.c | |||
@@ -1121,7 +1121,7 @@ int acpi_bus_register_driver(struct acpi_driver *driver) | |||
1121 | EXPORT_SYMBOL(acpi_bus_register_driver); | 1121 | EXPORT_SYMBOL(acpi_bus_register_driver); |
1122 | 1122 | ||
1123 | /** | 1123 | /** |
1124 | * acpi_bus_unregister_driver - unregisters a driver with the APIC bus | 1124 | * acpi_bus_unregister_driver - unregisters a driver with the ACPI bus |
1125 | * @driver: driver to unregister | 1125 | * @driver: driver to unregister |
1126 | * | 1126 | * |
1127 | * Unregisters a driver with the ACPI bus. Searches the namespace for all | 1127 | * Unregisters a driver with the ACPI bus. Searches the namespace for all |
diff --git a/drivers/ata/sata_promise.c b/drivers/ata/sata_promise.c index 958ba2a420c3..97f4acb54ad6 100644 --- a/drivers/ata/sata_promise.c +++ b/drivers/ata/sata_promise.c | |||
@@ -2,7 +2,7 @@ | |||
2 | * sata_promise.c - Promise SATA | 2 | * sata_promise.c - Promise SATA |
3 | * | 3 | * |
4 | * Maintained by: Tejun Heo <tj@kernel.org> | 4 | * Maintained by: Tejun Heo <tj@kernel.org> |
5 | * Mikael Pettersson <mikpe@it.uu.se> | 5 | * Mikael Pettersson |
6 | * Please ALWAYS copy linux-ide@vger.kernel.org | 6 | * Please ALWAYS copy linux-ide@vger.kernel.org |
7 | * on emails. | 7 | * on emails. |
8 | * | 8 | * |
diff --git a/drivers/base/core.c b/drivers/base/core.c index c7cfadcf6752..34abf4d8a45f 100644 --- a/drivers/base/core.c +++ b/drivers/base/core.c | |||
@@ -2017,7 +2017,7 @@ EXPORT_SYMBOL_GPL(device_move); | |||
2017 | */ | 2017 | */ |
2018 | void device_shutdown(void) | 2018 | void device_shutdown(void) |
2019 | { | 2019 | { |
2020 | struct device *dev; | 2020 | struct device *dev, *parent; |
2021 | 2021 | ||
2022 | spin_lock(&devices_kset->list_lock); | 2022 | spin_lock(&devices_kset->list_lock); |
2023 | /* | 2023 | /* |
@@ -2034,7 +2034,7 @@ void device_shutdown(void) | |||
2034 | * prevent it from being freed because parent's | 2034 | * prevent it from being freed because parent's |
2035 | * lock is to be held | 2035 | * lock is to be held |
2036 | */ | 2036 | */ |
2037 | get_device(dev->parent); | 2037 | parent = get_device(dev->parent); |
2038 | get_device(dev); | 2038 | get_device(dev); |
2039 | /* | 2039 | /* |
2040 | * Make sure the device is off the kset list, in the | 2040 | * Make sure the device is off the kset list, in the |
@@ -2044,8 +2044,8 @@ void device_shutdown(void) | |||
2044 | spin_unlock(&devices_kset->list_lock); | 2044 | spin_unlock(&devices_kset->list_lock); |
2045 | 2045 | ||
2046 | /* hold lock to avoid race with probe/release */ | 2046 | /* hold lock to avoid race with probe/release */ |
2047 | if (dev->parent) | 2047 | if (parent) |
2048 | device_lock(dev->parent); | 2048 | device_lock(parent); |
2049 | device_lock(dev); | 2049 | device_lock(dev); |
2050 | 2050 | ||
2051 | /* Don't allow any more runtime suspends */ | 2051 | /* Don't allow any more runtime suspends */ |
@@ -2063,11 +2063,11 @@ void device_shutdown(void) | |||
2063 | } | 2063 | } |
2064 | 2064 | ||
2065 | device_unlock(dev); | 2065 | device_unlock(dev); |
2066 | if (dev->parent) | 2066 | if (parent) |
2067 | device_unlock(dev->parent); | 2067 | device_unlock(parent); |
2068 | 2068 | ||
2069 | put_device(dev); | 2069 | put_device(dev); |
2070 | put_device(dev->parent); | 2070 | put_device(parent); |
2071 | 2071 | ||
2072 | spin_lock(&devices_kset->list_lock); | 2072 | spin_lock(&devices_kset->list_lock); |
2073 | } | 2073 | } |
diff --git a/drivers/block/cciss.c b/drivers/block/cciss.c index d2d95ff5353b..edfa2515bc86 100644 --- a/drivers/block/cciss.c +++ b/drivers/block/cciss.c | |||
@@ -1189,6 +1189,7 @@ static int cciss_ioctl32_passthru(struct block_device *bdev, fmode_t mode, | |||
1189 | int err; | 1189 | int err; |
1190 | u32 cp; | 1190 | u32 cp; |
1191 | 1191 | ||
1192 | memset(&arg64, 0, sizeof(arg64)); | ||
1192 | err = 0; | 1193 | err = 0; |
1193 | err |= | 1194 | err |= |
1194 | copy_from_user(&arg64.LUN_info, &arg32->LUN_info, | 1195 | copy_from_user(&arg64.LUN_info, &arg32->LUN_info, |
diff --git a/drivers/block/cpqarray.c b/drivers/block/cpqarray.c index 639d26b90b91..2b9440384536 100644 --- a/drivers/block/cpqarray.c +++ b/drivers/block/cpqarray.c | |||
@@ -1193,6 +1193,7 @@ out_passthru: | |||
1193 | ida_pci_info_struct pciinfo; | 1193 | ida_pci_info_struct pciinfo; |
1194 | 1194 | ||
1195 | if (!arg) return -EINVAL; | 1195 | if (!arg) return -EINVAL; |
1196 | memset(&pciinfo, 0, sizeof(pciinfo)); | ||
1196 | pciinfo.bus = host->pci_dev->bus->number; | 1197 | pciinfo.bus = host->pci_dev->bus->number; |
1197 | pciinfo.dev_fn = host->pci_dev->devfn; | 1198 | pciinfo.dev_fn = host->pci_dev->devfn; |
1198 | pciinfo.board_id = host->board_id; | 1199 | pciinfo.board_id = host->board_id; |
diff --git a/drivers/char/tpm/xen-tpmfront.c b/drivers/char/tpm/xen-tpmfront.c index 7a7929ba2658..06189e55b4e5 100644 --- a/drivers/char/tpm/xen-tpmfront.c +++ b/drivers/char/tpm/xen-tpmfront.c | |||
@@ -142,32 +142,6 @@ static int vtpm_recv(struct tpm_chip *chip, u8 *buf, size_t count) | |||
142 | return length; | 142 | return length; |
143 | } | 143 | } |
144 | 144 | ||
145 | ssize_t tpm_show_locality(struct device *dev, struct device_attribute *attr, | ||
146 | char *buf) | ||
147 | { | ||
148 | struct tpm_chip *chip = dev_get_drvdata(dev); | ||
149 | struct tpm_private *priv = TPM_VPRIV(chip); | ||
150 | u8 locality = priv->shr->locality; | ||
151 | |||
152 | return sprintf(buf, "%d\n", locality); | ||
153 | } | ||
154 | |||
155 | ssize_t tpm_store_locality(struct device *dev, struct device_attribute *attr, | ||
156 | const char *buf, size_t len) | ||
157 | { | ||
158 | struct tpm_chip *chip = dev_get_drvdata(dev); | ||
159 | struct tpm_private *priv = TPM_VPRIV(chip); | ||
160 | u8 val; | ||
161 | |||
162 | int rv = kstrtou8(buf, 0, &val); | ||
163 | if (rv) | ||
164 | return rv; | ||
165 | |||
166 | priv->shr->locality = val; | ||
167 | |||
168 | return len; | ||
169 | } | ||
170 | |||
171 | static const struct file_operations vtpm_ops = { | 145 | static const struct file_operations vtpm_ops = { |
172 | .owner = THIS_MODULE, | 146 | .owner = THIS_MODULE, |
173 | .llseek = no_llseek, | 147 | .llseek = no_llseek, |
@@ -188,8 +162,6 @@ static DEVICE_ATTR(caps, S_IRUGO, tpm_show_caps, NULL); | |||
188 | static DEVICE_ATTR(cancel, S_IWUSR | S_IWGRP, NULL, tpm_store_cancel); | 162 | static DEVICE_ATTR(cancel, S_IWUSR | S_IWGRP, NULL, tpm_store_cancel); |
189 | static DEVICE_ATTR(durations, S_IRUGO, tpm_show_durations, NULL); | 163 | static DEVICE_ATTR(durations, S_IRUGO, tpm_show_durations, NULL); |
190 | static DEVICE_ATTR(timeouts, S_IRUGO, tpm_show_timeouts, NULL); | 164 | static DEVICE_ATTR(timeouts, S_IRUGO, tpm_show_timeouts, NULL); |
191 | static DEVICE_ATTR(locality, S_IRUGO | S_IWUSR, tpm_show_locality, | ||
192 | tpm_store_locality); | ||
193 | 165 | ||
194 | static struct attribute *vtpm_attrs[] = { | 166 | static struct attribute *vtpm_attrs[] = { |
195 | &dev_attr_pubek.attr, | 167 | &dev_attr_pubek.attr, |
@@ -202,7 +174,6 @@ static struct attribute *vtpm_attrs[] = { | |||
202 | &dev_attr_cancel.attr, | 174 | &dev_attr_cancel.attr, |
203 | &dev_attr_durations.attr, | 175 | &dev_attr_durations.attr, |
204 | &dev_attr_timeouts.attr, | 176 | &dev_attr_timeouts.attr, |
205 | &dev_attr_locality.attr, | ||
206 | NULL, | 177 | NULL, |
207 | }; | 178 | }; |
208 | 179 | ||
@@ -210,8 +181,6 @@ static struct attribute_group vtpm_attr_grp = { | |||
210 | .attrs = vtpm_attrs, | 181 | .attrs = vtpm_attrs, |
211 | }; | 182 | }; |
212 | 183 | ||
213 | #define TPM_LONG_TIMEOUT (10 * 60 * HZ) | ||
214 | |||
215 | static const struct tpm_vendor_specific tpm_vtpm = { | 184 | static const struct tpm_vendor_specific tpm_vtpm = { |
216 | .status = vtpm_status, | 185 | .status = vtpm_status, |
217 | .recv = vtpm_recv, | 186 | .recv = vtpm_recv, |
@@ -224,11 +193,6 @@ static const struct tpm_vendor_specific tpm_vtpm = { | |||
224 | .miscdev = { | 193 | .miscdev = { |
225 | .fops = &vtpm_ops, | 194 | .fops = &vtpm_ops, |
226 | }, | 195 | }, |
227 | .duration = { | ||
228 | TPM_LONG_TIMEOUT, | ||
229 | TPM_LONG_TIMEOUT, | ||
230 | TPM_LONG_TIMEOUT, | ||
231 | }, | ||
232 | }; | 196 | }; |
233 | 197 | ||
234 | static irqreturn_t tpmif_interrupt(int dummy, void *dev_id) | 198 | static irqreturn_t tpmif_interrupt(int dummy, void *dev_id) |
diff --git a/drivers/clocksource/Kconfig b/drivers/clocksource/Kconfig index 41c69469ce20..971d796e071d 100644 --- a/drivers/clocksource/Kconfig +++ b/drivers/clocksource/Kconfig | |||
@@ -26,6 +26,7 @@ config DW_APB_TIMER_OF | |||
26 | 26 | ||
27 | config ARMADA_370_XP_TIMER | 27 | config ARMADA_370_XP_TIMER |
28 | bool | 28 | bool |
29 | select CLKSRC_OF | ||
29 | 30 | ||
30 | config ORION_TIMER | 31 | config ORION_TIMER |
31 | select CLKSRC_OF | 32 | select CLKSRC_OF |
diff --git a/drivers/clocksource/clksrc-of.c b/drivers/clocksource/clksrc-of.c index 37f5325bec95..b9ddd9e3a2f5 100644 --- a/drivers/clocksource/clksrc-of.c +++ b/drivers/clocksource/clksrc-of.c | |||
@@ -30,6 +30,9 @@ void __init clocksource_of_init(void) | |||
30 | clocksource_of_init_fn init_func; | 30 | clocksource_of_init_fn init_func; |
31 | 31 | ||
32 | for_each_matching_node_and_match(np, __clksrc_of_table, &match) { | 32 | for_each_matching_node_and_match(np, __clksrc_of_table, &match) { |
33 | if (!of_device_is_available(np)) | ||
34 | continue; | ||
35 | |||
33 | init_func = match->data; | 36 | init_func = match->data; |
34 | init_func(np); | 37 | init_func(np); |
35 | } | 38 | } |
diff --git a/drivers/clocksource/em_sti.c b/drivers/clocksource/em_sti.c index b9c81b7c3a3b..3a5909c12d42 100644 --- a/drivers/clocksource/em_sti.c +++ b/drivers/clocksource/em_sti.c | |||
@@ -301,7 +301,7 @@ static void em_sti_register_clockevent(struct em_sti_priv *p) | |||
301 | ced->name = dev_name(&p->pdev->dev); | 301 | ced->name = dev_name(&p->pdev->dev); |
302 | ced->features = CLOCK_EVT_FEAT_ONESHOT; | 302 | ced->features = CLOCK_EVT_FEAT_ONESHOT; |
303 | ced->rating = 200; | 303 | ced->rating = 200; |
304 | ced->cpumask = cpumask_of(0); | 304 | ced->cpumask = cpu_possible_mask; |
305 | ced->set_next_event = em_sti_clock_event_next; | 305 | ced->set_next_event = em_sti_clock_event_next; |
306 | ced->set_mode = em_sti_clock_event_mode; | 306 | ced->set_mode = em_sti_clock_event_mode; |
307 | 307 | ||
diff --git a/drivers/clocksource/exynos_mct.c b/drivers/clocksource/exynos_mct.c index 5b34768f4d7c..62b0de6a1837 100644 --- a/drivers/clocksource/exynos_mct.c +++ b/drivers/clocksource/exynos_mct.c | |||
@@ -428,7 +428,6 @@ static int exynos4_local_timer_setup(struct clock_event_device *evt) | |||
428 | evt->irq); | 428 | evt->irq); |
429 | return -EIO; | 429 | return -EIO; |
430 | } | 430 | } |
431 | irq_set_affinity(evt->irq, cpumask_of(cpu)); | ||
432 | } else { | 431 | } else { |
433 | enable_percpu_irq(mct_irqs[MCT_L0_IRQ], 0); | 432 | enable_percpu_irq(mct_irqs[MCT_L0_IRQ], 0); |
434 | } | 433 | } |
@@ -449,6 +448,7 @@ static int exynos4_mct_cpu_notify(struct notifier_block *self, | |||
449 | unsigned long action, void *hcpu) | 448 | unsigned long action, void *hcpu) |
450 | { | 449 | { |
451 | struct mct_clock_event_device *mevt; | 450 | struct mct_clock_event_device *mevt; |
451 | unsigned int cpu; | ||
452 | 452 | ||
453 | /* | 453 | /* |
454 | * Grab cpu pointer in each case to avoid spurious | 454 | * Grab cpu pointer in each case to avoid spurious |
@@ -459,6 +459,12 @@ static int exynos4_mct_cpu_notify(struct notifier_block *self, | |||
459 | mevt = this_cpu_ptr(&percpu_mct_tick); | 459 | mevt = this_cpu_ptr(&percpu_mct_tick); |
460 | exynos4_local_timer_setup(&mevt->evt); | 460 | exynos4_local_timer_setup(&mevt->evt); |
461 | break; | 461 | break; |
462 | case CPU_ONLINE: | ||
463 | cpu = (unsigned long)hcpu; | ||
464 | if (mct_int_type == MCT_INT_SPI) | ||
465 | irq_set_affinity(mct_irqs[MCT_L0_IRQ + cpu], | ||
466 | cpumask_of(cpu)); | ||
467 | break; | ||
462 | case CPU_DYING: | 468 | case CPU_DYING: |
463 | mevt = this_cpu_ptr(&percpu_mct_tick); | 469 | mevt = this_cpu_ptr(&percpu_mct_tick); |
464 | exynos4_local_timer_stop(&mevt->evt); | 470 | exynos4_local_timer_stop(&mevt->evt); |
@@ -500,6 +506,8 @@ static void __init exynos4_timer_resources(struct device_node *np, void __iomem | |||
500 | &percpu_mct_tick); | 506 | &percpu_mct_tick); |
501 | WARN(err, "MCT: can't request IRQ %d (%d)\n", | 507 | WARN(err, "MCT: can't request IRQ %d (%d)\n", |
502 | mct_irqs[MCT_L0_IRQ], err); | 508 | mct_irqs[MCT_L0_IRQ], err); |
509 | } else { | ||
510 | irq_set_affinity(mct_irqs[MCT_L0_IRQ], cpumask_of(0)); | ||
503 | } | 511 | } |
504 | 512 | ||
505 | err = register_cpu_notifier(&exynos4_mct_cpu_nb); | 513 | err = register_cpu_notifier(&exynos4_mct_cpu_nb); |
diff --git a/drivers/cpufreq/acpi-cpufreq.c b/drivers/cpufreq/acpi-cpufreq.c index a1260b4549db..d2c3253e015e 100644 --- a/drivers/cpufreq/acpi-cpufreq.c +++ b/drivers/cpufreq/acpi-cpufreq.c | |||
@@ -986,6 +986,10 @@ static int __init acpi_cpufreq_init(void) | |||
986 | { | 986 | { |
987 | int ret; | 987 | int ret; |
988 | 988 | ||
989 | /* don't keep reloading if cpufreq_driver exists */ | ||
990 | if (cpufreq_get_current_driver()) | ||
991 | return 0; | ||
992 | |||
989 | if (acpi_disabled) | 993 | if (acpi_disabled) |
990 | return 0; | 994 | return 0; |
991 | 995 | ||
diff --git a/drivers/cpufreq/cpufreq.c b/drivers/cpufreq/cpufreq.c index 89b3c52cd5c3..04548f7023af 100644 --- a/drivers/cpufreq/cpufreq.c +++ b/drivers/cpufreq/cpufreq.c | |||
@@ -1460,6 +1460,9 @@ unsigned int cpufreq_get(unsigned int cpu) | |||
1460 | { | 1460 | { |
1461 | unsigned int ret_freq = 0; | 1461 | unsigned int ret_freq = 0; |
1462 | 1462 | ||
1463 | if (cpufreq_disabled() || !cpufreq_driver) | ||
1464 | return -ENOENT; | ||
1465 | |||
1463 | if (!down_read_trylock(&cpufreq_rwsem)) | 1466 | if (!down_read_trylock(&cpufreq_rwsem)) |
1464 | return 0; | 1467 | return 0; |
1465 | 1468 | ||
diff --git a/drivers/cpufreq/exynos5440-cpufreq.c b/drivers/cpufreq/exynos5440-cpufreq.c index d514c152fd1a..be5380ecdcd4 100644 --- a/drivers/cpufreq/exynos5440-cpufreq.c +++ b/drivers/cpufreq/exynos5440-cpufreq.c | |||
@@ -457,7 +457,7 @@ err_free_table: | |||
457 | opp_free_cpufreq_table(dvfs_info->dev, &dvfs_info->freq_table); | 457 | opp_free_cpufreq_table(dvfs_info->dev, &dvfs_info->freq_table); |
458 | err_put_node: | 458 | err_put_node: |
459 | of_node_put(np); | 459 | of_node_put(np); |
460 | dev_err(dvfs_info->dev, "%s: failed initialization\n", __func__); | 460 | dev_err(&pdev->dev, "%s: failed initialization\n", __func__); |
461 | return ret; | 461 | return ret; |
462 | } | 462 | } |
463 | 463 | ||
diff --git a/drivers/gpu/drm/i2c/tda998x_drv.c b/drivers/gpu/drm/i2c/tda998x_drv.c index b1f8fc69023f..60e84043aa34 100644 --- a/drivers/gpu/drm/i2c/tda998x_drv.c +++ b/drivers/gpu/drm/i2c/tda998x_drv.c | |||
@@ -707,8 +707,7 @@ tda998x_encoder_dpms(struct drm_encoder *encoder, int mode) | |||
707 | reg_write(encoder, REG_VIP_CNTRL_2, priv->vip_cntrl_2); | 707 | reg_write(encoder, REG_VIP_CNTRL_2, priv->vip_cntrl_2); |
708 | break; | 708 | break; |
709 | case DRM_MODE_DPMS_OFF: | 709 | case DRM_MODE_DPMS_OFF: |
710 | /* disable audio and video ports */ | 710 | /* disable video ports */ |
711 | reg_write(encoder, REG_ENA_AP, 0x00); | ||
712 | reg_write(encoder, REG_ENA_VP_0, 0x00); | 711 | reg_write(encoder, REG_ENA_VP_0, 0x00); |
713 | reg_write(encoder, REG_ENA_VP_1, 0x00); | 712 | reg_write(encoder, REG_ENA_VP_1, 0x00); |
714 | reg_write(encoder, REG_ENA_VP_2, 0x00); | 713 | reg_write(encoder, REG_ENA_VP_2, 0x00); |
diff --git a/drivers/gpu/drm/i915/i915_gem.c b/drivers/gpu/drm/i915/i915_gem.c index df9253d890ee..cdfb9da0e4ce 100644 --- a/drivers/gpu/drm/i915/i915_gem.c +++ b/drivers/gpu/drm/i915/i915_gem.c | |||
@@ -4800,10 +4800,10 @@ i915_gem_inactive_count(struct shrinker *shrinker, struct shrink_control *sc) | |||
4800 | 4800 | ||
4801 | if (!mutex_trylock(&dev->struct_mutex)) { | 4801 | if (!mutex_trylock(&dev->struct_mutex)) { |
4802 | if (!mutex_is_locked_by(&dev->struct_mutex, current)) | 4802 | if (!mutex_is_locked_by(&dev->struct_mutex, current)) |
4803 | return SHRINK_STOP; | 4803 | return 0; |
4804 | 4804 | ||
4805 | if (dev_priv->mm.shrinker_no_lock_stealing) | 4805 | if (dev_priv->mm.shrinker_no_lock_stealing) |
4806 | return SHRINK_STOP; | 4806 | return 0; |
4807 | 4807 | ||
4808 | unlock = false; | 4808 | unlock = false; |
4809 | } | 4809 | } |
@@ -4901,10 +4901,10 @@ i915_gem_inactive_scan(struct shrinker *shrinker, struct shrink_control *sc) | |||
4901 | 4901 | ||
4902 | if (!mutex_trylock(&dev->struct_mutex)) { | 4902 | if (!mutex_trylock(&dev->struct_mutex)) { |
4903 | if (!mutex_is_locked_by(&dev->struct_mutex, current)) | 4903 | if (!mutex_is_locked_by(&dev->struct_mutex, current)) |
4904 | return 0; | 4904 | return SHRINK_STOP; |
4905 | 4905 | ||
4906 | if (dev_priv->mm.shrinker_no_lock_stealing) | 4906 | if (dev_priv->mm.shrinker_no_lock_stealing) |
4907 | return 0; | 4907 | return SHRINK_STOP; |
4908 | 4908 | ||
4909 | unlock = false; | 4909 | unlock = false; |
4910 | } | 4910 | } |
diff --git a/drivers/gpu/drm/i915/i915_gpu_error.c b/drivers/gpu/drm/i915/i915_gpu_error.c index aba9d7498996..dae364f0028c 100644 --- a/drivers/gpu/drm/i915/i915_gpu_error.c +++ b/drivers/gpu/drm/i915/i915_gpu_error.c | |||
@@ -143,8 +143,10 @@ static void i915_error_vprintf(struct drm_i915_error_state_buf *e, | |||
143 | 143 | ||
144 | /* Seek the first printf which is hits start position */ | 144 | /* Seek the first printf which is hits start position */ |
145 | if (e->pos < e->start) { | 145 | if (e->pos < e->start) { |
146 | len = vsnprintf(NULL, 0, f, args); | 146 | va_list tmp; |
147 | if (!__i915_error_seek(e, len)) | 147 | |
148 | va_copy(tmp, args); | ||
149 | if (!__i915_error_seek(e, vsnprintf(NULL, 0, f, tmp))) | ||
148 | return; | 150 | return; |
149 | } | 151 | } |
150 | 152 | ||
diff --git a/drivers/gpu/drm/i915/intel_display.c b/drivers/gpu/drm/i915/intel_display.c index d8a1d98693e7..e5822e79f912 100644 --- a/drivers/gpu/drm/i915/intel_display.c +++ b/drivers/gpu/drm/i915/intel_display.c | |||
@@ -4775,6 +4775,10 @@ static void i9xx_set_pipeconf(struct intel_crtc *intel_crtc) | |||
4775 | 4775 | ||
4776 | pipeconf = 0; | 4776 | pipeconf = 0; |
4777 | 4777 | ||
4778 | if (dev_priv->quirks & QUIRK_PIPEA_FORCE && | ||
4779 | I915_READ(PIPECONF(intel_crtc->pipe)) & PIPECONF_ENABLE) | ||
4780 | pipeconf |= PIPECONF_ENABLE; | ||
4781 | |||
4778 | if (intel_crtc->pipe == 0 && INTEL_INFO(dev)->gen < 4) { | 4782 | if (intel_crtc->pipe == 0 && INTEL_INFO(dev)->gen < 4) { |
4779 | /* Enable pixel doubling when the dot clock is > 90% of the (display) | 4783 | /* Enable pixel doubling when the dot clock is > 90% of the (display) |
4780 | * core speed. | 4784 | * core speed. |
diff --git a/drivers/gpu/drm/i915/intel_dp.c b/drivers/gpu/drm/i915/intel_dp.c index 2151d13772b8..79c14e298ba6 100644 --- a/drivers/gpu/drm/i915/intel_dp.c +++ b/drivers/gpu/drm/i915/intel_dp.c | |||
@@ -588,7 +588,18 @@ intel_dp_i2c_aux_ch(struct i2c_adapter *adapter, int mode, | |||
588 | DRM_DEBUG_KMS("aux_ch native nack\n"); | 588 | DRM_DEBUG_KMS("aux_ch native nack\n"); |
589 | return -EREMOTEIO; | 589 | return -EREMOTEIO; |
590 | case AUX_NATIVE_REPLY_DEFER: | 590 | case AUX_NATIVE_REPLY_DEFER: |
591 | udelay(100); | 591 | /* |
592 | * For now, just give more slack to branch devices. We | ||
593 | * could check the DPCD for I2C bit rate capabilities, | ||
594 | * and if available, adjust the interval. We could also | ||
595 | * be more careful with DP-to-Legacy adapters where a | ||
596 | * long legacy cable may force very low I2C bit rates. | ||
597 | */ | ||
598 | if (intel_dp->dpcd[DP_DOWNSTREAMPORT_PRESENT] & | ||
599 | DP_DWN_STRM_PORT_PRESENT) | ||
600 | usleep_range(500, 600); | ||
601 | else | ||
602 | usleep_range(300, 400); | ||
592 | continue; | 603 | continue; |
593 | default: | 604 | default: |
594 | DRM_ERROR("aux_ch invalid native reply 0x%02x\n", | 605 | DRM_ERROR("aux_ch invalid native reply 0x%02x\n", |
diff --git a/drivers/gpu/drm/i915/intel_tv.c b/drivers/gpu/drm/i915/intel_tv.c index f2c6d7909ae2..dd6f84bf6c22 100644 --- a/drivers/gpu/drm/i915/intel_tv.c +++ b/drivers/gpu/drm/i915/intel_tv.c | |||
@@ -916,6 +916,14 @@ intel_tv_compute_config(struct intel_encoder *encoder, | |||
916 | DRM_DEBUG_KMS("forcing bpc to 8 for TV\n"); | 916 | DRM_DEBUG_KMS("forcing bpc to 8 for TV\n"); |
917 | pipe_config->pipe_bpp = 8*3; | 917 | pipe_config->pipe_bpp = 8*3; |
918 | 918 | ||
919 | /* TV has it's own notion of sync and other mode flags, so clear them. */ | ||
920 | pipe_config->adjusted_mode.flags = 0; | ||
921 | |||
922 | /* | ||
923 | * FIXME: We don't check whether the input mode is actually what we want | ||
924 | * or whether userspace is doing something stupid. | ||
925 | */ | ||
926 | |||
919 | return true; | 927 | return true; |
920 | } | 928 | } |
921 | 929 | ||
diff --git a/drivers/gpu/drm/msm/mdp4/mdp4_kms.c b/drivers/gpu/drm/msm/mdp4/mdp4_kms.c index 5db5bbaedae2..bc7fd11ad8be 100644 --- a/drivers/gpu/drm/msm/mdp4/mdp4_kms.c +++ b/drivers/gpu/drm/msm/mdp4/mdp4_kms.c | |||
@@ -19,8 +19,6 @@ | |||
19 | #include "msm_drv.h" | 19 | #include "msm_drv.h" |
20 | #include "mdp4_kms.h" | 20 | #include "mdp4_kms.h" |
21 | 21 | ||
22 | #include <mach/iommu.h> | ||
23 | |||
24 | static struct mdp4_platform_config *mdp4_get_config(struct platform_device *dev); | 22 | static struct mdp4_platform_config *mdp4_get_config(struct platform_device *dev); |
25 | 23 | ||
26 | static int mdp4_hw_init(struct msm_kms *kms) | 24 | static int mdp4_hw_init(struct msm_kms *kms) |
diff --git a/drivers/gpu/drm/msm/msm_drv.c b/drivers/gpu/drm/msm/msm_drv.c index 008d772384c7..b3a2f1629041 100644 --- a/drivers/gpu/drm/msm/msm_drv.c +++ b/drivers/gpu/drm/msm/msm_drv.c | |||
@@ -18,8 +18,6 @@ | |||
18 | #include "msm_drv.h" | 18 | #include "msm_drv.h" |
19 | #include "msm_gpu.h" | 19 | #include "msm_gpu.h" |
20 | 20 | ||
21 | #include <mach/iommu.h> | ||
22 | |||
23 | static void msm_fb_output_poll_changed(struct drm_device *dev) | 21 | static void msm_fb_output_poll_changed(struct drm_device *dev) |
24 | { | 22 | { |
25 | struct msm_drm_private *priv = dev->dev_private; | 23 | struct msm_drm_private *priv = dev->dev_private; |
@@ -62,6 +60,8 @@ int msm_iommu_attach(struct drm_device *dev, struct iommu_domain *iommu, | |||
62 | int i, ret; | 60 | int i, ret; |
63 | 61 | ||
64 | for (i = 0; i < cnt; i++) { | 62 | for (i = 0; i < cnt; i++) { |
63 | /* TODO maybe some day msm iommu won't require this hack: */ | ||
64 | struct device *msm_iommu_get_ctx(const char *ctx_name); | ||
65 | struct device *ctx = msm_iommu_get_ctx(names[i]); | 65 | struct device *ctx = msm_iommu_get_ctx(names[i]); |
66 | if (!ctx) | 66 | if (!ctx) |
67 | continue; | 67 | continue; |
@@ -199,7 +199,7 @@ static int msm_load(struct drm_device *dev, unsigned long flags) | |||
199 | * imx drm driver on iMX5 | 199 | * imx drm driver on iMX5 |
200 | */ | 200 | */ |
201 | dev_err(dev->dev, "failed to load kms\n"); | 201 | dev_err(dev->dev, "failed to load kms\n"); |
202 | ret = PTR_ERR(priv->kms); | 202 | ret = PTR_ERR(kms); |
203 | goto fail; | 203 | goto fail; |
204 | } | 204 | } |
205 | 205 | ||
@@ -697,7 +697,7 @@ static struct drm_driver msm_driver = { | |||
697 | .gem_vm_ops = &vm_ops, | 697 | .gem_vm_ops = &vm_ops, |
698 | .dumb_create = msm_gem_dumb_create, | 698 | .dumb_create = msm_gem_dumb_create, |
699 | .dumb_map_offset = msm_gem_dumb_map_offset, | 699 | .dumb_map_offset = msm_gem_dumb_map_offset, |
700 | .dumb_destroy = msm_gem_dumb_destroy, | 700 | .dumb_destroy = drm_gem_dumb_destroy, |
701 | #ifdef CONFIG_DEBUG_FS | 701 | #ifdef CONFIG_DEBUG_FS |
702 | .debugfs_init = msm_debugfs_init, | 702 | .debugfs_init = msm_debugfs_init, |
703 | .debugfs_cleanup = msm_debugfs_cleanup, | 703 | .debugfs_cleanup = msm_debugfs_cleanup, |
diff --git a/drivers/gpu/drm/msm/msm_gem.c b/drivers/gpu/drm/msm/msm_gem.c index 29eacfa29cfb..2bae46c66a30 100644 --- a/drivers/gpu/drm/msm/msm_gem.c +++ b/drivers/gpu/drm/msm/msm_gem.c | |||
@@ -319,13 +319,6 @@ int msm_gem_dumb_create(struct drm_file *file, struct drm_device *dev, | |||
319 | MSM_BO_SCANOUT | MSM_BO_WC, &args->handle); | 319 | MSM_BO_SCANOUT | MSM_BO_WC, &args->handle); |
320 | } | 320 | } |
321 | 321 | ||
322 | int msm_gem_dumb_destroy(struct drm_file *file, struct drm_device *dev, | ||
323 | uint32_t handle) | ||
324 | { | ||
325 | /* No special work needed, drop the reference and see what falls out */ | ||
326 | return drm_gem_handle_delete(file, handle); | ||
327 | } | ||
328 | |||
329 | int msm_gem_dumb_map_offset(struct drm_file *file, struct drm_device *dev, | 322 | int msm_gem_dumb_map_offset(struct drm_file *file, struct drm_device *dev, |
330 | uint32_t handle, uint64_t *offset) | 323 | uint32_t handle, uint64_t *offset) |
331 | { | 324 | { |
diff --git a/drivers/gpu/drm/radeon/btc_dpm.c b/drivers/gpu/drm/radeon/btc_dpm.c index 05ff315e8e9e..b162e98a2953 100644 --- a/drivers/gpu/drm/radeon/btc_dpm.c +++ b/drivers/gpu/drm/radeon/btc_dpm.c | |||
@@ -1168,6 +1168,23 @@ static const struct radeon_blacklist_clocks btc_blacklist_clocks[] = | |||
1168 | { 25000, 30000, RADEON_SCLK_UP } | 1168 | { 25000, 30000, RADEON_SCLK_UP } |
1169 | }; | 1169 | }; |
1170 | 1170 | ||
1171 | void btc_get_max_clock_from_voltage_dependency_table(struct radeon_clock_voltage_dependency_table *table, | ||
1172 | u32 *max_clock) | ||
1173 | { | ||
1174 | u32 i, clock = 0; | ||
1175 | |||
1176 | if ((table == NULL) || (table->count == 0)) { | ||
1177 | *max_clock = clock; | ||
1178 | return; | ||
1179 | } | ||
1180 | |||
1181 | for (i = 0; i < table->count; i++) { | ||
1182 | if (clock < table->entries[i].clk) | ||
1183 | clock = table->entries[i].clk; | ||
1184 | } | ||
1185 | *max_clock = clock; | ||
1186 | } | ||
1187 | |||
1171 | void btc_apply_voltage_dependency_rules(struct radeon_clock_voltage_dependency_table *table, | 1188 | void btc_apply_voltage_dependency_rules(struct radeon_clock_voltage_dependency_table *table, |
1172 | u32 clock, u16 max_voltage, u16 *voltage) | 1189 | u32 clock, u16 max_voltage, u16 *voltage) |
1173 | { | 1190 | { |
@@ -2080,6 +2097,7 @@ static void btc_apply_state_adjust_rules(struct radeon_device *rdev, | |||
2080 | bool disable_mclk_switching; | 2097 | bool disable_mclk_switching; |
2081 | u32 mclk, sclk; | 2098 | u32 mclk, sclk; |
2082 | u16 vddc, vddci; | 2099 | u16 vddc, vddci; |
2100 | u32 max_sclk_vddc, max_mclk_vddci, max_mclk_vddc; | ||
2083 | 2101 | ||
2084 | if ((rdev->pm.dpm.new_active_crtc_count > 1) || | 2102 | if ((rdev->pm.dpm.new_active_crtc_count > 1) || |
2085 | btc_dpm_vblank_too_short(rdev)) | 2103 | btc_dpm_vblank_too_short(rdev)) |
@@ -2121,6 +2139,39 @@ static void btc_apply_state_adjust_rules(struct radeon_device *rdev, | |||
2121 | ps->low.vddci = max_limits->vddci; | 2139 | ps->low.vddci = max_limits->vddci; |
2122 | } | 2140 | } |
2123 | 2141 | ||
2142 | /* limit clocks to max supported clocks based on voltage dependency tables */ | ||
2143 | btc_get_max_clock_from_voltage_dependency_table(&rdev->pm.dpm.dyn_state.vddc_dependency_on_sclk, | ||
2144 | &max_sclk_vddc); | ||
2145 | btc_get_max_clock_from_voltage_dependency_table(&rdev->pm.dpm.dyn_state.vddci_dependency_on_mclk, | ||
2146 | &max_mclk_vddci); | ||
2147 | btc_get_max_clock_from_voltage_dependency_table(&rdev->pm.dpm.dyn_state.vddc_dependency_on_mclk, | ||
2148 | &max_mclk_vddc); | ||
2149 | |||
2150 | if (max_sclk_vddc) { | ||
2151 | if (ps->low.sclk > max_sclk_vddc) | ||
2152 | ps->low.sclk = max_sclk_vddc; | ||
2153 | if (ps->medium.sclk > max_sclk_vddc) | ||
2154 | ps->medium.sclk = max_sclk_vddc; | ||
2155 | if (ps->high.sclk > max_sclk_vddc) | ||
2156 | ps->high.sclk = max_sclk_vddc; | ||
2157 | } | ||
2158 | if (max_mclk_vddci) { | ||
2159 | if (ps->low.mclk > max_mclk_vddci) | ||
2160 | ps->low.mclk = max_mclk_vddci; | ||
2161 | if (ps->medium.mclk > max_mclk_vddci) | ||
2162 | ps->medium.mclk = max_mclk_vddci; | ||
2163 | if (ps->high.mclk > max_mclk_vddci) | ||
2164 | ps->high.mclk = max_mclk_vddci; | ||
2165 | } | ||
2166 | if (max_mclk_vddc) { | ||
2167 | if (ps->low.mclk > max_mclk_vddc) | ||
2168 | ps->low.mclk = max_mclk_vddc; | ||
2169 | if (ps->medium.mclk > max_mclk_vddc) | ||
2170 | ps->medium.mclk = max_mclk_vddc; | ||
2171 | if (ps->high.mclk > max_mclk_vddc) | ||
2172 | ps->high.mclk = max_mclk_vddc; | ||
2173 | } | ||
2174 | |||
2124 | /* XXX validate the min clocks required for display */ | 2175 | /* XXX validate the min clocks required for display */ |
2125 | 2176 | ||
2126 | if (disable_mclk_switching) { | 2177 | if (disable_mclk_switching) { |
diff --git a/drivers/gpu/drm/radeon/btc_dpm.h b/drivers/gpu/drm/radeon/btc_dpm.h index 1a15e0e41950..3b6f12b7760b 100644 --- a/drivers/gpu/drm/radeon/btc_dpm.h +++ b/drivers/gpu/drm/radeon/btc_dpm.h | |||
@@ -46,6 +46,8 @@ void btc_adjust_clock_combinations(struct radeon_device *rdev, | |||
46 | struct rv7xx_pl *pl); | 46 | struct rv7xx_pl *pl); |
47 | void btc_apply_voltage_dependency_rules(struct radeon_clock_voltage_dependency_table *table, | 47 | void btc_apply_voltage_dependency_rules(struct radeon_clock_voltage_dependency_table *table, |
48 | u32 clock, u16 max_voltage, u16 *voltage); | 48 | u32 clock, u16 max_voltage, u16 *voltage); |
49 | void btc_get_max_clock_from_voltage_dependency_table(struct radeon_clock_voltage_dependency_table *table, | ||
50 | u32 *max_clock); | ||
49 | void btc_apply_voltage_delta_rules(struct radeon_device *rdev, | 51 | void btc_apply_voltage_delta_rules(struct radeon_device *rdev, |
50 | u16 max_vddc, u16 max_vddci, | 52 | u16 max_vddc, u16 max_vddci, |
51 | u16 *vddc, u16 *vddci); | 53 | u16 *vddc, u16 *vddci); |
diff --git a/drivers/gpu/drm/radeon/ci_dpm.c b/drivers/gpu/drm/radeon/ci_dpm.c index 899627443030..51e947a97edf 100644 --- a/drivers/gpu/drm/radeon/ci_dpm.c +++ b/drivers/gpu/drm/radeon/ci_dpm.c | |||
@@ -146,6 +146,8 @@ static const struct ci_pt_config_reg didt_config_ci[] = | |||
146 | }; | 146 | }; |
147 | 147 | ||
148 | extern u8 rv770_get_memory_module_index(struct radeon_device *rdev); | 148 | extern u8 rv770_get_memory_module_index(struct radeon_device *rdev); |
149 | extern void btc_get_max_clock_from_voltage_dependency_table(struct radeon_clock_voltage_dependency_table *table, | ||
150 | u32 *max_clock); | ||
149 | extern int ni_copy_and_switch_arb_sets(struct radeon_device *rdev, | 151 | extern int ni_copy_and_switch_arb_sets(struct radeon_device *rdev, |
150 | u32 arb_freq_src, u32 arb_freq_dest); | 152 | u32 arb_freq_src, u32 arb_freq_dest); |
151 | extern u8 si_get_ddr3_mclk_frequency_ratio(u32 memory_clock); | 153 | extern u8 si_get_ddr3_mclk_frequency_ratio(u32 memory_clock); |
@@ -712,6 +714,7 @@ static void ci_apply_state_adjust_rules(struct radeon_device *rdev, | |||
712 | struct radeon_clock_and_voltage_limits *max_limits; | 714 | struct radeon_clock_and_voltage_limits *max_limits; |
713 | bool disable_mclk_switching; | 715 | bool disable_mclk_switching; |
714 | u32 sclk, mclk; | 716 | u32 sclk, mclk; |
717 | u32 max_sclk_vddc, max_mclk_vddci, max_mclk_vddc; | ||
715 | int i; | 718 | int i; |
716 | 719 | ||
717 | if ((rdev->pm.dpm.new_active_crtc_count > 1) || | 720 | if ((rdev->pm.dpm.new_active_crtc_count > 1) || |
@@ -739,6 +742,29 @@ static void ci_apply_state_adjust_rules(struct radeon_device *rdev, | |||
739 | } | 742 | } |
740 | } | 743 | } |
741 | 744 | ||
745 | /* limit clocks to max supported clocks based on voltage dependency tables */ | ||
746 | btc_get_max_clock_from_voltage_dependency_table(&rdev->pm.dpm.dyn_state.vddc_dependency_on_sclk, | ||
747 | &max_sclk_vddc); | ||
748 | btc_get_max_clock_from_voltage_dependency_table(&rdev->pm.dpm.dyn_state.vddci_dependency_on_mclk, | ||
749 | &max_mclk_vddci); | ||
750 | btc_get_max_clock_from_voltage_dependency_table(&rdev->pm.dpm.dyn_state.vddc_dependency_on_mclk, | ||
751 | &max_mclk_vddc); | ||
752 | |||
753 | for (i = 0; i < ps->performance_level_count; i++) { | ||
754 | if (max_sclk_vddc) { | ||
755 | if (ps->performance_levels[i].sclk > max_sclk_vddc) | ||
756 | ps->performance_levels[i].sclk = max_sclk_vddc; | ||
757 | } | ||
758 | if (max_mclk_vddci) { | ||
759 | if (ps->performance_levels[i].mclk > max_mclk_vddci) | ||
760 | ps->performance_levels[i].mclk = max_mclk_vddci; | ||
761 | } | ||
762 | if (max_mclk_vddc) { | ||
763 | if (ps->performance_levels[i].mclk > max_mclk_vddc) | ||
764 | ps->performance_levels[i].mclk = max_mclk_vddc; | ||
765 | } | ||
766 | } | ||
767 | |||
742 | /* XXX validate the min clocks required for display */ | 768 | /* XXX validate the min clocks required for display */ |
743 | 769 | ||
744 | if (disable_mclk_switching) { | 770 | if (disable_mclk_switching) { |
diff --git a/drivers/gpu/drm/radeon/cik.c b/drivers/gpu/drm/radeon/cik.c index adbdb6503b05..d02fd1c045d5 100644 --- a/drivers/gpu/drm/radeon/cik.c +++ b/drivers/gpu/drm/radeon/cik.c | |||
@@ -2845,10 +2845,8 @@ static void cik_gpu_init(struct radeon_device *rdev) | |||
2845 | rdev->config.cik.tile_config |= (3 << 0); | 2845 | rdev->config.cik.tile_config |= (3 << 0); |
2846 | break; | 2846 | break; |
2847 | } | 2847 | } |
2848 | if ((mc_arb_ramcfg & NOOFBANK_MASK) >> NOOFBANK_SHIFT) | 2848 | rdev->config.cik.tile_config |= |
2849 | rdev->config.cik.tile_config |= 1 << 4; | 2849 | ((mc_arb_ramcfg & NOOFBANK_MASK) >> NOOFBANK_SHIFT) << 4; |
2850 | else | ||
2851 | rdev->config.cik.tile_config |= 0 << 4; | ||
2852 | rdev->config.cik.tile_config |= | 2850 | rdev->config.cik.tile_config |= |
2853 | ((gb_addr_config & PIPE_INTERLEAVE_SIZE_MASK) >> PIPE_INTERLEAVE_SIZE_SHIFT) << 8; | 2851 | ((gb_addr_config & PIPE_INTERLEAVE_SIZE_MASK) >> PIPE_INTERLEAVE_SIZE_SHIFT) << 8; |
2854 | rdev->config.cik.tile_config |= | 2852 | rdev->config.cik.tile_config |= |
@@ -4456,8 +4454,8 @@ static int cik_mc_init(struct radeon_device *rdev) | |||
4456 | rdev->mc.aper_base = pci_resource_start(rdev->pdev, 0); | 4454 | rdev->mc.aper_base = pci_resource_start(rdev->pdev, 0); |
4457 | rdev->mc.aper_size = pci_resource_len(rdev->pdev, 0); | 4455 | rdev->mc.aper_size = pci_resource_len(rdev->pdev, 0); |
4458 | /* size in MB on si */ | 4456 | /* size in MB on si */ |
4459 | rdev->mc.mc_vram_size = RREG32(CONFIG_MEMSIZE) * 1024 * 1024; | 4457 | rdev->mc.mc_vram_size = RREG32(CONFIG_MEMSIZE) * 1024ULL * 1024ULL; |
4460 | rdev->mc.real_vram_size = RREG32(CONFIG_MEMSIZE) * 1024 * 1024; | 4458 | rdev->mc.real_vram_size = RREG32(CONFIG_MEMSIZE) * 1024ULL * 1024ULL; |
4461 | rdev->mc.visible_vram_size = rdev->mc.aper_size; | 4459 | rdev->mc.visible_vram_size = rdev->mc.aper_size; |
4462 | si_vram_gtt_location(rdev, &rdev->mc); | 4460 | si_vram_gtt_location(rdev, &rdev->mc); |
4463 | radeon_update_bandwidth_info(rdev); | 4461 | radeon_update_bandwidth_info(rdev); |
@@ -4735,12 +4733,13 @@ static void cik_vm_decode_fault(struct radeon_device *rdev, | |||
4735 | u32 mc_id = (status & MEMORY_CLIENT_ID_MASK) >> MEMORY_CLIENT_ID_SHIFT; | 4733 | u32 mc_id = (status & MEMORY_CLIENT_ID_MASK) >> MEMORY_CLIENT_ID_SHIFT; |
4736 | u32 vmid = (status & FAULT_VMID_MASK) >> FAULT_VMID_SHIFT; | 4734 | u32 vmid = (status & FAULT_VMID_MASK) >> FAULT_VMID_SHIFT; |
4737 | u32 protections = (status & PROTECTIONS_MASK) >> PROTECTIONS_SHIFT; | 4735 | u32 protections = (status & PROTECTIONS_MASK) >> PROTECTIONS_SHIFT; |
4738 | char *block = (char *)&mc_client; | 4736 | char block[5] = { mc_client >> 24, (mc_client >> 16) & 0xff, |
4737 | (mc_client >> 8) & 0xff, mc_client & 0xff, 0 }; | ||
4739 | 4738 | ||
4740 | printk("VM fault (0x%02x, vmid %d) at page %u, %s from %s (%d)\n", | 4739 | printk("VM fault (0x%02x, vmid %d) at page %u, %s from '%s' (0x%08x) (%d)\n", |
4741 | protections, vmid, addr, | 4740 | protections, vmid, addr, |
4742 | (status & MEMORY_CLIENT_RW_MASK) ? "write" : "read", | 4741 | (status & MEMORY_CLIENT_RW_MASK) ? "write" : "read", |
4743 | block, mc_id); | 4742 | block, mc_client, mc_id); |
4744 | } | 4743 | } |
4745 | 4744 | ||
4746 | /** | 4745 | /** |
diff --git a/drivers/gpu/drm/radeon/ni_dpm.c b/drivers/gpu/drm/radeon/ni_dpm.c index 6c398a456d78..f26339028154 100644 --- a/drivers/gpu/drm/radeon/ni_dpm.c +++ b/drivers/gpu/drm/radeon/ni_dpm.c | |||
@@ -787,6 +787,7 @@ static void ni_apply_state_adjust_rules(struct radeon_device *rdev, | |||
787 | bool disable_mclk_switching; | 787 | bool disable_mclk_switching; |
788 | u32 mclk, sclk; | 788 | u32 mclk, sclk; |
789 | u16 vddc, vddci; | 789 | u16 vddc, vddci; |
790 | u32 max_sclk_vddc, max_mclk_vddci, max_mclk_vddc; | ||
790 | int i; | 791 | int i; |
791 | 792 | ||
792 | if ((rdev->pm.dpm.new_active_crtc_count > 1) || | 793 | if ((rdev->pm.dpm.new_active_crtc_count > 1) || |
@@ -813,6 +814,29 @@ static void ni_apply_state_adjust_rules(struct radeon_device *rdev, | |||
813 | } | 814 | } |
814 | } | 815 | } |
815 | 816 | ||
817 | /* limit clocks to max supported clocks based on voltage dependency tables */ | ||
818 | btc_get_max_clock_from_voltage_dependency_table(&rdev->pm.dpm.dyn_state.vddc_dependency_on_sclk, | ||
819 | &max_sclk_vddc); | ||
820 | btc_get_max_clock_from_voltage_dependency_table(&rdev->pm.dpm.dyn_state.vddci_dependency_on_mclk, | ||
821 | &max_mclk_vddci); | ||
822 | btc_get_max_clock_from_voltage_dependency_table(&rdev->pm.dpm.dyn_state.vddc_dependency_on_mclk, | ||
823 | &max_mclk_vddc); | ||
824 | |||
825 | for (i = 0; i < ps->performance_level_count; i++) { | ||
826 | if (max_sclk_vddc) { | ||
827 | if (ps->performance_levels[i].sclk > max_sclk_vddc) | ||
828 | ps->performance_levels[i].sclk = max_sclk_vddc; | ||
829 | } | ||
830 | if (max_mclk_vddci) { | ||
831 | if (ps->performance_levels[i].mclk > max_mclk_vddci) | ||
832 | ps->performance_levels[i].mclk = max_mclk_vddci; | ||
833 | } | ||
834 | if (max_mclk_vddc) { | ||
835 | if (ps->performance_levels[i].mclk > max_mclk_vddc) | ||
836 | ps->performance_levels[i].mclk = max_mclk_vddc; | ||
837 | } | ||
838 | } | ||
839 | |||
816 | /* XXX validate the min clocks required for display */ | 840 | /* XXX validate the min clocks required for display */ |
817 | 841 | ||
818 | if (disable_mclk_switching) { | 842 | if (disable_mclk_switching) { |
diff --git a/drivers/gpu/drm/radeon/r100.c b/drivers/gpu/drm/radeon/r100.c index 24175717307b..d71333033b2b 100644 --- a/drivers/gpu/drm/radeon/r100.c +++ b/drivers/gpu/drm/radeon/r100.c | |||
@@ -2933,9 +2933,11 @@ static int r100_debugfs_cp_ring_info(struct seq_file *m, void *data) | |||
2933 | seq_printf(m, "CP_RB_RPTR 0x%08x\n", rdp); | 2933 | seq_printf(m, "CP_RB_RPTR 0x%08x\n", rdp); |
2934 | seq_printf(m, "%u free dwords in ring\n", ring->ring_free_dw); | 2934 | seq_printf(m, "%u free dwords in ring\n", ring->ring_free_dw); |
2935 | seq_printf(m, "%u dwords in ring\n", count); | 2935 | seq_printf(m, "%u dwords in ring\n", count); |
2936 | for (j = 0; j <= count; j++) { | 2936 | if (ring->ready) { |
2937 | i = (rdp + j) & ring->ptr_mask; | 2937 | for (j = 0; j <= count; j++) { |
2938 | seq_printf(m, "r[%04d]=0x%08x\n", i, ring->ring[i]); | 2938 | i = (rdp + j) & ring->ptr_mask; |
2939 | seq_printf(m, "r[%04d]=0x%08x\n", i, ring->ring[i]); | ||
2940 | } | ||
2939 | } | 2941 | } |
2940 | return 0; | 2942 | return 0; |
2941 | } | 2943 | } |
diff --git a/drivers/gpu/drm/radeon/r600_dpm.c b/drivers/gpu/drm/radeon/r600_dpm.c index e65f211a7be0..5513d8f06252 100644 --- a/drivers/gpu/drm/radeon/r600_dpm.c +++ b/drivers/gpu/drm/radeon/r600_dpm.c | |||
@@ -1084,7 +1084,7 @@ int r600_parse_extended_power_table(struct radeon_device *rdev) | |||
1084 | rdev->pm.dpm.dyn_state.uvd_clock_voltage_dependency_table.entries[i].dclk = | 1084 | rdev->pm.dpm.dyn_state.uvd_clock_voltage_dependency_table.entries[i].dclk = |
1085 | le16_to_cpu(uvd_clk->usDClkLow) | (uvd_clk->ucDClkHigh << 16); | 1085 | le16_to_cpu(uvd_clk->usDClkLow) | (uvd_clk->ucDClkHigh << 16); |
1086 | rdev->pm.dpm.dyn_state.uvd_clock_voltage_dependency_table.entries[i].v = | 1086 | rdev->pm.dpm.dyn_state.uvd_clock_voltage_dependency_table.entries[i].v = |
1087 | le16_to_cpu(limits->entries[i].usVoltage); | 1087 | le16_to_cpu(entry->usVoltage); |
1088 | entry = (ATOM_PPLIB_UVD_Clock_Voltage_Limit_Record *) | 1088 | entry = (ATOM_PPLIB_UVD_Clock_Voltage_Limit_Record *) |
1089 | ((u8 *)entry + sizeof(ATOM_PPLIB_UVD_Clock_Voltage_Limit_Record)); | 1089 | ((u8 *)entry + sizeof(ATOM_PPLIB_UVD_Clock_Voltage_Limit_Record)); |
1090 | } | 1090 | } |
diff --git a/drivers/gpu/drm/radeon/r600_hdmi.c b/drivers/gpu/drm/radeon/r600_hdmi.c index f443010ce90b..b0fa6002af3e 100644 --- a/drivers/gpu/drm/radeon/r600_hdmi.c +++ b/drivers/gpu/drm/radeon/r600_hdmi.c | |||
@@ -257,10 +257,7 @@ void r600_audio_set_dto(struct drm_encoder *encoder, u32 clock) | |||
257 | * number (coefficient of two integer numbers. DCCG_AUDIO_DTOx_PHASE | 257 | * number (coefficient of two integer numbers. DCCG_AUDIO_DTOx_PHASE |
258 | * is the numerator, DCCG_AUDIO_DTOx_MODULE is the denominator | 258 | * is the numerator, DCCG_AUDIO_DTOx_MODULE is the denominator |
259 | */ | 259 | */ |
260 | if (ASIC_IS_DCE3(rdev)) { | 260 | if (ASIC_IS_DCE32(rdev)) { |
261 | /* according to the reg specs, this should DCE3.2 only, but in | ||
262 | * practice it seems to cover DCE3.0 as well. | ||
263 | */ | ||
264 | if (dig->dig_encoder == 0) { | 261 | if (dig->dig_encoder == 0) { |
265 | dto_cntl = RREG32(DCCG_AUDIO_DTO0_CNTL) & ~DCCG_AUDIO_DTO_WALLCLOCK_RATIO_MASK; | 262 | dto_cntl = RREG32(DCCG_AUDIO_DTO0_CNTL) & ~DCCG_AUDIO_DTO_WALLCLOCK_RATIO_MASK; |
266 | dto_cntl |= DCCG_AUDIO_DTO_WALLCLOCK_RATIO(wallclock_ratio); | 263 | dto_cntl |= DCCG_AUDIO_DTO_WALLCLOCK_RATIO(wallclock_ratio); |
@@ -276,8 +273,21 @@ void r600_audio_set_dto(struct drm_encoder *encoder, u32 clock) | |||
276 | WREG32(DCCG_AUDIO_DTO1_MODULE, dto_modulo); | 273 | WREG32(DCCG_AUDIO_DTO1_MODULE, dto_modulo); |
277 | WREG32(DCCG_AUDIO_DTO_SELECT, 1); /* select DTO1 */ | 274 | WREG32(DCCG_AUDIO_DTO_SELECT, 1); /* select DTO1 */ |
278 | } | 275 | } |
276 | } else if (ASIC_IS_DCE3(rdev)) { | ||
277 | /* according to the reg specs, this should DCE3.2 only, but in | ||
278 | * practice it seems to cover DCE3.0/3.1 as well. | ||
279 | */ | ||
280 | if (dig->dig_encoder == 0) { | ||
281 | WREG32(DCCG_AUDIO_DTO0_PHASE, base_rate * 100); | ||
282 | WREG32(DCCG_AUDIO_DTO0_MODULE, clock * 100); | ||
283 | WREG32(DCCG_AUDIO_DTO_SELECT, 0); /* select DTO0 */ | ||
284 | } else { | ||
285 | WREG32(DCCG_AUDIO_DTO1_PHASE, base_rate * 100); | ||
286 | WREG32(DCCG_AUDIO_DTO1_MODULE, clock * 100); | ||
287 | WREG32(DCCG_AUDIO_DTO_SELECT, 1); /* select DTO1 */ | ||
288 | } | ||
279 | } else { | 289 | } else { |
280 | /* according to the reg specs, this should be DCE2.0 and DCE3.0 */ | 290 | /* according to the reg specs, this should be DCE2.0 and DCE3.0/3.1 */ |
281 | WREG32(AUDIO_DTO, AUDIO_DTO_PHASE(base_rate / 10) | | 291 | WREG32(AUDIO_DTO, AUDIO_DTO_PHASE(base_rate / 10) | |
282 | AUDIO_DTO_MODULE(clock / 10)); | 292 | AUDIO_DTO_MODULE(clock / 10)); |
283 | } | 293 | } |
diff --git a/drivers/gpu/drm/radeon/radeon_asic.c b/drivers/gpu/drm/radeon/radeon_asic.c index 5003385a7512..8f7e04538fd6 100644 --- a/drivers/gpu/drm/radeon/radeon_asic.c +++ b/drivers/gpu/drm/radeon/radeon_asic.c | |||
@@ -1004,6 +1004,8 @@ static struct radeon_asic rv6xx_asic = { | |||
1004 | .wait_for_vblank = &avivo_wait_for_vblank, | 1004 | .wait_for_vblank = &avivo_wait_for_vblank, |
1005 | .set_backlight_level = &atombios_set_backlight_level, | 1005 | .set_backlight_level = &atombios_set_backlight_level, |
1006 | .get_backlight_level = &atombios_get_backlight_level, | 1006 | .get_backlight_level = &atombios_get_backlight_level, |
1007 | .hdmi_enable = &r600_hdmi_enable, | ||
1008 | .hdmi_setmode = &r600_hdmi_setmode, | ||
1007 | }, | 1009 | }, |
1008 | .copy = { | 1010 | .copy = { |
1009 | .blit = &r600_copy_cpdma, | 1011 | .blit = &r600_copy_cpdma, |
diff --git a/drivers/gpu/drm/radeon/radeon_atombios.c b/drivers/gpu/drm/radeon/radeon_atombios.c index 404e25d285ba..f79ee184ffd5 100644 --- a/drivers/gpu/drm/radeon/radeon_atombios.c +++ b/drivers/gpu/drm/radeon/radeon_atombios.c | |||
@@ -1367,6 +1367,7 @@ bool radeon_atombios_get_ppll_ss_info(struct radeon_device *rdev, | |||
1367 | int index = GetIndexIntoMasterTable(DATA, PPLL_SS_Info); | 1367 | int index = GetIndexIntoMasterTable(DATA, PPLL_SS_Info); |
1368 | uint16_t data_offset, size; | 1368 | uint16_t data_offset, size; |
1369 | struct _ATOM_SPREAD_SPECTRUM_INFO *ss_info; | 1369 | struct _ATOM_SPREAD_SPECTRUM_INFO *ss_info; |
1370 | struct _ATOM_SPREAD_SPECTRUM_ASSIGNMENT *ss_assign; | ||
1370 | uint8_t frev, crev; | 1371 | uint8_t frev, crev; |
1371 | int i, num_indices; | 1372 | int i, num_indices; |
1372 | 1373 | ||
@@ -1378,18 +1379,21 @@ bool radeon_atombios_get_ppll_ss_info(struct radeon_device *rdev, | |||
1378 | 1379 | ||
1379 | num_indices = (size - sizeof(ATOM_COMMON_TABLE_HEADER)) / | 1380 | num_indices = (size - sizeof(ATOM_COMMON_TABLE_HEADER)) / |
1380 | sizeof(ATOM_SPREAD_SPECTRUM_ASSIGNMENT); | 1381 | sizeof(ATOM_SPREAD_SPECTRUM_ASSIGNMENT); |
1381 | 1382 | ss_assign = (struct _ATOM_SPREAD_SPECTRUM_ASSIGNMENT*) | |
1383 | ((u8 *)&ss_info->asSS_Info[0]); | ||
1382 | for (i = 0; i < num_indices; i++) { | 1384 | for (i = 0; i < num_indices; i++) { |
1383 | if (ss_info->asSS_Info[i].ucSS_Id == id) { | 1385 | if (ss_assign->ucSS_Id == id) { |
1384 | ss->percentage = | 1386 | ss->percentage = |
1385 | le16_to_cpu(ss_info->asSS_Info[i].usSpreadSpectrumPercentage); | 1387 | le16_to_cpu(ss_assign->usSpreadSpectrumPercentage); |
1386 | ss->type = ss_info->asSS_Info[i].ucSpreadSpectrumType; | 1388 | ss->type = ss_assign->ucSpreadSpectrumType; |
1387 | ss->step = ss_info->asSS_Info[i].ucSS_Step; | 1389 | ss->step = ss_assign->ucSS_Step; |
1388 | ss->delay = ss_info->asSS_Info[i].ucSS_Delay; | 1390 | ss->delay = ss_assign->ucSS_Delay; |
1389 | ss->range = ss_info->asSS_Info[i].ucSS_Range; | 1391 | ss->range = ss_assign->ucSS_Range; |
1390 | ss->refdiv = ss_info->asSS_Info[i].ucRecommendedRef_Div; | 1392 | ss->refdiv = ss_assign->ucRecommendedRef_Div; |
1391 | return true; | 1393 | return true; |
1392 | } | 1394 | } |
1395 | ss_assign = (struct _ATOM_SPREAD_SPECTRUM_ASSIGNMENT*) | ||
1396 | ((u8 *)ss_assign + sizeof(struct _ATOM_SPREAD_SPECTRUM_ASSIGNMENT)); | ||
1393 | } | 1397 | } |
1394 | } | 1398 | } |
1395 | return false; | 1399 | return false; |
@@ -1477,6 +1481,12 @@ union asic_ss_info { | |||
1477 | struct _ATOM_ASIC_INTERNAL_SS_INFO_V3 info_3; | 1481 | struct _ATOM_ASIC_INTERNAL_SS_INFO_V3 info_3; |
1478 | }; | 1482 | }; |
1479 | 1483 | ||
1484 | union asic_ss_assignment { | ||
1485 | struct _ATOM_ASIC_SS_ASSIGNMENT v1; | ||
1486 | struct _ATOM_ASIC_SS_ASSIGNMENT_V2 v2; | ||
1487 | struct _ATOM_ASIC_SS_ASSIGNMENT_V3 v3; | ||
1488 | }; | ||
1489 | |||
1480 | bool radeon_atombios_get_asic_ss_info(struct radeon_device *rdev, | 1490 | bool radeon_atombios_get_asic_ss_info(struct radeon_device *rdev, |
1481 | struct radeon_atom_ss *ss, | 1491 | struct radeon_atom_ss *ss, |
1482 | int id, u32 clock) | 1492 | int id, u32 clock) |
@@ -1485,6 +1495,7 @@ bool radeon_atombios_get_asic_ss_info(struct radeon_device *rdev, | |||
1485 | int index = GetIndexIntoMasterTable(DATA, ASIC_InternalSS_Info); | 1495 | int index = GetIndexIntoMasterTable(DATA, ASIC_InternalSS_Info); |
1486 | uint16_t data_offset, size; | 1496 | uint16_t data_offset, size; |
1487 | union asic_ss_info *ss_info; | 1497 | union asic_ss_info *ss_info; |
1498 | union asic_ss_assignment *ss_assign; | ||
1488 | uint8_t frev, crev; | 1499 | uint8_t frev, crev; |
1489 | int i, num_indices; | 1500 | int i, num_indices; |
1490 | 1501 | ||
@@ -1509,45 +1520,52 @@ bool radeon_atombios_get_asic_ss_info(struct radeon_device *rdev, | |||
1509 | num_indices = (size - sizeof(ATOM_COMMON_TABLE_HEADER)) / | 1520 | num_indices = (size - sizeof(ATOM_COMMON_TABLE_HEADER)) / |
1510 | sizeof(ATOM_ASIC_SS_ASSIGNMENT); | 1521 | sizeof(ATOM_ASIC_SS_ASSIGNMENT); |
1511 | 1522 | ||
1523 | ss_assign = (union asic_ss_assignment *)((u8 *)&ss_info->info.asSpreadSpectrum[0]); | ||
1512 | for (i = 0; i < num_indices; i++) { | 1524 | for (i = 0; i < num_indices; i++) { |
1513 | if ((ss_info->info.asSpreadSpectrum[i].ucClockIndication == id) && | 1525 | if ((ss_assign->v1.ucClockIndication == id) && |
1514 | (clock <= le32_to_cpu(ss_info->info.asSpreadSpectrum[i].ulTargetClockRange))) { | 1526 | (clock <= le32_to_cpu(ss_assign->v1.ulTargetClockRange))) { |
1515 | ss->percentage = | 1527 | ss->percentage = |
1516 | le16_to_cpu(ss_info->info.asSpreadSpectrum[i].usSpreadSpectrumPercentage); | 1528 | le16_to_cpu(ss_assign->v1.usSpreadSpectrumPercentage); |
1517 | ss->type = ss_info->info.asSpreadSpectrum[i].ucSpreadSpectrumMode; | 1529 | ss->type = ss_assign->v1.ucSpreadSpectrumMode; |
1518 | ss->rate = le16_to_cpu(ss_info->info.asSpreadSpectrum[i].usSpreadRateInKhz); | 1530 | ss->rate = le16_to_cpu(ss_assign->v1.usSpreadRateInKhz); |
1519 | return true; | 1531 | return true; |
1520 | } | 1532 | } |
1533 | ss_assign = (union asic_ss_assignment *) | ||
1534 | ((u8 *)ss_assign + sizeof(ATOM_ASIC_SS_ASSIGNMENT)); | ||
1521 | } | 1535 | } |
1522 | break; | 1536 | break; |
1523 | case 2: | 1537 | case 2: |
1524 | num_indices = (size - sizeof(ATOM_COMMON_TABLE_HEADER)) / | 1538 | num_indices = (size - sizeof(ATOM_COMMON_TABLE_HEADER)) / |
1525 | sizeof(ATOM_ASIC_SS_ASSIGNMENT_V2); | 1539 | sizeof(ATOM_ASIC_SS_ASSIGNMENT_V2); |
1540 | ss_assign = (union asic_ss_assignment *)((u8 *)&ss_info->info_2.asSpreadSpectrum[0]); | ||
1526 | for (i = 0; i < num_indices; i++) { | 1541 | for (i = 0; i < num_indices; i++) { |
1527 | if ((ss_info->info_2.asSpreadSpectrum[i].ucClockIndication == id) && | 1542 | if ((ss_assign->v2.ucClockIndication == id) && |
1528 | (clock <= le32_to_cpu(ss_info->info_2.asSpreadSpectrum[i].ulTargetClockRange))) { | 1543 | (clock <= le32_to_cpu(ss_assign->v2.ulTargetClockRange))) { |
1529 | ss->percentage = | 1544 | ss->percentage = |
1530 | le16_to_cpu(ss_info->info_2.asSpreadSpectrum[i].usSpreadSpectrumPercentage); | 1545 | le16_to_cpu(ss_assign->v2.usSpreadSpectrumPercentage); |
1531 | ss->type = ss_info->info_2.asSpreadSpectrum[i].ucSpreadSpectrumMode; | 1546 | ss->type = ss_assign->v2.ucSpreadSpectrumMode; |
1532 | ss->rate = le16_to_cpu(ss_info->info_2.asSpreadSpectrum[i].usSpreadRateIn10Hz); | 1547 | ss->rate = le16_to_cpu(ss_assign->v2.usSpreadRateIn10Hz); |
1533 | if ((crev == 2) && | 1548 | if ((crev == 2) && |
1534 | ((id == ASIC_INTERNAL_ENGINE_SS) || | 1549 | ((id == ASIC_INTERNAL_ENGINE_SS) || |
1535 | (id == ASIC_INTERNAL_MEMORY_SS))) | 1550 | (id == ASIC_INTERNAL_MEMORY_SS))) |
1536 | ss->rate /= 100; | 1551 | ss->rate /= 100; |
1537 | return true; | 1552 | return true; |
1538 | } | 1553 | } |
1554 | ss_assign = (union asic_ss_assignment *) | ||
1555 | ((u8 *)ss_assign + sizeof(ATOM_ASIC_SS_ASSIGNMENT_V2)); | ||
1539 | } | 1556 | } |
1540 | break; | 1557 | break; |
1541 | case 3: | 1558 | case 3: |
1542 | num_indices = (size - sizeof(ATOM_COMMON_TABLE_HEADER)) / | 1559 | num_indices = (size - sizeof(ATOM_COMMON_TABLE_HEADER)) / |
1543 | sizeof(ATOM_ASIC_SS_ASSIGNMENT_V3); | 1560 | sizeof(ATOM_ASIC_SS_ASSIGNMENT_V3); |
1561 | ss_assign = (union asic_ss_assignment *)((u8 *)&ss_info->info_3.asSpreadSpectrum[0]); | ||
1544 | for (i = 0; i < num_indices; i++) { | 1562 | for (i = 0; i < num_indices; i++) { |
1545 | if ((ss_info->info_3.asSpreadSpectrum[i].ucClockIndication == id) && | 1563 | if ((ss_assign->v3.ucClockIndication == id) && |
1546 | (clock <= le32_to_cpu(ss_info->info_3.asSpreadSpectrum[i].ulTargetClockRange))) { | 1564 | (clock <= le32_to_cpu(ss_assign->v3.ulTargetClockRange))) { |
1547 | ss->percentage = | 1565 | ss->percentage = |
1548 | le16_to_cpu(ss_info->info_3.asSpreadSpectrum[i].usSpreadSpectrumPercentage); | 1566 | le16_to_cpu(ss_assign->v3.usSpreadSpectrumPercentage); |
1549 | ss->type = ss_info->info_3.asSpreadSpectrum[i].ucSpreadSpectrumMode; | 1567 | ss->type = ss_assign->v3.ucSpreadSpectrumMode; |
1550 | ss->rate = le16_to_cpu(ss_info->info_3.asSpreadSpectrum[i].usSpreadRateIn10Hz); | 1568 | ss->rate = le16_to_cpu(ss_assign->v3.usSpreadRateIn10Hz); |
1551 | if ((id == ASIC_INTERNAL_ENGINE_SS) || | 1569 | if ((id == ASIC_INTERNAL_ENGINE_SS) || |
1552 | (id == ASIC_INTERNAL_MEMORY_SS)) | 1570 | (id == ASIC_INTERNAL_MEMORY_SS)) |
1553 | ss->rate /= 100; | 1571 | ss->rate /= 100; |
@@ -1555,6 +1573,8 @@ bool radeon_atombios_get_asic_ss_info(struct radeon_device *rdev, | |||
1555 | radeon_atombios_get_igp_ss_overrides(rdev, ss, id); | 1573 | radeon_atombios_get_igp_ss_overrides(rdev, ss, id); |
1556 | return true; | 1574 | return true; |
1557 | } | 1575 | } |
1576 | ss_assign = (union asic_ss_assignment *) | ||
1577 | ((u8 *)ss_assign + sizeof(ATOM_ASIC_SS_ASSIGNMENT_V3)); | ||
1558 | } | 1578 | } |
1559 | break; | 1579 | break; |
1560 | default: | 1580 | default: |
diff --git a/drivers/gpu/drm/radeon/radeon_cs.c b/drivers/gpu/drm/radeon/radeon_cs.c index ac6ece61a476..66c222836631 100644 --- a/drivers/gpu/drm/radeon/radeon_cs.c +++ b/drivers/gpu/drm/radeon/radeon_cs.c | |||
@@ -85,8 +85,9 @@ static int radeon_cs_parser_relocs(struct radeon_cs_parser *p) | |||
85 | VRAM, also but everything into VRAM on AGP cards to avoid | 85 | VRAM, also but everything into VRAM on AGP cards to avoid |
86 | image corruptions */ | 86 | image corruptions */ |
87 | if (p->ring == R600_RING_TYPE_UVD_INDEX && | 87 | if (p->ring == R600_RING_TYPE_UVD_INDEX && |
88 | (i == 0 || p->rdev->flags & RADEON_IS_AGP)) { | 88 | p->rdev->family < CHIP_PALM && |
89 | /* TODO: is this still needed for NI+ ? */ | 89 | (i == 0 || drm_pci_device_is_agp(p->rdev->ddev))) { |
90 | |||
90 | p->relocs[i].lobj.domain = | 91 | p->relocs[i].lobj.domain = |
91 | RADEON_GEM_DOMAIN_VRAM; | 92 | RADEON_GEM_DOMAIN_VRAM; |
92 | 93 | ||
diff --git a/drivers/gpu/drm/radeon/radeon_device.c b/drivers/gpu/drm/radeon/radeon_device.c index e29faa73b574..841d0e09be3e 100644 --- a/drivers/gpu/drm/radeon/radeon_device.c +++ b/drivers/gpu/drm/radeon/radeon_device.c | |||
@@ -1320,13 +1320,22 @@ int radeon_device_init(struct radeon_device *rdev, | |||
1320 | return r; | 1320 | return r; |
1321 | } | 1321 | } |
1322 | if ((radeon_testing & 1)) { | 1322 | if ((radeon_testing & 1)) { |
1323 | radeon_test_moves(rdev); | 1323 | if (rdev->accel_working) |
1324 | radeon_test_moves(rdev); | ||
1325 | else | ||
1326 | DRM_INFO("radeon: acceleration disabled, skipping move tests\n"); | ||
1324 | } | 1327 | } |
1325 | if ((radeon_testing & 2)) { | 1328 | if ((radeon_testing & 2)) { |
1326 | radeon_test_syncing(rdev); | 1329 | if (rdev->accel_working) |
1330 | radeon_test_syncing(rdev); | ||
1331 | else | ||
1332 | DRM_INFO("radeon: acceleration disabled, skipping sync tests\n"); | ||
1327 | } | 1333 | } |
1328 | if (radeon_benchmarking) { | 1334 | if (radeon_benchmarking) { |
1329 | radeon_benchmark(rdev, radeon_benchmarking); | 1335 | if (rdev->accel_working) |
1336 | radeon_benchmark(rdev, radeon_benchmarking); | ||
1337 | else | ||
1338 | DRM_INFO("radeon: acceleration disabled, skipping benchmarks\n"); | ||
1330 | } | 1339 | } |
1331 | return 0; | 1340 | return 0; |
1332 | } | 1341 | } |
diff --git a/drivers/gpu/drm/radeon/radeon_pm.c b/drivers/gpu/drm/radeon/radeon_pm.c index 87e1d69e8fdb..ac07ad1d4f8c 100644 --- a/drivers/gpu/drm/radeon/radeon_pm.c +++ b/drivers/gpu/drm/radeon/radeon_pm.c | |||
@@ -1002,7 +1002,7 @@ static void radeon_pm_resume_old(struct radeon_device *rdev) | |||
1002 | { | 1002 | { |
1003 | /* set up the default clocks if the MC ucode is loaded */ | 1003 | /* set up the default clocks if the MC ucode is loaded */ |
1004 | if ((rdev->family >= CHIP_BARTS) && | 1004 | if ((rdev->family >= CHIP_BARTS) && |
1005 | (rdev->family <= CHIP_HAINAN) && | 1005 | (rdev->family <= CHIP_CAYMAN) && |
1006 | rdev->mc_fw) { | 1006 | rdev->mc_fw) { |
1007 | if (rdev->pm.default_vddc) | 1007 | if (rdev->pm.default_vddc) |
1008 | radeon_atom_set_voltage(rdev, rdev->pm.default_vddc, | 1008 | radeon_atom_set_voltage(rdev, rdev->pm.default_vddc, |
@@ -1046,7 +1046,7 @@ static void radeon_pm_resume_dpm(struct radeon_device *rdev) | |||
1046 | if (ret) { | 1046 | if (ret) { |
1047 | DRM_ERROR("radeon: dpm resume failed\n"); | 1047 | DRM_ERROR("radeon: dpm resume failed\n"); |
1048 | if ((rdev->family >= CHIP_BARTS) && | 1048 | if ((rdev->family >= CHIP_BARTS) && |
1049 | (rdev->family <= CHIP_HAINAN) && | 1049 | (rdev->family <= CHIP_CAYMAN) && |
1050 | rdev->mc_fw) { | 1050 | rdev->mc_fw) { |
1051 | if (rdev->pm.default_vddc) | 1051 | if (rdev->pm.default_vddc) |
1052 | radeon_atom_set_voltage(rdev, rdev->pm.default_vddc, | 1052 | radeon_atom_set_voltage(rdev, rdev->pm.default_vddc, |
@@ -1097,7 +1097,7 @@ static int radeon_pm_init_old(struct radeon_device *rdev) | |||
1097 | radeon_pm_init_profile(rdev); | 1097 | radeon_pm_init_profile(rdev); |
1098 | /* set up the default clocks if the MC ucode is loaded */ | 1098 | /* set up the default clocks if the MC ucode is loaded */ |
1099 | if ((rdev->family >= CHIP_BARTS) && | 1099 | if ((rdev->family >= CHIP_BARTS) && |
1100 | (rdev->family <= CHIP_HAINAN) && | 1100 | (rdev->family <= CHIP_CAYMAN) && |
1101 | rdev->mc_fw) { | 1101 | rdev->mc_fw) { |
1102 | if (rdev->pm.default_vddc) | 1102 | if (rdev->pm.default_vddc) |
1103 | radeon_atom_set_voltage(rdev, rdev->pm.default_vddc, | 1103 | radeon_atom_set_voltage(rdev, rdev->pm.default_vddc, |
@@ -1183,7 +1183,7 @@ static int radeon_pm_init_dpm(struct radeon_device *rdev) | |||
1183 | if (ret) { | 1183 | if (ret) { |
1184 | rdev->pm.dpm_enabled = false; | 1184 | rdev->pm.dpm_enabled = false; |
1185 | if ((rdev->family >= CHIP_BARTS) && | 1185 | if ((rdev->family >= CHIP_BARTS) && |
1186 | (rdev->family <= CHIP_HAINAN) && | 1186 | (rdev->family <= CHIP_CAYMAN) && |
1187 | rdev->mc_fw) { | 1187 | rdev->mc_fw) { |
1188 | if (rdev->pm.default_vddc) | 1188 | if (rdev->pm.default_vddc) |
1189 | radeon_atom_set_voltage(rdev, rdev->pm.default_vddc, | 1189 | radeon_atom_set_voltage(rdev, rdev->pm.default_vddc, |
diff --git a/drivers/gpu/drm/radeon/radeon_ring.c b/drivers/gpu/drm/radeon/radeon_ring.c index 46a25f037b84..18254e1c3e71 100644 --- a/drivers/gpu/drm/radeon/radeon_ring.c +++ b/drivers/gpu/drm/radeon/radeon_ring.c | |||
@@ -839,9 +839,11 @@ static int radeon_debugfs_ring_info(struct seq_file *m, void *data) | |||
839 | * packet that is the root issue | 839 | * packet that is the root issue |
840 | */ | 840 | */ |
841 | i = (ring->rptr + ring->ptr_mask + 1 - 32) & ring->ptr_mask; | 841 | i = (ring->rptr + ring->ptr_mask + 1 - 32) & ring->ptr_mask; |
842 | for (j = 0; j <= (count + 32); j++) { | 842 | if (ring->ready) { |
843 | seq_printf(m, "r[%5d]=0x%08x\n", i, ring->ring[i]); | 843 | for (j = 0; j <= (count + 32); j++) { |
844 | i = (i + 1) & ring->ptr_mask; | 844 | seq_printf(m, "r[%5d]=0x%08x\n", i, ring->ring[i]); |
845 | i = (i + 1) & ring->ptr_mask; | ||
846 | } | ||
845 | } | 847 | } |
846 | return 0; | 848 | return 0; |
847 | } | 849 | } |
diff --git a/drivers/gpu/drm/radeon/radeon_uvd.c b/drivers/gpu/drm/radeon/radeon_uvd.c index 1a01bbff9bfa..a0f11856ddde 100644 --- a/drivers/gpu/drm/radeon/radeon_uvd.c +++ b/drivers/gpu/drm/radeon/radeon_uvd.c | |||
@@ -476,8 +476,7 @@ static int radeon_uvd_cs_reloc(struct radeon_cs_parser *p, | |||
476 | return -EINVAL; | 476 | return -EINVAL; |
477 | } | 477 | } |
478 | 478 | ||
479 | /* TODO: is this still necessary on NI+ ? */ | 479 | if (p->rdev->family < CHIP_PALM && (cmd == 0 || cmd == 0x3) && |
480 | if ((cmd == 0 || cmd == 0x3) && | ||
481 | (start >> 28) != (p->rdev->uvd.gpu_addr >> 28)) { | 480 | (start >> 28) != (p->rdev->uvd.gpu_addr >> 28)) { |
482 | DRM_ERROR("msg/fb buffer %LX-%LX out of 256MB segment!\n", | 481 | DRM_ERROR("msg/fb buffer %LX-%LX out of 256MB segment!\n", |
483 | start, end); | 482 | start, end); |
diff --git a/drivers/gpu/drm/radeon/si_dpm.c b/drivers/gpu/drm/radeon/si_dpm.c index cfe5d4d28915..9ace28702c76 100644 --- a/drivers/gpu/drm/radeon/si_dpm.c +++ b/drivers/gpu/drm/radeon/si_dpm.c | |||
@@ -2910,6 +2910,7 @@ static void si_apply_state_adjust_rules(struct radeon_device *rdev, | |||
2910 | bool disable_sclk_switching = false; | 2910 | bool disable_sclk_switching = false; |
2911 | u32 mclk, sclk; | 2911 | u32 mclk, sclk; |
2912 | u16 vddc, vddci; | 2912 | u16 vddc, vddci; |
2913 | u32 max_sclk_vddc, max_mclk_vddci, max_mclk_vddc; | ||
2913 | int i; | 2914 | int i; |
2914 | 2915 | ||
2915 | if ((rdev->pm.dpm.new_active_crtc_count > 1) || | 2916 | if ((rdev->pm.dpm.new_active_crtc_count > 1) || |
@@ -2943,6 +2944,29 @@ static void si_apply_state_adjust_rules(struct radeon_device *rdev, | |||
2943 | } | 2944 | } |
2944 | } | 2945 | } |
2945 | 2946 | ||
2947 | /* limit clocks to max supported clocks based on voltage dependency tables */ | ||
2948 | btc_get_max_clock_from_voltage_dependency_table(&rdev->pm.dpm.dyn_state.vddc_dependency_on_sclk, | ||
2949 | &max_sclk_vddc); | ||
2950 | btc_get_max_clock_from_voltage_dependency_table(&rdev->pm.dpm.dyn_state.vddci_dependency_on_mclk, | ||
2951 | &max_mclk_vddci); | ||
2952 | btc_get_max_clock_from_voltage_dependency_table(&rdev->pm.dpm.dyn_state.vddc_dependency_on_mclk, | ||
2953 | &max_mclk_vddc); | ||
2954 | |||
2955 | for (i = 0; i < ps->performance_level_count; i++) { | ||
2956 | if (max_sclk_vddc) { | ||
2957 | if (ps->performance_levels[i].sclk > max_sclk_vddc) | ||
2958 | ps->performance_levels[i].sclk = max_sclk_vddc; | ||
2959 | } | ||
2960 | if (max_mclk_vddci) { | ||
2961 | if (ps->performance_levels[i].mclk > max_mclk_vddci) | ||
2962 | ps->performance_levels[i].mclk = max_mclk_vddci; | ||
2963 | } | ||
2964 | if (max_mclk_vddc) { | ||
2965 | if (ps->performance_levels[i].mclk > max_mclk_vddc) | ||
2966 | ps->performance_levels[i].mclk = max_mclk_vddc; | ||
2967 | } | ||
2968 | } | ||
2969 | |||
2946 | /* XXX validate the min clocks required for display */ | 2970 | /* XXX validate the min clocks required for display */ |
2947 | 2971 | ||
2948 | if (disable_mclk_switching) { | 2972 | if (disable_mclk_switching) { |
diff --git a/drivers/gpu/drm/radeon/uvd_v1_0.c b/drivers/gpu/drm/radeon/uvd_v1_0.c index 7266805d9786..3100fa9cb52f 100644 --- a/drivers/gpu/drm/radeon/uvd_v1_0.c +++ b/drivers/gpu/drm/radeon/uvd_v1_0.c | |||
@@ -212,8 +212,8 @@ int uvd_v1_0_start(struct radeon_device *rdev) | |||
212 | /* enable VCPU clock */ | 212 | /* enable VCPU clock */ |
213 | WREG32(UVD_VCPU_CNTL, 1 << 9); | 213 | WREG32(UVD_VCPU_CNTL, 1 << 9); |
214 | 214 | ||
215 | /* enable UMC */ | 215 | /* enable UMC and NC0 */ |
216 | WREG32_P(UVD_LMI_CTRL2, 0, ~(1 << 8)); | 216 | WREG32_P(UVD_LMI_CTRL2, 1 << 13, ~((1 << 8) | (1 << 13))); |
217 | 217 | ||
218 | /* boot up the VCPU */ | 218 | /* boot up the VCPU */ |
219 | WREG32(UVD_SOFT_RESET, 0); | 219 | WREG32(UVD_SOFT_RESET, 0); |
diff --git a/drivers/hv/connection.c b/drivers/hv/connection.c index 4faea979975e..af6edf9b1936 100644 --- a/drivers/hv/connection.c +++ b/drivers/hv/connection.c | |||
@@ -194,7 +194,7 @@ int vmbus_connect(void) | |||
194 | 194 | ||
195 | do { | 195 | do { |
196 | ret = vmbus_negotiate_version(msginfo, version); | 196 | ret = vmbus_negotiate_version(msginfo, version); |
197 | if (ret) | 197 | if (ret == -ETIMEDOUT) |
198 | goto cleanup; | 198 | goto cleanup; |
199 | 199 | ||
200 | if (vmbus_connection.conn_state == CONNECTED) | 200 | if (vmbus_connection.conn_state == CONNECTED) |
diff --git a/drivers/hv/hv_kvp.c b/drivers/hv/hv_kvp.c index 28b03325b872..09988b289622 100644 --- a/drivers/hv/hv_kvp.c +++ b/drivers/hv/hv_kvp.c | |||
@@ -32,13 +32,17 @@ | |||
32 | /* | 32 | /* |
33 | * Pre win8 version numbers used in ws2008 and ws 2008 r2 (win7) | 33 | * Pre win8 version numbers used in ws2008 and ws 2008 r2 (win7) |
34 | */ | 34 | */ |
35 | #define WS2008_SRV_MAJOR 1 | ||
36 | #define WS2008_SRV_MINOR 0 | ||
37 | #define WS2008_SRV_VERSION (WS2008_SRV_MAJOR << 16 | WS2008_SRV_MINOR) | ||
38 | |||
35 | #define WIN7_SRV_MAJOR 3 | 39 | #define WIN7_SRV_MAJOR 3 |
36 | #define WIN7_SRV_MINOR 0 | 40 | #define WIN7_SRV_MINOR 0 |
37 | #define WIN7_SRV_MAJOR_MINOR (WIN7_SRV_MAJOR << 16 | WIN7_SRV_MINOR) | 41 | #define WIN7_SRV_VERSION (WIN7_SRV_MAJOR << 16 | WIN7_SRV_MINOR) |
38 | 42 | ||
39 | #define WIN8_SRV_MAJOR 4 | 43 | #define WIN8_SRV_MAJOR 4 |
40 | #define WIN8_SRV_MINOR 0 | 44 | #define WIN8_SRV_MINOR 0 |
41 | #define WIN8_SRV_MAJOR_MINOR (WIN8_SRV_MAJOR << 16 | WIN8_SRV_MINOR) | 45 | #define WIN8_SRV_VERSION (WIN8_SRV_MAJOR << 16 | WIN8_SRV_MINOR) |
42 | 46 | ||
43 | /* | 47 | /* |
44 | * Global state maintained for transaction that is being processed. | 48 | * Global state maintained for transaction that is being processed. |
@@ -587,6 +591,8 @@ void hv_kvp_onchannelcallback(void *context) | |||
587 | 591 | ||
588 | struct icmsg_hdr *icmsghdrp; | 592 | struct icmsg_hdr *icmsghdrp; |
589 | struct icmsg_negotiate *negop = NULL; | 593 | struct icmsg_negotiate *negop = NULL; |
594 | int util_fw_version; | ||
595 | int kvp_srv_version; | ||
590 | 596 | ||
591 | if (kvp_transaction.active) { | 597 | if (kvp_transaction.active) { |
592 | /* | 598 | /* |
@@ -606,17 +612,26 @@ void hv_kvp_onchannelcallback(void *context) | |||
606 | 612 | ||
607 | if (icmsghdrp->icmsgtype == ICMSGTYPE_NEGOTIATE) { | 613 | if (icmsghdrp->icmsgtype == ICMSGTYPE_NEGOTIATE) { |
608 | /* | 614 | /* |
609 | * We start with win8 version and if the host cannot | 615 | * Based on the host, select appropriate |
610 | * support that we use the previous version. | 616 | * framework and service versions we will |
617 | * negotiate. | ||
611 | */ | 618 | */ |
612 | if (vmbus_prep_negotiate_resp(icmsghdrp, negop, | 619 | switch (vmbus_proto_version) { |
613 | recv_buffer, UTIL_FW_MAJOR_MINOR, | 620 | case (VERSION_WS2008): |
614 | WIN8_SRV_MAJOR_MINOR)) | 621 | util_fw_version = UTIL_WS2K8_FW_VERSION; |
615 | goto done; | 622 | kvp_srv_version = WS2008_SRV_VERSION; |
616 | 623 | break; | |
624 | case (VERSION_WIN7): | ||
625 | util_fw_version = UTIL_FW_VERSION; | ||
626 | kvp_srv_version = WIN7_SRV_VERSION; | ||
627 | break; | ||
628 | default: | ||
629 | util_fw_version = UTIL_FW_VERSION; | ||
630 | kvp_srv_version = WIN8_SRV_VERSION; | ||
631 | } | ||
617 | vmbus_prep_negotiate_resp(icmsghdrp, negop, | 632 | vmbus_prep_negotiate_resp(icmsghdrp, negop, |
618 | recv_buffer, UTIL_FW_MAJOR_MINOR, | 633 | recv_buffer, util_fw_version, |
619 | WIN7_SRV_MAJOR_MINOR); | 634 | kvp_srv_version); |
620 | 635 | ||
621 | } else { | 636 | } else { |
622 | kvp_msg = (struct hv_kvp_msg *)&recv_buffer[ | 637 | kvp_msg = (struct hv_kvp_msg *)&recv_buffer[ |
@@ -649,7 +664,6 @@ void hv_kvp_onchannelcallback(void *context) | |||
649 | return; | 664 | return; |
650 | 665 | ||
651 | } | 666 | } |
652 | done: | ||
653 | 667 | ||
654 | icmsghdrp->icflags = ICMSGHDRFLAG_TRANSACTION | 668 | icmsghdrp->icflags = ICMSGHDRFLAG_TRANSACTION |
655 | | ICMSGHDRFLAG_RESPONSE; | 669 | | ICMSGHDRFLAG_RESPONSE; |
diff --git a/drivers/hv/hv_snapshot.c b/drivers/hv/hv_snapshot.c index e4572f3f2834..0c3546224376 100644 --- a/drivers/hv/hv_snapshot.c +++ b/drivers/hv/hv_snapshot.c | |||
@@ -26,7 +26,7 @@ | |||
26 | 26 | ||
27 | #define VSS_MAJOR 5 | 27 | #define VSS_MAJOR 5 |
28 | #define VSS_MINOR 0 | 28 | #define VSS_MINOR 0 |
29 | #define VSS_MAJOR_MINOR (VSS_MAJOR << 16 | VSS_MINOR) | 29 | #define VSS_VERSION (VSS_MAJOR << 16 | VSS_MINOR) |
30 | 30 | ||
31 | 31 | ||
32 | 32 | ||
@@ -190,8 +190,8 @@ void hv_vss_onchannelcallback(void *context) | |||
190 | 190 | ||
191 | if (icmsghdrp->icmsgtype == ICMSGTYPE_NEGOTIATE) { | 191 | if (icmsghdrp->icmsgtype == ICMSGTYPE_NEGOTIATE) { |
192 | vmbus_prep_negotiate_resp(icmsghdrp, negop, | 192 | vmbus_prep_negotiate_resp(icmsghdrp, negop, |
193 | recv_buffer, UTIL_FW_MAJOR_MINOR, | 193 | recv_buffer, UTIL_FW_VERSION, |
194 | VSS_MAJOR_MINOR); | 194 | VSS_VERSION); |
195 | } else { | 195 | } else { |
196 | vss_msg = (struct hv_vss_msg *)&recv_buffer[ | 196 | vss_msg = (struct hv_vss_msg *)&recv_buffer[ |
197 | sizeof(struct vmbuspipe_hdr) + | 197 | sizeof(struct vmbuspipe_hdr) + |
diff --git a/drivers/hv/hv_util.c b/drivers/hv/hv_util.c index 9113850edb43..62dfd246b948 100644 --- a/drivers/hv/hv_util.c +++ b/drivers/hv/hv_util.c | |||
@@ -28,17 +28,32 @@ | |||
28 | #include <linux/reboot.h> | 28 | #include <linux/reboot.h> |
29 | #include <linux/hyperv.h> | 29 | #include <linux/hyperv.h> |
30 | 30 | ||
31 | #define SHUTDOWN_MAJOR 3 | ||
32 | #define SHUTDOWN_MINOR 0 | ||
33 | #define SHUTDOWN_MAJOR_MINOR (SHUTDOWN_MAJOR << 16 | SHUTDOWN_MINOR) | ||
34 | 31 | ||
35 | #define TIMESYNCH_MAJOR 3 | 32 | #define SD_MAJOR 3 |
36 | #define TIMESYNCH_MINOR 0 | 33 | #define SD_MINOR 0 |
37 | #define TIMESYNCH_MAJOR_MINOR (TIMESYNCH_MAJOR << 16 | TIMESYNCH_MINOR) | 34 | #define SD_VERSION (SD_MAJOR << 16 | SD_MINOR) |
38 | 35 | ||
39 | #define HEARTBEAT_MAJOR 3 | 36 | #define SD_WS2008_MAJOR 1 |
40 | #define HEARTBEAT_MINOR 0 | 37 | #define SD_WS2008_VERSION (SD_WS2008_MAJOR << 16 | SD_MINOR) |
41 | #define HEARTBEAT_MAJOR_MINOR (HEARTBEAT_MAJOR << 16 | HEARTBEAT_MINOR) | 38 | |
39 | #define TS_MAJOR 3 | ||
40 | #define TS_MINOR 0 | ||
41 | #define TS_VERSION (TS_MAJOR << 16 | TS_MINOR) | ||
42 | |||
43 | #define TS_WS2008_MAJOR 1 | ||
44 | #define TS_WS2008_VERSION (TS_WS2008_MAJOR << 16 | TS_MINOR) | ||
45 | |||
46 | #define HB_MAJOR 3 | ||
47 | #define HB_MINOR 0 | ||
48 | #define HB_VERSION (HB_MAJOR << 16 | HB_MINOR) | ||
49 | |||
50 | #define HB_WS2008_MAJOR 1 | ||
51 | #define HB_WS2008_VERSION (HB_WS2008_MAJOR << 16 | HB_MINOR) | ||
52 | |||
53 | static int sd_srv_version; | ||
54 | static int ts_srv_version; | ||
55 | static int hb_srv_version; | ||
56 | static int util_fw_version; | ||
42 | 57 | ||
43 | static void shutdown_onchannelcallback(void *context); | 58 | static void shutdown_onchannelcallback(void *context); |
44 | static struct hv_util_service util_shutdown = { | 59 | static struct hv_util_service util_shutdown = { |
@@ -99,8 +114,8 @@ static void shutdown_onchannelcallback(void *context) | |||
99 | 114 | ||
100 | if (icmsghdrp->icmsgtype == ICMSGTYPE_NEGOTIATE) { | 115 | if (icmsghdrp->icmsgtype == ICMSGTYPE_NEGOTIATE) { |
101 | vmbus_prep_negotiate_resp(icmsghdrp, negop, | 116 | vmbus_prep_negotiate_resp(icmsghdrp, negop, |
102 | shut_txf_buf, UTIL_FW_MAJOR_MINOR, | 117 | shut_txf_buf, util_fw_version, |
103 | SHUTDOWN_MAJOR_MINOR); | 118 | sd_srv_version); |
104 | } else { | 119 | } else { |
105 | shutdown_msg = | 120 | shutdown_msg = |
106 | (struct shutdown_msg_data *)&shut_txf_buf[ | 121 | (struct shutdown_msg_data *)&shut_txf_buf[ |
@@ -216,6 +231,7 @@ static void timesync_onchannelcallback(void *context) | |||
216 | struct icmsg_hdr *icmsghdrp; | 231 | struct icmsg_hdr *icmsghdrp; |
217 | struct ictimesync_data *timedatap; | 232 | struct ictimesync_data *timedatap; |
218 | u8 *time_txf_buf = util_timesynch.recv_buffer; | 233 | u8 *time_txf_buf = util_timesynch.recv_buffer; |
234 | struct icmsg_negotiate *negop = NULL; | ||
219 | 235 | ||
220 | vmbus_recvpacket(channel, time_txf_buf, | 236 | vmbus_recvpacket(channel, time_txf_buf, |
221 | PAGE_SIZE, &recvlen, &requestid); | 237 | PAGE_SIZE, &recvlen, &requestid); |
@@ -225,9 +241,10 @@ static void timesync_onchannelcallback(void *context) | |||
225 | sizeof(struct vmbuspipe_hdr)]; | 241 | sizeof(struct vmbuspipe_hdr)]; |
226 | 242 | ||
227 | if (icmsghdrp->icmsgtype == ICMSGTYPE_NEGOTIATE) { | 243 | if (icmsghdrp->icmsgtype == ICMSGTYPE_NEGOTIATE) { |
228 | vmbus_prep_negotiate_resp(icmsghdrp, NULL, time_txf_buf, | 244 | vmbus_prep_negotiate_resp(icmsghdrp, negop, |
229 | UTIL_FW_MAJOR_MINOR, | 245 | time_txf_buf, |
230 | TIMESYNCH_MAJOR_MINOR); | 246 | util_fw_version, |
247 | ts_srv_version); | ||
231 | } else { | 248 | } else { |
232 | timedatap = (struct ictimesync_data *)&time_txf_buf[ | 249 | timedatap = (struct ictimesync_data *)&time_txf_buf[ |
233 | sizeof(struct vmbuspipe_hdr) + | 250 | sizeof(struct vmbuspipe_hdr) + |
@@ -257,6 +274,7 @@ static void heartbeat_onchannelcallback(void *context) | |||
257 | struct icmsg_hdr *icmsghdrp; | 274 | struct icmsg_hdr *icmsghdrp; |
258 | struct heartbeat_msg_data *heartbeat_msg; | 275 | struct heartbeat_msg_data *heartbeat_msg; |
259 | u8 *hbeat_txf_buf = util_heartbeat.recv_buffer; | 276 | u8 *hbeat_txf_buf = util_heartbeat.recv_buffer; |
277 | struct icmsg_negotiate *negop = NULL; | ||
260 | 278 | ||
261 | vmbus_recvpacket(channel, hbeat_txf_buf, | 279 | vmbus_recvpacket(channel, hbeat_txf_buf, |
262 | PAGE_SIZE, &recvlen, &requestid); | 280 | PAGE_SIZE, &recvlen, &requestid); |
@@ -266,9 +284,9 @@ static void heartbeat_onchannelcallback(void *context) | |||
266 | sizeof(struct vmbuspipe_hdr)]; | 284 | sizeof(struct vmbuspipe_hdr)]; |
267 | 285 | ||
268 | if (icmsghdrp->icmsgtype == ICMSGTYPE_NEGOTIATE) { | 286 | if (icmsghdrp->icmsgtype == ICMSGTYPE_NEGOTIATE) { |
269 | vmbus_prep_negotiate_resp(icmsghdrp, NULL, | 287 | vmbus_prep_negotiate_resp(icmsghdrp, negop, |
270 | hbeat_txf_buf, UTIL_FW_MAJOR_MINOR, | 288 | hbeat_txf_buf, util_fw_version, |
271 | HEARTBEAT_MAJOR_MINOR); | 289 | hb_srv_version); |
272 | } else { | 290 | } else { |
273 | heartbeat_msg = | 291 | heartbeat_msg = |
274 | (struct heartbeat_msg_data *)&hbeat_txf_buf[ | 292 | (struct heartbeat_msg_data *)&hbeat_txf_buf[ |
@@ -321,6 +339,25 @@ static int util_probe(struct hv_device *dev, | |||
321 | goto error; | 339 | goto error; |
322 | 340 | ||
323 | hv_set_drvdata(dev, srv); | 341 | hv_set_drvdata(dev, srv); |
342 | /* | ||
343 | * Based on the host; initialize the framework and | ||
344 | * service version numbers we will negotiate. | ||
345 | */ | ||
346 | switch (vmbus_proto_version) { | ||
347 | case (VERSION_WS2008): | ||
348 | util_fw_version = UTIL_WS2K8_FW_VERSION; | ||
349 | sd_srv_version = SD_WS2008_VERSION; | ||
350 | ts_srv_version = TS_WS2008_VERSION; | ||
351 | hb_srv_version = HB_WS2008_VERSION; | ||
352 | break; | ||
353 | |||
354 | default: | ||
355 | util_fw_version = UTIL_FW_VERSION; | ||
356 | sd_srv_version = SD_VERSION; | ||
357 | ts_srv_version = TS_VERSION; | ||
358 | hb_srv_version = HB_VERSION; | ||
359 | } | ||
360 | |||
324 | return 0; | 361 | return 0; |
325 | 362 | ||
326 | error: | 363 | error: |
diff --git a/drivers/hwmon/applesmc.c b/drivers/hwmon/applesmc.c index 62c2e32e25ef..98814d12a604 100644 --- a/drivers/hwmon/applesmc.c +++ b/drivers/hwmon/applesmc.c | |||
@@ -525,16 +525,25 @@ static int applesmc_init_smcreg_try(void) | |||
525 | { | 525 | { |
526 | struct applesmc_registers *s = &smcreg; | 526 | struct applesmc_registers *s = &smcreg; |
527 | bool left_light_sensor, right_light_sensor; | 527 | bool left_light_sensor, right_light_sensor; |
528 | unsigned int count; | ||
528 | u8 tmp[1]; | 529 | u8 tmp[1]; |
529 | int ret; | 530 | int ret; |
530 | 531 | ||
531 | if (s->init_complete) | 532 | if (s->init_complete) |
532 | return 0; | 533 | return 0; |
533 | 534 | ||
534 | ret = read_register_count(&s->key_count); | 535 | ret = read_register_count(&count); |
535 | if (ret) | 536 | if (ret) |
536 | return ret; | 537 | return ret; |
537 | 538 | ||
539 | if (s->cache && s->key_count != count) { | ||
540 | pr_warn("key count changed from %d to %d\n", | ||
541 | s->key_count, count); | ||
542 | kfree(s->cache); | ||
543 | s->cache = NULL; | ||
544 | } | ||
545 | s->key_count = count; | ||
546 | |||
538 | if (!s->cache) | 547 | if (!s->cache) |
539 | s->cache = kcalloc(s->key_count, sizeof(*s->cache), GFP_KERNEL); | 548 | s->cache = kcalloc(s->key_count, sizeof(*s->cache), GFP_KERNEL); |
540 | if (!s->cache) | 549 | if (!s->cache) |
diff --git a/drivers/i2c/busses/i2c-designware-core.c b/drivers/i2c/busses/i2c-designware-core.c index dbecf08399f8..5888feef1ac5 100644 --- a/drivers/i2c/busses/i2c-designware-core.c +++ b/drivers/i2c/busses/i2c-designware-core.c | |||
@@ -98,6 +98,8 @@ | |||
98 | 98 | ||
99 | #define DW_IC_ERR_TX_ABRT 0x1 | 99 | #define DW_IC_ERR_TX_ABRT 0x1 |
100 | 100 | ||
101 | #define DW_IC_TAR_10BITADDR_MASTER BIT(12) | ||
102 | |||
101 | /* | 103 | /* |
102 | * status codes | 104 | * status codes |
103 | */ | 105 | */ |
@@ -388,22 +390,34 @@ static int i2c_dw_wait_bus_not_busy(struct dw_i2c_dev *dev) | |||
388 | static void i2c_dw_xfer_init(struct dw_i2c_dev *dev) | 390 | static void i2c_dw_xfer_init(struct dw_i2c_dev *dev) |
389 | { | 391 | { |
390 | struct i2c_msg *msgs = dev->msgs; | 392 | struct i2c_msg *msgs = dev->msgs; |
391 | u32 ic_con; | 393 | u32 ic_con, ic_tar = 0; |
392 | 394 | ||
393 | /* Disable the adapter */ | 395 | /* Disable the adapter */ |
394 | __i2c_dw_enable(dev, false); | 396 | __i2c_dw_enable(dev, false); |
395 | 397 | ||
396 | /* set the slave (target) address */ | ||
397 | dw_writel(dev, msgs[dev->msg_write_idx].addr, DW_IC_TAR); | ||
398 | |||
399 | /* if the slave address is ten bit address, enable 10BITADDR */ | 398 | /* if the slave address is ten bit address, enable 10BITADDR */ |
400 | ic_con = dw_readl(dev, DW_IC_CON); | 399 | ic_con = dw_readl(dev, DW_IC_CON); |
401 | if (msgs[dev->msg_write_idx].flags & I2C_M_TEN) | 400 | if (msgs[dev->msg_write_idx].flags & I2C_M_TEN) { |
402 | ic_con |= DW_IC_CON_10BITADDR_MASTER; | 401 | ic_con |= DW_IC_CON_10BITADDR_MASTER; |
403 | else | 402 | /* |
403 | * If I2C_DYNAMIC_TAR_UPDATE is set, the 10-bit addressing | ||
404 | * mode has to be enabled via bit 12 of IC_TAR register. | ||
405 | * We set it always as I2C_DYNAMIC_TAR_UPDATE can't be | ||
406 | * detected from registers. | ||
407 | */ | ||
408 | ic_tar = DW_IC_TAR_10BITADDR_MASTER; | ||
409 | } else { | ||
404 | ic_con &= ~DW_IC_CON_10BITADDR_MASTER; | 410 | ic_con &= ~DW_IC_CON_10BITADDR_MASTER; |
411 | } | ||
412 | |||
405 | dw_writel(dev, ic_con, DW_IC_CON); | 413 | dw_writel(dev, ic_con, DW_IC_CON); |
406 | 414 | ||
415 | /* | ||
416 | * Set the slave (target) address and enable 10-bit addressing mode | ||
417 | * if applicable. | ||
418 | */ | ||
419 | dw_writel(dev, msgs[dev->msg_write_idx].addr | ic_tar, DW_IC_TAR); | ||
420 | |||
407 | /* Enable the adapter */ | 421 | /* Enable the adapter */ |
408 | __i2c_dw_enable(dev, true); | 422 | __i2c_dw_enable(dev, true); |
409 | 423 | ||
diff --git a/drivers/i2c/busses/i2c-ismt.c b/drivers/i2c/busses/i2c-ismt.c index 8ed79a086f85..1672effbcebb 100644 --- a/drivers/i2c/busses/i2c-ismt.c +++ b/drivers/i2c/busses/i2c-ismt.c | |||
@@ -393,6 +393,9 @@ static int ismt_access(struct i2c_adapter *adap, u16 addr, | |||
393 | 393 | ||
394 | desc = &priv->hw[priv->head]; | 394 | desc = &priv->hw[priv->head]; |
395 | 395 | ||
396 | /* Initialize the DMA buffer */ | ||
397 | memset(priv->dma_buffer, 0, sizeof(priv->dma_buffer)); | ||
398 | |||
396 | /* Initialize the descriptor */ | 399 | /* Initialize the descriptor */ |
397 | memset(desc, 0, sizeof(struct ismt_desc)); | 400 | memset(desc, 0, sizeof(struct ismt_desc)); |
398 | desc->tgtaddr_rw = ISMT_DESC_ADDR_RW(addr, read_write); | 401 | desc->tgtaddr_rw = ISMT_DESC_ADDR_RW(addr, read_write); |
diff --git a/drivers/i2c/busses/i2c-mv64xxx.c b/drivers/i2c/busses/i2c-mv64xxx.c index 7f3a47443494..d3e9cc3153a9 100644 --- a/drivers/i2c/busses/i2c-mv64xxx.c +++ b/drivers/i2c/busses/i2c-mv64xxx.c | |||
@@ -234,9 +234,9 @@ static int mv64xxx_i2c_offload_msg(struct mv64xxx_i2c_data *drv_data) | |||
234 | ctrl_reg |= MV64XXX_I2C_BRIDGE_CONTROL_WR | | 234 | ctrl_reg |= MV64XXX_I2C_BRIDGE_CONTROL_WR | |
235 | (msg->len - 1) << MV64XXX_I2C_BRIDGE_CONTROL_TX_SIZE_SHIFT; | 235 | (msg->len - 1) << MV64XXX_I2C_BRIDGE_CONTROL_TX_SIZE_SHIFT; |
236 | 236 | ||
237 | writel_relaxed(data_reg_lo, | 237 | writel(data_reg_lo, |
238 | drv_data->reg_base + MV64XXX_I2C_REG_TX_DATA_LO); | 238 | drv_data->reg_base + MV64XXX_I2C_REG_TX_DATA_LO); |
239 | writel_relaxed(data_reg_hi, | 239 | writel(data_reg_hi, |
240 | drv_data->reg_base + MV64XXX_I2C_REG_TX_DATA_HI); | 240 | drv_data->reg_base + MV64XXX_I2C_REG_TX_DATA_HI); |
241 | 241 | ||
242 | } else { | 242 | } else { |
@@ -697,6 +697,7 @@ static const struct of_device_id mv64xxx_i2c_of_match_table[] = { | |||
697 | MODULE_DEVICE_TABLE(of, mv64xxx_i2c_of_match_table); | 697 | MODULE_DEVICE_TABLE(of, mv64xxx_i2c_of_match_table); |
698 | 698 | ||
699 | #ifdef CONFIG_OF | 699 | #ifdef CONFIG_OF |
700 | #ifdef CONFIG_HAVE_CLK | ||
700 | static int | 701 | static int |
701 | mv64xxx_calc_freq(const int tclk, const int n, const int m) | 702 | mv64xxx_calc_freq(const int tclk, const int n, const int m) |
702 | { | 703 | { |
@@ -726,16 +727,12 @@ mv64xxx_find_baud_factors(const u32 req_freq, const u32 tclk, u32 *best_n, | |||
726 | return false; | 727 | return false; |
727 | return true; | 728 | return true; |
728 | } | 729 | } |
730 | #endif /* CONFIG_HAVE_CLK */ | ||
729 | 731 | ||
730 | static int | 732 | static int |
731 | mv64xxx_of_config(struct mv64xxx_i2c_data *drv_data, | 733 | mv64xxx_of_config(struct mv64xxx_i2c_data *drv_data, |
732 | struct device *dev) | 734 | struct device *dev) |
733 | { | 735 | { |
734 | const struct of_device_id *device; | ||
735 | struct device_node *np = dev->of_node; | ||
736 | u32 bus_freq, tclk; | ||
737 | int rc = 0; | ||
738 | |||
739 | /* CLK is mandatory when using DT to describe the i2c bus. We | 736 | /* CLK is mandatory when using DT to describe the i2c bus. We |
740 | * need to know tclk in order to calculate bus clock | 737 | * need to know tclk in order to calculate bus clock |
741 | * factors. | 738 | * factors. |
@@ -744,6 +741,11 @@ mv64xxx_of_config(struct mv64xxx_i2c_data *drv_data, | |||
744 | /* Have OF but no CLK */ | 741 | /* Have OF but no CLK */ |
745 | return -ENODEV; | 742 | return -ENODEV; |
746 | #else | 743 | #else |
744 | const struct of_device_id *device; | ||
745 | struct device_node *np = dev->of_node; | ||
746 | u32 bus_freq, tclk; | ||
747 | int rc = 0; | ||
748 | |||
747 | if (IS_ERR(drv_data->clk)) { | 749 | if (IS_ERR(drv_data->clk)) { |
748 | rc = -ENODEV; | 750 | rc = -ENODEV; |
749 | goto out; | 751 | goto out; |
diff --git a/drivers/i2c/busses/i2c-s3c2410.c b/drivers/i2c/busses/i2c-s3c2410.c index 3535f3c0f7b4..3747b9bf67d6 100644 --- a/drivers/i2c/busses/i2c-s3c2410.c +++ b/drivers/i2c/busses/i2c-s3c2410.c | |||
@@ -1178,8 +1178,6 @@ static int s3c24xx_i2c_remove(struct platform_device *pdev) | |||
1178 | 1178 | ||
1179 | i2c_del_adapter(&i2c->adap); | 1179 | i2c_del_adapter(&i2c->adap); |
1180 | 1180 | ||
1181 | clk_disable_unprepare(i2c->clk); | ||
1182 | |||
1183 | if (pdev->dev.of_node && IS_ERR(i2c->pctrl)) | 1181 | if (pdev->dev.of_node && IS_ERR(i2c->pctrl)) |
1184 | s3c24xx_i2c_dt_gpio_free(i2c); | 1182 | s3c24xx_i2c_dt_gpio_free(i2c); |
1185 | 1183 | ||
diff --git a/drivers/md/bcache/bcache.h b/drivers/md/bcache/bcache.h index b39f6f0b45f2..0f12382aa35d 100644 --- a/drivers/md/bcache/bcache.h +++ b/drivers/md/bcache/bcache.h | |||
@@ -498,7 +498,7 @@ struct cached_dev { | |||
498 | */ | 498 | */ |
499 | atomic_t has_dirty; | 499 | atomic_t has_dirty; |
500 | 500 | ||
501 | struct ratelimit writeback_rate; | 501 | struct bch_ratelimit writeback_rate; |
502 | struct delayed_work writeback_rate_update; | 502 | struct delayed_work writeback_rate_update; |
503 | 503 | ||
504 | /* | 504 | /* |
@@ -507,10 +507,9 @@ struct cached_dev { | |||
507 | */ | 507 | */ |
508 | sector_t last_read; | 508 | sector_t last_read; |
509 | 509 | ||
510 | /* Number of writeback bios in flight */ | 510 | /* Limit number of writeback bios in flight */ |
511 | atomic_t in_flight; | 511 | struct semaphore in_flight; |
512 | struct closure_with_timer writeback; | 512 | struct closure_with_timer writeback; |
513 | struct closure_waitlist writeback_wait; | ||
514 | 513 | ||
515 | struct keybuf writeback_keys; | 514 | struct keybuf writeback_keys; |
516 | 515 | ||
diff --git a/drivers/md/bcache/bset.c b/drivers/md/bcache/bset.c index 8010eed06a51..22d1ae72c282 100644 --- a/drivers/md/bcache/bset.c +++ b/drivers/md/bcache/bset.c | |||
@@ -926,28 +926,45 @@ struct bkey *bch_next_recurse_key(struct btree *b, struct bkey *search) | |||
926 | 926 | ||
927 | /* Mergesort */ | 927 | /* Mergesort */ |
928 | 928 | ||
929 | static void sort_key_next(struct btree_iter *iter, | ||
930 | struct btree_iter_set *i) | ||
931 | { | ||
932 | i->k = bkey_next(i->k); | ||
933 | |||
934 | if (i->k == i->end) | ||
935 | *i = iter->data[--iter->used]; | ||
936 | } | ||
937 | |||
929 | static void btree_sort_fixup(struct btree_iter *iter) | 938 | static void btree_sort_fixup(struct btree_iter *iter) |
930 | { | 939 | { |
931 | while (iter->used > 1) { | 940 | while (iter->used > 1) { |
932 | struct btree_iter_set *top = iter->data, *i = top + 1; | 941 | struct btree_iter_set *top = iter->data, *i = top + 1; |
933 | struct bkey *k; | ||
934 | 942 | ||
935 | if (iter->used > 2 && | 943 | if (iter->used > 2 && |
936 | btree_iter_cmp(i[0], i[1])) | 944 | btree_iter_cmp(i[0], i[1])) |
937 | i++; | 945 | i++; |
938 | 946 | ||
939 | for (k = i->k; | 947 | if (bkey_cmp(top->k, &START_KEY(i->k)) <= 0) |
940 | k != i->end && bkey_cmp(top->k, &START_KEY(k)) > 0; | ||
941 | k = bkey_next(k)) | ||
942 | if (top->k > i->k) | ||
943 | __bch_cut_front(top->k, k); | ||
944 | else if (KEY_SIZE(k)) | ||
945 | bch_cut_back(&START_KEY(k), top->k); | ||
946 | |||
947 | if (top->k < i->k || k == i->k) | ||
948 | break; | 948 | break; |
949 | 949 | ||
950 | heap_sift(iter, i - top, btree_iter_cmp); | 950 | if (!KEY_SIZE(i->k)) { |
951 | sort_key_next(iter, i); | ||
952 | heap_sift(iter, i - top, btree_iter_cmp); | ||
953 | continue; | ||
954 | } | ||
955 | |||
956 | if (top->k > i->k) { | ||
957 | if (bkey_cmp(top->k, i->k) >= 0) | ||
958 | sort_key_next(iter, i); | ||
959 | else | ||
960 | bch_cut_front(top->k, i->k); | ||
961 | |||
962 | heap_sift(iter, i - top, btree_iter_cmp); | ||
963 | } else { | ||
964 | /* can't happen because of comparison func */ | ||
965 | BUG_ON(!bkey_cmp(&START_KEY(top->k), &START_KEY(i->k))); | ||
966 | bch_cut_back(&START_KEY(i->k), top->k); | ||
967 | } | ||
951 | } | 968 | } |
952 | } | 969 | } |
953 | 970 | ||
diff --git a/drivers/md/bcache/btree.c b/drivers/md/bcache/btree.c index f9764e61978b..f42fc7ed9cd6 100644 --- a/drivers/md/bcache/btree.c +++ b/drivers/md/bcache/btree.c | |||
@@ -255,7 +255,7 @@ void bch_btree_node_read(struct btree *b) | |||
255 | 255 | ||
256 | return; | 256 | return; |
257 | err: | 257 | err: |
258 | bch_cache_set_error(b->c, "io error reading bucket %lu", | 258 | bch_cache_set_error(b->c, "io error reading bucket %zu", |
259 | PTR_BUCKET_NR(b->c, &b->key, 0)); | 259 | PTR_BUCKET_NR(b->c, &b->key, 0)); |
260 | } | 260 | } |
261 | 261 | ||
@@ -612,7 +612,7 @@ static unsigned long bch_mca_scan(struct shrinker *shrink, | |||
612 | return SHRINK_STOP; | 612 | return SHRINK_STOP; |
613 | 613 | ||
614 | /* Return -1 if we can't do anything right now */ | 614 | /* Return -1 if we can't do anything right now */ |
615 | if (sc->gfp_mask & __GFP_WAIT) | 615 | if (sc->gfp_mask & __GFP_IO) |
616 | mutex_lock(&c->bucket_lock); | 616 | mutex_lock(&c->bucket_lock); |
617 | else if (!mutex_trylock(&c->bucket_lock)) | 617 | else if (!mutex_trylock(&c->bucket_lock)) |
618 | return -1; | 618 | return -1; |
diff --git a/drivers/md/bcache/journal.c b/drivers/md/bcache/journal.c index ba95ab84b2be..8435f81e5d85 100644 --- a/drivers/md/bcache/journal.c +++ b/drivers/md/bcache/journal.c | |||
@@ -153,7 +153,8 @@ int bch_journal_read(struct cache_set *c, struct list_head *list, | |||
153 | bitmap_zero(bitmap, SB_JOURNAL_BUCKETS); | 153 | bitmap_zero(bitmap, SB_JOURNAL_BUCKETS); |
154 | pr_debug("%u journal buckets", ca->sb.njournal_buckets); | 154 | pr_debug("%u journal buckets", ca->sb.njournal_buckets); |
155 | 155 | ||
156 | /* Read journal buckets ordered by golden ratio hash to quickly | 156 | /* |
157 | * Read journal buckets ordered by golden ratio hash to quickly | ||
157 | * find a sequence of buckets with valid journal entries | 158 | * find a sequence of buckets with valid journal entries |
158 | */ | 159 | */ |
159 | for (i = 0; i < ca->sb.njournal_buckets; i++) { | 160 | for (i = 0; i < ca->sb.njournal_buckets; i++) { |
@@ -166,18 +167,20 @@ int bch_journal_read(struct cache_set *c, struct list_head *list, | |||
166 | goto bsearch; | 167 | goto bsearch; |
167 | } | 168 | } |
168 | 169 | ||
169 | /* If that fails, check all the buckets we haven't checked | 170 | /* |
171 | * If that fails, check all the buckets we haven't checked | ||
170 | * already | 172 | * already |
171 | */ | 173 | */ |
172 | pr_debug("falling back to linear search"); | 174 | pr_debug("falling back to linear search"); |
173 | 175 | ||
174 | for (l = 0; l < ca->sb.njournal_buckets; l++) { | 176 | for (l = find_first_zero_bit(bitmap, ca->sb.njournal_buckets); |
175 | if (test_bit(l, bitmap)) | 177 | l < ca->sb.njournal_buckets; |
176 | continue; | 178 | l = find_next_zero_bit(bitmap, ca->sb.njournal_buckets, l + 1)) |
177 | |||
178 | if (read_bucket(l)) | 179 | if (read_bucket(l)) |
179 | goto bsearch; | 180 | goto bsearch; |
180 | } | 181 | |
182 | if (list_empty(list)) | ||
183 | continue; | ||
181 | bsearch: | 184 | bsearch: |
182 | /* Binary search */ | 185 | /* Binary search */ |
183 | m = r = find_next_bit(bitmap, ca->sb.njournal_buckets, l + 1); | 186 | m = r = find_next_bit(bitmap, ca->sb.njournal_buckets, l + 1); |
@@ -197,10 +200,12 @@ bsearch: | |||
197 | r = m; | 200 | r = m; |
198 | } | 201 | } |
199 | 202 | ||
200 | /* Read buckets in reverse order until we stop finding more | 203 | /* |
204 | * Read buckets in reverse order until we stop finding more | ||
201 | * journal entries | 205 | * journal entries |
202 | */ | 206 | */ |
203 | pr_debug("finishing up"); | 207 | pr_debug("finishing up: m %u njournal_buckets %u", |
208 | m, ca->sb.njournal_buckets); | ||
204 | l = m; | 209 | l = m; |
205 | 210 | ||
206 | while (1) { | 211 | while (1) { |
@@ -228,9 +233,10 @@ bsearch: | |||
228 | } | 233 | } |
229 | } | 234 | } |
230 | 235 | ||
231 | c->journal.seq = list_entry(list->prev, | 236 | if (!list_empty(list)) |
232 | struct journal_replay, | 237 | c->journal.seq = list_entry(list->prev, |
233 | list)->j.seq; | 238 | struct journal_replay, |
239 | list)->j.seq; | ||
234 | 240 | ||
235 | return 0; | 241 | return 0; |
236 | #undef read_bucket | 242 | #undef read_bucket |
@@ -428,7 +434,7 @@ static void do_journal_discard(struct cache *ca) | |||
428 | return; | 434 | return; |
429 | } | 435 | } |
430 | 436 | ||
431 | switch (atomic_read(&ja->discard_in_flight) == DISCARD_IN_FLIGHT) { | 437 | switch (atomic_read(&ja->discard_in_flight)) { |
432 | case DISCARD_IN_FLIGHT: | 438 | case DISCARD_IN_FLIGHT: |
433 | return; | 439 | return; |
434 | 440 | ||
@@ -689,6 +695,7 @@ void bch_journal_meta(struct cache_set *c, struct closure *cl) | |||
689 | if (cl) | 695 | if (cl) |
690 | BUG_ON(!closure_wait(&w->wait, cl)); | 696 | BUG_ON(!closure_wait(&w->wait, cl)); |
691 | 697 | ||
698 | closure_flush(&c->journal.io); | ||
692 | __journal_try_write(c, true); | 699 | __journal_try_write(c, true); |
693 | } | 700 | } |
694 | } | 701 | } |
diff --git a/drivers/md/bcache/request.c b/drivers/md/bcache/request.c index 786a1a4f74d8..71eb233b9ace 100644 --- a/drivers/md/bcache/request.c +++ b/drivers/md/bcache/request.c | |||
@@ -997,14 +997,17 @@ static void request_write(struct cached_dev *dc, struct search *s) | |||
997 | } else { | 997 | } else { |
998 | bch_writeback_add(dc); | 998 | bch_writeback_add(dc); |
999 | 999 | ||
1000 | if (s->op.flush_journal) { | 1000 | if (bio->bi_rw & REQ_FLUSH) { |
1001 | /* Also need to send a flush to the backing device */ | 1001 | /* Also need to send a flush to the backing device */ |
1002 | s->op.cache_bio = bio_clone_bioset(bio, GFP_NOIO, | 1002 | struct bio *flush = bio_alloc_bioset(0, GFP_NOIO, |
1003 | dc->disk.bio_split); | 1003 | dc->disk.bio_split); |
1004 | 1004 | ||
1005 | bio->bi_size = 0; | 1005 | flush->bi_rw = WRITE_FLUSH; |
1006 | bio->bi_vcnt = 0; | 1006 | flush->bi_bdev = bio->bi_bdev; |
1007 | closure_bio_submit(bio, cl, s->d); | 1007 | flush->bi_end_io = request_endio; |
1008 | flush->bi_private = cl; | ||
1009 | |||
1010 | closure_bio_submit(flush, cl, s->d); | ||
1008 | } else { | 1011 | } else { |
1009 | s->op.cache_bio = bio; | 1012 | s->op.cache_bio = bio; |
1010 | } | 1013 | } |
diff --git a/drivers/md/bcache/sysfs.c b/drivers/md/bcache/sysfs.c index 4fe6ab2fbe2e..924dcfdae111 100644 --- a/drivers/md/bcache/sysfs.c +++ b/drivers/md/bcache/sysfs.c | |||
@@ -223,8 +223,13 @@ STORE(__cached_dev) | |||
223 | } | 223 | } |
224 | 224 | ||
225 | if (attr == &sysfs_label) { | 225 | if (attr == &sysfs_label) { |
226 | /* note: endlines are preserved */ | 226 | if (size > SB_LABEL_SIZE) |
227 | memcpy(dc->sb.label, buf, SB_LABEL_SIZE); | 227 | return -EINVAL; |
228 | memcpy(dc->sb.label, buf, size); | ||
229 | if (size < SB_LABEL_SIZE) | ||
230 | dc->sb.label[size] = '\0'; | ||
231 | if (size && dc->sb.label[size - 1] == '\n') | ||
232 | dc->sb.label[size - 1] = '\0'; | ||
228 | bch_write_bdev_super(dc, NULL); | 233 | bch_write_bdev_super(dc, NULL); |
229 | if (dc->disk.c) { | 234 | if (dc->disk.c) { |
230 | memcpy(dc->disk.c->uuids[dc->disk.id].label, | 235 | memcpy(dc->disk.c->uuids[dc->disk.id].label, |
diff --git a/drivers/md/bcache/util.c b/drivers/md/bcache/util.c index 98eb81159a22..420dad545c7d 100644 --- a/drivers/md/bcache/util.c +++ b/drivers/md/bcache/util.c | |||
@@ -190,7 +190,16 @@ void bch_time_stats_update(struct time_stats *stats, uint64_t start_time) | |||
190 | stats->last = now ?: 1; | 190 | stats->last = now ?: 1; |
191 | } | 191 | } |
192 | 192 | ||
193 | unsigned bch_next_delay(struct ratelimit *d, uint64_t done) | 193 | /** |
194 | * bch_next_delay() - increment @d by the amount of work done, and return how | ||
195 | * long to delay until the next time to do some work. | ||
196 | * | ||
197 | * @d - the struct bch_ratelimit to update | ||
198 | * @done - the amount of work done, in arbitrary units | ||
199 | * | ||
200 | * Returns the amount of time to delay by, in jiffies | ||
201 | */ | ||
202 | uint64_t bch_next_delay(struct bch_ratelimit *d, uint64_t done) | ||
194 | { | 203 | { |
195 | uint64_t now = local_clock(); | 204 | uint64_t now = local_clock(); |
196 | 205 | ||
diff --git a/drivers/md/bcache/util.h b/drivers/md/bcache/util.h index 1ae2a73ad85f..ea345c6896f4 100644 --- a/drivers/md/bcache/util.h +++ b/drivers/md/bcache/util.h | |||
@@ -450,17 +450,23 @@ read_attribute(name ## _last_ ## frequency_units) | |||
450 | (ewma) >> factor; \ | 450 | (ewma) >> factor; \ |
451 | }) | 451 | }) |
452 | 452 | ||
453 | struct ratelimit { | 453 | struct bch_ratelimit { |
454 | /* Next time we want to do some work, in nanoseconds */ | ||
454 | uint64_t next; | 455 | uint64_t next; |
456 | |||
457 | /* | ||
458 | * Rate at which we want to do work, in units per nanosecond | ||
459 | * The units here correspond to the units passed to bch_next_delay() | ||
460 | */ | ||
455 | unsigned rate; | 461 | unsigned rate; |
456 | }; | 462 | }; |
457 | 463 | ||
458 | static inline void ratelimit_reset(struct ratelimit *d) | 464 | static inline void bch_ratelimit_reset(struct bch_ratelimit *d) |
459 | { | 465 | { |
460 | d->next = local_clock(); | 466 | d->next = local_clock(); |
461 | } | 467 | } |
462 | 468 | ||
463 | unsigned bch_next_delay(struct ratelimit *d, uint64_t done); | 469 | uint64_t bch_next_delay(struct bch_ratelimit *d, uint64_t done); |
464 | 470 | ||
465 | #define __DIV_SAFE(n, d, zero) \ | 471 | #define __DIV_SAFE(n, d, zero) \ |
466 | ({ \ | 472 | ({ \ |
diff --git a/drivers/md/bcache/writeback.c b/drivers/md/bcache/writeback.c index 22cbff551628..ba3ee48320f2 100644 --- a/drivers/md/bcache/writeback.c +++ b/drivers/md/bcache/writeback.c | |||
@@ -94,11 +94,15 @@ static void update_writeback_rate(struct work_struct *work) | |||
94 | 94 | ||
95 | static unsigned writeback_delay(struct cached_dev *dc, unsigned sectors) | 95 | static unsigned writeback_delay(struct cached_dev *dc, unsigned sectors) |
96 | { | 96 | { |
97 | uint64_t ret; | ||
98 | |||
97 | if (atomic_read(&dc->disk.detaching) || | 99 | if (atomic_read(&dc->disk.detaching) || |
98 | !dc->writeback_percent) | 100 | !dc->writeback_percent) |
99 | return 0; | 101 | return 0; |
100 | 102 | ||
101 | return bch_next_delay(&dc->writeback_rate, sectors * 10000000ULL); | 103 | ret = bch_next_delay(&dc->writeback_rate, sectors * 10000000ULL); |
104 | |||
105 | return min_t(uint64_t, ret, HZ); | ||
102 | } | 106 | } |
103 | 107 | ||
104 | /* Background writeback */ | 108 | /* Background writeback */ |
@@ -208,7 +212,7 @@ normal_refill: | |||
208 | 212 | ||
209 | up_write(&dc->writeback_lock); | 213 | up_write(&dc->writeback_lock); |
210 | 214 | ||
211 | ratelimit_reset(&dc->writeback_rate); | 215 | bch_ratelimit_reset(&dc->writeback_rate); |
212 | 216 | ||
213 | /* Punt to workqueue only so we don't recurse and blow the stack */ | 217 | /* Punt to workqueue only so we don't recurse and blow the stack */ |
214 | continue_at(cl, read_dirty, dirty_wq); | 218 | continue_at(cl, read_dirty, dirty_wq); |
@@ -318,9 +322,7 @@ static void write_dirty_finish(struct closure *cl) | |||
318 | } | 322 | } |
319 | 323 | ||
320 | bch_keybuf_del(&dc->writeback_keys, w); | 324 | bch_keybuf_del(&dc->writeback_keys, w); |
321 | atomic_dec_bug(&dc->in_flight); | 325 | up(&dc->in_flight); |
322 | |||
323 | closure_wake_up(&dc->writeback_wait); | ||
324 | 326 | ||
325 | closure_return_with_destructor(cl, dirty_io_destructor); | 327 | closure_return_with_destructor(cl, dirty_io_destructor); |
326 | } | 328 | } |
@@ -349,7 +351,7 @@ static void write_dirty(struct closure *cl) | |||
349 | 351 | ||
350 | closure_bio_submit(&io->bio, cl, &io->dc->disk); | 352 | closure_bio_submit(&io->bio, cl, &io->dc->disk); |
351 | 353 | ||
352 | continue_at(cl, write_dirty_finish, dirty_wq); | 354 | continue_at(cl, write_dirty_finish, system_wq); |
353 | } | 355 | } |
354 | 356 | ||
355 | static void read_dirty_endio(struct bio *bio, int error) | 357 | static void read_dirty_endio(struct bio *bio, int error) |
@@ -369,7 +371,7 @@ static void read_dirty_submit(struct closure *cl) | |||
369 | 371 | ||
370 | closure_bio_submit(&io->bio, cl, &io->dc->disk); | 372 | closure_bio_submit(&io->bio, cl, &io->dc->disk); |
371 | 373 | ||
372 | continue_at(cl, write_dirty, dirty_wq); | 374 | continue_at(cl, write_dirty, system_wq); |
373 | } | 375 | } |
374 | 376 | ||
375 | static void read_dirty(struct closure *cl) | 377 | static void read_dirty(struct closure *cl) |
@@ -394,12 +396,8 @@ static void read_dirty(struct closure *cl) | |||
394 | 396 | ||
395 | if (delay > 0 && | 397 | if (delay > 0 && |
396 | (KEY_START(&w->key) != dc->last_read || | 398 | (KEY_START(&w->key) != dc->last_read || |
397 | jiffies_to_msecs(delay) > 50)) { | 399 | jiffies_to_msecs(delay) > 50)) |
398 | w->private = NULL; | 400 | delay = schedule_timeout_uninterruptible(delay); |
399 | |||
400 | closure_delay(&dc->writeback, delay); | ||
401 | continue_at(cl, read_dirty, dirty_wq); | ||
402 | } | ||
403 | 401 | ||
404 | dc->last_read = KEY_OFFSET(&w->key); | 402 | dc->last_read = KEY_OFFSET(&w->key); |
405 | 403 | ||
@@ -424,15 +422,10 @@ static void read_dirty(struct closure *cl) | |||
424 | 422 | ||
425 | trace_bcache_writeback(&w->key); | 423 | trace_bcache_writeback(&w->key); |
426 | 424 | ||
427 | closure_call(&io->cl, read_dirty_submit, NULL, &dc->disk.cl); | 425 | down(&dc->in_flight); |
426 | closure_call(&io->cl, read_dirty_submit, NULL, cl); | ||
428 | 427 | ||
429 | delay = writeback_delay(dc, KEY_SIZE(&w->key)); | 428 | delay = writeback_delay(dc, KEY_SIZE(&w->key)); |
430 | |||
431 | atomic_inc(&dc->in_flight); | ||
432 | |||
433 | if (!closure_wait_event(&dc->writeback_wait, cl, | ||
434 | atomic_read(&dc->in_flight) < 64)) | ||
435 | continue_at(cl, read_dirty, dirty_wq); | ||
436 | } | 429 | } |
437 | 430 | ||
438 | if (0) { | 431 | if (0) { |
@@ -442,7 +435,11 @@ err: | |||
442 | bch_keybuf_del(&dc->writeback_keys, w); | 435 | bch_keybuf_del(&dc->writeback_keys, w); |
443 | } | 436 | } |
444 | 437 | ||
445 | refill_dirty(cl); | 438 | /* |
439 | * Wait for outstanding writeback IOs to finish (and keybuf slots to be | ||
440 | * freed) before refilling again | ||
441 | */ | ||
442 | continue_at(cl, refill_dirty, dirty_wq); | ||
446 | } | 443 | } |
447 | 444 | ||
448 | /* Init */ | 445 | /* Init */ |
@@ -484,6 +481,7 @@ void bch_sectors_dirty_init(struct cached_dev *dc) | |||
484 | 481 | ||
485 | void bch_cached_dev_writeback_init(struct cached_dev *dc) | 482 | void bch_cached_dev_writeback_init(struct cached_dev *dc) |
486 | { | 483 | { |
484 | sema_init(&dc->in_flight, 64); | ||
487 | closure_init_unlocked(&dc->writeback); | 485 | closure_init_unlocked(&dc->writeback); |
488 | init_rwsem(&dc->writeback_lock); | 486 | init_rwsem(&dc->writeback_lock); |
489 | 487 | ||
@@ -513,7 +511,7 @@ void bch_writeback_exit(void) | |||
513 | 511 | ||
514 | int __init bch_writeback_init(void) | 512 | int __init bch_writeback_init(void) |
515 | { | 513 | { |
516 | dirty_wq = create_singlethread_workqueue("bcache_writeback"); | 514 | dirty_wq = create_workqueue("bcache_writeback"); |
517 | if (!dirty_wq) | 515 | if (!dirty_wq) |
518 | return -ENOMEM; | 516 | return -ENOMEM; |
519 | 517 | ||
diff --git a/drivers/md/dm-io.c b/drivers/md/dm-io.c index ea49834377c8..2a20986a2fec 100644 --- a/drivers/md/dm-io.c +++ b/drivers/md/dm-io.c | |||
@@ -19,8 +19,6 @@ | |||
19 | #define DM_MSG_PREFIX "io" | 19 | #define DM_MSG_PREFIX "io" |
20 | 20 | ||
21 | #define DM_IO_MAX_REGIONS BITS_PER_LONG | 21 | #define DM_IO_MAX_REGIONS BITS_PER_LONG |
22 | #define MIN_IOS 16 | ||
23 | #define MIN_BIOS 16 | ||
24 | 22 | ||
25 | struct dm_io_client { | 23 | struct dm_io_client { |
26 | mempool_t *pool; | 24 | mempool_t *pool; |
@@ -50,16 +48,17 @@ static struct kmem_cache *_dm_io_cache; | |||
50 | struct dm_io_client *dm_io_client_create(void) | 48 | struct dm_io_client *dm_io_client_create(void) |
51 | { | 49 | { |
52 | struct dm_io_client *client; | 50 | struct dm_io_client *client; |
51 | unsigned min_ios = dm_get_reserved_bio_based_ios(); | ||
53 | 52 | ||
54 | client = kmalloc(sizeof(*client), GFP_KERNEL); | 53 | client = kmalloc(sizeof(*client), GFP_KERNEL); |
55 | if (!client) | 54 | if (!client) |
56 | return ERR_PTR(-ENOMEM); | 55 | return ERR_PTR(-ENOMEM); |
57 | 56 | ||
58 | client->pool = mempool_create_slab_pool(MIN_IOS, _dm_io_cache); | 57 | client->pool = mempool_create_slab_pool(min_ios, _dm_io_cache); |
59 | if (!client->pool) | 58 | if (!client->pool) |
60 | goto bad; | 59 | goto bad; |
61 | 60 | ||
62 | client->bios = bioset_create(MIN_BIOS, 0); | 61 | client->bios = bioset_create(min_ios, 0); |
63 | if (!client->bios) | 62 | if (!client->bios) |
64 | goto bad; | 63 | goto bad; |
65 | 64 | ||
diff --git a/drivers/md/dm-mpath.c b/drivers/md/dm-mpath.c index b759a127f9c3..de570a558764 100644 --- a/drivers/md/dm-mpath.c +++ b/drivers/md/dm-mpath.c | |||
@@ -7,6 +7,7 @@ | |||
7 | 7 | ||
8 | #include <linux/device-mapper.h> | 8 | #include <linux/device-mapper.h> |
9 | 9 | ||
10 | #include "dm.h" | ||
10 | #include "dm-path-selector.h" | 11 | #include "dm-path-selector.h" |
11 | #include "dm-uevent.h" | 12 | #include "dm-uevent.h" |
12 | 13 | ||
@@ -116,8 +117,6 @@ struct dm_mpath_io { | |||
116 | 117 | ||
117 | typedef int (*action_fn) (struct pgpath *pgpath); | 118 | typedef int (*action_fn) (struct pgpath *pgpath); |
118 | 119 | ||
119 | #define MIN_IOS 256 /* Mempool size */ | ||
120 | |||
121 | static struct kmem_cache *_mpio_cache; | 120 | static struct kmem_cache *_mpio_cache; |
122 | 121 | ||
123 | static struct workqueue_struct *kmultipathd, *kmpath_handlerd; | 122 | static struct workqueue_struct *kmultipathd, *kmpath_handlerd; |
@@ -190,6 +189,7 @@ static void free_priority_group(struct priority_group *pg, | |||
190 | static struct multipath *alloc_multipath(struct dm_target *ti) | 189 | static struct multipath *alloc_multipath(struct dm_target *ti) |
191 | { | 190 | { |
192 | struct multipath *m; | 191 | struct multipath *m; |
192 | unsigned min_ios = dm_get_reserved_rq_based_ios(); | ||
193 | 193 | ||
194 | m = kzalloc(sizeof(*m), GFP_KERNEL); | 194 | m = kzalloc(sizeof(*m), GFP_KERNEL); |
195 | if (m) { | 195 | if (m) { |
@@ -202,7 +202,7 @@ static struct multipath *alloc_multipath(struct dm_target *ti) | |||
202 | INIT_WORK(&m->trigger_event, trigger_event); | 202 | INIT_WORK(&m->trigger_event, trigger_event); |
203 | init_waitqueue_head(&m->pg_init_wait); | 203 | init_waitqueue_head(&m->pg_init_wait); |
204 | mutex_init(&m->work_mutex); | 204 | mutex_init(&m->work_mutex); |
205 | m->mpio_pool = mempool_create_slab_pool(MIN_IOS, _mpio_cache); | 205 | m->mpio_pool = mempool_create_slab_pool(min_ios, _mpio_cache); |
206 | if (!m->mpio_pool) { | 206 | if (!m->mpio_pool) { |
207 | kfree(m); | 207 | kfree(m); |
208 | return NULL; | 208 | return NULL; |
@@ -1268,6 +1268,7 @@ static int noretry_error(int error) | |||
1268 | case -EREMOTEIO: | 1268 | case -EREMOTEIO: |
1269 | case -EILSEQ: | 1269 | case -EILSEQ: |
1270 | case -ENODATA: | 1270 | case -ENODATA: |
1271 | case -ENOSPC: | ||
1271 | return 1; | 1272 | return 1; |
1272 | } | 1273 | } |
1273 | 1274 | ||
@@ -1298,8 +1299,17 @@ static int do_end_io(struct multipath *m, struct request *clone, | |||
1298 | if (!error && !clone->errors) | 1299 | if (!error && !clone->errors) |
1299 | return 0; /* I/O complete */ | 1300 | return 0; /* I/O complete */ |
1300 | 1301 | ||
1301 | if (noretry_error(error)) | 1302 | if (noretry_error(error)) { |
1303 | if ((clone->cmd_flags & REQ_WRITE_SAME) && | ||
1304 | !clone->q->limits.max_write_same_sectors) { | ||
1305 | struct queue_limits *limits; | ||
1306 | |||
1307 | /* device doesn't really support WRITE SAME, disable it */ | ||
1308 | limits = dm_get_queue_limits(dm_table_get_md(m->ti->table)); | ||
1309 | limits->max_write_same_sectors = 0; | ||
1310 | } | ||
1302 | return error; | 1311 | return error; |
1312 | } | ||
1303 | 1313 | ||
1304 | if (mpio->pgpath) | 1314 | if (mpio->pgpath) |
1305 | fail_path(mpio->pgpath); | 1315 | fail_path(mpio->pgpath); |
diff --git a/drivers/md/dm-snap-persistent.c b/drivers/md/dm-snap-persistent.c index 3ac415675b6c..4caa8e6d59d7 100644 --- a/drivers/md/dm-snap-persistent.c +++ b/drivers/md/dm-snap-persistent.c | |||
@@ -256,7 +256,7 @@ static int chunk_io(struct pstore *ps, void *area, chunk_t chunk, int rw, | |||
256 | */ | 256 | */ |
257 | INIT_WORK_ONSTACK(&req.work, do_metadata); | 257 | INIT_WORK_ONSTACK(&req.work, do_metadata); |
258 | queue_work(ps->metadata_wq, &req.work); | 258 | queue_work(ps->metadata_wq, &req.work); |
259 | flush_work(&req.work); | 259 | flush_workqueue(ps->metadata_wq); |
260 | 260 | ||
261 | return req.result; | 261 | return req.result; |
262 | } | 262 | } |
diff --git a/drivers/md/dm-snap.c b/drivers/md/dm-snap.c index c434e5aab2df..aec57d76db5d 100644 --- a/drivers/md/dm-snap.c +++ b/drivers/md/dm-snap.c | |||
@@ -725,17 +725,16 @@ static int calc_max_buckets(void) | |||
725 | */ | 725 | */ |
726 | static int init_hash_tables(struct dm_snapshot *s) | 726 | static int init_hash_tables(struct dm_snapshot *s) |
727 | { | 727 | { |
728 | sector_t hash_size, cow_dev_size, origin_dev_size, max_buckets; | 728 | sector_t hash_size, cow_dev_size, max_buckets; |
729 | 729 | ||
730 | /* | 730 | /* |
731 | * Calculate based on the size of the original volume or | 731 | * Calculate based on the size of the original volume or |
732 | * the COW volume... | 732 | * the COW volume... |
733 | */ | 733 | */ |
734 | cow_dev_size = get_dev_size(s->cow->bdev); | 734 | cow_dev_size = get_dev_size(s->cow->bdev); |
735 | origin_dev_size = get_dev_size(s->origin->bdev); | ||
736 | max_buckets = calc_max_buckets(); | 735 | max_buckets = calc_max_buckets(); |
737 | 736 | ||
738 | hash_size = min(origin_dev_size, cow_dev_size) >> s->store->chunk_shift; | 737 | hash_size = cow_dev_size >> s->store->chunk_shift; |
739 | hash_size = min(hash_size, max_buckets); | 738 | hash_size = min(hash_size, max_buckets); |
740 | 739 | ||
741 | if (hash_size < 64) | 740 | if (hash_size < 64) |
diff --git a/drivers/md/dm-stats.c b/drivers/md/dm-stats.c index 8ae31e8d3d64..3d404c1371ed 100644 --- a/drivers/md/dm-stats.c +++ b/drivers/md/dm-stats.c | |||
@@ -451,19 +451,26 @@ static void dm_stat_for_entry(struct dm_stat *s, size_t entry, | |||
451 | struct dm_stat_percpu *p; | 451 | struct dm_stat_percpu *p; |
452 | 452 | ||
453 | /* | 453 | /* |
454 | * For strict correctness we should use local_irq_disable/enable | 454 | * For strict correctness we should use local_irq_save/restore |
455 | * instead of preempt_disable/enable. | 455 | * instead of preempt_disable/enable. |
456 | * | 456 | * |
457 | * This is racy if the driver finishes bios from non-interrupt | 457 | * preempt_disable/enable is racy if the driver finishes bios |
458 | * context as well as from interrupt context or from more different | 458 | * from non-interrupt context as well as from interrupt context |
459 | * interrupts. | 459 | * or from more different interrupts. |
460 | * | 460 | * |
461 | * However, the race only results in not counting some events, | 461 | * On 64-bit architectures the race only results in not counting some |
462 | * so it is acceptable. | 462 | * events, so it is acceptable. On 32-bit architectures the race could |
463 | * cause the counter going off by 2^32, so we need to do proper locking | ||
464 | * there. | ||
463 | * | 465 | * |
464 | * part_stat_lock()/part_stat_unlock() have this race too. | 466 | * part_stat_lock()/part_stat_unlock() have this race too. |
465 | */ | 467 | */ |
468 | #if BITS_PER_LONG == 32 | ||
469 | unsigned long flags; | ||
470 | local_irq_save(flags); | ||
471 | #else | ||
466 | preempt_disable(); | 472 | preempt_disable(); |
473 | #endif | ||
467 | p = &s->stat_percpu[smp_processor_id()][entry]; | 474 | p = &s->stat_percpu[smp_processor_id()][entry]; |
468 | 475 | ||
469 | if (!end) { | 476 | if (!end) { |
@@ -478,7 +485,11 @@ static void dm_stat_for_entry(struct dm_stat *s, size_t entry, | |||
478 | p->ticks[idx] += duration; | 485 | p->ticks[idx] += duration; |
479 | } | 486 | } |
480 | 487 | ||
488 | #if BITS_PER_LONG == 32 | ||
489 | local_irq_restore(flags); | ||
490 | #else | ||
481 | preempt_enable(); | 491 | preempt_enable(); |
492 | #endif | ||
482 | } | 493 | } |
483 | 494 | ||
484 | static void __dm_stat_bio(struct dm_stat *s, unsigned long bi_rw, | 495 | static void __dm_stat_bio(struct dm_stat *s, unsigned long bi_rw, |
diff --git a/drivers/md/dm-thin.c b/drivers/md/dm-thin.c index ed063427d676..2c0cf511ec23 100644 --- a/drivers/md/dm-thin.c +++ b/drivers/md/dm-thin.c | |||
@@ -2095,6 +2095,7 @@ static int pool_ctr(struct dm_target *ti, unsigned argc, char **argv) | |||
2095 | * them down to the data device. The thin device's discard | 2095 | * them down to the data device. The thin device's discard |
2096 | * processing will cause mappings to be removed from the btree. | 2096 | * processing will cause mappings to be removed from the btree. |
2097 | */ | 2097 | */ |
2098 | ti->discard_zeroes_data_unsupported = true; | ||
2098 | if (pf.discard_enabled && pf.discard_passdown) { | 2099 | if (pf.discard_enabled && pf.discard_passdown) { |
2099 | ti->num_discard_bios = 1; | 2100 | ti->num_discard_bios = 1; |
2100 | 2101 | ||
@@ -2104,7 +2105,6 @@ static int pool_ctr(struct dm_target *ti, unsigned argc, char **argv) | |||
2104 | * thin devices' discard limits consistent). | 2105 | * thin devices' discard limits consistent). |
2105 | */ | 2106 | */ |
2106 | ti->discards_supported = true; | 2107 | ti->discards_supported = true; |
2107 | ti->discard_zeroes_data_unsupported = true; | ||
2108 | } | 2108 | } |
2109 | ti->private = pt; | 2109 | ti->private = pt; |
2110 | 2110 | ||
@@ -2689,8 +2689,16 @@ static void pool_io_hints(struct dm_target *ti, struct queue_limits *limits) | |||
2689 | * They get transferred to the live pool in bind_control_target() | 2689 | * They get transferred to the live pool in bind_control_target() |
2690 | * called from pool_preresume(). | 2690 | * called from pool_preresume(). |
2691 | */ | 2691 | */ |
2692 | if (!pt->adjusted_pf.discard_enabled) | 2692 | if (!pt->adjusted_pf.discard_enabled) { |
2693 | /* | ||
2694 | * Must explicitly disallow stacking discard limits otherwise the | ||
2695 | * block layer will stack them if pool's data device has support. | ||
2696 | * QUEUE_FLAG_DISCARD wouldn't be set but there is no way for the | ||
2697 | * user to see that, so make sure to set all discard limits to 0. | ||
2698 | */ | ||
2699 | limits->discard_granularity = 0; | ||
2693 | return; | 2700 | return; |
2701 | } | ||
2694 | 2702 | ||
2695 | disable_passdown_if_not_supported(pt); | 2703 | disable_passdown_if_not_supported(pt); |
2696 | 2704 | ||
@@ -2826,10 +2834,10 @@ static int thin_ctr(struct dm_target *ti, unsigned argc, char **argv) | |||
2826 | ti->per_bio_data_size = sizeof(struct dm_thin_endio_hook); | 2834 | ti->per_bio_data_size = sizeof(struct dm_thin_endio_hook); |
2827 | 2835 | ||
2828 | /* In case the pool supports discards, pass them on. */ | 2836 | /* In case the pool supports discards, pass them on. */ |
2837 | ti->discard_zeroes_data_unsupported = true; | ||
2829 | if (tc->pool->pf.discard_enabled) { | 2838 | if (tc->pool->pf.discard_enabled) { |
2830 | ti->discards_supported = true; | 2839 | ti->discards_supported = true; |
2831 | ti->num_discard_bios = 1; | 2840 | ti->num_discard_bios = 1; |
2832 | ti->discard_zeroes_data_unsupported = true; | ||
2833 | /* Discard bios must be split on a block boundary */ | 2841 | /* Discard bios must be split on a block boundary */ |
2834 | ti->split_discard_bios = true; | 2842 | ti->split_discard_bios = true; |
2835 | } | 2843 | } |
diff --git a/drivers/md/dm.c b/drivers/md/dm.c index 6a5e9ed2fcc3..b3e26c7d1417 100644 --- a/drivers/md/dm.c +++ b/drivers/md/dm.c | |||
@@ -211,10 +211,55 @@ struct dm_md_mempools { | |||
211 | struct bio_set *bs; | 211 | struct bio_set *bs; |
212 | }; | 212 | }; |
213 | 213 | ||
214 | #define MIN_IOS 256 | 214 | #define RESERVED_BIO_BASED_IOS 16 |
215 | #define RESERVED_REQUEST_BASED_IOS 256 | ||
216 | #define RESERVED_MAX_IOS 1024 | ||
215 | static struct kmem_cache *_io_cache; | 217 | static struct kmem_cache *_io_cache; |
216 | static struct kmem_cache *_rq_tio_cache; | 218 | static struct kmem_cache *_rq_tio_cache; |
217 | 219 | ||
220 | /* | ||
221 | * Bio-based DM's mempools' reserved IOs set by the user. | ||
222 | */ | ||
223 | static unsigned reserved_bio_based_ios = RESERVED_BIO_BASED_IOS; | ||
224 | |||
225 | /* | ||
226 | * Request-based DM's mempools' reserved IOs set by the user. | ||
227 | */ | ||
228 | static unsigned reserved_rq_based_ios = RESERVED_REQUEST_BASED_IOS; | ||
229 | |||
230 | static unsigned __dm_get_reserved_ios(unsigned *reserved_ios, | ||
231 | unsigned def, unsigned max) | ||
232 | { | ||
233 | unsigned ios = ACCESS_ONCE(*reserved_ios); | ||
234 | unsigned modified_ios = 0; | ||
235 | |||
236 | if (!ios) | ||
237 | modified_ios = def; | ||
238 | else if (ios > max) | ||
239 | modified_ios = max; | ||
240 | |||
241 | if (modified_ios) { | ||
242 | (void)cmpxchg(reserved_ios, ios, modified_ios); | ||
243 | ios = modified_ios; | ||
244 | } | ||
245 | |||
246 | return ios; | ||
247 | } | ||
248 | |||
249 | unsigned dm_get_reserved_bio_based_ios(void) | ||
250 | { | ||
251 | return __dm_get_reserved_ios(&reserved_bio_based_ios, | ||
252 | RESERVED_BIO_BASED_IOS, RESERVED_MAX_IOS); | ||
253 | } | ||
254 | EXPORT_SYMBOL_GPL(dm_get_reserved_bio_based_ios); | ||
255 | |||
256 | unsigned dm_get_reserved_rq_based_ios(void) | ||
257 | { | ||
258 | return __dm_get_reserved_ios(&reserved_rq_based_ios, | ||
259 | RESERVED_REQUEST_BASED_IOS, RESERVED_MAX_IOS); | ||
260 | } | ||
261 | EXPORT_SYMBOL_GPL(dm_get_reserved_rq_based_ios); | ||
262 | |||
218 | static int __init local_init(void) | 263 | static int __init local_init(void) |
219 | { | 264 | { |
220 | int r = -ENOMEM; | 265 | int r = -ENOMEM; |
@@ -2278,6 +2323,17 @@ struct target_type *dm_get_immutable_target_type(struct mapped_device *md) | |||
2278 | } | 2323 | } |
2279 | 2324 | ||
2280 | /* | 2325 | /* |
2326 | * The queue_limits are only valid as long as you have a reference | ||
2327 | * count on 'md'. | ||
2328 | */ | ||
2329 | struct queue_limits *dm_get_queue_limits(struct mapped_device *md) | ||
2330 | { | ||
2331 | BUG_ON(!atomic_read(&md->holders)); | ||
2332 | return &md->queue->limits; | ||
2333 | } | ||
2334 | EXPORT_SYMBOL_GPL(dm_get_queue_limits); | ||
2335 | |||
2336 | /* | ||
2281 | * Fully initialize a request-based queue (->elevator, ->request_fn, etc). | 2337 | * Fully initialize a request-based queue (->elevator, ->request_fn, etc). |
2282 | */ | 2338 | */ |
2283 | static int dm_init_request_based_queue(struct mapped_device *md) | 2339 | static int dm_init_request_based_queue(struct mapped_device *md) |
@@ -2862,18 +2918,18 @@ struct dm_md_mempools *dm_alloc_md_mempools(unsigned type, unsigned integrity, u | |||
2862 | 2918 | ||
2863 | if (type == DM_TYPE_BIO_BASED) { | 2919 | if (type == DM_TYPE_BIO_BASED) { |
2864 | cachep = _io_cache; | 2920 | cachep = _io_cache; |
2865 | pool_size = 16; | 2921 | pool_size = dm_get_reserved_bio_based_ios(); |
2866 | front_pad = roundup(per_bio_data_size, __alignof__(struct dm_target_io)) + offsetof(struct dm_target_io, clone); | 2922 | front_pad = roundup(per_bio_data_size, __alignof__(struct dm_target_io)) + offsetof(struct dm_target_io, clone); |
2867 | } else if (type == DM_TYPE_REQUEST_BASED) { | 2923 | } else if (type == DM_TYPE_REQUEST_BASED) { |
2868 | cachep = _rq_tio_cache; | 2924 | cachep = _rq_tio_cache; |
2869 | pool_size = MIN_IOS; | 2925 | pool_size = dm_get_reserved_rq_based_ios(); |
2870 | front_pad = offsetof(struct dm_rq_clone_bio_info, clone); | 2926 | front_pad = offsetof(struct dm_rq_clone_bio_info, clone); |
2871 | /* per_bio_data_size is not used. See __bind_mempools(). */ | 2927 | /* per_bio_data_size is not used. See __bind_mempools(). */ |
2872 | WARN_ON(per_bio_data_size != 0); | 2928 | WARN_ON(per_bio_data_size != 0); |
2873 | } else | 2929 | } else |
2874 | goto out; | 2930 | goto out; |
2875 | 2931 | ||
2876 | pools->io_pool = mempool_create_slab_pool(MIN_IOS, cachep); | 2932 | pools->io_pool = mempool_create_slab_pool(pool_size, cachep); |
2877 | if (!pools->io_pool) | 2933 | if (!pools->io_pool) |
2878 | goto out; | 2934 | goto out; |
2879 | 2935 | ||
@@ -2924,6 +2980,13 @@ module_exit(dm_exit); | |||
2924 | 2980 | ||
2925 | module_param(major, uint, 0); | 2981 | module_param(major, uint, 0); |
2926 | MODULE_PARM_DESC(major, "The major number of the device mapper"); | 2982 | MODULE_PARM_DESC(major, "The major number of the device mapper"); |
2983 | |||
2984 | module_param(reserved_bio_based_ios, uint, S_IRUGO | S_IWUSR); | ||
2985 | MODULE_PARM_DESC(reserved_bio_based_ios, "Reserved IOs in bio-based mempools"); | ||
2986 | |||
2987 | module_param(reserved_rq_based_ios, uint, S_IRUGO | S_IWUSR); | ||
2988 | MODULE_PARM_DESC(reserved_rq_based_ios, "Reserved IOs in request-based mempools"); | ||
2989 | |||
2927 | MODULE_DESCRIPTION(DM_NAME " driver"); | 2990 | MODULE_DESCRIPTION(DM_NAME " driver"); |
2928 | MODULE_AUTHOR("Joe Thornber <dm-devel@redhat.com>"); | 2991 | MODULE_AUTHOR("Joe Thornber <dm-devel@redhat.com>"); |
2929 | MODULE_LICENSE("GPL"); | 2992 | MODULE_LICENSE("GPL"); |
diff --git a/drivers/md/dm.h b/drivers/md/dm.h index 5e604cc7b4aa..1d1ad7b7e527 100644 --- a/drivers/md/dm.h +++ b/drivers/md/dm.h | |||
@@ -184,6 +184,9 @@ void dm_free_md_mempools(struct dm_md_mempools *pools); | |||
184 | /* | 184 | /* |
185 | * Helpers that are used by DM core | 185 | * Helpers that are used by DM core |
186 | */ | 186 | */ |
187 | unsigned dm_get_reserved_bio_based_ios(void); | ||
188 | unsigned dm_get_reserved_rq_based_ios(void); | ||
189 | |||
187 | static inline bool dm_message_test_buffer_overflow(char *result, unsigned maxlen) | 190 | static inline bool dm_message_test_buffer_overflow(char *result, unsigned maxlen) |
188 | { | 191 | { |
189 | return !maxlen || strlen(result) + 1 >= maxlen; | 192 | return !maxlen || strlen(result) + 1 >= maxlen; |
diff --git a/drivers/misc/mei/amthif.c b/drivers/misc/mei/amthif.c index 04fd38567729..226c3f3cd3e8 100644 --- a/drivers/misc/mei/amthif.c +++ b/drivers/misc/mei/amthif.c | |||
@@ -57,6 +57,7 @@ void mei_amthif_reset_params(struct mei_device *dev) | |||
57 | dev->iamthif_ioctl = false; | 57 | dev->iamthif_ioctl = false; |
58 | dev->iamthif_state = MEI_IAMTHIF_IDLE; | 58 | dev->iamthif_state = MEI_IAMTHIF_IDLE; |
59 | dev->iamthif_timer = 0; | 59 | dev->iamthif_timer = 0; |
60 | dev->iamthif_stall_timer = 0; | ||
60 | } | 61 | } |
61 | 62 | ||
62 | /** | 63 | /** |
diff --git a/drivers/misc/mei/bus.c b/drivers/misc/mei/bus.c index 6d0282c08a06..cd2033cd7120 100644 --- a/drivers/misc/mei/bus.c +++ b/drivers/misc/mei/bus.c | |||
@@ -297,10 +297,13 @@ int __mei_cl_recv(struct mei_cl *cl, u8 *buf, size_t length) | |||
297 | 297 | ||
298 | if (cl->reading_state != MEI_READ_COMPLETE && | 298 | if (cl->reading_state != MEI_READ_COMPLETE && |
299 | !waitqueue_active(&cl->rx_wait)) { | 299 | !waitqueue_active(&cl->rx_wait)) { |
300 | |||
300 | mutex_unlock(&dev->device_lock); | 301 | mutex_unlock(&dev->device_lock); |
301 | 302 | ||
302 | if (wait_event_interruptible(cl->rx_wait, | 303 | if (wait_event_interruptible(cl->rx_wait, |
303 | (MEI_READ_COMPLETE == cl->reading_state))) { | 304 | cl->reading_state == MEI_READ_COMPLETE || |
305 | mei_cl_is_transitioning(cl))) { | ||
306 | |||
304 | if (signal_pending(current)) | 307 | if (signal_pending(current)) |
305 | return -EINTR; | 308 | return -EINTR; |
306 | return -ERESTARTSYS; | 309 | return -ERESTARTSYS; |
diff --git a/drivers/misc/mei/client.h b/drivers/misc/mei/client.h index 6374ed99e233..c8396e582f1c 100644 --- a/drivers/misc/mei/client.h +++ b/drivers/misc/mei/client.h | |||
@@ -90,6 +90,12 @@ static inline bool mei_cl_is_connected(struct mei_cl *cl) | |||
90 | cl->dev->dev_state == MEI_DEV_ENABLED && | 90 | cl->dev->dev_state == MEI_DEV_ENABLED && |
91 | cl->state == MEI_FILE_CONNECTED); | 91 | cl->state == MEI_FILE_CONNECTED); |
92 | } | 92 | } |
93 | static inline bool mei_cl_is_transitioning(struct mei_cl *cl) | ||
94 | { | ||
95 | return (MEI_FILE_INITIALIZING == cl->state || | ||
96 | MEI_FILE_DISCONNECTED == cl->state || | ||
97 | MEI_FILE_DISCONNECTING == cl->state); | ||
98 | } | ||
93 | 99 | ||
94 | bool mei_cl_is_other_connecting(struct mei_cl *cl); | 100 | bool mei_cl_is_other_connecting(struct mei_cl *cl); |
95 | int mei_cl_disconnect(struct mei_cl *cl); | 101 | int mei_cl_disconnect(struct mei_cl *cl); |
diff --git a/drivers/misc/mei/hbm.c b/drivers/misc/mei/hbm.c index f1c974a0bc0d..9b3a0fb7f265 100644 --- a/drivers/misc/mei/hbm.c +++ b/drivers/misc/mei/hbm.c | |||
@@ -35,11 +35,15 @@ static void mei_hbm_me_cl_allocate(struct mei_device *dev) | |||
35 | struct mei_me_client *clients; | 35 | struct mei_me_client *clients; |
36 | int b; | 36 | int b; |
37 | 37 | ||
38 | dev->me_clients_num = 0; | ||
39 | dev->me_client_presentation_num = 0; | ||
40 | dev->me_client_index = 0; | ||
41 | |||
38 | /* count how many ME clients we have */ | 42 | /* count how many ME clients we have */ |
39 | for_each_set_bit(b, dev->me_clients_map, MEI_CLIENTS_MAX) | 43 | for_each_set_bit(b, dev->me_clients_map, MEI_CLIENTS_MAX) |
40 | dev->me_clients_num++; | 44 | dev->me_clients_num++; |
41 | 45 | ||
42 | if (dev->me_clients_num <= 0) | 46 | if (dev->me_clients_num == 0) |
43 | return; | 47 | return; |
44 | 48 | ||
45 | kfree(dev->me_clients); | 49 | kfree(dev->me_clients); |
@@ -221,7 +225,7 @@ static int mei_hbm_prop_req(struct mei_device *dev) | |||
221 | struct hbm_props_request *prop_req; | 225 | struct hbm_props_request *prop_req; |
222 | const size_t len = sizeof(struct hbm_props_request); | 226 | const size_t len = sizeof(struct hbm_props_request); |
223 | unsigned long next_client_index; | 227 | unsigned long next_client_index; |
224 | u8 client_num; | 228 | unsigned long client_num; |
225 | 229 | ||
226 | 230 | ||
227 | client_num = dev->me_client_presentation_num; | 231 | client_num = dev->me_client_presentation_num; |
@@ -680,8 +684,6 @@ void mei_hbm_dispatch(struct mei_device *dev, struct mei_msg_hdr *hdr) | |||
680 | if (dev->dev_state == MEI_DEV_INIT_CLIENTS && | 684 | if (dev->dev_state == MEI_DEV_INIT_CLIENTS && |
681 | dev->hbm_state == MEI_HBM_ENUM_CLIENTS) { | 685 | dev->hbm_state == MEI_HBM_ENUM_CLIENTS) { |
682 | dev->init_clients_timer = 0; | 686 | dev->init_clients_timer = 0; |
683 | dev->me_client_presentation_num = 0; | ||
684 | dev->me_client_index = 0; | ||
685 | mei_hbm_me_cl_allocate(dev); | 687 | mei_hbm_me_cl_allocate(dev); |
686 | dev->hbm_state = MEI_HBM_CLIENT_PROPERTIES; | 688 | dev->hbm_state = MEI_HBM_CLIENT_PROPERTIES; |
687 | 689 | ||
diff --git a/drivers/misc/mei/init.c b/drivers/misc/mei/init.c index 92c73118b13c..6197018e2f16 100644 --- a/drivers/misc/mei/init.c +++ b/drivers/misc/mei/init.c | |||
@@ -175,6 +175,9 @@ void mei_reset(struct mei_device *dev, int interrupts_enabled) | |||
175 | memset(&dev->wr_ext_msg, 0, sizeof(dev->wr_ext_msg)); | 175 | memset(&dev->wr_ext_msg, 0, sizeof(dev->wr_ext_msg)); |
176 | } | 176 | } |
177 | 177 | ||
178 | /* we're already in reset, cancel the init timer */ | ||
179 | dev->init_clients_timer = 0; | ||
180 | |||
178 | dev->me_clients_num = 0; | 181 | dev->me_clients_num = 0; |
179 | dev->rd_msg_hdr = 0; | 182 | dev->rd_msg_hdr = 0; |
180 | dev->wd_pending = false; | 183 | dev->wd_pending = false; |
diff --git a/drivers/misc/mei/main.c b/drivers/misc/mei/main.c index 9aa3b78067d3..c71420ef1e37 100644 --- a/drivers/misc/mei/main.c +++ b/drivers/misc/mei/main.c | |||
@@ -252,19 +252,16 @@ static ssize_t mei_read(struct file *file, char __user *ubuf, | |||
252 | mutex_unlock(&dev->device_lock); | 252 | mutex_unlock(&dev->device_lock); |
253 | 253 | ||
254 | if (wait_event_interruptible(cl->rx_wait, | 254 | if (wait_event_interruptible(cl->rx_wait, |
255 | (MEI_READ_COMPLETE == cl->reading_state || | 255 | MEI_READ_COMPLETE == cl->reading_state || |
256 | MEI_FILE_INITIALIZING == cl->state || | 256 | mei_cl_is_transitioning(cl))) { |
257 | MEI_FILE_DISCONNECTED == cl->state || | 257 | |
258 | MEI_FILE_DISCONNECTING == cl->state))) { | ||
259 | if (signal_pending(current)) | 258 | if (signal_pending(current)) |
260 | return -EINTR; | 259 | return -EINTR; |
261 | return -ERESTARTSYS; | 260 | return -ERESTARTSYS; |
262 | } | 261 | } |
263 | 262 | ||
264 | mutex_lock(&dev->device_lock); | 263 | mutex_lock(&dev->device_lock); |
265 | if (MEI_FILE_INITIALIZING == cl->state || | 264 | if (mei_cl_is_transitioning(cl)) { |
266 | MEI_FILE_DISCONNECTED == cl->state || | ||
267 | MEI_FILE_DISCONNECTING == cl->state) { | ||
268 | rets = -EBUSY; | 265 | rets = -EBUSY; |
269 | goto out; | 266 | goto out; |
270 | } | 267 | } |
diff --git a/drivers/misc/mei/mei_dev.h b/drivers/misc/mei/mei_dev.h index 7b918b2fb894..456b322013e2 100644 --- a/drivers/misc/mei/mei_dev.h +++ b/drivers/misc/mei/mei_dev.h | |||
@@ -396,9 +396,9 @@ struct mei_device { | |||
396 | struct mei_me_client *me_clients; /* Note: memory has to be allocated */ | 396 | struct mei_me_client *me_clients; /* Note: memory has to be allocated */ |
397 | DECLARE_BITMAP(me_clients_map, MEI_CLIENTS_MAX); | 397 | DECLARE_BITMAP(me_clients_map, MEI_CLIENTS_MAX); |
398 | DECLARE_BITMAP(host_clients_map, MEI_CLIENTS_MAX); | 398 | DECLARE_BITMAP(host_clients_map, MEI_CLIENTS_MAX); |
399 | u8 me_clients_num; | 399 | unsigned long me_clients_num; |
400 | u8 me_client_presentation_num; | 400 | unsigned long me_client_presentation_num; |
401 | u8 me_client_index; | 401 | unsigned long me_client_index; |
402 | 402 | ||
403 | struct mei_cl wd_cl; | 403 | struct mei_cl wd_cl; |
404 | enum mei_wd_states wd_state; | 404 | enum mei_wd_states wd_state; |
diff --git a/drivers/pci/pci.c b/drivers/pci/pci.c index e8ccf6c0f08a..bdd64b1b4817 100644 --- a/drivers/pci/pci.c +++ b/drivers/pci/pci.c | |||
@@ -1155,8 +1155,14 @@ static void pci_enable_bridge(struct pci_dev *dev) | |||
1155 | 1155 | ||
1156 | pci_enable_bridge(dev->bus->self); | 1156 | pci_enable_bridge(dev->bus->self); |
1157 | 1157 | ||
1158 | if (pci_is_enabled(dev)) | 1158 | if (pci_is_enabled(dev)) { |
1159 | if (!dev->is_busmaster) { | ||
1160 | dev_warn(&dev->dev, "driver skip pci_set_master, fix it!\n"); | ||
1161 | pci_set_master(dev); | ||
1162 | } | ||
1159 | return; | 1163 | return; |
1164 | } | ||
1165 | |||
1160 | retval = pci_enable_device(dev); | 1166 | retval = pci_enable_device(dev); |
1161 | if (retval) | 1167 | if (retval) |
1162 | dev_err(&dev->dev, "Error enabling bridge (%d), continuing\n", | 1168 | dev_err(&dev->dev, "Error enabling bridge (%d), continuing\n", |
diff --git a/drivers/staging/imx-drm/imx-drm-core.c b/drivers/staging/imx-drm/imx-drm-core.c index 47c5888461ff..a2e52a0c53c9 100644 --- a/drivers/staging/imx-drm/imx-drm-core.c +++ b/drivers/staging/imx-drm/imx-drm-core.c | |||
@@ -41,7 +41,6 @@ struct imx_drm_device { | |||
41 | struct list_head encoder_list; | 41 | struct list_head encoder_list; |
42 | struct list_head connector_list; | 42 | struct list_head connector_list; |
43 | struct mutex mutex; | 43 | struct mutex mutex; |
44 | int references; | ||
45 | int pipes; | 44 | int pipes; |
46 | struct drm_fbdev_cma *fbhelper; | 45 | struct drm_fbdev_cma *fbhelper; |
47 | }; | 46 | }; |
@@ -241,8 +240,6 @@ struct drm_device *imx_drm_device_get(void) | |||
241 | } | 240 | } |
242 | } | 241 | } |
243 | 242 | ||
244 | imxdrm->references++; | ||
245 | |||
246 | return imxdrm->drm; | 243 | return imxdrm->drm; |
247 | 244 | ||
248 | unwind_crtc: | 245 | unwind_crtc: |
@@ -280,8 +277,6 @@ void imx_drm_device_put(void) | |||
280 | list_for_each_entry(enc, &imxdrm->encoder_list, list) | 277 | list_for_each_entry(enc, &imxdrm->encoder_list, list) |
281 | module_put(enc->owner); | 278 | module_put(enc->owner); |
282 | 279 | ||
283 | imxdrm->references--; | ||
284 | |||
285 | mutex_unlock(&imxdrm->mutex); | 280 | mutex_unlock(&imxdrm->mutex); |
286 | } | 281 | } |
287 | EXPORT_SYMBOL_GPL(imx_drm_device_put); | 282 | EXPORT_SYMBOL_GPL(imx_drm_device_put); |
@@ -485,7 +480,7 @@ int imx_drm_add_crtc(struct drm_crtc *crtc, | |||
485 | 480 | ||
486 | mutex_lock(&imxdrm->mutex); | 481 | mutex_lock(&imxdrm->mutex); |
487 | 482 | ||
488 | if (imxdrm->references) { | 483 | if (imxdrm->drm->open_count) { |
489 | ret = -EBUSY; | 484 | ret = -EBUSY; |
490 | goto err_busy; | 485 | goto err_busy; |
491 | } | 486 | } |
@@ -564,7 +559,7 @@ int imx_drm_add_encoder(struct drm_encoder *encoder, | |||
564 | 559 | ||
565 | mutex_lock(&imxdrm->mutex); | 560 | mutex_lock(&imxdrm->mutex); |
566 | 561 | ||
567 | if (imxdrm->references) { | 562 | if (imxdrm->drm->open_count) { |
568 | ret = -EBUSY; | 563 | ret = -EBUSY; |
569 | goto err_busy; | 564 | goto err_busy; |
570 | } | 565 | } |
@@ -709,7 +704,7 @@ int imx_drm_add_connector(struct drm_connector *connector, | |||
709 | 704 | ||
710 | mutex_lock(&imxdrm->mutex); | 705 | mutex_lock(&imxdrm->mutex); |
711 | 706 | ||
712 | if (imxdrm->references) { | 707 | if (imxdrm->drm->open_count) { |
713 | ret = -EBUSY; | 708 | ret = -EBUSY; |
714 | goto err_busy; | 709 | goto err_busy; |
715 | } | 710 | } |
diff --git a/drivers/staging/lustre/lustre/obdecho/echo_client.c b/drivers/staging/lustre/lustre/obdecho/echo_client.c index 2644edf438c1..c8b43442dc74 100644 --- a/drivers/staging/lustre/lustre/obdecho/echo_client.c +++ b/drivers/staging/lustre/lustre/obdecho/echo_client.c | |||
@@ -1387,7 +1387,7 @@ echo_copyout_lsm (struct lov_stripe_md *lsm, void *_ulsm, int ulsm_nob) | |||
1387 | if (nob > ulsm_nob) | 1387 | if (nob > ulsm_nob) |
1388 | return (-EINVAL); | 1388 | return (-EINVAL); |
1389 | 1389 | ||
1390 | if (copy_to_user (ulsm, lsm, sizeof(ulsm))) | 1390 | if (copy_to_user (ulsm, lsm, sizeof(*ulsm))) |
1391 | return (-EFAULT); | 1391 | return (-EFAULT); |
1392 | 1392 | ||
1393 | for (i = 0; i < lsm->lsm_stripe_count; i++) { | 1393 | for (i = 0; i < lsm->lsm_stripe_count; i++) { |
diff --git a/drivers/staging/octeon-usb/cvmx-usb.c b/drivers/staging/octeon-usb/cvmx-usb.c index d7b3c82b5ead..45dfe94199ae 100644 --- a/drivers/staging/octeon-usb/cvmx-usb.c +++ b/drivers/staging/octeon-usb/cvmx-usb.c | |||
@@ -604,7 +604,7 @@ int cvmx_usb_initialize(struct cvmx_usb_state *state, int usb_port_number, | |||
604 | } | 604 | } |
605 | } | 605 | } |
606 | 606 | ||
607 | memset(usb, 0, sizeof(usb)); | 607 | memset(usb, 0, sizeof(*usb)); |
608 | usb->init_flags = flags; | 608 | usb->init_flags = flags; |
609 | 609 | ||
610 | /* Initialize the USB state structure */ | 610 | /* Initialize the USB state structure */ |
diff --git a/drivers/staging/rtl8188eu/core/rtw_mp.c b/drivers/staging/rtl8188eu/core/rtw_mp.c index c7ff2e4d1f23..9832dcbbd07f 100644 --- a/drivers/staging/rtl8188eu/core/rtw_mp.c +++ b/drivers/staging/rtl8188eu/core/rtw_mp.c | |||
@@ -907,7 +907,7 @@ u32 mp_query_psd(struct adapter *pAdapter, u8 *data) | |||
907 | sscanf(data, "pts =%d, start =%d, stop =%d", &psd_pts, &psd_start, &psd_stop); | 907 | sscanf(data, "pts =%d, start =%d, stop =%d", &psd_pts, &psd_start, &psd_stop); |
908 | } | 908 | } |
909 | 909 | ||
910 | _rtw_memset(data, '\0', sizeof(data)); | 910 | _rtw_memset(data, '\0', sizeof(*data)); |
911 | 911 | ||
912 | i = psd_start; | 912 | i = psd_start; |
913 | while (i < psd_stop) { | 913 | while (i < psd_stop) { |
diff --git a/drivers/staging/rtl8188eu/hal/rtl8188e_dm.c b/drivers/staging/rtl8188eu/hal/rtl8188e_dm.c index 9c2e7a20c09e..ec0028d4e61a 100644 --- a/drivers/staging/rtl8188eu/hal/rtl8188e_dm.c +++ b/drivers/staging/rtl8188eu/hal/rtl8188e_dm.c | |||
@@ -57,7 +57,7 @@ static void Init_ODM_ComInfo_88E(struct adapter *Adapter) | |||
57 | u8 cut_ver, fab_ver; | 57 | u8 cut_ver, fab_ver; |
58 | 58 | ||
59 | /* Init Value */ | 59 | /* Init Value */ |
60 | _rtw_memset(dm_odm, 0, sizeof(dm_odm)); | 60 | _rtw_memset(dm_odm, 0, sizeof(*dm_odm)); |
61 | 61 | ||
62 | dm_odm->Adapter = Adapter; | 62 | dm_odm->Adapter = Adapter; |
63 | 63 | ||
diff --git a/drivers/staging/rtl8188eu/os_dep/ioctl_linux.c b/drivers/staging/rtl8188eu/os_dep/ioctl_linux.c index cd4100fb3645..95953ebc0279 100644 --- a/drivers/staging/rtl8188eu/os_dep/ioctl_linux.c +++ b/drivers/staging/rtl8188eu/os_dep/ioctl_linux.c | |||
@@ -6973,7 +6973,7 @@ static int rtw_mp_ctx(struct net_device *dev, | |||
6973 | stop = strncmp(extra, "stop", 4); | 6973 | stop = strncmp(extra, "stop", 4); |
6974 | sscanf(extra, "count =%d, pkt", &count); | 6974 | sscanf(extra, "count =%d, pkt", &count); |
6975 | 6975 | ||
6976 | _rtw_memset(extra, '\0', sizeof(extra)); | 6976 | _rtw_memset(extra, '\0', sizeof(*extra)); |
6977 | 6977 | ||
6978 | if (stop == 0) { | 6978 | if (stop == 0) { |
6979 | bStartTest = 0; /* To set Stop */ | 6979 | bStartTest = 0; /* To set Stop */ |
diff --git a/drivers/staging/rtl8188eu/os_dep/usb_intf.c b/drivers/staging/rtl8188eu/os_dep/usb_intf.c index d3078d200e50..9ca3180ebaa0 100644 --- a/drivers/staging/rtl8188eu/os_dep/usb_intf.c +++ b/drivers/staging/rtl8188eu/os_dep/usb_intf.c | |||
@@ -54,6 +54,7 @@ static struct usb_device_id rtw_usb_id_tbl[] = { | |||
54 | /*=== Customer ID ===*/ | 54 | /*=== Customer ID ===*/ |
55 | /****** 8188EUS ********/ | 55 | /****** 8188EUS ********/ |
56 | {USB_DEVICE(0x8179, 0x07B8)}, /* Abocom - Abocom */ | 56 | {USB_DEVICE(0x8179, 0x07B8)}, /* Abocom - Abocom */ |
57 | {USB_DEVICE(0x2001, 0x330F)}, /* DLink DWA-125 REV D1 */ | ||
57 | {} /* Terminating entry */ | 58 | {} /* Terminating entry */ |
58 | }; | 59 | }; |
59 | 60 | ||
diff --git a/drivers/staging/rtl8192u/r819xU_cmdpkt.c b/drivers/staging/rtl8192u/r819xU_cmdpkt.c index 5bc361b16d4c..56144014b7c9 100644 --- a/drivers/staging/rtl8192u/r819xU_cmdpkt.c +++ b/drivers/staging/rtl8192u/r819xU_cmdpkt.c | |||
@@ -37,6 +37,8 @@ rt_status SendTxCommandPacket(struct net_device *dev, void *pData, u32 DataLen) | |||
37 | /* Get TCB and local buffer from common pool. | 37 | /* Get TCB and local buffer from common pool. |
38 | (It is shared by CmdQ, MgntQ, and USB coalesce DataQ) */ | 38 | (It is shared by CmdQ, MgntQ, and USB coalesce DataQ) */ |
39 | skb = dev_alloc_skb(USB_HWDESC_HEADER_LEN + DataLen + 4); | 39 | skb = dev_alloc_skb(USB_HWDESC_HEADER_LEN + DataLen + 4); |
40 | if (!skb) | ||
41 | return RT_STATUS_FAILURE; | ||
40 | memcpy((unsigned char *)(skb->cb), &dev, sizeof(dev)); | 42 | memcpy((unsigned char *)(skb->cb), &dev, sizeof(dev)); |
41 | tcb_desc = (cb_desc *)(skb->cb + MAX_DEV_ADDR_SIZE); | 43 | tcb_desc = (cb_desc *)(skb->cb + MAX_DEV_ADDR_SIZE); |
42 | tcb_desc->queue_index = TXCMD_QUEUE; | 44 | tcb_desc->queue_index = TXCMD_QUEUE; |
diff --git a/drivers/staging/vt6656/iwctl.c b/drivers/staging/vt6656/iwctl.c index d0cf7d8a20e5..8872e0f84f40 100644 --- a/drivers/staging/vt6656/iwctl.c +++ b/drivers/staging/vt6656/iwctl.c | |||
@@ -1634,6 +1634,9 @@ int iwctl_siwencodeext(struct net_device *dev, struct iw_request_info *info, | |||
1634 | if (pMgmt == NULL) | 1634 | if (pMgmt == NULL) |
1635 | return -EFAULT; | 1635 | return -EFAULT; |
1636 | 1636 | ||
1637 | if (!(pDevice->flags & DEVICE_FLAGS_OPENED)) | ||
1638 | return -ENODEV; | ||
1639 | |||
1637 | buf = kzalloc(sizeof(struct viawget_wpa_param), GFP_KERNEL); | 1640 | buf = kzalloc(sizeof(struct viawget_wpa_param), GFP_KERNEL); |
1638 | if (buf == NULL) | 1641 | if (buf == NULL) |
1639 | return -ENOMEM; | 1642 | return -ENOMEM; |
diff --git a/drivers/staging/vt6656/main_usb.c b/drivers/staging/vt6656/main_usb.c index 536971786ae8..6f9d28182445 100644 --- a/drivers/staging/vt6656/main_usb.c +++ b/drivers/staging/vt6656/main_usb.c | |||
@@ -1098,6 +1098,8 @@ static int device_close(struct net_device *dev) | |||
1098 | memset(pMgmt->abyCurrBSSID, 0, 6); | 1098 | memset(pMgmt->abyCurrBSSID, 0, 6); |
1099 | pMgmt->eCurrState = WMAC_STATE_IDLE; | 1099 | pMgmt->eCurrState = WMAC_STATE_IDLE; |
1100 | 1100 | ||
1101 | pDevice->flags &= ~DEVICE_FLAGS_OPENED; | ||
1102 | |||
1101 | device_free_tx_bufs(pDevice); | 1103 | device_free_tx_bufs(pDevice); |
1102 | device_free_rx_bufs(pDevice); | 1104 | device_free_rx_bufs(pDevice); |
1103 | device_free_int_bufs(pDevice); | 1105 | device_free_int_bufs(pDevice); |
@@ -1109,7 +1111,6 @@ static int device_close(struct net_device *dev) | |||
1109 | usb_free_urb(pDevice->pInterruptURB); | 1111 | usb_free_urb(pDevice->pInterruptURB); |
1110 | 1112 | ||
1111 | BSSvClearNodeDBTable(pDevice, 0); | 1113 | BSSvClearNodeDBTable(pDevice, 0); |
1112 | pDevice->flags &=(~DEVICE_FLAGS_OPENED); | ||
1113 | 1114 | ||
1114 | DBG_PRT(MSG_LEVEL_DEBUG, KERN_INFO "device_close2 \n"); | 1115 | DBG_PRT(MSG_LEVEL_DEBUG, KERN_INFO "device_close2 \n"); |
1115 | 1116 | ||
diff --git a/drivers/staging/vt6656/rxtx.c b/drivers/staging/vt6656/rxtx.c index fb743a8811bb..14f3e852215d 100644 --- a/drivers/staging/vt6656/rxtx.c +++ b/drivers/staging/vt6656/rxtx.c | |||
@@ -148,6 +148,8 @@ static void *s_vGetFreeContext(struct vnt_private *pDevice) | |||
148 | DBG_PRT(MSG_LEVEL_DEBUG, KERN_INFO"GetFreeContext()\n"); | 148 | DBG_PRT(MSG_LEVEL_DEBUG, KERN_INFO"GetFreeContext()\n"); |
149 | 149 | ||
150 | for (ii = 0; ii < pDevice->cbTD; ii++) { | 150 | for (ii = 0; ii < pDevice->cbTD; ii++) { |
151 | if (!pDevice->apTD[ii]) | ||
152 | return NULL; | ||
151 | pContext = pDevice->apTD[ii]; | 153 | pContext = pDevice->apTD[ii]; |
152 | if (pContext->bBoolInUse == false) { | 154 | if (pContext->bBoolInUse == false) { |
153 | pContext->bBoolInUse = true; | 155 | pContext->bBoolInUse = true; |
diff --git a/drivers/tty/n_tty.c b/drivers/tty/n_tty.c index c9a9ddd1d0bc..01bf5eb4f238 100644 --- a/drivers/tty/n_tty.c +++ b/drivers/tty/n_tty.c | |||
@@ -1758,8 +1758,7 @@ static void n_tty_set_termios(struct tty_struct *tty, struct ktermios *old) | |||
1758 | canon_change = (old->c_lflag ^ tty->termios.c_lflag) & ICANON; | 1758 | canon_change = (old->c_lflag ^ tty->termios.c_lflag) & ICANON; |
1759 | if (canon_change) { | 1759 | if (canon_change) { |
1760 | bitmap_zero(ldata->read_flags, N_TTY_BUF_SIZE); | 1760 | bitmap_zero(ldata->read_flags, N_TTY_BUF_SIZE); |
1761 | ldata->line_start = 0; | 1761 | ldata->line_start = ldata->canon_head = ldata->read_tail; |
1762 | ldata->canon_head = ldata->read_tail; | ||
1763 | ldata->erasing = 0; | 1762 | ldata->erasing = 0; |
1764 | ldata->lnext = 0; | 1763 | ldata->lnext = 0; |
1765 | } | 1764 | } |
diff --git a/drivers/tty/serial/pch_uart.c b/drivers/tty/serial/pch_uart.c index 52379e56a31e..44077c0b7670 100644 --- a/drivers/tty/serial/pch_uart.c +++ b/drivers/tty/serial/pch_uart.c | |||
@@ -667,30 +667,21 @@ static int pop_tx_x(struct eg20t_port *priv, unsigned char *buf) | |||
667 | 667 | ||
668 | static int dma_push_rx(struct eg20t_port *priv, int size) | 668 | static int dma_push_rx(struct eg20t_port *priv, int size) |
669 | { | 669 | { |
670 | struct tty_struct *tty; | ||
671 | int room; | 670 | int room; |
672 | struct uart_port *port = &priv->port; | 671 | struct uart_port *port = &priv->port; |
673 | struct tty_port *tport = &port->state->port; | 672 | struct tty_port *tport = &port->state->port; |
674 | 673 | ||
675 | port = &priv->port; | ||
676 | tty = tty_port_tty_get(tport); | ||
677 | if (!tty) { | ||
678 | dev_dbg(priv->port.dev, "%s:tty is busy now", __func__); | ||
679 | return 0; | ||
680 | } | ||
681 | |||
682 | room = tty_buffer_request_room(tport, size); | 674 | room = tty_buffer_request_room(tport, size); |
683 | 675 | ||
684 | if (room < size) | 676 | if (room < size) |
685 | dev_warn(port->dev, "Rx overrun: dropping %u bytes\n", | 677 | dev_warn(port->dev, "Rx overrun: dropping %u bytes\n", |
686 | size - room); | 678 | size - room); |
687 | if (!room) | 679 | if (!room) |
688 | return room; | 680 | return 0; |
689 | 681 | ||
690 | tty_insert_flip_string(tport, sg_virt(&priv->sg_rx), size); | 682 | tty_insert_flip_string(tport, sg_virt(&priv->sg_rx), size); |
691 | 683 | ||
692 | port->icount.rx += room; | 684 | port->icount.rx += room; |
693 | tty_kref_put(tty); | ||
694 | 685 | ||
695 | return room; | 686 | return room; |
696 | } | 687 | } |
@@ -1098,6 +1089,8 @@ static void pch_uart_err_ir(struct eg20t_port *priv, unsigned int lsr) | |||
1098 | if (tty == NULL) { | 1089 | if (tty == NULL) { |
1099 | for (i = 0; error_msg[i] != NULL; i++) | 1090 | for (i = 0; error_msg[i] != NULL; i++) |
1100 | dev_err(&priv->pdev->dev, error_msg[i]); | 1091 | dev_err(&priv->pdev->dev, error_msg[i]); |
1092 | } else { | ||
1093 | tty_kref_put(tty); | ||
1101 | } | 1094 | } |
1102 | } | 1095 | } |
1103 | 1096 | ||
diff --git a/drivers/tty/serial/serial-tegra.c b/drivers/tty/serial/serial-tegra.c index d0d972f7e43e..0489a2bdcdf9 100644 --- a/drivers/tty/serial/serial-tegra.c +++ b/drivers/tty/serial/serial-tegra.c | |||
@@ -732,7 +732,7 @@ static irqreturn_t tegra_uart_isr(int irq, void *data) | |||
732 | static void tegra_uart_stop_rx(struct uart_port *u) | 732 | static void tegra_uart_stop_rx(struct uart_port *u) |
733 | { | 733 | { |
734 | struct tegra_uart_port *tup = to_tegra_uport(u); | 734 | struct tegra_uart_port *tup = to_tegra_uport(u); |
735 | struct tty_struct *tty = tty_port_tty_get(&tup->uport.state->port); | 735 | struct tty_struct *tty; |
736 | struct tty_port *port = &u->state->port; | 736 | struct tty_port *port = &u->state->port; |
737 | struct dma_tx_state state; | 737 | struct dma_tx_state state; |
738 | unsigned long ier; | 738 | unsigned long ier; |
@@ -744,6 +744,8 @@ static void tegra_uart_stop_rx(struct uart_port *u) | |||
744 | if (!tup->rx_in_progress) | 744 | if (!tup->rx_in_progress) |
745 | return; | 745 | return; |
746 | 746 | ||
747 | tty = tty_port_tty_get(&tup->uport.state->port); | ||
748 | |||
747 | tegra_uart_wait_sym_time(tup, 1); /* wait a character interval */ | 749 | tegra_uart_wait_sym_time(tup, 1); /* wait a character interval */ |
748 | 750 | ||
749 | ier = tup->ier_shadow; | 751 | ier = tup->ier_shadow; |
diff --git a/drivers/tty/tty_ioctl.c b/drivers/tty/tty_ioctl.c index 03ba081c5772..6fd60fece6b4 100644 --- a/drivers/tty/tty_ioctl.c +++ b/drivers/tty/tty_ioctl.c | |||
@@ -1201,6 +1201,9 @@ int n_tty_ioctl_helper(struct tty_struct *tty, struct file *file, | |||
1201 | } | 1201 | } |
1202 | return 0; | 1202 | return 0; |
1203 | case TCFLSH: | 1203 | case TCFLSH: |
1204 | retval = tty_check_change(tty); | ||
1205 | if (retval) | ||
1206 | return retval; | ||
1204 | return __tty_perform_flush(tty, arg); | 1207 | return __tty_perform_flush(tty, arg); |
1205 | default: | 1208 | default: |
1206 | /* Try the mode commands */ | 1209 | /* Try the mode commands */ |
diff --git a/drivers/usb/chipidea/Kconfig b/drivers/usb/chipidea/Kconfig index 4a851e15e58c..77b47d82c9a6 100644 --- a/drivers/usb/chipidea/Kconfig +++ b/drivers/usb/chipidea/Kconfig | |||
@@ -1,6 +1,6 @@ | |||
1 | config USB_CHIPIDEA | 1 | config USB_CHIPIDEA |
2 | tristate "ChipIdea Highspeed Dual Role Controller" | 2 | tristate "ChipIdea Highspeed Dual Role Controller" |
3 | depends on (USB_EHCI_HCD && USB_GADGET) || (USB_EHCI_HCD && !USB_GADGET) || (!USB_EHCI_HCD && USB_GADGET) | 3 | depends on ((USB_EHCI_HCD && USB_GADGET) || (USB_EHCI_HCD && !USB_GADGET) || (!USB_EHCI_HCD && USB_GADGET)) && HAS_DMA |
4 | help | 4 | help |
5 | Say Y here if your system has a dual role high speed USB | 5 | Say Y here if your system has a dual role high speed USB |
6 | controller based on ChipIdea silicon IP. Currently, only the | 6 | controller based on ChipIdea silicon IP. Currently, only the |
diff --git a/drivers/usb/chipidea/ci_hdrc_imx.c b/drivers/usb/chipidea/ci_hdrc_imx.c index 74d998d9b45b..be822a2c1776 100644 --- a/drivers/usb/chipidea/ci_hdrc_imx.c +++ b/drivers/usb/chipidea/ci_hdrc_imx.c | |||
@@ -131,7 +131,7 @@ static int ci_hdrc_imx_probe(struct platform_device *pdev) | |||
131 | if (ret) { | 131 | if (ret) { |
132 | dev_err(&pdev->dev, "usbmisc init failed, ret=%d\n", | 132 | dev_err(&pdev->dev, "usbmisc init failed, ret=%d\n", |
133 | ret); | 133 | ret); |
134 | goto err_clk; | 134 | goto err_phy; |
135 | } | 135 | } |
136 | } | 136 | } |
137 | 137 | ||
@@ -143,7 +143,7 @@ static int ci_hdrc_imx_probe(struct platform_device *pdev) | |||
143 | dev_err(&pdev->dev, | 143 | dev_err(&pdev->dev, |
144 | "Can't register ci_hdrc platform device, err=%d\n", | 144 | "Can't register ci_hdrc platform device, err=%d\n", |
145 | ret); | 145 | ret); |
146 | goto err_clk; | 146 | goto err_phy; |
147 | } | 147 | } |
148 | 148 | ||
149 | if (data->usbmisc_data) { | 149 | if (data->usbmisc_data) { |
@@ -164,6 +164,9 @@ static int ci_hdrc_imx_probe(struct platform_device *pdev) | |||
164 | 164 | ||
165 | disable_device: | 165 | disable_device: |
166 | ci_hdrc_remove_device(data->ci_pdev); | 166 | ci_hdrc_remove_device(data->ci_pdev); |
167 | err_phy: | ||
168 | if (data->phy) | ||
169 | usb_phy_shutdown(data->phy); | ||
167 | err_clk: | 170 | err_clk: |
168 | clk_disable_unprepare(data->clk); | 171 | clk_disable_unprepare(data->clk); |
169 | return ret; | 172 | return ret; |
diff --git a/drivers/usb/chipidea/core.c b/drivers/usb/chipidea/core.c index 94626409559a..23763dcec069 100644 --- a/drivers/usb/chipidea/core.c +++ b/drivers/usb/chipidea/core.c | |||
@@ -605,6 +605,7 @@ static int ci_hdrc_remove(struct platform_device *pdev) | |||
605 | dbg_remove_files(ci); | 605 | dbg_remove_files(ci); |
606 | free_irq(ci->irq, ci); | 606 | free_irq(ci->irq, ci); |
607 | ci_role_destroy(ci); | 607 | ci_role_destroy(ci); |
608 | kfree(ci->hw_bank.regmap); | ||
608 | 609 | ||
609 | return 0; | 610 | return 0; |
610 | } | 611 | } |
diff --git a/drivers/usb/chipidea/udc.c b/drivers/usb/chipidea/udc.c index 6b4c2f2eb946..9333083dd111 100644 --- a/drivers/usb/chipidea/udc.c +++ b/drivers/usb/chipidea/udc.c | |||
@@ -1600,6 +1600,8 @@ static void destroy_eps(struct ci_hdrc *ci) | |||
1600 | for (i = 0; i < ci->hw_ep_max; i++) { | 1600 | for (i = 0; i < ci->hw_ep_max; i++) { |
1601 | struct ci_hw_ep *hwep = &ci->ci_hw_ep[i]; | 1601 | struct ci_hw_ep *hwep = &ci->ci_hw_ep[i]; |
1602 | 1602 | ||
1603 | if (hwep->pending_td) | ||
1604 | free_pending_td(hwep); | ||
1603 | dma_pool_free(ci->qh_pool, hwep->qh.ptr, hwep->qh.dma); | 1605 | dma_pool_free(ci->qh_pool, hwep->qh.ptr, hwep->qh.dma); |
1604 | } | 1606 | } |
1605 | } | 1607 | } |
@@ -1667,13 +1669,13 @@ static int ci_udc_stop(struct usb_gadget *gadget, | |||
1667 | if (ci->platdata->notify_event) | 1669 | if (ci->platdata->notify_event) |
1668 | ci->platdata->notify_event(ci, | 1670 | ci->platdata->notify_event(ci, |
1669 | CI_HDRC_CONTROLLER_STOPPED_EVENT); | 1671 | CI_HDRC_CONTROLLER_STOPPED_EVENT); |
1670 | ci->driver = NULL; | ||
1671 | spin_unlock_irqrestore(&ci->lock, flags); | 1672 | spin_unlock_irqrestore(&ci->lock, flags); |
1672 | _gadget_stop_activity(&ci->gadget); | 1673 | _gadget_stop_activity(&ci->gadget); |
1673 | spin_lock_irqsave(&ci->lock, flags); | 1674 | spin_lock_irqsave(&ci->lock, flags); |
1674 | pm_runtime_put(&ci->gadget.dev); | 1675 | pm_runtime_put(&ci->gadget.dev); |
1675 | } | 1676 | } |
1676 | 1677 | ||
1678 | ci->driver = NULL; | ||
1677 | spin_unlock_irqrestore(&ci->lock, flags); | 1679 | spin_unlock_irqrestore(&ci->lock, flags); |
1678 | 1680 | ||
1679 | return 0; | 1681 | return 0; |
diff --git a/drivers/usb/core/devio.c b/drivers/usb/core/devio.c index 737e3c19967b..71dc5d768fa5 100644 --- a/drivers/usb/core/devio.c +++ b/drivers/usb/core/devio.c | |||
@@ -742,6 +742,22 @@ static int check_ctrlrecip(struct dev_state *ps, unsigned int requesttype, | |||
742 | if ((index & ~USB_DIR_IN) == 0) | 742 | if ((index & ~USB_DIR_IN) == 0) |
743 | return 0; | 743 | return 0; |
744 | ret = findintfep(ps->dev, index); | 744 | ret = findintfep(ps->dev, index); |
745 | if (ret < 0) { | ||
746 | /* | ||
747 | * Some not fully compliant Win apps seem to get | ||
748 | * index wrong and have the endpoint number here | ||
749 | * rather than the endpoint address (with the | ||
750 | * correct direction). Win does let this through, | ||
751 | * so we'll not reject it here but leave it to | ||
752 | * the device to not break KVM. But we warn. | ||
753 | */ | ||
754 | ret = findintfep(ps->dev, index ^ 0x80); | ||
755 | if (ret >= 0) | ||
756 | dev_info(&ps->dev->dev, | ||
757 | "%s: process %i (%s) requesting ep %02x but needs %02x\n", | ||
758 | __func__, task_pid_nr(current), | ||
759 | current->comm, index, index ^ 0x80); | ||
760 | } | ||
745 | if (ret >= 0) | 761 | if (ret >= 0) |
746 | ret = checkintf(ps, ret); | 762 | ret = checkintf(ps, ret); |
747 | break; | 763 | break; |
diff --git a/drivers/usb/core/hub.c b/drivers/usb/core/hub.c index dde4c83516a1..e6b682c6c236 100644 --- a/drivers/usb/core/hub.c +++ b/drivers/usb/core/hub.c | |||
@@ -3426,6 +3426,9 @@ static int usb_req_set_sel(struct usb_device *udev, enum usb3_link_state state) | |||
3426 | unsigned long long u2_pel; | 3426 | unsigned long long u2_pel; |
3427 | int ret; | 3427 | int ret; |
3428 | 3428 | ||
3429 | if (udev->state != USB_STATE_CONFIGURED) | ||
3430 | return 0; | ||
3431 | |||
3429 | /* Convert SEL and PEL stored in ns to us */ | 3432 | /* Convert SEL and PEL stored in ns to us */ |
3430 | u1_sel = DIV_ROUND_UP(udev->u1_params.sel, 1000); | 3433 | u1_sel = DIV_ROUND_UP(udev->u1_params.sel, 1000); |
3431 | u1_pel = DIV_ROUND_UP(udev->u1_params.pel, 1000); | 3434 | u1_pel = DIV_ROUND_UP(udev->u1_params.pel, 1000); |
diff --git a/drivers/usb/dwc3/dwc3-pci.c b/drivers/usb/dwc3/dwc3-pci.c index 997ebe420bc9..2e252aae51ca 100644 --- a/drivers/usb/dwc3/dwc3-pci.c +++ b/drivers/usb/dwc3/dwc3-pci.c | |||
@@ -29,6 +29,7 @@ | |||
29 | #define PCI_VENDOR_ID_SYNOPSYS 0x16c3 | 29 | #define PCI_VENDOR_ID_SYNOPSYS 0x16c3 |
30 | #define PCI_DEVICE_ID_SYNOPSYS_HAPSUSB3 0xabcd | 30 | #define PCI_DEVICE_ID_SYNOPSYS_HAPSUSB3 0xabcd |
31 | #define PCI_DEVICE_ID_INTEL_BYT 0x0f37 | 31 | #define PCI_DEVICE_ID_INTEL_BYT 0x0f37 |
32 | #define PCI_DEVICE_ID_INTEL_MRFLD 0x119e | ||
32 | 33 | ||
33 | struct dwc3_pci { | 34 | struct dwc3_pci { |
34 | struct device *dev; | 35 | struct device *dev; |
@@ -189,6 +190,7 @@ static DEFINE_PCI_DEVICE_TABLE(dwc3_pci_id_table) = { | |||
189 | PCI_DEVICE_ID_SYNOPSYS_HAPSUSB3), | 190 | PCI_DEVICE_ID_SYNOPSYS_HAPSUSB3), |
190 | }, | 191 | }, |
191 | { PCI_DEVICE(PCI_VENDOR_ID_INTEL, PCI_DEVICE_ID_INTEL_BYT), }, | 192 | { PCI_DEVICE(PCI_VENDOR_ID_INTEL, PCI_DEVICE_ID_INTEL_BYT), }, |
193 | { PCI_DEVICE(PCI_VENDOR_ID_INTEL, PCI_DEVICE_ID_INTEL_MRFLD), }, | ||
192 | { } /* Terminating Entry */ | 194 | { } /* Terminating Entry */ |
193 | }; | 195 | }; |
194 | MODULE_DEVICE_TABLE(pci, dwc3_pci_id_table); | 196 | MODULE_DEVICE_TABLE(pci, dwc3_pci_id_table); |
diff --git a/drivers/usb/gadget/f_fs.c b/drivers/usb/gadget/f_fs.c index 1a66c5baa0d1..0658908d8968 100644 --- a/drivers/usb/gadget/f_fs.c +++ b/drivers/usb/gadget/f_fs.c | |||
@@ -1034,37 +1034,19 @@ struct ffs_sb_fill_data { | |||
1034 | struct ffs_file_perms perms; | 1034 | struct ffs_file_perms perms; |
1035 | umode_t root_mode; | 1035 | umode_t root_mode; |
1036 | const char *dev_name; | 1036 | const char *dev_name; |
1037 | union { | 1037 | struct ffs_data *ffs_data; |
1038 | /* set by ffs_fs_mount(), read by ffs_sb_fill() */ | ||
1039 | void *private_data; | ||
1040 | /* set by ffs_sb_fill(), read by ffs_fs_mount */ | ||
1041 | struct ffs_data *ffs_data; | ||
1042 | }; | ||
1043 | }; | 1038 | }; |
1044 | 1039 | ||
1045 | static int ffs_sb_fill(struct super_block *sb, void *_data, int silent) | 1040 | static int ffs_sb_fill(struct super_block *sb, void *_data, int silent) |
1046 | { | 1041 | { |
1047 | struct ffs_sb_fill_data *data = _data; | 1042 | struct ffs_sb_fill_data *data = _data; |
1048 | struct inode *inode; | 1043 | struct inode *inode; |
1049 | struct ffs_data *ffs; | 1044 | struct ffs_data *ffs = data->ffs_data; |
1050 | 1045 | ||
1051 | ENTER(); | 1046 | ENTER(); |
1052 | 1047 | ||
1053 | /* Initialise data */ | ||
1054 | ffs = ffs_data_new(); | ||
1055 | if (unlikely(!ffs)) | ||
1056 | goto Enomem; | ||
1057 | |||
1058 | ffs->sb = sb; | 1048 | ffs->sb = sb; |
1059 | ffs->dev_name = kstrdup(data->dev_name, GFP_KERNEL); | 1049 | data->ffs_data = NULL; |
1060 | if (unlikely(!ffs->dev_name)) | ||
1061 | goto Enomem; | ||
1062 | ffs->file_perms = data->perms; | ||
1063 | ffs->private_data = data->private_data; | ||
1064 | |||
1065 | /* used by the caller of this function */ | ||
1066 | data->ffs_data = ffs; | ||
1067 | |||
1068 | sb->s_fs_info = ffs; | 1050 | sb->s_fs_info = ffs; |
1069 | sb->s_blocksize = PAGE_CACHE_SIZE; | 1051 | sb->s_blocksize = PAGE_CACHE_SIZE; |
1070 | sb->s_blocksize_bits = PAGE_CACHE_SHIFT; | 1052 | sb->s_blocksize_bits = PAGE_CACHE_SHIFT; |
@@ -1080,17 +1062,14 @@ static int ffs_sb_fill(struct super_block *sb, void *_data, int silent) | |||
1080 | &data->perms); | 1062 | &data->perms); |
1081 | sb->s_root = d_make_root(inode); | 1063 | sb->s_root = d_make_root(inode); |
1082 | if (unlikely(!sb->s_root)) | 1064 | if (unlikely(!sb->s_root)) |
1083 | goto Enomem; | 1065 | return -ENOMEM; |
1084 | 1066 | ||
1085 | /* EP0 file */ | 1067 | /* EP0 file */ |
1086 | if (unlikely(!ffs_sb_create_file(sb, "ep0", ffs, | 1068 | if (unlikely(!ffs_sb_create_file(sb, "ep0", ffs, |
1087 | &ffs_ep0_operations, NULL))) | 1069 | &ffs_ep0_operations, NULL))) |
1088 | goto Enomem; | 1070 | return -ENOMEM; |
1089 | 1071 | ||
1090 | return 0; | 1072 | return 0; |
1091 | |||
1092 | Enomem: | ||
1093 | return -ENOMEM; | ||
1094 | } | 1073 | } |
1095 | 1074 | ||
1096 | static int ffs_fs_parse_opts(struct ffs_sb_fill_data *data, char *opts) | 1075 | static int ffs_fs_parse_opts(struct ffs_sb_fill_data *data, char *opts) |
@@ -1193,6 +1172,7 @@ ffs_fs_mount(struct file_system_type *t, int flags, | |||
1193 | struct dentry *rv; | 1172 | struct dentry *rv; |
1194 | int ret; | 1173 | int ret; |
1195 | void *ffs_dev; | 1174 | void *ffs_dev; |
1175 | struct ffs_data *ffs; | ||
1196 | 1176 | ||
1197 | ENTER(); | 1177 | ENTER(); |
1198 | 1178 | ||
@@ -1200,18 +1180,30 @@ ffs_fs_mount(struct file_system_type *t, int flags, | |||
1200 | if (unlikely(ret < 0)) | 1180 | if (unlikely(ret < 0)) |
1201 | return ERR_PTR(ret); | 1181 | return ERR_PTR(ret); |
1202 | 1182 | ||
1183 | ffs = ffs_data_new(); | ||
1184 | if (unlikely(!ffs)) | ||
1185 | return ERR_PTR(-ENOMEM); | ||
1186 | ffs->file_perms = data.perms; | ||
1187 | |||
1188 | ffs->dev_name = kstrdup(dev_name, GFP_KERNEL); | ||
1189 | if (unlikely(!ffs->dev_name)) { | ||
1190 | ffs_data_put(ffs); | ||
1191 | return ERR_PTR(-ENOMEM); | ||
1192 | } | ||
1193 | |||
1203 | ffs_dev = functionfs_acquire_dev_callback(dev_name); | 1194 | ffs_dev = functionfs_acquire_dev_callback(dev_name); |
1204 | if (IS_ERR(ffs_dev)) | 1195 | if (IS_ERR(ffs_dev)) { |
1205 | return ffs_dev; | 1196 | ffs_data_put(ffs); |
1197 | return ERR_CAST(ffs_dev); | ||
1198 | } | ||
1199 | ffs->private_data = ffs_dev; | ||
1200 | data.ffs_data = ffs; | ||
1206 | 1201 | ||
1207 | data.dev_name = dev_name; | ||
1208 | data.private_data = ffs_dev; | ||
1209 | rv = mount_nodev(t, flags, &data, ffs_sb_fill); | 1202 | rv = mount_nodev(t, flags, &data, ffs_sb_fill); |
1210 | 1203 | if (IS_ERR(rv) && data.ffs_data) { | |
1211 | /* data.ffs_data is set by ffs_sb_fill */ | ||
1212 | if (IS_ERR(rv)) | ||
1213 | functionfs_release_dev_callback(data.ffs_data); | 1204 | functionfs_release_dev_callback(data.ffs_data); |
1214 | 1205 | ffs_data_put(data.ffs_data); | |
1206 | } | ||
1215 | return rv; | 1207 | return rv; |
1216 | } | 1208 | } |
1217 | 1209 | ||
diff --git a/drivers/usb/host/ehci-fsl.c b/drivers/usb/host/ehci-fsl.c index 4449f565d6c6..f2407b2e8a99 100644 --- a/drivers/usb/host/ehci-fsl.c +++ b/drivers/usb/host/ehci-fsl.c | |||
@@ -130,7 +130,7 @@ static int usb_hcd_fsl_probe(const struct hc_driver *driver, | |||
130 | } | 130 | } |
131 | 131 | ||
132 | /* Enable USB controller, 83xx or 8536 */ | 132 | /* Enable USB controller, 83xx or 8536 */ |
133 | if (pdata->have_sysif_regs) | 133 | if (pdata->have_sysif_regs && pdata->controller_ver < FSL_USB_VER_1_6) |
134 | setbits32(hcd->regs + FSL_SOC_USB_CTRL, 0x4); | 134 | setbits32(hcd->regs + FSL_SOC_USB_CTRL, 0x4); |
135 | 135 | ||
136 | /* Don't need to set host mode here. It will be done by tdi_reset() */ | 136 | /* Don't need to set host mode here. It will be done by tdi_reset() */ |
@@ -232,15 +232,9 @@ static int ehci_fsl_setup_phy(struct usb_hcd *hcd, | |||
232 | case FSL_USB2_PHY_ULPI: | 232 | case FSL_USB2_PHY_ULPI: |
233 | if (pdata->have_sysif_regs && pdata->controller_ver) { | 233 | if (pdata->have_sysif_regs && pdata->controller_ver) { |
234 | /* controller version 1.6 or above */ | 234 | /* controller version 1.6 or above */ |
235 | clrbits32(non_ehci + FSL_SOC_USB_CTRL, UTMI_PHY_EN); | ||
235 | setbits32(non_ehci + FSL_SOC_USB_CTRL, | 236 | setbits32(non_ehci + FSL_SOC_USB_CTRL, |
236 | ULPI_PHY_CLK_SEL); | 237 | ULPI_PHY_CLK_SEL | USB_CTRL_USB_EN); |
237 | /* | ||
238 | * Due to controller issue of PHY_CLK_VALID in ULPI | ||
239 | * mode, we set USB_CTRL_USB_EN before checking | ||
240 | * PHY_CLK_VALID, otherwise PHY_CLK_VALID doesn't work. | ||
241 | */ | ||
242 | clrsetbits_be32(non_ehci + FSL_SOC_USB_CTRL, | ||
243 | UTMI_PHY_EN, USB_CTRL_USB_EN); | ||
244 | } | 238 | } |
245 | portsc |= PORT_PTS_ULPI; | 239 | portsc |= PORT_PTS_ULPI; |
246 | break; | 240 | break; |
@@ -270,8 +264,9 @@ static int ehci_fsl_setup_phy(struct usb_hcd *hcd, | |||
270 | if (pdata->have_sysif_regs && pdata->controller_ver && | 264 | if (pdata->have_sysif_regs && pdata->controller_ver && |
271 | (phy_mode == FSL_USB2_PHY_ULPI)) { | 265 | (phy_mode == FSL_USB2_PHY_ULPI)) { |
272 | /* check PHY_CLK_VALID to get phy clk valid */ | 266 | /* check PHY_CLK_VALID to get phy clk valid */ |
273 | if (!spin_event_timeout(in_be32(non_ehci + FSL_SOC_USB_CTRL) & | 267 | if (!(spin_event_timeout(in_be32(non_ehci + FSL_SOC_USB_CTRL) & |
274 | PHY_CLK_VALID, FSL_USB_PHY_CLK_TIMEOUT, 0)) { | 268 | PHY_CLK_VALID, FSL_USB_PHY_CLK_TIMEOUT, 0) || |
269 | in_be32(non_ehci + FSL_SOC_USB_PRICTRL))) { | ||
275 | printk(KERN_WARNING "fsl-ehci: USB PHY clock invalid\n"); | 270 | printk(KERN_WARNING "fsl-ehci: USB PHY clock invalid\n"); |
276 | return -EINVAL; | 271 | return -EINVAL; |
277 | } | 272 | } |
diff --git a/drivers/usb/host/ehci-pci.c b/drivers/usb/host/ehci-pci.c index 6bd299e61f58..854c2ec7b699 100644 --- a/drivers/usb/host/ehci-pci.c +++ b/drivers/usb/host/ehci-pci.c | |||
@@ -361,7 +361,7 @@ static struct pci_driver ehci_pci_driver = { | |||
361 | .remove = usb_hcd_pci_remove, | 361 | .remove = usb_hcd_pci_remove, |
362 | .shutdown = usb_hcd_pci_shutdown, | 362 | .shutdown = usb_hcd_pci_shutdown, |
363 | 363 | ||
364 | #ifdef CONFIG_PM_SLEEP | 364 | #ifdef CONFIG_PM |
365 | .driver = { | 365 | .driver = { |
366 | .pm = &usb_hcd_pci_pm_ops | 366 | .pm = &usb_hcd_pci_pm_ops |
367 | }, | 367 | }, |
diff --git a/drivers/usb/host/imx21-hcd.c b/drivers/usb/host/imx21-hcd.c index 60a5de505ca1..adb01d950a16 100644 --- a/drivers/usb/host/imx21-hcd.c +++ b/drivers/usb/host/imx21-hcd.c | |||
@@ -824,13 +824,13 @@ static int imx21_hc_urb_enqueue_isoc(struct usb_hcd *hcd, | |||
824 | i = DIV_ROUND_UP(wrap_frame( | 824 | i = DIV_ROUND_UP(wrap_frame( |
825 | cur_frame - urb->start_frame), | 825 | cur_frame - urb->start_frame), |
826 | urb->interval); | 826 | urb->interval); |
827 | if (urb->transfer_flags & URB_ISO_ASAP) { | 827 | |
828 | /* Treat underruns as if URB_ISO_ASAP was set */ | ||
829 | if ((urb->transfer_flags & URB_ISO_ASAP) || | ||
830 | i >= urb->number_of_packets) { | ||
828 | urb->start_frame = wrap_frame(urb->start_frame | 831 | urb->start_frame = wrap_frame(urb->start_frame |
829 | + i * urb->interval); | 832 | + i * urb->interval); |
830 | i = 0; | 833 | i = 0; |
831 | } else if (i >= urb->number_of_packets) { | ||
832 | ret = -EXDEV; | ||
833 | goto alloc_dmem_failed; | ||
834 | } | 834 | } |
835 | } | 835 | } |
836 | } | 836 | } |
diff --git a/drivers/usb/host/ohci-hcd.c b/drivers/usb/host/ohci-hcd.c index 8f6b695af6a4..604cad1bcf9c 100644 --- a/drivers/usb/host/ohci-hcd.c +++ b/drivers/usb/host/ohci-hcd.c | |||
@@ -216,31 +216,26 @@ static int ohci_urb_enqueue ( | |||
216 | frame &= ~(ed->interval - 1); | 216 | frame &= ~(ed->interval - 1); |
217 | frame |= ed->branch; | 217 | frame |= ed->branch; |
218 | urb->start_frame = frame; | 218 | urb->start_frame = frame; |
219 | ed->last_iso = frame + ed->interval * (size - 1); | ||
219 | } | 220 | } |
220 | } else if (ed->type == PIPE_ISOCHRONOUS) { | 221 | } else if (ed->type == PIPE_ISOCHRONOUS) { |
221 | u16 next = ohci_frame_no(ohci) + 1; | 222 | u16 next = ohci_frame_no(ohci) + 1; |
222 | u16 frame = ed->last_iso + ed->interval; | 223 | u16 frame = ed->last_iso + ed->interval; |
224 | u16 length = ed->interval * (size - 1); | ||
223 | 225 | ||
224 | /* Behind the scheduling threshold? */ | 226 | /* Behind the scheduling threshold? */ |
225 | if (unlikely(tick_before(frame, next))) { | 227 | if (unlikely(tick_before(frame, next))) { |
226 | 228 | ||
227 | /* USB_ISO_ASAP: Round up to the first available slot */ | 229 | /* URB_ISO_ASAP: Round up to the first available slot */ |
228 | if (urb->transfer_flags & URB_ISO_ASAP) { | 230 | if (urb->transfer_flags & URB_ISO_ASAP) { |
229 | frame += (next - frame + ed->interval - 1) & | 231 | frame += (next - frame + ed->interval - 1) & |
230 | -ed->interval; | 232 | -ed->interval; |
231 | 233 | ||
232 | /* | 234 | /* |
233 | * Not ASAP: Use the next slot in the stream. If | 235 | * Not ASAP: Use the next slot in the stream, |
234 | * the entire URB falls before the threshold, fail. | 236 | * no matter what. |
235 | */ | 237 | */ |
236 | } else { | 238 | } else { |
237 | if (tick_before(frame + ed->interval * | ||
238 | (urb->number_of_packets - 1), next)) { | ||
239 | retval = -EXDEV; | ||
240 | usb_hcd_unlink_urb_from_ep(hcd, urb); | ||
241 | goto fail; | ||
242 | } | ||
243 | |||
244 | /* | 239 | /* |
245 | * Some OHCI hardware doesn't handle late TDs | 240 | * Some OHCI hardware doesn't handle late TDs |
246 | * correctly. After retiring them it proceeds | 241 | * correctly. After retiring them it proceeds |
@@ -251,9 +246,16 @@ static int ohci_urb_enqueue ( | |||
251 | urb_priv->td_cnt = DIV_ROUND_UP( | 246 | urb_priv->td_cnt = DIV_ROUND_UP( |
252 | (u16) (next - frame), | 247 | (u16) (next - frame), |
253 | ed->interval); | 248 | ed->interval); |
249 | if (urb_priv->td_cnt >= urb_priv->length) { | ||
250 | ++urb_priv->td_cnt; /* Mark it */ | ||
251 | ohci_dbg(ohci, "iso underrun %p (%u+%u < %u)\n", | ||
252 | urb, frame, length, | ||
253 | next); | ||
254 | } | ||
254 | } | 255 | } |
255 | } | 256 | } |
256 | urb->start_frame = frame; | 257 | urb->start_frame = frame; |
258 | ed->last_iso = frame + length; | ||
257 | } | 259 | } |
258 | 260 | ||
259 | /* fill the TDs and link them to the ed; and | 261 | /* fill the TDs and link them to the ed; and |
diff --git a/drivers/usb/host/ohci-q.c b/drivers/usb/host/ohci-q.c index df4a6707322d..e7f577e63624 100644 --- a/drivers/usb/host/ohci-q.c +++ b/drivers/usb/host/ohci-q.c | |||
@@ -41,9 +41,13 @@ finish_urb(struct ohci_hcd *ohci, struct urb *urb, int status) | |||
41 | __releases(ohci->lock) | 41 | __releases(ohci->lock) |
42 | __acquires(ohci->lock) | 42 | __acquires(ohci->lock) |
43 | { | 43 | { |
44 | struct device *dev = ohci_to_hcd(ohci)->self.controller; | 44 | struct device *dev = ohci_to_hcd(ohci)->self.controller; |
45 | struct usb_host_endpoint *ep = urb->ep; | ||
46 | struct urb_priv *urb_priv; | ||
47 | |||
45 | // ASSERT (urb->hcpriv != 0); | 48 | // ASSERT (urb->hcpriv != 0); |
46 | 49 | ||
50 | restart: | ||
47 | urb_free_priv (ohci, urb->hcpriv); | 51 | urb_free_priv (ohci, urb->hcpriv); |
48 | urb->hcpriv = NULL; | 52 | urb->hcpriv = NULL; |
49 | if (likely(status == -EINPROGRESS)) | 53 | if (likely(status == -EINPROGRESS)) |
@@ -80,6 +84,21 @@ __acquires(ohci->lock) | |||
80 | ohci->hc_control &= ~(OHCI_CTRL_PLE|OHCI_CTRL_IE); | 84 | ohci->hc_control &= ~(OHCI_CTRL_PLE|OHCI_CTRL_IE); |
81 | ohci_writel (ohci, ohci->hc_control, &ohci->regs->control); | 85 | ohci_writel (ohci, ohci->hc_control, &ohci->regs->control); |
82 | } | 86 | } |
87 | |||
88 | /* | ||
89 | * An isochronous URB that is sumitted too late won't have any TDs | ||
90 | * (marked by the fact that the td_cnt value is larger than the | ||
91 | * actual number of TDs). If the next URB on this endpoint is like | ||
92 | * that, give it back now. | ||
93 | */ | ||
94 | if (!list_empty(&ep->urb_list)) { | ||
95 | urb = list_first_entry(&ep->urb_list, struct urb, urb_list); | ||
96 | urb_priv = urb->hcpriv; | ||
97 | if (urb_priv->td_cnt > urb_priv->length) { | ||
98 | status = 0; | ||
99 | goto restart; | ||
100 | } | ||
101 | } | ||
83 | } | 102 | } |
84 | 103 | ||
85 | 104 | ||
@@ -546,7 +565,6 @@ td_fill (struct ohci_hcd *ohci, u32 info, | |||
546 | td->hwCBP = cpu_to_hc32 (ohci, data & 0xFFFFF000); | 565 | td->hwCBP = cpu_to_hc32 (ohci, data & 0xFFFFF000); |
547 | *ohci_hwPSWp(ohci, td, 0) = cpu_to_hc16 (ohci, | 566 | *ohci_hwPSWp(ohci, td, 0) = cpu_to_hc16 (ohci, |
548 | (data & 0x0FFF) | 0xE000); | 567 | (data & 0x0FFF) | 0xE000); |
549 | td->ed->last_iso = info & 0xffff; | ||
550 | } else { | 568 | } else { |
551 | td->hwCBP = cpu_to_hc32 (ohci, data); | 569 | td->hwCBP = cpu_to_hc32 (ohci, data); |
552 | } | 570 | } |
@@ -996,7 +1014,7 @@ rescan_this: | |||
996 | urb_priv->td_cnt++; | 1014 | urb_priv->td_cnt++; |
997 | 1015 | ||
998 | /* if URB is done, clean up */ | 1016 | /* if URB is done, clean up */ |
999 | if (urb_priv->td_cnt == urb_priv->length) { | 1017 | if (urb_priv->td_cnt >= urb_priv->length) { |
1000 | modified = completed = 1; | 1018 | modified = completed = 1; |
1001 | finish_urb(ohci, urb, 0); | 1019 | finish_urb(ohci, urb, 0); |
1002 | } | 1020 | } |
@@ -1086,7 +1104,7 @@ static void takeback_td(struct ohci_hcd *ohci, struct td *td) | |||
1086 | urb_priv->td_cnt++; | 1104 | urb_priv->td_cnt++; |
1087 | 1105 | ||
1088 | /* If all this urb's TDs are done, call complete() */ | 1106 | /* If all this urb's TDs are done, call complete() */ |
1089 | if (urb_priv->td_cnt == urb_priv->length) | 1107 | if (urb_priv->td_cnt >= urb_priv->length) |
1090 | finish_urb(ohci, urb, status); | 1108 | finish_urb(ohci, urb, status); |
1091 | 1109 | ||
1092 | /* clean schedule: unlink EDs that are no longer busy */ | 1110 | /* clean schedule: unlink EDs that are no longer busy */ |
diff --git a/drivers/usb/host/uhci-pci.c b/drivers/usb/host/uhci-pci.c index c300bd2f7d1c..0f228c46eeda 100644 --- a/drivers/usb/host/uhci-pci.c +++ b/drivers/usb/host/uhci-pci.c | |||
@@ -293,7 +293,7 @@ static struct pci_driver uhci_pci_driver = { | |||
293 | .remove = usb_hcd_pci_remove, | 293 | .remove = usb_hcd_pci_remove, |
294 | .shutdown = uhci_shutdown, | 294 | .shutdown = uhci_shutdown, |
295 | 295 | ||
296 | #ifdef CONFIG_PM_SLEEP | 296 | #ifdef CONFIG_PM |
297 | .driver = { | 297 | .driver = { |
298 | .pm = &usb_hcd_pci_pm_ops | 298 | .pm = &usb_hcd_pci_pm_ops |
299 | }, | 299 | }, |
diff --git a/drivers/usb/host/uhci-q.c b/drivers/usb/host/uhci-q.c index 041c6ddb695c..da6f56d996ce 100644 --- a/drivers/usb/host/uhci-q.c +++ b/drivers/usb/host/uhci-q.c | |||
@@ -1303,7 +1303,7 @@ static int uhci_submit_isochronous(struct uhci_hcd *uhci, struct urb *urb, | |||
1303 | } | 1303 | } |
1304 | 1304 | ||
1305 | /* Fell behind? */ | 1305 | /* Fell behind? */ |
1306 | if (uhci_frame_before_eq(frame, next)) { | 1306 | if (!uhci_frame_before_eq(next, frame)) { |
1307 | 1307 | ||
1308 | /* USB_ISO_ASAP: Round up to the first available slot */ | 1308 | /* USB_ISO_ASAP: Round up to the first available slot */ |
1309 | if (urb->transfer_flags & URB_ISO_ASAP) | 1309 | if (urb->transfer_flags & URB_ISO_ASAP) |
@@ -1311,13 +1311,17 @@ static int uhci_submit_isochronous(struct uhci_hcd *uhci, struct urb *urb, | |||
1311 | -qh->period; | 1311 | -qh->period; |
1312 | 1312 | ||
1313 | /* | 1313 | /* |
1314 | * Not ASAP: Use the next slot in the stream. If | 1314 | * Not ASAP: Use the next slot in the stream, |
1315 | * the entire URB falls before the threshold, fail. | 1315 | * no matter what. |
1316 | */ | 1316 | */ |
1317 | else if (!uhci_frame_before_eq(next, | 1317 | else if (!uhci_frame_before_eq(next, |
1318 | frame + (urb->number_of_packets - 1) * | 1318 | frame + (urb->number_of_packets - 1) * |
1319 | qh->period)) | 1319 | qh->period)) |
1320 | return -EXDEV; | 1320 | dev_dbg(uhci_dev(uhci), "iso underrun %p (%u+%u < %u)\n", |
1321 | urb, frame, | ||
1322 | (urb->number_of_packets - 1) * | ||
1323 | qh->period, | ||
1324 | next); | ||
1321 | } | 1325 | } |
1322 | } | 1326 | } |
1323 | 1327 | ||
diff --git a/drivers/usb/host/xhci-hub.c b/drivers/usb/host/xhci-hub.c index fae697ed0b70..773a6b28c4f1 100644 --- a/drivers/usb/host/xhci-hub.c +++ b/drivers/usb/host/xhci-hub.c | |||
@@ -287,7 +287,7 @@ static int xhci_stop_device(struct xhci_hcd *xhci, int slot_id, int suspend) | |||
287 | if (virt_dev->eps[i].ring && virt_dev->eps[i].ring->dequeue) | 287 | if (virt_dev->eps[i].ring && virt_dev->eps[i].ring->dequeue) |
288 | xhci_queue_stop_endpoint(xhci, slot_id, i, suspend); | 288 | xhci_queue_stop_endpoint(xhci, slot_id, i, suspend); |
289 | } | 289 | } |
290 | cmd->command_trb = xhci->cmd_ring->enqueue; | 290 | cmd->command_trb = xhci_find_next_enqueue(xhci->cmd_ring); |
291 | list_add_tail(&cmd->cmd_list, &virt_dev->cmd_list); | 291 | list_add_tail(&cmd->cmd_list, &virt_dev->cmd_list); |
292 | xhci_queue_stop_endpoint(xhci, slot_id, 0, suspend); | 292 | xhci_queue_stop_endpoint(xhci, slot_id, 0, suspend); |
293 | xhci_ring_cmd_db(xhci); | 293 | xhci_ring_cmd_db(xhci); |
@@ -552,11 +552,15 @@ void xhci_del_comp_mod_timer(struct xhci_hcd *xhci, u32 status, u16 wIndex) | |||
552 | * - Mark a port as being done with device resume, | 552 | * - Mark a port as being done with device resume, |
553 | * and ring the endpoint doorbells. | 553 | * and ring the endpoint doorbells. |
554 | * - Stop the Synopsys redriver Compliance Mode polling. | 554 | * - Stop the Synopsys redriver Compliance Mode polling. |
555 | * - Drop and reacquire the xHCI lock, in order to wait for port resume. | ||
555 | */ | 556 | */ |
556 | static u32 xhci_get_port_status(struct usb_hcd *hcd, | 557 | static u32 xhci_get_port_status(struct usb_hcd *hcd, |
557 | struct xhci_bus_state *bus_state, | 558 | struct xhci_bus_state *bus_state, |
558 | __le32 __iomem **port_array, | 559 | __le32 __iomem **port_array, |
559 | u16 wIndex, u32 raw_port_status) | 560 | u16 wIndex, u32 raw_port_status, |
561 | unsigned long flags) | ||
562 | __releases(&xhci->lock) | ||
563 | __acquires(&xhci->lock) | ||
560 | { | 564 | { |
561 | struct xhci_hcd *xhci = hcd_to_xhci(hcd); | 565 | struct xhci_hcd *xhci = hcd_to_xhci(hcd); |
562 | u32 status = 0; | 566 | u32 status = 0; |
@@ -591,21 +595,42 @@ static u32 xhci_get_port_status(struct usb_hcd *hcd, | |||
591 | return 0xffffffff; | 595 | return 0xffffffff; |
592 | if (time_after_eq(jiffies, | 596 | if (time_after_eq(jiffies, |
593 | bus_state->resume_done[wIndex])) { | 597 | bus_state->resume_done[wIndex])) { |
598 | int time_left; | ||
599 | |||
594 | xhci_dbg(xhci, "Resume USB2 port %d\n", | 600 | xhci_dbg(xhci, "Resume USB2 port %d\n", |
595 | wIndex + 1); | 601 | wIndex + 1); |
596 | bus_state->resume_done[wIndex] = 0; | 602 | bus_state->resume_done[wIndex] = 0; |
597 | clear_bit(wIndex, &bus_state->resuming_ports); | 603 | clear_bit(wIndex, &bus_state->resuming_ports); |
604 | |||
605 | set_bit(wIndex, &bus_state->rexit_ports); | ||
598 | xhci_set_link_state(xhci, port_array, wIndex, | 606 | xhci_set_link_state(xhci, port_array, wIndex, |
599 | XDEV_U0); | 607 | XDEV_U0); |
600 | xhci_dbg(xhci, "set port %d resume\n", | 608 | |
601 | wIndex + 1); | 609 | spin_unlock_irqrestore(&xhci->lock, flags); |
602 | slot_id = xhci_find_slot_id_by_port(hcd, xhci, | 610 | time_left = wait_for_completion_timeout( |
603 | wIndex + 1); | 611 | &bus_state->rexit_done[wIndex], |
604 | if (!slot_id) { | 612 | msecs_to_jiffies( |
605 | xhci_dbg(xhci, "slot_id is zero\n"); | 613 | XHCI_MAX_REXIT_TIMEOUT)); |
606 | return 0xffffffff; | 614 | spin_lock_irqsave(&xhci->lock, flags); |
615 | |||
616 | if (time_left) { | ||
617 | slot_id = xhci_find_slot_id_by_port(hcd, | ||
618 | xhci, wIndex + 1); | ||
619 | if (!slot_id) { | ||
620 | xhci_dbg(xhci, "slot_id is zero\n"); | ||
621 | return 0xffffffff; | ||
622 | } | ||
623 | xhci_ring_device(xhci, slot_id); | ||
624 | } else { | ||
625 | int port_status = xhci_readl(xhci, | ||
626 | port_array[wIndex]); | ||
627 | xhci_warn(xhci, "Port resume took longer than %i msec, port status = 0x%x\n", | ||
628 | XHCI_MAX_REXIT_TIMEOUT, | ||
629 | port_status); | ||
630 | status |= USB_PORT_STAT_SUSPEND; | ||
631 | clear_bit(wIndex, &bus_state->rexit_ports); | ||
607 | } | 632 | } |
608 | xhci_ring_device(xhci, slot_id); | 633 | |
609 | bus_state->port_c_suspend |= 1 << wIndex; | 634 | bus_state->port_c_suspend |= 1 << wIndex; |
610 | bus_state->suspended_ports &= ~(1 << wIndex); | 635 | bus_state->suspended_ports &= ~(1 << wIndex); |
611 | } else { | 636 | } else { |
@@ -728,7 +753,7 @@ int xhci_hub_control(struct usb_hcd *hcd, u16 typeReq, u16 wValue, | |||
728 | break; | 753 | break; |
729 | } | 754 | } |
730 | status = xhci_get_port_status(hcd, bus_state, port_array, | 755 | status = xhci_get_port_status(hcd, bus_state, port_array, |
731 | wIndex, temp); | 756 | wIndex, temp, flags); |
732 | if (status == 0xffffffff) | 757 | if (status == 0xffffffff) |
733 | goto error; | 758 | goto error; |
734 | 759 | ||
diff --git a/drivers/usb/host/xhci-mem.c b/drivers/usb/host/xhci-mem.c index 53b972c2a09f..83bcd13622c3 100644 --- a/drivers/usb/host/xhci-mem.c +++ b/drivers/usb/host/xhci-mem.c | |||
@@ -2428,6 +2428,8 @@ int xhci_mem_init(struct xhci_hcd *xhci, gfp_t flags) | |||
2428 | for (i = 0; i < USB_MAXCHILDREN; ++i) { | 2428 | for (i = 0; i < USB_MAXCHILDREN; ++i) { |
2429 | xhci->bus_state[0].resume_done[i] = 0; | 2429 | xhci->bus_state[0].resume_done[i] = 0; |
2430 | xhci->bus_state[1].resume_done[i] = 0; | 2430 | xhci->bus_state[1].resume_done[i] = 0; |
2431 | /* Only the USB 2.0 completions will ever be used. */ | ||
2432 | init_completion(&xhci->bus_state[1].rexit_done[i]); | ||
2431 | } | 2433 | } |
2432 | 2434 | ||
2433 | if (scratchpad_alloc(xhci, flags)) | 2435 | if (scratchpad_alloc(xhci, flags)) |
diff --git a/drivers/usb/host/xhci-pci.c b/drivers/usb/host/xhci-pci.c index c2d495057eb5..236c3aabe940 100644 --- a/drivers/usb/host/xhci-pci.c +++ b/drivers/usb/host/xhci-pci.c | |||
@@ -351,7 +351,7 @@ static struct pci_driver xhci_pci_driver = { | |||
351 | /* suspend and resume implemented later */ | 351 | /* suspend and resume implemented later */ |
352 | 352 | ||
353 | .shutdown = usb_hcd_pci_shutdown, | 353 | .shutdown = usb_hcd_pci_shutdown, |
354 | #ifdef CONFIG_PM_SLEEP | 354 | #ifdef CONFIG_PM |
355 | .driver = { | 355 | .driver = { |
356 | .pm = &usb_hcd_pci_pm_ops | 356 | .pm = &usb_hcd_pci_pm_ops |
357 | }, | 357 | }, |
diff --git a/drivers/usb/host/xhci-ring.c b/drivers/usb/host/xhci-ring.c index 411da1fc7ae8..6bfbd80ec2b9 100644 --- a/drivers/usb/host/xhci-ring.c +++ b/drivers/usb/host/xhci-ring.c | |||
@@ -123,6 +123,16 @@ static int enqueue_is_link_trb(struct xhci_ring *ring) | |||
123 | return TRB_TYPE_LINK_LE32(link->control); | 123 | return TRB_TYPE_LINK_LE32(link->control); |
124 | } | 124 | } |
125 | 125 | ||
126 | union xhci_trb *xhci_find_next_enqueue(struct xhci_ring *ring) | ||
127 | { | ||
128 | /* Enqueue pointer can be left pointing to the link TRB, | ||
129 | * we must handle that | ||
130 | */ | ||
131 | if (TRB_TYPE_LINK_LE32(ring->enqueue->link.control)) | ||
132 | return ring->enq_seg->next->trbs; | ||
133 | return ring->enqueue; | ||
134 | } | ||
135 | |||
126 | /* Updates trb to point to the next TRB in the ring, and updates seg if the next | 136 | /* Updates trb to point to the next TRB in the ring, and updates seg if the next |
127 | * TRB is in a new segment. This does not skip over link TRBs, and it does not | 137 | * TRB is in a new segment. This does not skip over link TRBs, and it does not |
128 | * effect the ring dequeue or enqueue pointers. | 138 | * effect the ring dequeue or enqueue pointers. |
@@ -859,8 +869,12 @@ remove_finished_td: | |||
859 | /* Otherwise ring the doorbell(s) to restart queued transfers */ | 869 | /* Otherwise ring the doorbell(s) to restart queued transfers */ |
860 | ring_doorbell_for_active_rings(xhci, slot_id, ep_index); | 870 | ring_doorbell_for_active_rings(xhci, slot_id, ep_index); |
861 | } | 871 | } |
862 | ep->stopped_td = NULL; | 872 | |
863 | ep->stopped_trb = NULL; | 873 | /* Clear stopped_td and stopped_trb if endpoint is not halted */ |
874 | if (!(ep->ep_state & EP_HALTED)) { | ||
875 | ep->stopped_td = NULL; | ||
876 | ep->stopped_trb = NULL; | ||
877 | } | ||
864 | 878 | ||
865 | /* | 879 | /* |
866 | * Drop the lock and complete the URBs in the cancelled TD list. | 880 | * Drop the lock and complete the URBs in the cancelled TD list. |
@@ -1414,6 +1428,12 @@ static void handle_cmd_completion(struct xhci_hcd *xhci, | |||
1414 | inc_deq(xhci, xhci->cmd_ring); | 1428 | inc_deq(xhci, xhci->cmd_ring); |
1415 | return; | 1429 | return; |
1416 | } | 1430 | } |
1431 | /* There is no command to handle if we get a stop event when the | ||
1432 | * command ring is empty, event->cmd_trb points to the next | ||
1433 | * unset command | ||
1434 | */ | ||
1435 | if (xhci->cmd_ring->dequeue == xhci->cmd_ring->enqueue) | ||
1436 | return; | ||
1417 | } | 1437 | } |
1418 | 1438 | ||
1419 | switch (le32_to_cpu(xhci->cmd_ring->dequeue->generic.field[3]) | 1439 | switch (le32_to_cpu(xhci->cmd_ring->dequeue->generic.field[3]) |
@@ -1743,6 +1763,19 @@ static void handle_port_status(struct xhci_hcd *xhci, | |||
1743 | } | 1763 | } |
1744 | } | 1764 | } |
1745 | 1765 | ||
1766 | /* | ||
1767 | * Check to see if xhci-hub.c is waiting on RExit to U0 transition (or | ||
1768 | * RExit to a disconnect state). If so, let the the driver know it's | ||
1769 | * out of the RExit state. | ||
1770 | */ | ||
1771 | if (!DEV_SUPERSPEED(temp) && | ||
1772 | test_and_clear_bit(faked_port_index, | ||
1773 | &bus_state->rexit_ports)) { | ||
1774 | complete(&bus_state->rexit_done[faked_port_index]); | ||
1775 | bogus_port_status = true; | ||
1776 | goto cleanup; | ||
1777 | } | ||
1778 | |||
1746 | if (hcd->speed != HCD_USB3) | 1779 | if (hcd->speed != HCD_USB3) |
1747 | xhci_test_and_clear_bit(xhci, port_array, faked_port_index, | 1780 | xhci_test_and_clear_bit(xhci, port_array, faked_port_index, |
1748 | PORT_PLC); | 1781 | PORT_PLC); |
diff --git a/drivers/usb/host/xhci.c b/drivers/usb/host/xhci.c index 49b6edb84a79..1e36dbb48366 100644 --- a/drivers/usb/host/xhci.c +++ b/drivers/usb/host/xhci.c | |||
@@ -2598,15 +2598,7 @@ static int xhci_configure_endpoint(struct xhci_hcd *xhci, | |||
2598 | if (command) { | 2598 | if (command) { |
2599 | cmd_completion = command->completion; | 2599 | cmd_completion = command->completion; |
2600 | cmd_status = &command->status; | 2600 | cmd_status = &command->status; |
2601 | command->command_trb = xhci->cmd_ring->enqueue; | 2601 | command->command_trb = xhci_find_next_enqueue(xhci->cmd_ring); |
2602 | |||
2603 | /* Enqueue pointer can be left pointing to the link TRB, | ||
2604 | * we must handle that | ||
2605 | */ | ||
2606 | if (TRB_TYPE_LINK_LE32(command->command_trb->link.control)) | ||
2607 | command->command_trb = | ||
2608 | xhci->cmd_ring->enq_seg->next->trbs; | ||
2609 | |||
2610 | list_add_tail(&command->cmd_list, &virt_dev->cmd_list); | 2602 | list_add_tail(&command->cmd_list, &virt_dev->cmd_list); |
2611 | } else { | 2603 | } else { |
2612 | cmd_completion = &virt_dev->cmd_completion; | 2604 | cmd_completion = &virt_dev->cmd_completion; |
@@ -2614,7 +2606,7 @@ static int xhci_configure_endpoint(struct xhci_hcd *xhci, | |||
2614 | } | 2606 | } |
2615 | init_completion(cmd_completion); | 2607 | init_completion(cmd_completion); |
2616 | 2608 | ||
2617 | cmd_trb = xhci->cmd_ring->dequeue; | 2609 | cmd_trb = xhci_find_next_enqueue(xhci->cmd_ring); |
2618 | if (!ctx_change) | 2610 | if (!ctx_change) |
2619 | ret = xhci_queue_configure_endpoint(xhci, in_ctx->dma, | 2611 | ret = xhci_queue_configure_endpoint(xhci, in_ctx->dma, |
2620 | udev->slot_id, must_succeed); | 2612 | udev->slot_id, must_succeed); |
@@ -3439,14 +3431,7 @@ int xhci_discover_or_reset_device(struct usb_hcd *hcd, struct usb_device *udev) | |||
3439 | 3431 | ||
3440 | /* Attempt to submit the Reset Device command to the command ring */ | 3432 | /* Attempt to submit the Reset Device command to the command ring */ |
3441 | spin_lock_irqsave(&xhci->lock, flags); | 3433 | spin_lock_irqsave(&xhci->lock, flags); |
3442 | reset_device_cmd->command_trb = xhci->cmd_ring->enqueue; | 3434 | reset_device_cmd->command_trb = xhci_find_next_enqueue(xhci->cmd_ring); |
3443 | |||
3444 | /* Enqueue pointer can be left pointing to the link TRB, | ||
3445 | * we must handle that | ||
3446 | */ | ||
3447 | if (TRB_TYPE_LINK_LE32(reset_device_cmd->command_trb->link.control)) | ||
3448 | reset_device_cmd->command_trb = | ||
3449 | xhci->cmd_ring->enq_seg->next->trbs; | ||
3450 | 3435 | ||
3451 | list_add_tail(&reset_device_cmd->cmd_list, &virt_dev->cmd_list); | 3436 | list_add_tail(&reset_device_cmd->cmd_list, &virt_dev->cmd_list); |
3452 | ret = xhci_queue_reset_device(xhci, slot_id); | 3437 | ret = xhci_queue_reset_device(xhci, slot_id); |
@@ -3650,7 +3635,7 @@ int xhci_alloc_dev(struct usb_hcd *hcd, struct usb_device *udev) | |||
3650 | union xhci_trb *cmd_trb; | 3635 | union xhci_trb *cmd_trb; |
3651 | 3636 | ||
3652 | spin_lock_irqsave(&xhci->lock, flags); | 3637 | spin_lock_irqsave(&xhci->lock, flags); |
3653 | cmd_trb = xhci->cmd_ring->dequeue; | 3638 | cmd_trb = xhci_find_next_enqueue(xhci->cmd_ring); |
3654 | ret = xhci_queue_slot_control(xhci, TRB_ENABLE_SLOT, 0); | 3639 | ret = xhci_queue_slot_control(xhci, TRB_ENABLE_SLOT, 0); |
3655 | if (ret) { | 3640 | if (ret) { |
3656 | spin_unlock_irqrestore(&xhci->lock, flags); | 3641 | spin_unlock_irqrestore(&xhci->lock, flags); |
@@ -3785,7 +3770,7 @@ int xhci_address_device(struct usb_hcd *hcd, struct usb_device *udev) | |||
3785 | slot_ctx->dev_info >> 27); | 3770 | slot_ctx->dev_info >> 27); |
3786 | 3771 | ||
3787 | spin_lock_irqsave(&xhci->lock, flags); | 3772 | spin_lock_irqsave(&xhci->lock, flags); |
3788 | cmd_trb = xhci->cmd_ring->dequeue; | 3773 | cmd_trb = xhci_find_next_enqueue(xhci->cmd_ring); |
3789 | ret = xhci_queue_address_device(xhci, virt_dev->in_ctx->dma, | 3774 | ret = xhci_queue_address_device(xhci, virt_dev->in_ctx->dma, |
3790 | udev->slot_id); | 3775 | udev->slot_id); |
3791 | if (ret) { | 3776 | if (ret) { |
diff --git a/drivers/usb/host/xhci.h b/drivers/usb/host/xhci.h index 46aa14894148..289fbfbae746 100644 --- a/drivers/usb/host/xhci.h +++ b/drivers/usb/host/xhci.h | |||
@@ -1412,8 +1412,18 @@ struct xhci_bus_state { | |||
1412 | unsigned long resume_done[USB_MAXCHILDREN]; | 1412 | unsigned long resume_done[USB_MAXCHILDREN]; |
1413 | /* which ports have started to resume */ | 1413 | /* which ports have started to resume */ |
1414 | unsigned long resuming_ports; | 1414 | unsigned long resuming_ports; |
1415 | /* Which ports are waiting on RExit to U0 transition. */ | ||
1416 | unsigned long rexit_ports; | ||
1417 | struct completion rexit_done[USB_MAXCHILDREN]; | ||
1415 | }; | 1418 | }; |
1416 | 1419 | ||
1420 | |||
1421 | /* | ||
1422 | * It can take up to 20 ms to transition from RExit to U0 on the | ||
1423 | * Intel Lynx Point LP xHCI host. | ||
1424 | */ | ||
1425 | #define XHCI_MAX_REXIT_TIMEOUT (20 * 1000) | ||
1426 | |||
1417 | static inline unsigned int hcd_index(struct usb_hcd *hcd) | 1427 | static inline unsigned int hcd_index(struct usb_hcd *hcd) |
1418 | { | 1428 | { |
1419 | if (hcd->speed == HCD_USB3) | 1429 | if (hcd->speed == HCD_USB3) |
@@ -1840,6 +1850,7 @@ int xhci_cancel_cmd(struct xhci_hcd *xhci, struct xhci_command *command, | |||
1840 | union xhci_trb *cmd_trb); | 1850 | union xhci_trb *cmd_trb); |
1841 | void xhci_ring_ep_doorbell(struct xhci_hcd *xhci, unsigned int slot_id, | 1851 | void xhci_ring_ep_doorbell(struct xhci_hcd *xhci, unsigned int slot_id, |
1842 | unsigned int ep_index, unsigned int stream_id); | 1852 | unsigned int ep_index, unsigned int stream_id); |
1853 | union xhci_trb *xhci_find_next_enqueue(struct xhci_ring *ring); | ||
1843 | 1854 | ||
1844 | /* xHCI roothub code */ | 1855 | /* xHCI roothub code */ |
1845 | void xhci_set_link_state(struct xhci_hcd *xhci, __le32 __iomem **port_array, | 1856 | void xhci_set_link_state(struct xhci_hcd *xhci, __le32 __iomem **port_array, |
diff --git a/drivers/video/mmp/hw/mmp_ctrl.c b/drivers/video/mmp/hw/mmp_ctrl.c index 75dca19bf214..6ac755270ab4 100644 --- a/drivers/video/mmp/hw/mmp_ctrl.c +++ b/drivers/video/mmp/hw/mmp_ctrl.c | |||
@@ -514,7 +514,7 @@ static int mmphw_probe(struct platform_device *pdev) | |||
514 | if (IS_ERR(ctrl->clk)) { | 514 | if (IS_ERR(ctrl->clk)) { |
515 | dev_err(ctrl->dev, "unable to get clk %s\n", mi->clk_name); | 515 | dev_err(ctrl->dev, "unable to get clk %s\n", mi->clk_name); |
516 | ret = -ENOENT; | 516 | ret = -ENOENT; |
517 | goto failed_get_clk; | 517 | goto failed; |
518 | } | 518 | } |
519 | clk_prepare_enable(ctrl->clk); | 519 | clk_prepare_enable(ctrl->clk); |
520 | 520 | ||
@@ -551,21 +551,8 @@ failed_path_init: | |||
551 | path_deinit(path_plat); | 551 | path_deinit(path_plat); |
552 | } | 552 | } |
553 | 553 | ||
554 | if (ctrl->clk) { | 554 | clk_disable_unprepare(ctrl->clk); |
555 | devm_clk_put(ctrl->dev, ctrl->clk); | ||
556 | clk_disable_unprepare(ctrl->clk); | ||
557 | } | ||
558 | failed_get_clk: | ||
559 | devm_free_irq(ctrl->dev, ctrl->irq, ctrl); | ||
560 | failed: | 555 | failed: |
561 | if (ctrl) { | ||
562 | if (ctrl->reg_base) | ||
563 | devm_iounmap(ctrl->dev, ctrl->reg_base); | ||
564 | devm_release_mem_region(ctrl->dev, res->start, | ||
565 | resource_size(res)); | ||
566 | devm_kfree(ctrl->dev, ctrl); | ||
567 | } | ||
568 | |||
569 | dev_err(&pdev->dev, "device init failed\n"); | 556 | dev_err(&pdev->dev, "device init failed\n"); |
570 | 557 | ||
571 | return ret; | 558 | return ret; |
diff --git a/drivers/video/mxsfb.c b/drivers/video/mxsfb.c index d250ed0f806d..27197a8048c0 100644 --- a/drivers/video/mxsfb.c +++ b/drivers/video/mxsfb.c | |||
@@ -620,6 +620,7 @@ static int mxsfb_restore_mode(struct mxsfb_info *host) | |||
620 | break; | 620 | break; |
621 | case 3: | 621 | case 3: |
622 | bits_per_pixel = 32; | 622 | bits_per_pixel = 32; |
623 | break; | ||
623 | case 1: | 624 | case 1: |
624 | default: | 625 | default: |
625 | return -EINVAL; | 626 | return -EINVAL; |
diff --git a/drivers/video/neofb.c b/drivers/video/neofb.c index 7ef079c146e7..c172a5281f9e 100644 --- a/drivers/video/neofb.c +++ b/drivers/video/neofb.c | |||
@@ -2075,6 +2075,7 @@ static int neofb_probe(struct pci_dev *dev, const struct pci_device_id *id) | |||
2075 | if (!fb_find_mode(&info->var, info, mode_option, NULL, 0, | 2075 | if (!fb_find_mode(&info->var, info, mode_option, NULL, 0, |
2076 | info->monspecs.modedb, 16)) { | 2076 | info->monspecs.modedb, 16)) { |
2077 | printk(KERN_ERR "neofb: Unable to find usable video mode.\n"); | 2077 | printk(KERN_ERR "neofb: Unable to find usable video mode.\n"); |
2078 | err = -EINVAL; | ||
2078 | goto err_map_video; | 2079 | goto err_map_video; |
2079 | } | 2080 | } |
2080 | 2081 | ||
@@ -2097,7 +2098,8 @@ static int neofb_probe(struct pci_dev *dev, const struct pci_device_id *id) | |||
2097 | info->fix.smem_len >> 10, info->var.xres, | 2098 | info->fix.smem_len >> 10, info->var.xres, |
2098 | info->var.yres, h_sync / 1000, h_sync % 1000, v_sync); | 2099 | info->var.yres, h_sync / 1000, h_sync % 1000, v_sync); |
2099 | 2100 | ||
2100 | if (fb_alloc_cmap(&info->cmap, 256, 0) < 0) | 2101 | err = fb_alloc_cmap(&info->cmap, 256, 0); |
2102 | if (err < 0) | ||
2101 | goto err_map_video; | 2103 | goto err_map_video; |
2102 | 2104 | ||
2103 | err = register_framebuffer(info); | 2105 | err = register_framebuffer(info); |
diff --git a/drivers/video/of_display_timing.c b/drivers/video/of_display_timing.c index 171821ddd78d..ba5b40f581f6 100644 --- a/drivers/video/of_display_timing.c +++ b/drivers/video/of_display_timing.c | |||
@@ -120,7 +120,7 @@ int of_get_display_timing(struct device_node *np, const char *name, | |||
120 | return -EINVAL; | 120 | return -EINVAL; |
121 | } | 121 | } |
122 | 122 | ||
123 | timing_np = of_find_node_by_name(np, name); | 123 | timing_np = of_get_child_by_name(np, name); |
124 | if (!timing_np) { | 124 | if (!timing_np) { |
125 | pr_err("%s: could not find node '%s'\n", | 125 | pr_err("%s: could not find node '%s'\n", |
126 | of_node_full_name(np), name); | 126 | of_node_full_name(np), name); |
@@ -143,11 +143,11 @@ struct display_timings *of_get_display_timings(struct device_node *np) | |||
143 | struct display_timings *disp; | 143 | struct display_timings *disp; |
144 | 144 | ||
145 | if (!np) { | 145 | if (!np) { |
146 | pr_err("%s: no devicenode given\n", of_node_full_name(np)); | 146 | pr_err("%s: no device node given\n", of_node_full_name(np)); |
147 | return NULL; | 147 | return NULL; |
148 | } | 148 | } |
149 | 149 | ||
150 | timings_np = of_find_node_by_name(np, "display-timings"); | 150 | timings_np = of_get_child_by_name(np, "display-timings"); |
151 | if (!timings_np) { | 151 | if (!timings_np) { |
152 | pr_err("%s: could not find display-timings node\n", | 152 | pr_err("%s: could not find display-timings node\n", |
153 | of_node_full_name(np)); | 153 | of_node_full_name(np)); |
diff --git a/drivers/video/omap2/displays-new/Kconfig b/drivers/video/omap2/displays-new/Kconfig index 6c90885b0940..10b25e7cd878 100644 --- a/drivers/video/omap2/displays-new/Kconfig +++ b/drivers/video/omap2/displays-new/Kconfig | |||
@@ -35,6 +35,7 @@ config DISPLAY_PANEL_DPI | |||
35 | 35 | ||
36 | config DISPLAY_PANEL_DSI_CM | 36 | config DISPLAY_PANEL_DSI_CM |
37 | tristate "Generic DSI Command Mode Panel" | 37 | tristate "Generic DSI Command Mode Panel" |
38 | depends on BACKLIGHT_CLASS_DEVICE | ||
38 | help | 39 | help |
39 | Driver for generic DSI command mode panels. | 40 | Driver for generic DSI command mode panels. |
40 | 41 | ||
diff --git a/drivers/video/omap2/displays-new/connector-analog-tv.c b/drivers/video/omap2/displays-new/connector-analog-tv.c index 1b60698f141e..ccd9073f706f 100644 --- a/drivers/video/omap2/displays-new/connector-analog-tv.c +++ b/drivers/video/omap2/displays-new/connector-analog-tv.c | |||
@@ -191,7 +191,7 @@ static int tvc_probe_pdata(struct platform_device *pdev) | |||
191 | in = omap_dss_find_output(pdata->source); | 191 | in = omap_dss_find_output(pdata->source); |
192 | if (in == NULL) { | 192 | if (in == NULL) { |
193 | dev_err(&pdev->dev, "Failed to find video source\n"); | 193 | dev_err(&pdev->dev, "Failed to find video source\n"); |
194 | return -ENODEV; | 194 | return -EPROBE_DEFER; |
195 | } | 195 | } |
196 | 196 | ||
197 | ddata->in = in; | 197 | ddata->in = in; |
diff --git a/drivers/video/omap2/displays-new/connector-dvi.c b/drivers/video/omap2/displays-new/connector-dvi.c index bc5f8ceda371..63d88ee6dfe4 100644 --- a/drivers/video/omap2/displays-new/connector-dvi.c +++ b/drivers/video/omap2/displays-new/connector-dvi.c | |||
@@ -263,7 +263,7 @@ static int dvic_probe_pdata(struct platform_device *pdev) | |||
263 | in = omap_dss_find_output(pdata->source); | 263 | in = omap_dss_find_output(pdata->source); |
264 | if (in == NULL) { | 264 | if (in == NULL) { |
265 | dev_err(&pdev->dev, "Failed to find video source\n"); | 265 | dev_err(&pdev->dev, "Failed to find video source\n"); |
266 | return -ENODEV; | 266 | return -EPROBE_DEFER; |
267 | } | 267 | } |
268 | 268 | ||
269 | ddata->in = in; | 269 | ddata->in = in; |
diff --git a/drivers/video/omap2/displays-new/connector-hdmi.c b/drivers/video/omap2/displays-new/connector-hdmi.c index c5826716d6ab..9abe2c039ae9 100644 --- a/drivers/video/omap2/displays-new/connector-hdmi.c +++ b/drivers/video/omap2/displays-new/connector-hdmi.c | |||
@@ -290,7 +290,7 @@ static int hdmic_probe_pdata(struct platform_device *pdev) | |||
290 | in = omap_dss_find_output(pdata->source); | 290 | in = omap_dss_find_output(pdata->source); |
291 | if (in == NULL) { | 291 | if (in == NULL) { |
292 | dev_err(&pdev->dev, "Failed to find video source\n"); | 292 | dev_err(&pdev->dev, "Failed to find video source\n"); |
293 | return -ENODEV; | 293 | return -EPROBE_DEFER; |
294 | } | 294 | } |
295 | 295 | ||
296 | ddata->in = in; | 296 | ddata->in = in; |
diff --git a/drivers/video/omap2/dss/dispc.c b/drivers/video/omap2/dss/dispc.c index 02a7340111df..477975009eee 100644 --- a/drivers/video/omap2/dss/dispc.c +++ b/drivers/video/omap2/dss/dispc.c | |||
@@ -3691,6 +3691,7 @@ static int __init omap_dispchw_probe(struct platform_device *pdev) | |||
3691 | } | 3691 | } |
3692 | 3692 | ||
3693 | pm_runtime_enable(&pdev->dev); | 3693 | pm_runtime_enable(&pdev->dev); |
3694 | pm_runtime_irq_safe(&pdev->dev); | ||
3694 | 3695 | ||
3695 | r = dispc_runtime_get(); | 3696 | r = dispc_runtime_get(); |
3696 | if (r) | 3697 | if (r) |
diff --git a/drivers/video/s3fb.c b/drivers/video/s3fb.c index 47ca86c5c6c0..d838ba829459 100644 --- a/drivers/video/s3fb.c +++ b/drivers/video/s3fb.c | |||
@@ -1336,14 +1336,7 @@ static int s3_pci_probe(struct pci_dev *dev, const struct pci_device_id *id) | |||
1336 | (info->var.bits_per_pixel * info->var.xres_virtual); | 1336 | (info->var.bits_per_pixel * info->var.xres_virtual); |
1337 | if (info->var.yres_virtual < info->var.yres) { | 1337 | if (info->var.yres_virtual < info->var.yres) { |
1338 | dev_err(info->device, "virtual vertical size smaller than real\n"); | 1338 | dev_err(info->device, "virtual vertical size smaller than real\n"); |
1339 | goto err_find_mode; | 1339 | rc = -EINVAL; |
1340 | } | ||
1341 | |||
1342 | /* maximize virtual vertical size for fast scrolling */ | ||
1343 | info->var.yres_virtual = info->fix.smem_len * 8 / | ||
1344 | (info->var.bits_per_pixel * info->var.xres_virtual); | ||
1345 | if (info->var.yres_virtual < info->var.yres) { | ||
1346 | dev_err(info->device, "virtual vertical size smaller than real\n"); | ||
1347 | goto err_find_mode; | 1340 | goto err_find_mode; |
1348 | } | 1341 | } |
1349 | 1342 | ||
diff --git a/drivers/xen/balloon.c b/drivers/xen/balloon.c index a50c6e3a7cc4..b232908a6192 100644 --- a/drivers/xen/balloon.c +++ b/drivers/xen/balloon.c | |||
@@ -398,8 +398,6 @@ static enum bp_state decrease_reservation(unsigned long nr_pages, gfp_t gfp) | |||
398 | if (nr_pages > ARRAY_SIZE(frame_list)) | 398 | if (nr_pages > ARRAY_SIZE(frame_list)) |
399 | nr_pages = ARRAY_SIZE(frame_list); | 399 | nr_pages = ARRAY_SIZE(frame_list); |
400 | 400 | ||
401 | scratch_page = get_balloon_scratch_page(); | ||
402 | |||
403 | for (i = 0; i < nr_pages; i++) { | 401 | for (i = 0; i < nr_pages; i++) { |
404 | page = alloc_page(gfp); | 402 | page = alloc_page(gfp); |
405 | if (page == NULL) { | 403 | if (page == NULL) { |
@@ -413,6 +411,12 @@ static enum bp_state decrease_reservation(unsigned long nr_pages, gfp_t gfp) | |||
413 | 411 | ||
414 | scrub_page(page); | 412 | scrub_page(page); |
415 | 413 | ||
414 | /* | ||
415 | * Ballooned out frames are effectively replaced with | ||
416 | * a scratch frame. Ensure direct mappings and the | ||
417 | * p2m are consistent. | ||
418 | */ | ||
419 | scratch_page = get_balloon_scratch_page(); | ||
416 | #ifdef CONFIG_XEN_HAVE_PVMMU | 420 | #ifdef CONFIG_XEN_HAVE_PVMMU |
417 | if (xen_pv_domain() && !PageHighMem(page)) { | 421 | if (xen_pv_domain() && !PageHighMem(page)) { |
418 | ret = HYPERVISOR_update_va_mapping( | 422 | ret = HYPERVISOR_update_va_mapping( |
@@ -422,24 +426,19 @@ static enum bp_state decrease_reservation(unsigned long nr_pages, gfp_t gfp) | |||
422 | BUG_ON(ret); | 426 | BUG_ON(ret); |
423 | } | 427 | } |
424 | #endif | 428 | #endif |
425 | } | ||
426 | |||
427 | /* Ensure that ballooned highmem pages don't have kmaps. */ | ||
428 | kmap_flush_unused(); | ||
429 | flush_tlb_all(); | ||
430 | |||
431 | /* No more mappings: invalidate P2M and add to balloon. */ | ||
432 | for (i = 0; i < nr_pages; i++) { | ||
433 | pfn = mfn_to_pfn(frame_list[i]); | ||
434 | if (!xen_feature(XENFEAT_auto_translated_physmap)) { | 429 | if (!xen_feature(XENFEAT_auto_translated_physmap)) { |
435 | unsigned long p; | 430 | unsigned long p; |
436 | p = page_to_pfn(scratch_page); | 431 | p = page_to_pfn(scratch_page); |
437 | __set_phys_to_machine(pfn, pfn_to_mfn(p)); | 432 | __set_phys_to_machine(pfn, pfn_to_mfn(p)); |
438 | } | 433 | } |
434 | put_balloon_scratch_page(); | ||
435 | |||
439 | balloon_append(pfn_to_page(pfn)); | 436 | balloon_append(pfn_to_page(pfn)); |
440 | } | 437 | } |
441 | 438 | ||
442 | put_balloon_scratch_page(); | 439 | /* Ensure that ballooned highmem pages don't have kmaps. */ |
440 | kmap_flush_unused(); | ||
441 | flush_tlb_all(); | ||
443 | 442 | ||
444 | set_xen_guest_handle(reservation.extent_start, frame_list); | 443 | set_xen_guest_handle(reservation.extent_start, frame_list); |
445 | reservation.nr_extents = nr_pages; | 444 | reservation.nr_extents = nr_pages; |