diff options
author | Dave Airlie <airlied@redhat.com> | 2014-11-11 19:29:34 -0500 |
---|---|---|
committer | Dave Airlie <airlied@redhat.com> | 2014-11-12 02:53:30 -0500 |
commit | 51b44eb17b8ec6c83eac7772b4c8bc5887c5fbf7 (patch) | |
tree | 4125e1888cbc215ec4a365457505a407f48e5232 /drivers | |
parent | cc7096fb6d1dfbdac5e7e2675c046fd40646cc66 (diff) | |
parent | 206c5f60a3d902bc4b56dab2de3e88de5eb06108 (diff) |
Merge tag 'v3.18-rc4' into drm-next
backmerge to get vmwgfx locking changes into next as the
conflict with per-plane locking.
Diffstat (limited to 'drivers')
379 files changed, 2978 insertions, 2014 deletions
diff --git a/drivers/acpi/ec.c b/drivers/acpi/ec.c index 3d304ff7f095..5f9b74b9b71f 100644 --- a/drivers/acpi/ec.c +++ b/drivers/acpi/ec.c | |||
@@ -126,6 +126,7 @@ static int EC_FLAGS_MSI; /* Out-of-spec MSI controller */ | |||
126 | static int EC_FLAGS_VALIDATE_ECDT; /* ASUStec ECDTs need to be validated */ | 126 | static int EC_FLAGS_VALIDATE_ECDT; /* ASUStec ECDTs need to be validated */ |
127 | static int EC_FLAGS_SKIP_DSDT_SCAN; /* Not all BIOS survive early DSDT scan */ | 127 | static int EC_FLAGS_SKIP_DSDT_SCAN; /* Not all BIOS survive early DSDT scan */ |
128 | static int EC_FLAGS_CLEAR_ON_RESUME; /* Needs acpi_ec_clear() on boot/resume */ | 128 | static int EC_FLAGS_CLEAR_ON_RESUME; /* Needs acpi_ec_clear() on boot/resume */ |
129 | static int EC_FLAGS_QUERY_HANDSHAKE; /* Needs QR_EC issued when SCI_EVT set */ | ||
129 | 130 | ||
130 | /* -------------------------------------------------------------------------- | 131 | /* -------------------------------------------------------------------------- |
131 | * Transaction Management | 132 | * Transaction Management |
@@ -236,13 +237,8 @@ static bool advance_transaction(struct acpi_ec *ec) | |||
236 | } | 237 | } |
237 | return wakeup; | 238 | return wakeup; |
238 | } else { | 239 | } else { |
239 | /* | 240 | if (EC_FLAGS_QUERY_HANDSHAKE && |
240 | * There is firmware refusing to respond QR_EC when SCI_EVT | 241 | !(status & ACPI_EC_FLAG_SCI) && |
241 | * is not set, for which case, we complete the QR_EC | ||
242 | * without issuing it to the firmware. | ||
243 | * https://bugzilla.kernel.org/show_bug.cgi?id=86211 | ||
244 | */ | ||
245 | if (!(status & ACPI_EC_FLAG_SCI) && | ||
246 | (t->command == ACPI_EC_COMMAND_QUERY)) { | 242 | (t->command == ACPI_EC_COMMAND_QUERY)) { |
247 | t->flags |= ACPI_EC_COMMAND_POLL; | 243 | t->flags |= ACPI_EC_COMMAND_POLL; |
248 | t->rdata[t->ri++] = 0x00; | 244 | t->rdata[t->ri++] = 0x00; |
@@ -334,13 +330,13 @@ static int acpi_ec_transaction_unlocked(struct acpi_ec *ec, | |||
334 | pr_debug("***** Command(%s) started *****\n", | 330 | pr_debug("***** Command(%s) started *****\n", |
335 | acpi_ec_cmd_string(t->command)); | 331 | acpi_ec_cmd_string(t->command)); |
336 | start_transaction(ec); | 332 | start_transaction(ec); |
337 | spin_unlock_irqrestore(&ec->lock, tmp); | ||
338 | ret = ec_poll(ec); | ||
339 | spin_lock_irqsave(&ec->lock, tmp); | ||
340 | if (ec->curr->command == ACPI_EC_COMMAND_QUERY) { | 333 | if (ec->curr->command == ACPI_EC_COMMAND_QUERY) { |
341 | clear_bit(EC_FLAGS_QUERY_PENDING, &ec->flags); | 334 | clear_bit(EC_FLAGS_QUERY_PENDING, &ec->flags); |
342 | pr_debug("***** Event stopped *****\n"); | 335 | pr_debug("***** Event stopped *****\n"); |
343 | } | 336 | } |
337 | spin_unlock_irqrestore(&ec->lock, tmp); | ||
338 | ret = ec_poll(ec); | ||
339 | spin_lock_irqsave(&ec->lock, tmp); | ||
344 | pr_debug("***** Command(%s) stopped *****\n", | 340 | pr_debug("***** Command(%s) stopped *****\n", |
345 | acpi_ec_cmd_string(t->command)); | 341 | acpi_ec_cmd_string(t->command)); |
346 | ec->curr = NULL; | 342 | ec->curr = NULL; |
@@ -1012,6 +1008,18 @@ static int ec_enlarge_storm_threshold(const struct dmi_system_id *id) | |||
1012 | } | 1008 | } |
1013 | 1009 | ||
1014 | /* | 1010 | /* |
1011 | * Acer EC firmware refuses to respond QR_EC when SCI_EVT is not set, for | ||
1012 | * which case, we complete the QR_EC without issuing it to the firmware. | ||
1013 | * https://bugzilla.kernel.org/show_bug.cgi?id=86211 | ||
1014 | */ | ||
1015 | static int ec_flag_query_handshake(const struct dmi_system_id *id) | ||
1016 | { | ||
1017 | pr_debug("Detected the EC firmware requiring QR_EC issued when SCI_EVT set\n"); | ||
1018 | EC_FLAGS_QUERY_HANDSHAKE = 1; | ||
1019 | return 0; | ||
1020 | } | ||
1021 | |||
1022 | /* | ||
1015 | * On some hardware it is necessary to clear events accumulated by the EC during | 1023 | * On some hardware it is necessary to clear events accumulated by the EC during |
1016 | * sleep. These ECs stop reporting GPEs until they are manually polled, if too | 1024 | * sleep. These ECs stop reporting GPEs until they are manually polled, if too |
1017 | * many events are accumulated. (e.g. Samsung Series 5/9 notebooks) | 1025 | * many events are accumulated. (e.g. Samsung Series 5/9 notebooks) |
@@ -1085,6 +1093,9 @@ static struct dmi_system_id ec_dmi_table[] __initdata = { | |||
1085 | { | 1093 | { |
1086 | ec_clear_on_resume, "Samsung hardware", { | 1094 | ec_clear_on_resume, "Samsung hardware", { |
1087 | DMI_MATCH(DMI_SYS_VENDOR, "SAMSUNG ELECTRONICS CO., LTD.")}, NULL}, | 1095 | DMI_MATCH(DMI_SYS_VENDOR, "SAMSUNG ELECTRONICS CO., LTD.")}, NULL}, |
1096 | { | ||
1097 | ec_flag_query_handshake, "Acer hardware", { | ||
1098 | DMI_MATCH(DMI_SYS_VENDOR, "Acer"), }, NULL}, | ||
1088 | {}, | 1099 | {}, |
1089 | }; | 1100 | }; |
1090 | 1101 | ||
diff --git a/drivers/acpi/scan.c b/drivers/acpi/scan.c index d670158a26c5..0476e90b2091 100644 --- a/drivers/acpi/scan.c +++ b/drivers/acpi/scan.c | |||
@@ -142,6 +142,53 @@ static int create_modalias(struct acpi_device *acpi_dev, char *modalias, | |||
142 | } | 142 | } |
143 | 143 | ||
144 | /* | 144 | /* |
145 | * acpi_companion_match() - Can we match via ACPI companion device | ||
146 | * @dev: Device in question | ||
147 | * | ||
148 | * Check if the given device has an ACPI companion and if that companion has | ||
149 | * a valid list of PNP IDs, and if the device is the first (primary) physical | ||
150 | * device associated with it. | ||
151 | * | ||
152 | * If multiple physical devices are attached to a single ACPI companion, we need | ||
153 | * to be careful. The usage scenario for this kind of relationship is that all | ||
154 | * of the physical devices in question use resources provided by the ACPI | ||
155 | * companion. A typical case is an MFD device where all the sub-devices share | ||
156 | * the parent's ACPI companion. In such cases we can only allow the primary | ||
157 | * (first) physical device to be matched with the help of the companion's PNP | ||
158 | * IDs. | ||
159 | * | ||
160 | * Additional physical devices sharing the ACPI companion can still use | ||
161 | * resources available from it but they will be matched normally using functions | ||
162 | * provided by their bus types (and analogously for their modalias). | ||
163 | */ | ||
164 | static bool acpi_companion_match(const struct device *dev) | ||
165 | { | ||
166 | struct acpi_device *adev; | ||
167 | bool ret; | ||
168 | |||
169 | adev = ACPI_COMPANION(dev); | ||
170 | if (!adev) | ||
171 | return false; | ||
172 | |||
173 | if (list_empty(&adev->pnp.ids)) | ||
174 | return false; | ||
175 | |||
176 | mutex_lock(&adev->physical_node_lock); | ||
177 | if (list_empty(&adev->physical_node_list)) { | ||
178 | ret = false; | ||
179 | } else { | ||
180 | const struct acpi_device_physical_node *node; | ||
181 | |||
182 | node = list_first_entry(&adev->physical_node_list, | ||
183 | struct acpi_device_physical_node, node); | ||
184 | ret = node->dev == dev; | ||
185 | } | ||
186 | mutex_unlock(&adev->physical_node_lock); | ||
187 | |||
188 | return ret; | ||
189 | } | ||
190 | |||
191 | /* | ||
145 | * Creates uevent modalias field for ACPI enumerated devices. | 192 | * Creates uevent modalias field for ACPI enumerated devices. |
146 | * Because the other buses does not support ACPI HIDs & CIDs. | 193 | * Because the other buses does not support ACPI HIDs & CIDs. |
147 | * e.g. for a device with hid:IBM0001 and cid:ACPI0001 you get: | 194 | * e.g. for a device with hid:IBM0001 and cid:ACPI0001 you get: |
@@ -149,20 +196,14 @@ static int create_modalias(struct acpi_device *acpi_dev, char *modalias, | |||
149 | */ | 196 | */ |
150 | int acpi_device_uevent_modalias(struct device *dev, struct kobj_uevent_env *env) | 197 | int acpi_device_uevent_modalias(struct device *dev, struct kobj_uevent_env *env) |
151 | { | 198 | { |
152 | struct acpi_device *acpi_dev; | ||
153 | int len; | 199 | int len; |
154 | 200 | ||
155 | acpi_dev = ACPI_COMPANION(dev); | 201 | if (!acpi_companion_match(dev)) |
156 | if (!acpi_dev) | ||
157 | return -ENODEV; | ||
158 | |||
159 | /* Fall back to bus specific way of modalias exporting */ | ||
160 | if (list_empty(&acpi_dev->pnp.ids)) | ||
161 | return -ENODEV; | 202 | return -ENODEV; |
162 | 203 | ||
163 | if (add_uevent_var(env, "MODALIAS=")) | 204 | if (add_uevent_var(env, "MODALIAS=")) |
164 | return -ENOMEM; | 205 | return -ENOMEM; |
165 | len = create_modalias(acpi_dev, &env->buf[env->buflen - 1], | 206 | len = create_modalias(ACPI_COMPANION(dev), &env->buf[env->buflen - 1], |
166 | sizeof(env->buf) - env->buflen); | 207 | sizeof(env->buf) - env->buflen); |
167 | if (len <= 0) | 208 | if (len <= 0) |
168 | return len; | 209 | return len; |
@@ -179,18 +220,12 @@ EXPORT_SYMBOL_GPL(acpi_device_uevent_modalias); | |||
179 | */ | 220 | */ |
180 | int acpi_device_modalias(struct device *dev, char *buf, int size) | 221 | int acpi_device_modalias(struct device *dev, char *buf, int size) |
181 | { | 222 | { |
182 | struct acpi_device *acpi_dev; | ||
183 | int len; | 223 | int len; |
184 | 224 | ||
185 | acpi_dev = ACPI_COMPANION(dev); | 225 | if (!acpi_companion_match(dev)) |
186 | if (!acpi_dev) | ||
187 | return -ENODEV; | 226 | return -ENODEV; |
188 | 227 | ||
189 | /* Fall back to bus specific way of modalias exporting */ | 228 | len = create_modalias(ACPI_COMPANION(dev), buf, size -1); |
190 | if (list_empty(&acpi_dev->pnp.ids)) | ||
191 | return -ENODEV; | ||
192 | |||
193 | len = create_modalias(acpi_dev, buf, size -1); | ||
194 | if (len <= 0) | 229 | if (len <= 0) |
195 | return len; | 230 | return len; |
196 | buf[len++] = '\n'; | 231 | buf[len++] = '\n'; |
@@ -853,6 +888,9 @@ const struct acpi_device_id *acpi_match_device(const struct acpi_device_id *ids, | |||
853 | if (!ids || !handle || acpi_bus_get_device(handle, &adev)) | 888 | if (!ids || !handle || acpi_bus_get_device(handle, &adev)) |
854 | return NULL; | 889 | return NULL; |
855 | 890 | ||
891 | if (!acpi_companion_match(dev)) | ||
892 | return NULL; | ||
893 | |||
856 | return __acpi_match_device(adev, ids); | 894 | return __acpi_match_device(adev, ids); |
857 | } | 895 | } |
858 | EXPORT_SYMBOL_GPL(acpi_match_device); | 896 | EXPORT_SYMBOL_GPL(acpi_match_device); |
diff --git a/drivers/base/Kconfig b/drivers/base/Kconfig index 61a33f4ba608..df04227d00cf 100644 --- a/drivers/base/Kconfig +++ b/drivers/base/Kconfig | |||
@@ -171,20 +171,23 @@ config WANT_DEV_COREDUMP | |||
171 | Drivers should "select" this option if they desire to use the | 171 | Drivers should "select" this option if they desire to use the |
172 | device coredump mechanism. | 172 | device coredump mechanism. |
173 | 173 | ||
174 | config DISABLE_DEV_COREDUMP | 174 | config ALLOW_DEV_COREDUMP |
175 | bool "Disable device coredump" if EXPERT | 175 | bool "Allow device coredump" if EXPERT |
176 | default y | ||
176 | help | 177 | help |
177 | Disable the device coredump mechanism despite drivers wanting to | 178 | This option controls if the device coredump mechanism is available or |
178 | use it; this allows for more sensitive systems or systems that | 179 | not; if disabled, the mechanism will be omitted even if drivers that |
179 | don't want to ever access the information to not have the code, | 180 | can use it are enabled. |
180 | nor keep any data. | 181 | Say 'N' for more sensitive systems or systems that don't want |
182 | to ever access the information to not have the code, nor keep any | ||
183 | data. | ||
181 | 184 | ||
182 | If unsure, say N. | 185 | If unsure, say Y. |
183 | 186 | ||
184 | config DEV_COREDUMP | 187 | config DEV_COREDUMP |
185 | bool | 188 | bool |
186 | default y if WANT_DEV_COREDUMP | 189 | default y if WANT_DEV_COREDUMP |
187 | depends on !DISABLE_DEV_COREDUMP | 190 | depends on ALLOW_DEV_COREDUMP |
188 | 191 | ||
189 | config DEBUG_DRIVER | 192 | config DEBUG_DRIVER |
190 | bool "Driver Core verbose debug messages" | 193 | bool "Driver Core verbose debug messages" |
diff --git a/drivers/base/core.c b/drivers/base/core.c index 14d162952c3b..842d04707de6 100644 --- a/drivers/base/core.c +++ b/drivers/base/core.c | |||
@@ -724,12 +724,12 @@ class_dir_create_and_add(struct class *class, struct kobject *parent_kobj) | |||
724 | return &dir->kobj; | 724 | return &dir->kobj; |
725 | } | 725 | } |
726 | 726 | ||
727 | static DEFINE_MUTEX(gdp_mutex); | ||
727 | 728 | ||
728 | static struct kobject *get_device_parent(struct device *dev, | 729 | static struct kobject *get_device_parent(struct device *dev, |
729 | struct device *parent) | 730 | struct device *parent) |
730 | { | 731 | { |
731 | if (dev->class) { | 732 | if (dev->class) { |
732 | static DEFINE_MUTEX(gdp_mutex); | ||
733 | struct kobject *kobj = NULL; | 733 | struct kobject *kobj = NULL; |
734 | struct kobject *parent_kobj; | 734 | struct kobject *parent_kobj; |
735 | struct kobject *k; | 735 | struct kobject *k; |
@@ -793,7 +793,9 @@ static void cleanup_glue_dir(struct device *dev, struct kobject *glue_dir) | |||
793 | glue_dir->kset != &dev->class->p->glue_dirs) | 793 | glue_dir->kset != &dev->class->p->glue_dirs) |
794 | return; | 794 | return; |
795 | 795 | ||
796 | mutex_lock(&gdp_mutex); | ||
796 | kobject_put(glue_dir); | 797 | kobject_put(glue_dir); |
798 | mutex_unlock(&gdp_mutex); | ||
797 | } | 799 | } |
798 | 800 | ||
799 | static void cleanup_device_parent(struct device *dev) | 801 | static void cleanup_device_parent(struct device *dev) |
diff --git a/drivers/base/dma-contiguous.c b/drivers/base/dma-contiguous.c index 473ff4892401..950fff9ce453 100644 --- a/drivers/base/dma-contiguous.c +++ b/drivers/base/dma-contiguous.c | |||
@@ -223,9 +223,10 @@ bool dma_release_from_contiguous(struct device *dev, struct page *pages, | |||
223 | #undef pr_fmt | 223 | #undef pr_fmt |
224 | #define pr_fmt(fmt) fmt | 224 | #define pr_fmt(fmt) fmt |
225 | 225 | ||
226 | static void rmem_cma_device_init(struct reserved_mem *rmem, struct device *dev) | 226 | static int rmem_cma_device_init(struct reserved_mem *rmem, struct device *dev) |
227 | { | 227 | { |
228 | dev_set_cma_area(dev, rmem->priv); | 228 | dev_set_cma_area(dev, rmem->priv); |
229 | return 0; | ||
229 | } | 230 | } |
230 | 231 | ||
231 | static void rmem_cma_device_release(struct reserved_mem *rmem, | 232 | static void rmem_cma_device_release(struct reserved_mem *rmem, |
diff --git a/drivers/base/power/main.c b/drivers/base/power/main.c index 44973196d3fd..9717d5f20139 100644 --- a/drivers/base/power/main.c +++ b/drivers/base/power/main.c | |||
@@ -1266,6 +1266,8 @@ int dpm_suspend_late(pm_message_t state) | |||
1266 | } | 1266 | } |
1267 | mutex_unlock(&dpm_list_mtx); | 1267 | mutex_unlock(&dpm_list_mtx); |
1268 | async_synchronize_full(); | 1268 | async_synchronize_full(); |
1269 | if (!error) | ||
1270 | error = async_error; | ||
1269 | if (error) { | 1271 | if (error) { |
1270 | suspend_stats.failed_suspend_late++; | 1272 | suspend_stats.failed_suspend_late++; |
1271 | dpm_save_failed_step(SUSPEND_SUSPEND_LATE); | 1273 | dpm_save_failed_step(SUSPEND_SUSPEND_LATE); |
diff --git a/drivers/bcma/host_pci.c b/drivers/bcma/host_pci.c index 1e5ac0a79696..cd9161a8b3a1 100644 --- a/drivers/bcma/host_pci.c +++ b/drivers/bcma/host_pci.c | |||
@@ -275,7 +275,7 @@ static SIMPLE_DEV_PM_OPS(bcma_pm_ops, bcma_host_pci_suspend, | |||
275 | static const struct pci_device_id bcma_pci_bridge_tbl[] = { | 275 | static const struct pci_device_id bcma_pci_bridge_tbl[] = { |
276 | { PCI_DEVICE(PCI_VENDOR_ID_BROADCOM, 0x0576) }, | 276 | { PCI_DEVICE(PCI_VENDOR_ID_BROADCOM, 0x0576) }, |
277 | { PCI_DEVICE(PCI_VENDOR_ID_BROADCOM, 0x4313) }, | 277 | { PCI_DEVICE(PCI_VENDOR_ID_BROADCOM, 0x4313) }, |
278 | { PCI_DEVICE(PCI_VENDOR_ID_BROADCOM, 43224) }, | 278 | { PCI_DEVICE(PCI_VENDOR_ID_BROADCOM, 43224) }, /* 0xa8d8 */ |
279 | { PCI_DEVICE(PCI_VENDOR_ID_BROADCOM, 0x4331) }, | 279 | { PCI_DEVICE(PCI_VENDOR_ID_BROADCOM, 0x4331) }, |
280 | { PCI_DEVICE(PCI_VENDOR_ID_BROADCOM, 0x4353) }, | 280 | { PCI_DEVICE(PCI_VENDOR_ID_BROADCOM, 0x4353) }, |
281 | { PCI_DEVICE(PCI_VENDOR_ID_BROADCOM, 0x4357) }, | 281 | { PCI_DEVICE(PCI_VENDOR_ID_BROADCOM, 0x4357) }, |
@@ -285,7 +285,8 @@ static const struct pci_device_id bcma_pci_bridge_tbl[] = { | |||
285 | { PCI_DEVICE(PCI_VENDOR_ID_BROADCOM, 0x43a9) }, | 285 | { PCI_DEVICE(PCI_VENDOR_ID_BROADCOM, 0x43a9) }, |
286 | { PCI_DEVICE(PCI_VENDOR_ID_BROADCOM, 0x43aa) }, | 286 | { PCI_DEVICE(PCI_VENDOR_ID_BROADCOM, 0x43aa) }, |
287 | { PCI_DEVICE(PCI_VENDOR_ID_BROADCOM, 0x4727) }, | 287 | { PCI_DEVICE(PCI_VENDOR_ID_BROADCOM, 0x4727) }, |
288 | { PCI_DEVICE(PCI_VENDOR_ID_BROADCOM, 43227) }, /* 0xA8DB */ | 288 | { PCI_DEVICE(PCI_VENDOR_ID_BROADCOM, 43227) }, /* 0xa8db, BCM43217 (sic!) */ |
289 | { PCI_DEVICE(PCI_VENDOR_ID_BROADCOM, 43228) }, /* 0xa8dc */ | ||
289 | { 0, }, | 290 | { 0, }, |
290 | }; | 291 | }; |
291 | MODULE_DEVICE_TABLE(pci, bcma_pci_bridge_tbl); | 292 | MODULE_DEVICE_TABLE(pci, bcma_pci_bridge_tbl); |
diff --git a/drivers/bcma/main.c b/drivers/bcma/main.c index d1656c2f70af..1000955ce09d 100644 --- a/drivers/bcma/main.c +++ b/drivers/bcma/main.c | |||
@@ -132,7 +132,7 @@ static bool bcma_is_core_needed_early(u16 core_id) | |||
132 | return false; | 132 | return false; |
133 | } | 133 | } |
134 | 134 | ||
135 | #ifdef CONFIG_OF | 135 | #if defined(CONFIG_OF) && defined(CONFIG_OF_ADDRESS) |
136 | static struct device_node *bcma_of_find_child_device(struct platform_device *parent, | 136 | static struct device_node *bcma_of_find_child_device(struct platform_device *parent, |
137 | struct bcma_device *core) | 137 | struct bcma_device *core) |
138 | { | 138 | { |
diff --git a/drivers/block/null_blk.c b/drivers/block/null_blk.c index 2671a3f02f0c..8001e812018b 100644 --- a/drivers/block/null_blk.c +++ b/drivers/block/null_blk.c | |||
@@ -450,14 +450,10 @@ static int init_driver_queues(struct nullb *nullb) | |||
450 | 450 | ||
451 | ret = setup_commands(nq); | 451 | ret = setup_commands(nq); |
452 | if (ret) | 452 | if (ret) |
453 | goto err_queue; | 453 | return ret; |
454 | nullb->nr_queues++; | 454 | nullb->nr_queues++; |
455 | } | 455 | } |
456 | |||
457 | return 0; | 456 | return 0; |
458 | err_queue: | ||
459 | cleanup_queues(nullb); | ||
460 | return ret; | ||
461 | } | 457 | } |
462 | 458 | ||
463 | static int null_add_dev(void) | 459 | static int null_add_dev(void) |
@@ -507,7 +503,9 @@ static int null_add_dev(void) | |||
507 | goto out_cleanup_queues; | 503 | goto out_cleanup_queues; |
508 | } | 504 | } |
509 | blk_queue_make_request(nullb->q, null_queue_bio); | 505 | blk_queue_make_request(nullb->q, null_queue_bio); |
510 | init_driver_queues(nullb); | 506 | rv = init_driver_queues(nullb); |
507 | if (rv) | ||
508 | goto out_cleanup_blk_queue; | ||
511 | } else { | 509 | } else { |
512 | nullb->q = blk_init_queue_node(null_request_fn, &nullb->lock, home_node); | 510 | nullb->q = blk_init_queue_node(null_request_fn, &nullb->lock, home_node); |
513 | if (!nullb->q) { | 511 | if (!nullb->q) { |
@@ -516,7 +514,9 @@ static int null_add_dev(void) | |||
516 | } | 514 | } |
517 | blk_queue_prep_rq(nullb->q, null_rq_prep_fn); | 515 | blk_queue_prep_rq(nullb->q, null_rq_prep_fn); |
518 | blk_queue_softirq_done(nullb->q, null_softirq_done_fn); | 516 | blk_queue_softirq_done(nullb->q, null_softirq_done_fn); |
519 | init_driver_queues(nullb); | 517 | rv = init_driver_queues(nullb); |
518 | if (rv) | ||
519 | goto out_cleanup_blk_queue; | ||
520 | } | 520 | } |
521 | 521 | ||
522 | nullb->q->queuedata = nullb; | 522 | nullb->q->queuedata = nullb; |
diff --git a/drivers/block/rbd.c b/drivers/block/rbd.c index 0a54c588e433..27b71a0b72d0 100644 --- a/drivers/block/rbd.c +++ b/drivers/block/rbd.c | |||
@@ -342,7 +342,6 @@ struct rbd_device { | |||
342 | 342 | ||
343 | struct list_head rq_queue; /* incoming rq queue */ | 343 | struct list_head rq_queue; /* incoming rq queue */ |
344 | spinlock_t lock; /* queue, flags, open_count */ | 344 | spinlock_t lock; /* queue, flags, open_count */ |
345 | struct workqueue_struct *rq_wq; | ||
346 | struct work_struct rq_work; | 345 | struct work_struct rq_work; |
347 | 346 | ||
348 | struct rbd_image_header header; | 347 | struct rbd_image_header header; |
@@ -402,6 +401,8 @@ static struct kmem_cache *rbd_segment_name_cache; | |||
402 | static int rbd_major; | 401 | static int rbd_major; |
403 | static DEFINE_IDA(rbd_dev_id_ida); | 402 | static DEFINE_IDA(rbd_dev_id_ida); |
404 | 403 | ||
404 | static struct workqueue_struct *rbd_wq; | ||
405 | |||
405 | /* | 406 | /* |
406 | * Default to false for now, as single-major requires >= 0.75 version of | 407 | * Default to false for now, as single-major requires >= 0.75 version of |
407 | * userspace rbd utility. | 408 | * userspace rbd utility. |
@@ -3452,7 +3453,7 @@ static void rbd_request_fn(struct request_queue *q) | |||
3452 | } | 3453 | } |
3453 | 3454 | ||
3454 | if (queued) | 3455 | if (queued) |
3455 | queue_work(rbd_dev->rq_wq, &rbd_dev->rq_work); | 3456 | queue_work(rbd_wq, &rbd_dev->rq_work); |
3456 | } | 3457 | } |
3457 | 3458 | ||
3458 | /* | 3459 | /* |
@@ -3532,7 +3533,7 @@ static int rbd_obj_read_sync(struct rbd_device *rbd_dev, | |||
3532 | page_count = (u32) calc_pages_for(offset, length); | 3533 | page_count = (u32) calc_pages_for(offset, length); |
3533 | pages = ceph_alloc_page_vector(page_count, GFP_KERNEL); | 3534 | pages = ceph_alloc_page_vector(page_count, GFP_KERNEL); |
3534 | if (IS_ERR(pages)) | 3535 | if (IS_ERR(pages)) |
3535 | ret = PTR_ERR(pages); | 3536 | return PTR_ERR(pages); |
3536 | 3537 | ||
3537 | ret = -ENOMEM; | 3538 | ret = -ENOMEM; |
3538 | obj_request = rbd_obj_request_create(object_name, offset, length, | 3539 | obj_request = rbd_obj_request_create(object_name, offset, length, |
@@ -5242,16 +5243,9 @@ static int rbd_dev_device_setup(struct rbd_device *rbd_dev) | |||
5242 | set_capacity(rbd_dev->disk, rbd_dev->mapping.size / SECTOR_SIZE); | 5243 | set_capacity(rbd_dev->disk, rbd_dev->mapping.size / SECTOR_SIZE); |
5243 | set_disk_ro(rbd_dev->disk, rbd_dev->mapping.read_only); | 5244 | set_disk_ro(rbd_dev->disk, rbd_dev->mapping.read_only); |
5244 | 5245 | ||
5245 | rbd_dev->rq_wq = alloc_workqueue("%s", WQ_MEM_RECLAIM, 0, | ||
5246 | rbd_dev->disk->disk_name); | ||
5247 | if (!rbd_dev->rq_wq) { | ||
5248 | ret = -ENOMEM; | ||
5249 | goto err_out_mapping; | ||
5250 | } | ||
5251 | |||
5252 | ret = rbd_bus_add_dev(rbd_dev); | 5246 | ret = rbd_bus_add_dev(rbd_dev); |
5253 | if (ret) | 5247 | if (ret) |
5254 | goto err_out_workqueue; | 5248 | goto err_out_mapping; |
5255 | 5249 | ||
5256 | /* Everything's ready. Announce the disk to the world. */ | 5250 | /* Everything's ready. Announce the disk to the world. */ |
5257 | 5251 | ||
@@ -5263,9 +5257,6 @@ static int rbd_dev_device_setup(struct rbd_device *rbd_dev) | |||
5263 | 5257 | ||
5264 | return ret; | 5258 | return ret; |
5265 | 5259 | ||
5266 | err_out_workqueue: | ||
5267 | destroy_workqueue(rbd_dev->rq_wq); | ||
5268 | rbd_dev->rq_wq = NULL; | ||
5269 | err_out_mapping: | 5260 | err_out_mapping: |
5270 | rbd_dev_mapping_clear(rbd_dev); | 5261 | rbd_dev_mapping_clear(rbd_dev); |
5271 | err_out_disk: | 5262 | err_out_disk: |
@@ -5512,7 +5503,6 @@ static void rbd_dev_device_release(struct device *dev) | |||
5512 | { | 5503 | { |
5513 | struct rbd_device *rbd_dev = dev_to_rbd_dev(dev); | 5504 | struct rbd_device *rbd_dev = dev_to_rbd_dev(dev); |
5514 | 5505 | ||
5515 | destroy_workqueue(rbd_dev->rq_wq); | ||
5516 | rbd_free_disk(rbd_dev); | 5506 | rbd_free_disk(rbd_dev); |
5517 | clear_bit(RBD_DEV_FLAG_EXISTS, &rbd_dev->flags); | 5507 | clear_bit(RBD_DEV_FLAG_EXISTS, &rbd_dev->flags); |
5518 | rbd_dev_mapping_clear(rbd_dev); | 5508 | rbd_dev_mapping_clear(rbd_dev); |
@@ -5716,11 +5706,21 @@ static int __init rbd_init(void) | |||
5716 | if (rc) | 5706 | if (rc) |
5717 | return rc; | 5707 | return rc; |
5718 | 5708 | ||
5709 | /* | ||
5710 | * The number of active work items is limited by the number of | ||
5711 | * rbd devices, so leave @max_active at default. | ||
5712 | */ | ||
5713 | rbd_wq = alloc_workqueue(RBD_DRV_NAME, WQ_MEM_RECLAIM, 0); | ||
5714 | if (!rbd_wq) { | ||
5715 | rc = -ENOMEM; | ||
5716 | goto err_out_slab; | ||
5717 | } | ||
5718 | |||
5719 | if (single_major) { | 5719 | if (single_major) { |
5720 | rbd_major = register_blkdev(0, RBD_DRV_NAME); | 5720 | rbd_major = register_blkdev(0, RBD_DRV_NAME); |
5721 | if (rbd_major < 0) { | 5721 | if (rbd_major < 0) { |
5722 | rc = rbd_major; | 5722 | rc = rbd_major; |
5723 | goto err_out_slab; | 5723 | goto err_out_wq; |
5724 | } | 5724 | } |
5725 | } | 5725 | } |
5726 | 5726 | ||
@@ -5738,6 +5738,8 @@ static int __init rbd_init(void) | |||
5738 | err_out_blkdev: | 5738 | err_out_blkdev: |
5739 | if (single_major) | 5739 | if (single_major) |
5740 | unregister_blkdev(rbd_major, RBD_DRV_NAME); | 5740 | unregister_blkdev(rbd_major, RBD_DRV_NAME); |
5741 | err_out_wq: | ||
5742 | destroy_workqueue(rbd_wq); | ||
5741 | err_out_slab: | 5743 | err_out_slab: |
5742 | rbd_slab_exit(); | 5744 | rbd_slab_exit(); |
5743 | return rc; | 5745 | return rc; |
@@ -5749,6 +5751,7 @@ static void __exit rbd_exit(void) | |||
5749 | rbd_sysfs_cleanup(); | 5751 | rbd_sysfs_cleanup(); |
5750 | if (single_major) | 5752 | if (single_major) |
5751 | unregister_blkdev(rbd_major, RBD_DRV_NAME); | 5753 | unregister_blkdev(rbd_major, RBD_DRV_NAME); |
5754 | destroy_workqueue(rbd_wq); | ||
5752 | rbd_slab_exit(); | 5755 | rbd_slab_exit(); |
5753 | } | 5756 | } |
5754 | 5757 | ||
diff --git a/drivers/block/sunvdc.c b/drivers/block/sunvdc.c index 756b8ec00f16..0ebadf93b6c5 100644 --- a/drivers/block/sunvdc.c +++ b/drivers/block/sunvdc.c | |||
@@ -69,8 +69,6 @@ struct vdc_port { | |||
69 | u8 vdisk_mtype; | 69 | u8 vdisk_mtype; |
70 | 70 | ||
71 | char disk_name[32]; | 71 | char disk_name[32]; |
72 | |||
73 | struct vio_disk_vtoc label; | ||
74 | }; | 72 | }; |
75 | 73 | ||
76 | static inline struct vdc_port *to_vdc_port(struct vio_driver_state *vio) | 74 | static inline struct vdc_port *to_vdc_port(struct vio_driver_state *vio) |
@@ -710,13 +708,6 @@ static int probe_disk(struct vdc_port *port) | |||
710 | if (comp.err) | 708 | if (comp.err) |
711 | return comp.err; | 709 | return comp.err; |
712 | 710 | ||
713 | err = generic_request(port, VD_OP_GET_VTOC, | ||
714 | &port->label, sizeof(port->label)); | ||
715 | if (err < 0) { | ||
716 | printk(KERN_ERR PFX "VD_OP_GET_VTOC returns error %d\n", err); | ||
717 | return err; | ||
718 | } | ||
719 | |||
720 | if (vdc_version_supported(port, 1, 1)) { | 711 | if (vdc_version_supported(port, 1, 1)) { |
721 | /* vdisk_size should be set during the handshake, if it wasn't | 712 | /* vdisk_size should be set during the handshake, if it wasn't |
722 | * then the underlying disk is reserved by another system | 713 | * then the underlying disk is reserved by another system |
diff --git a/drivers/block/zram/zram_drv.c b/drivers/block/zram/zram_drv.c index 0e63e8aa8279..2ad0b5bce44b 100644 --- a/drivers/block/zram/zram_drv.c +++ b/drivers/block/zram/zram_drv.c | |||
@@ -99,11 +99,12 @@ static ssize_t mem_used_total_show(struct device *dev, | |||
99 | { | 99 | { |
100 | u64 val = 0; | 100 | u64 val = 0; |
101 | struct zram *zram = dev_to_zram(dev); | 101 | struct zram *zram = dev_to_zram(dev); |
102 | struct zram_meta *meta = zram->meta; | ||
103 | 102 | ||
104 | down_read(&zram->init_lock); | 103 | down_read(&zram->init_lock); |
105 | if (init_done(zram)) | 104 | if (init_done(zram)) { |
105 | struct zram_meta *meta = zram->meta; | ||
106 | val = zs_get_total_pages(meta->mem_pool); | 106 | val = zs_get_total_pages(meta->mem_pool); |
107 | } | ||
107 | up_read(&zram->init_lock); | 108 | up_read(&zram->init_lock); |
108 | 109 | ||
109 | return scnprintf(buf, PAGE_SIZE, "%llu\n", val << PAGE_SHIFT); | 110 | return scnprintf(buf, PAGE_SIZE, "%llu\n", val << PAGE_SHIFT); |
@@ -173,16 +174,17 @@ static ssize_t mem_used_max_store(struct device *dev, | |||
173 | int err; | 174 | int err; |
174 | unsigned long val; | 175 | unsigned long val; |
175 | struct zram *zram = dev_to_zram(dev); | 176 | struct zram *zram = dev_to_zram(dev); |
176 | struct zram_meta *meta = zram->meta; | ||
177 | 177 | ||
178 | err = kstrtoul(buf, 10, &val); | 178 | err = kstrtoul(buf, 10, &val); |
179 | if (err || val != 0) | 179 | if (err || val != 0) |
180 | return -EINVAL; | 180 | return -EINVAL; |
181 | 181 | ||
182 | down_read(&zram->init_lock); | 182 | down_read(&zram->init_lock); |
183 | if (init_done(zram)) | 183 | if (init_done(zram)) { |
184 | struct zram_meta *meta = zram->meta; | ||
184 | atomic_long_set(&zram->stats.max_used_pages, | 185 | atomic_long_set(&zram->stats.max_used_pages, |
185 | zs_get_total_pages(meta->mem_pool)); | 186 | zs_get_total_pages(meta->mem_pool)); |
187 | } | ||
186 | up_read(&zram->init_lock); | 188 | up_read(&zram->init_lock); |
187 | 189 | ||
188 | return len; | 190 | return len; |
diff --git a/drivers/char/raw.c b/drivers/char/raw.c index 0102dc788608..a24891b97547 100644 --- a/drivers/char/raw.c +++ b/drivers/char/raw.c | |||
@@ -285,7 +285,7 @@ static long raw_ctl_compat_ioctl(struct file *file, unsigned int cmd, | |||
285 | 285 | ||
286 | static const struct file_operations raw_fops = { | 286 | static const struct file_operations raw_fops = { |
287 | .read = new_sync_read, | 287 | .read = new_sync_read, |
288 | .read_iter = generic_file_read_iter, | 288 | .read_iter = blkdev_read_iter, |
289 | .write = new_sync_write, | 289 | .write = new_sync_write, |
290 | .write_iter = blkdev_write_iter, | 290 | .write_iter = blkdev_write_iter, |
291 | .fsync = blkdev_fsync, | 291 | .fsync = blkdev_fsync, |
diff --git a/drivers/clocksource/arm_arch_timer.c b/drivers/clocksource/arm_arch_timer.c index 2133f9d59d06..43005d4d3348 100644 --- a/drivers/clocksource/arm_arch_timer.c +++ b/drivers/clocksource/arm_arch_timer.c | |||
@@ -660,11 +660,11 @@ static bool __init | |||
660 | arch_timer_probed(int type, const struct of_device_id *matches) | 660 | arch_timer_probed(int type, const struct of_device_id *matches) |
661 | { | 661 | { |
662 | struct device_node *dn; | 662 | struct device_node *dn; |
663 | bool probed = false; | 663 | bool probed = true; |
664 | 664 | ||
665 | dn = of_find_matching_node(NULL, matches); | 665 | dn = of_find_matching_node(NULL, matches); |
666 | if (dn && of_device_is_available(dn) && (arch_timers_present & type)) | 666 | if (dn && of_device_is_available(dn) && !(arch_timers_present & type)) |
667 | probed = true; | 667 | probed = false; |
668 | of_node_put(dn); | 668 | of_node_put(dn); |
669 | 669 | ||
670 | return probed; | 670 | return probed; |
diff --git a/drivers/cpufreq/cpufreq-dt.c b/drivers/cpufreq/cpufreq-dt.c index 92c162af5045..23aaf40cf37f 100644 --- a/drivers/cpufreq/cpufreq-dt.c +++ b/drivers/cpufreq/cpufreq-dt.c | |||
@@ -187,6 +187,7 @@ static int cpufreq_init(struct cpufreq_policy *policy) | |||
187 | struct device *cpu_dev; | 187 | struct device *cpu_dev; |
188 | struct regulator *cpu_reg; | 188 | struct regulator *cpu_reg; |
189 | struct clk *cpu_clk; | 189 | struct clk *cpu_clk; |
190 | unsigned long min_uV = ~0, max_uV = 0; | ||
190 | unsigned int transition_latency; | 191 | unsigned int transition_latency; |
191 | int ret; | 192 | int ret; |
192 | 193 | ||
@@ -206,16 +207,10 @@ static int cpufreq_init(struct cpufreq_policy *policy) | |||
206 | /* OPPs might be populated at runtime, don't check for error here */ | 207 | /* OPPs might be populated at runtime, don't check for error here */ |
207 | of_init_opp_table(cpu_dev); | 208 | of_init_opp_table(cpu_dev); |
208 | 209 | ||
209 | ret = dev_pm_opp_init_cpufreq_table(cpu_dev, &freq_table); | ||
210 | if (ret) { | ||
211 | dev_err(cpu_dev, "failed to init cpufreq table: %d\n", ret); | ||
212 | goto out_put_node; | ||
213 | } | ||
214 | |||
215 | priv = kzalloc(sizeof(*priv), GFP_KERNEL); | 210 | priv = kzalloc(sizeof(*priv), GFP_KERNEL); |
216 | if (!priv) { | 211 | if (!priv) { |
217 | ret = -ENOMEM; | 212 | ret = -ENOMEM; |
218 | goto out_free_table; | 213 | goto out_put_node; |
219 | } | 214 | } |
220 | 215 | ||
221 | of_property_read_u32(np, "voltage-tolerance", &priv->voltage_tolerance); | 216 | of_property_read_u32(np, "voltage-tolerance", &priv->voltage_tolerance); |
@@ -224,30 +219,51 @@ static int cpufreq_init(struct cpufreq_policy *policy) | |||
224 | transition_latency = CPUFREQ_ETERNAL; | 219 | transition_latency = CPUFREQ_ETERNAL; |
225 | 220 | ||
226 | if (!IS_ERR(cpu_reg)) { | 221 | if (!IS_ERR(cpu_reg)) { |
227 | struct dev_pm_opp *opp; | 222 | unsigned long opp_freq = 0; |
228 | unsigned long min_uV, max_uV; | ||
229 | int i; | ||
230 | 223 | ||
231 | /* | 224 | /* |
232 | * OPP is maintained in order of increasing frequency, and | 225 | * Disable any OPPs where the connected regulator isn't able to |
233 | * freq_table initialised from OPP is therefore sorted in the | 226 | * provide the specified voltage and record minimum and maximum |
234 | * same order. | 227 | * voltage levels. |
235 | */ | 228 | */ |
236 | for (i = 0; freq_table[i].frequency != CPUFREQ_TABLE_END; i++) | 229 | while (1) { |
237 | ; | 230 | struct dev_pm_opp *opp; |
238 | rcu_read_lock(); | 231 | unsigned long opp_uV, tol_uV; |
239 | opp = dev_pm_opp_find_freq_exact(cpu_dev, | 232 | |
240 | freq_table[0].frequency * 1000, true); | 233 | rcu_read_lock(); |
241 | min_uV = dev_pm_opp_get_voltage(opp); | 234 | opp = dev_pm_opp_find_freq_ceil(cpu_dev, &opp_freq); |
242 | opp = dev_pm_opp_find_freq_exact(cpu_dev, | 235 | if (IS_ERR(opp)) { |
243 | freq_table[i-1].frequency * 1000, true); | 236 | rcu_read_unlock(); |
244 | max_uV = dev_pm_opp_get_voltage(opp); | 237 | break; |
245 | rcu_read_unlock(); | 238 | } |
239 | opp_uV = dev_pm_opp_get_voltage(opp); | ||
240 | rcu_read_unlock(); | ||
241 | |||
242 | tol_uV = opp_uV * priv->voltage_tolerance / 100; | ||
243 | if (regulator_is_supported_voltage(cpu_reg, opp_uV, | ||
244 | opp_uV + tol_uV)) { | ||
245 | if (opp_uV < min_uV) | ||
246 | min_uV = opp_uV; | ||
247 | if (opp_uV > max_uV) | ||
248 | max_uV = opp_uV; | ||
249 | } else { | ||
250 | dev_pm_opp_disable(cpu_dev, opp_freq); | ||
251 | } | ||
252 | |||
253 | opp_freq++; | ||
254 | } | ||
255 | |||
246 | ret = regulator_set_voltage_time(cpu_reg, min_uV, max_uV); | 256 | ret = regulator_set_voltage_time(cpu_reg, min_uV, max_uV); |
247 | if (ret > 0) | 257 | if (ret > 0) |
248 | transition_latency += ret * 1000; | 258 | transition_latency += ret * 1000; |
249 | } | 259 | } |
250 | 260 | ||
261 | ret = dev_pm_opp_init_cpufreq_table(cpu_dev, &freq_table); | ||
262 | if (ret) { | ||
263 | pr_err("failed to init cpufreq table: %d\n", ret); | ||
264 | goto out_free_priv; | ||
265 | } | ||
266 | |||
251 | /* | 267 | /* |
252 | * For now, just loading the cooling device; | 268 | * For now, just loading the cooling device; |
253 | * thermal DT code takes care of matching them. | 269 | * thermal DT code takes care of matching them. |
@@ -277,7 +293,7 @@ static int cpufreq_init(struct cpufreq_policy *policy) | |||
277 | policy->cpuinfo.transition_latency = transition_latency; | 293 | policy->cpuinfo.transition_latency = transition_latency; |
278 | 294 | ||
279 | pd = cpufreq_get_driver_data(); | 295 | pd = cpufreq_get_driver_data(); |
280 | if (pd && !pd->independent_clocks) | 296 | if (!pd || !pd->independent_clocks) |
281 | cpumask_setall(policy->cpus); | 297 | cpumask_setall(policy->cpus); |
282 | 298 | ||
283 | of_node_put(np); | 299 | of_node_put(np); |
@@ -286,9 +302,9 @@ static int cpufreq_init(struct cpufreq_policy *policy) | |||
286 | 302 | ||
287 | out_cooling_unregister: | 303 | out_cooling_unregister: |
288 | cpufreq_cooling_unregister(priv->cdev); | 304 | cpufreq_cooling_unregister(priv->cdev); |
289 | kfree(priv); | ||
290 | out_free_table: | ||
291 | dev_pm_opp_free_cpufreq_table(cpu_dev, &freq_table); | 305 | dev_pm_opp_free_cpufreq_table(cpu_dev, &freq_table); |
306 | out_free_priv: | ||
307 | kfree(priv); | ||
292 | out_put_node: | 308 | out_put_node: |
293 | of_node_put(np); | 309 | of_node_put(np); |
294 | out_put_reg_clk: | 310 | out_put_reg_clk: |
diff --git a/drivers/dma/edma.c b/drivers/dma/edma.c index 123f578d6dd3..4cfaaa5a49be 100644 --- a/drivers/dma/edma.c +++ b/drivers/dma/edma.c | |||
@@ -1107,52 +1107,14 @@ bool edma_filter_fn(struct dma_chan *chan, void *param) | |||
1107 | } | 1107 | } |
1108 | EXPORT_SYMBOL(edma_filter_fn); | 1108 | EXPORT_SYMBOL(edma_filter_fn); |
1109 | 1109 | ||
1110 | static struct platform_device *pdev0, *pdev1; | ||
1111 | |||
1112 | static const struct platform_device_info edma_dev_info0 = { | ||
1113 | .name = "edma-dma-engine", | ||
1114 | .id = 0, | ||
1115 | .dma_mask = DMA_BIT_MASK(32), | ||
1116 | }; | ||
1117 | |||
1118 | static const struct platform_device_info edma_dev_info1 = { | ||
1119 | .name = "edma-dma-engine", | ||
1120 | .id = 1, | ||
1121 | .dma_mask = DMA_BIT_MASK(32), | ||
1122 | }; | ||
1123 | |||
1124 | static int edma_init(void) | 1110 | static int edma_init(void) |
1125 | { | 1111 | { |
1126 | int ret = platform_driver_register(&edma_driver); | 1112 | return platform_driver_register(&edma_driver); |
1127 | |||
1128 | if (ret == 0) { | ||
1129 | pdev0 = platform_device_register_full(&edma_dev_info0); | ||
1130 | if (IS_ERR(pdev0)) { | ||
1131 | platform_driver_unregister(&edma_driver); | ||
1132 | ret = PTR_ERR(pdev0); | ||
1133 | goto out; | ||
1134 | } | ||
1135 | } | ||
1136 | |||
1137 | if (!of_have_populated_dt() && EDMA_CTLRS == 2) { | ||
1138 | pdev1 = platform_device_register_full(&edma_dev_info1); | ||
1139 | if (IS_ERR(pdev1)) { | ||
1140 | platform_driver_unregister(&edma_driver); | ||
1141 | platform_device_unregister(pdev0); | ||
1142 | ret = PTR_ERR(pdev1); | ||
1143 | } | ||
1144 | } | ||
1145 | |||
1146 | out: | ||
1147 | return ret; | ||
1148 | } | 1113 | } |
1149 | subsys_initcall(edma_init); | 1114 | subsys_initcall(edma_init); |
1150 | 1115 | ||
1151 | static void __exit edma_exit(void) | 1116 | static void __exit edma_exit(void) |
1152 | { | 1117 | { |
1153 | platform_device_unregister(pdev0); | ||
1154 | if (pdev1) | ||
1155 | platform_device_unregister(pdev1); | ||
1156 | platform_driver_unregister(&edma_driver); | 1118 | platform_driver_unregister(&edma_driver); |
1157 | } | 1119 | } |
1158 | module_exit(edma_exit); | 1120 | module_exit(edma_exit); |
diff --git a/drivers/edac/cpc925_edac.c b/drivers/edac/cpc925_edac.c index df6575f1430d..682288ced4ac 100644 --- a/drivers/edac/cpc925_edac.c +++ b/drivers/edac/cpc925_edac.c | |||
@@ -562,7 +562,7 @@ static void cpc925_mc_check(struct mem_ctl_info *mci) | |||
562 | 562 | ||
563 | if (apiexcp & UECC_EXCP_DETECTED) { | 563 | if (apiexcp & UECC_EXCP_DETECTED) { |
564 | cpc925_mc_printk(mci, KERN_INFO, "DRAM UECC Fault\n"); | 564 | cpc925_mc_printk(mci, KERN_INFO, "DRAM UECC Fault\n"); |
565 | edac_mc_handle_error(HW_EVENT_ERR_CORRECTED, mci, 1, | 565 | edac_mc_handle_error(HW_EVENT_ERR_UNCORRECTED, mci, 1, |
566 | pfn, offset, 0, | 566 | pfn, offset, 0, |
567 | csrow, -1, -1, | 567 | csrow, -1, -1, |
568 | mci->ctl_name, ""); | 568 | mci->ctl_name, ""); |
diff --git a/drivers/edac/e7xxx_edac.c b/drivers/edac/e7xxx_edac.c index 3cda79bc8b00..ece3aef16bb1 100644 --- a/drivers/edac/e7xxx_edac.c +++ b/drivers/edac/e7xxx_edac.c | |||
@@ -226,7 +226,7 @@ static void process_ce(struct mem_ctl_info *mci, struct e7xxx_error_info *info) | |||
226 | static void process_ce_no_info(struct mem_ctl_info *mci) | 226 | static void process_ce_no_info(struct mem_ctl_info *mci) |
227 | { | 227 | { |
228 | edac_dbg(3, "\n"); | 228 | edac_dbg(3, "\n"); |
229 | edac_mc_handle_error(HW_EVENT_ERR_UNCORRECTED, mci, 1, 0, 0, 0, -1, -1, -1, | 229 | edac_mc_handle_error(HW_EVENT_ERR_CORRECTED, mci, 1, 0, 0, 0, -1, -1, -1, |
230 | "e7xxx CE log register overflow", ""); | 230 | "e7xxx CE log register overflow", ""); |
231 | } | 231 | } |
232 | 232 | ||
diff --git a/drivers/edac/i3200_edac.c b/drivers/edac/i3200_edac.c index 022a70273ada..aa98b136f5d0 100644 --- a/drivers/edac/i3200_edac.c +++ b/drivers/edac/i3200_edac.c | |||
@@ -242,11 +242,11 @@ static void i3200_process_error_info(struct mem_ctl_info *mci, | |||
242 | -1, -1, | 242 | -1, -1, |
243 | "i3000 UE", ""); | 243 | "i3000 UE", ""); |
244 | } else if (log & I3200_ECCERRLOG_CE) { | 244 | } else if (log & I3200_ECCERRLOG_CE) { |
245 | edac_mc_handle_error(HW_EVENT_ERR_UNCORRECTED, mci, 1, | 245 | edac_mc_handle_error(HW_EVENT_ERR_CORRECTED, mci, 1, |
246 | 0, 0, eccerrlog_syndrome(log), | 246 | 0, 0, eccerrlog_syndrome(log), |
247 | eccerrlog_row(channel, log), | 247 | eccerrlog_row(channel, log), |
248 | -1, -1, | 248 | -1, -1, |
249 | "i3000 UE", ""); | 249 | "i3000 CE", ""); |
250 | } | 250 | } |
251 | } | 251 | } |
252 | } | 252 | } |
diff --git a/drivers/edac/i82860_edac.c b/drivers/edac/i82860_edac.c index 3382f6344e42..4382343a7c60 100644 --- a/drivers/edac/i82860_edac.c +++ b/drivers/edac/i82860_edac.c | |||
@@ -124,7 +124,7 @@ static int i82860_process_error_info(struct mem_ctl_info *mci, | |||
124 | dimm->location[0], dimm->location[1], -1, | 124 | dimm->location[0], dimm->location[1], -1, |
125 | "i82860 UE", ""); | 125 | "i82860 UE", ""); |
126 | else | 126 | else |
127 | edac_mc_handle_error(HW_EVENT_ERR_UNCORRECTED, mci, 1, | 127 | edac_mc_handle_error(HW_EVENT_ERR_CORRECTED, mci, 1, |
128 | info->eap, 0, info->derrsyn, | 128 | info->eap, 0, info->derrsyn, |
129 | dimm->location[0], dimm->location[1], -1, | 129 | dimm->location[0], dimm->location[1], -1, |
130 | "i82860 CE", ""); | 130 | "i82860 CE", ""); |
diff --git a/drivers/gpu/drm/armada/armada_crtc.c b/drivers/gpu/drm/armada/armada_crtc.c index 0b164fb1c107..e3a7a5078e5c 100644 --- a/drivers/gpu/drm/armada/armada_crtc.c +++ b/drivers/gpu/drm/armada/armada_crtc.c | |||
@@ -261,7 +261,7 @@ static void armada_drm_vblank_off(struct armada_crtc *dcrtc) | |||
261 | * Tell the DRM core that vblank IRQs aren't going to happen for | 261 | * Tell the DRM core that vblank IRQs aren't going to happen for |
262 | * a while. This cleans up any pending vblank events for us. | 262 | * a while. This cleans up any pending vblank events for us. |
263 | */ | 263 | */ |
264 | drm_vblank_off(dev, dcrtc->num); | 264 | drm_crtc_vblank_off(&dcrtc->crtc); |
265 | 265 | ||
266 | /* Handle any pending flip event. */ | 266 | /* Handle any pending flip event. */ |
267 | spin_lock_irq(&dev->event_lock); | 267 | spin_lock_irq(&dev->event_lock); |
@@ -290,6 +290,8 @@ static void armada_drm_crtc_dpms(struct drm_crtc *crtc, int dpms) | |||
290 | armada_drm_crtc_update(dcrtc); | 290 | armada_drm_crtc_update(dcrtc); |
291 | if (dpms_blanked(dpms)) | 291 | if (dpms_blanked(dpms)) |
292 | armada_drm_vblank_off(dcrtc); | 292 | armada_drm_vblank_off(dcrtc); |
293 | else | ||
294 | drm_crtc_vblank_on(&dcrtc->crtc); | ||
293 | } | 295 | } |
294 | } | 296 | } |
295 | 297 | ||
@@ -527,7 +529,7 @@ static int armada_drm_crtc_mode_set(struct drm_crtc *crtc, | |||
527 | /* Wait for pending flips to complete */ | 529 | /* Wait for pending flips to complete */ |
528 | wait_event(dcrtc->frame_wait, !dcrtc->frame_work); | 530 | wait_event(dcrtc->frame_wait, !dcrtc->frame_work); |
529 | 531 | ||
530 | drm_vblank_pre_modeset(crtc->dev, dcrtc->num); | 532 | drm_crtc_vblank_off(crtc); |
531 | 533 | ||
532 | crtc->mode = *adj; | 534 | crtc->mode = *adj; |
533 | 535 | ||
@@ -618,7 +620,7 @@ static int armada_drm_crtc_mode_set(struct drm_crtc *crtc, | |||
618 | 620 | ||
619 | armada_drm_crtc_update(dcrtc); | 621 | armada_drm_crtc_update(dcrtc); |
620 | 622 | ||
621 | drm_vblank_post_modeset(crtc->dev, dcrtc->num); | 623 | drm_crtc_vblank_on(crtc); |
622 | armada_drm_crtc_finish_fb(dcrtc, old_fb, dpms_blanked(dcrtc->dpms)); | 624 | armada_drm_crtc_finish_fb(dcrtc, old_fb, dpms_blanked(dcrtc->dpms)); |
623 | 625 | ||
624 | return 0; | 626 | return 0; |
@@ -946,18 +948,15 @@ static int armada_drm_crtc_page_flip(struct drm_crtc *crtc, | |||
946 | armada_reg_queue_end(work->regs, i); | 948 | armada_reg_queue_end(work->regs, i); |
947 | 949 | ||
948 | /* | 950 | /* |
949 | * Hold the old framebuffer for the work - DRM appears to drop our | 951 | * Ensure that we hold a reference on the new framebuffer. |
950 | * reference to the old framebuffer in drm_mode_page_flip_ioctl(). | 952 | * This has to match the behaviour in mode_set. |
951 | */ | 953 | */ |
952 | drm_framebuffer_reference(work->old_fb); | 954 | drm_framebuffer_reference(fb); |
953 | 955 | ||
954 | ret = armada_drm_crtc_queue_frame_work(dcrtc, work); | 956 | ret = armada_drm_crtc_queue_frame_work(dcrtc, work); |
955 | if (ret) { | 957 | if (ret) { |
956 | /* | 958 | /* Undo our reference above */ |
957 | * Undo our reference above; DRM does not drop the reference | 959 | drm_framebuffer_unreference(fb); |
958 | * to this object on error, so that's okay. | ||
959 | */ | ||
960 | drm_framebuffer_unreference(work->old_fb); | ||
961 | kfree(work); | 960 | kfree(work); |
962 | return ret; | 961 | return ret; |
963 | } | 962 | } |
diff --git a/drivers/gpu/drm/armada/armada_drv.c b/drivers/gpu/drm/armada/armada_drv.c index f672e6ad8afa..908e5316eac4 100644 --- a/drivers/gpu/drm/armada/armada_drv.c +++ b/drivers/gpu/drm/armada/armada_drv.c | |||
@@ -190,6 +190,7 @@ static int armada_drm_load(struct drm_device *dev, unsigned long flags) | |||
190 | if (ret) | 190 | if (ret) |
191 | goto err_comp; | 191 | goto err_comp; |
192 | 192 | ||
193 | dev->irq_enabled = true; | ||
193 | dev->vblank_disable_allowed = 1; | 194 | dev->vblank_disable_allowed = 1; |
194 | 195 | ||
195 | ret = armada_fbdev_init(dev); | 196 | ret = armada_fbdev_init(dev); |
@@ -331,7 +332,7 @@ static struct drm_driver armada_drm_driver = { | |||
331 | .desc = "Armada SoC DRM", | 332 | .desc = "Armada SoC DRM", |
332 | .date = "20120730", | 333 | .date = "20120730", |
333 | .driver_features = DRIVER_GEM | DRIVER_MODESET | | 334 | .driver_features = DRIVER_GEM | DRIVER_MODESET | |
334 | DRIVER_PRIME, | 335 | DRIVER_HAVE_IRQ | DRIVER_PRIME, |
335 | .ioctls = armada_ioctls, | 336 | .ioctls = armada_ioctls, |
336 | .fops = &armada_drm_fops, | 337 | .fops = &armada_drm_fops, |
337 | }; | 338 | }; |
diff --git a/drivers/gpu/drm/exynos/exynos_dp_core.c b/drivers/gpu/drm/exynos/exynos_dp_core.c index cd50ece31601..6adb1e5cfb08 100644 --- a/drivers/gpu/drm/exynos/exynos_dp_core.c +++ b/drivers/gpu/drm/exynos/exynos_dp_core.c | |||
@@ -1355,13 +1355,8 @@ static void exynos_dp_unbind(struct device *dev, struct device *master, | |||
1355 | void *data) | 1355 | void *data) |
1356 | { | 1356 | { |
1357 | struct exynos_drm_display *display = dev_get_drvdata(dev); | 1357 | struct exynos_drm_display *display = dev_get_drvdata(dev); |
1358 | struct exynos_dp_device *dp = display->ctx; | ||
1359 | struct drm_encoder *encoder = dp->encoder; | ||
1360 | 1358 | ||
1361 | exynos_dp_dpms(display, DRM_MODE_DPMS_OFF); | 1359 | exynos_dp_dpms(display, DRM_MODE_DPMS_OFF); |
1362 | |||
1363 | exynos_dp_connector_destroy(&dp->connector); | ||
1364 | encoder->funcs->destroy(encoder); | ||
1365 | } | 1360 | } |
1366 | 1361 | ||
1367 | static const struct component_ops exynos_dp_ops = { | 1362 | static const struct component_ops exynos_dp_ops = { |
diff --git a/drivers/gpu/drm/exynos/exynos_drm_crtc.c b/drivers/gpu/drm/exynos/exynos_drm_crtc.c index 8e38e9f8e542..45026e693225 100644 --- a/drivers/gpu/drm/exynos/exynos_drm_crtc.c +++ b/drivers/gpu/drm/exynos/exynos_drm_crtc.c | |||
@@ -71,13 +71,16 @@ static void exynos_drm_crtc_dpms(struct drm_crtc *crtc, int mode) | |||
71 | !atomic_read(&exynos_crtc->pending_flip), | 71 | !atomic_read(&exynos_crtc->pending_flip), |
72 | HZ/20)) | 72 | HZ/20)) |
73 | atomic_set(&exynos_crtc->pending_flip, 0); | 73 | atomic_set(&exynos_crtc->pending_flip, 0); |
74 | drm_vblank_off(crtc->dev, exynos_crtc->pipe); | 74 | drm_crtc_vblank_off(crtc); |
75 | } | 75 | } |
76 | 76 | ||
77 | if (manager->ops->dpms) | 77 | if (manager->ops->dpms) |
78 | manager->ops->dpms(manager, mode); | 78 | manager->ops->dpms(manager, mode); |
79 | 79 | ||
80 | exynos_crtc->dpms = mode; | 80 | exynos_crtc->dpms = mode; |
81 | |||
82 | if (mode == DRM_MODE_DPMS_ON) | ||
83 | drm_crtc_vblank_on(crtc); | ||
81 | } | 84 | } |
82 | 85 | ||
83 | static void exynos_drm_crtc_prepare(struct drm_crtc *crtc) | 86 | static void exynos_drm_crtc_prepare(struct drm_crtc *crtc) |
diff --git a/drivers/gpu/drm/exynos/exynos_drm_dpi.c b/drivers/gpu/drm/exynos/exynos_drm_dpi.c index 96c87db388fb..3dc678ed9949 100644 --- a/drivers/gpu/drm/exynos/exynos_drm_dpi.c +++ b/drivers/gpu/drm/exynos/exynos_drm_dpi.c | |||
@@ -338,14 +338,10 @@ err_del_component: | |||
338 | 338 | ||
339 | int exynos_dpi_remove(struct device *dev) | 339 | int exynos_dpi_remove(struct device *dev) |
340 | { | 340 | { |
341 | struct drm_encoder *encoder = exynos_dpi_display.encoder; | ||
342 | struct exynos_dpi *ctx = exynos_dpi_display.ctx; | 341 | struct exynos_dpi *ctx = exynos_dpi_display.ctx; |
343 | 342 | ||
344 | exynos_dpi_dpms(&exynos_dpi_display, DRM_MODE_DPMS_OFF); | 343 | exynos_dpi_dpms(&exynos_dpi_display, DRM_MODE_DPMS_OFF); |
345 | 344 | ||
346 | exynos_dpi_connector_destroy(&ctx->connector); | ||
347 | encoder->funcs->destroy(encoder); | ||
348 | |||
349 | if (ctx->panel) | 345 | if (ctx->panel) |
350 | drm_panel_detach(ctx->panel); | 346 | drm_panel_detach(ctx->panel); |
351 | 347 | ||
diff --git a/drivers/gpu/drm/exynos/exynos_drm_drv.c b/drivers/gpu/drm/exynos/exynos_drm_drv.c index 443a2069858a..c57466edf45b 100644 --- a/drivers/gpu/drm/exynos/exynos_drm_drv.c +++ b/drivers/gpu/drm/exynos/exynos_drm_drv.c | |||
@@ -87,16 +87,12 @@ static int exynos_drm_load(struct drm_device *dev, unsigned long flags) | |||
87 | 87 | ||
88 | plane = exynos_plane_init(dev, possible_crtcs, | 88 | plane = exynos_plane_init(dev, possible_crtcs, |
89 | DRM_PLANE_TYPE_OVERLAY); | 89 | DRM_PLANE_TYPE_OVERLAY); |
90 | if (IS_ERR(plane)) | 90 | if (!IS_ERR(plane)) |
91 | goto err_mode_config_cleanup; | 91 | continue; |
92 | } | ||
93 | |||
94 | /* init kms poll for handling hpd */ | ||
95 | drm_kms_helper_poll_init(dev); | ||
96 | 92 | ||
97 | ret = drm_vblank_init(dev, MAX_CRTC); | 93 | ret = PTR_ERR(plane); |
98 | if (ret) | ||
99 | goto err_mode_config_cleanup; | 94 | goto err_mode_config_cleanup; |
95 | } | ||
100 | 96 | ||
101 | /* setup possible_clones. */ | 97 | /* setup possible_clones. */ |
102 | exynos_drm_encoder_setup(dev); | 98 | exynos_drm_encoder_setup(dev); |
@@ -106,15 +102,16 @@ static int exynos_drm_load(struct drm_device *dev, unsigned long flags) | |||
106 | /* Try to bind all sub drivers. */ | 102 | /* Try to bind all sub drivers. */ |
107 | ret = component_bind_all(dev->dev, dev); | 103 | ret = component_bind_all(dev->dev, dev); |
108 | if (ret) | 104 | if (ret) |
109 | goto err_cleanup_vblank; | 105 | goto err_mode_config_cleanup; |
110 | 106 | ||
111 | /* Probe non kms sub drivers and virtual display driver. */ | 107 | ret = drm_vblank_init(dev, dev->mode_config.num_crtc); |
112 | ret = exynos_drm_device_subdrv_probe(dev); | ||
113 | if (ret) | 108 | if (ret) |
114 | goto err_unbind_all; | 109 | goto err_unbind_all; |
115 | 110 | ||
116 | /* force connectors detection */ | 111 | /* Probe non kms sub drivers and virtual display driver. */ |
117 | drm_helper_hpd_irq_event(dev); | 112 | ret = exynos_drm_device_subdrv_probe(dev); |
113 | if (ret) | ||
114 | goto err_cleanup_vblank; | ||
118 | 115 | ||
119 | /* | 116 | /* |
120 | * enable drm irq mode. | 117 | * enable drm irq mode. |
@@ -133,12 +130,18 @@ static int exynos_drm_load(struct drm_device *dev, unsigned long flags) | |||
133 | */ | 130 | */ |
134 | dev->vblank_disable_allowed = true; | 131 | dev->vblank_disable_allowed = true; |
135 | 132 | ||
133 | /* init kms poll for handling hpd */ | ||
134 | drm_kms_helper_poll_init(dev); | ||
135 | |||
136 | /* force connectors detection */ | ||
137 | drm_helper_hpd_irq_event(dev); | ||
138 | |||
136 | return 0; | 139 | return 0; |
137 | 140 | ||
138 | err_unbind_all: | ||
139 | component_unbind_all(dev->dev, dev); | ||
140 | err_cleanup_vblank: | 141 | err_cleanup_vblank: |
141 | drm_vblank_cleanup(dev); | 142 | drm_vblank_cleanup(dev); |
143 | err_unbind_all: | ||
144 | component_unbind_all(dev->dev, dev); | ||
142 | err_mode_config_cleanup: | 145 | err_mode_config_cleanup: |
143 | drm_mode_config_cleanup(dev); | 146 | drm_mode_config_cleanup(dev); |
144 | drm_release_iommu_mapping(dev); | 147 | drm_release_iommu_mapping(dev); |
@@ -155,8 +158,8 @@ static int exynos_drm_unload(struct drm_device *dev) | |||
155 | exynos_drm_fbdev_fini(dev); | 158 | exynos_drm_fbdev_fini(dev); |
156 | drm_kms_helper_poll_fini(dev); | 159 | drm_kms_helper_poll_fini(dev); |
157 | 160 | ||
158 | component_unbind_all(dev->dev, dev); | ||
159 | drm_vblank_cleanup(dev); | 161 | drm_vblank_cleanup(dev); |
162 | component_unbind_all(dev->dev, dev); | ||
160 | drm_mode_config_cleanup(dev); | 163 | drm_mode_config_cleanup(dev); |
161 | drm_release_iommu_mapping(dev); | 164 | drm_release_iommu_mapping(dev); |
162 | 165 | ||
@@ -191,8 +194,12 @@ static int exynos_drm_resume(struct drm_device *dev) | |||
191 | 194 | ||
192 | drm_modeset_lock_all(dev); | 195 | drm_modeset_lock_all(dev); |
193 | list_for_each_entry(connector, &dev->mode_config.connector_list, head) { | 196 | list_for_each_entry(connector, &dev->mode_config.connector_list, head) { |
194 | if (connector->funcs->dpms) | 197 | if (connector->funcs->dpms) { |
195 | connector->funcs->dpms(connector, connector->dpms); | 198 | int dpms = connector->dpms; |
199 | |||
200 | connector->dpms = DRM_MODE_DPMS_OFF; | ||
201 | connector->funcs->dpms(connector, dpms); | ||
202 | } | ||
196 | } | 203 | } |
197 | drm_modeset_unlock_all(dev); | 204 | drm_modeset_unlock_all(dev); |
198 | 205 | ||
diff --git a/drivers/gpu/drm/exynos/exynos_drm_dsi.c b/drivers/gpu/drm/exynos/exynos_drm_dsi.c index 24741d8758e8..acf7e9e39dcd 100644 --- a/drivers/gpu/drm/exynos/exynos_drm_dsi.c +++ b/drivers/gpu/drm/exynos/exynos_drm_dsi.c | |||
@@ -1660,13 +1660,9 @@ static void exynos_dsi_unbind(struct device *dev, struct device *master, | |||
1660 | void *data) | 1660 | void *data) |
1661 | { | 1661 | { |
1662 | struct exynos_dsi *dsi = exynos_dsi_display.ctx; | 1662 | struct exynos_dsi *dsi = exynos_dsi_display.ctx; |
1663 | struct drm_encoder *encoder = dsi->encoder; | ||
1664 | 1663 | ||
1665 | exynos_dsi_dpms(&exynos_dsi_display, DRM_MODE_DPMS_OFF); | 1664 | exynos_dsi_dpms(&exynos_dsi_display, DRM_MODE_DPMS_OFF); |
1666 | 1665 | ||
1667 | exynos_dsi_connector_destroy(&dsi->connector); | ||
1668 | encoder->funcs->destroy(encoder); | ||
1669 | |||
1670 | mipi_dsi_host_unregister(&dsi->dsi_host); | 1666 | mipi_dsi_host_unregister(&dsi->dsi_host); |
1671 | } | 1667 | } |
1672 | 1668 | ||
diff --git a/drivers/gpu/drm/exynos/exynos_drm_vidi.c b/drivers/gpu/drm/exynos/exynos_drm_vidi.c index d565207040a2..50faf913e574 100644 --- a/drivers/gpu/drm/exynos/exynos_drm_vidi.c +++ b/drivers/gpu/drm/exynos/exynos_drm_vidi.c | |||
@@ -630,7 +630,6 @@ static int vidi_remove(struct platform_device *pdev) | |||
630 | { | 630 | { |
631 | struct exynos_drm_manager *mgr = platform_get_drvdata(pdev); | 631 | struct exynos_drm_manager *mgr = platform_get_drvdata(pdev); |
632 | struct vidi_context *ctx = mgr->ctx; | 632 | struct vidi_context *ctx = mgr->ctx; |
633 | struct drm_encoder *encoder = ctx->encoder; | ||
634 | 633 | ||
635 | if (ctx->raw_edid != (struct edid *)fake_edid_info) { | 634 | if (ctx->raw_edid != (struct edid *)fake_edid_info) { |
636 | kfree(ctx->raw_edid); | 635 | kfree(ctx->raw_edid); |
@@ -639,9 +638,6 @@ static int vidi_remove(struct platform_device *pdev) | |||
639 | return -EINVAL; | 638 | return -EINVAL; |
640 | } | 639 | } |
641 | 640 | ||
642 | encoder->funcs->destroy(encoder); | ||
643 | drm_connector_cleanup(&ctx->connector); | ||
644 | |||
645 | return 0; | 641 | return 0; |
646 | } | 642 | } |
647 | 643 | ||
diff --git a/drivers/gpu/drm/exynos/exynos_hdmi.c b/drivers/gpu/drm/exynos/exynos_hdmi.c index 7910fb37d9bb..563a19e62eb2 100644 --- a/drivers/gpu/drm/exynos/exynos_hdmi.c +++ b/drivers/gpu/drm/exynos/exynos_hdmi.c | |||
@@ -2312,12 +2312,6 @@ static int hdmi_bind(struct device *dev, struct device *master, void *data) | |||
2312 | 2312 | ||
2313 | static void hdmi_unbind(struct device *dev, struct device *master, void *data) | 2313 | static void hdmi_unbind(struct device *dev, struct device *master, void *data) |
2314 | { | 2314 | { |
2315 | struct exynos_drm_display *display = get_hdmi_display(dev); | ||
2316 | struct drm_encoder *encoder = display->encoder; | ||
2317 | struct hdmi_context *hdata = display->ctx; | ||
2318 | |||
2319 | hdmi_connector_destroy(&hdata->connector); | ||
2320 | encoder->funcs->destroy(encoder); | ||
2321 | } | 2315 | } |
2322 | 2316 | ||
2323 | static const struct component_ops hdmi_component_ops = { | 2317 | static const struct component_ops hdmi_component_ops = { |
diff --git a/drivers/gpu/drm/i915/intel_display.c b/drivers/gpu/drm/i915/intel_display.c index 1d2fa7f4523e..31bb1d7acf9b 100644 --- a/drivers/gpu/drm/i915/intel_display.c +++ b/drivers/gpu/drm/i915/intel_display.c | |||
@@ -4632,7 +4632,7 @@ static void vlv_update_cdclk(struct drm_device *dev) | |||
4632 | * BSpec erroneously claims we should aim for 4MHz, but | 4632 | * BSpec erroneously claims we should aim for 4MHz, but |
4633 | * in fact 1MHz is the correct frequency. | 4633 | * in fact 1MHz is the correct frequency. |
4634 | */ | 4634 | */ |
4635 | I915_WRITE(GMBUSFREQ_VLV, dev_priv->vlv_cdclk_freq); | 4635 | I915_WRITE(GMBUSFREQ_VLV, DIV_ROUND_UP(dev_priv->vlv_cdclk_freq, 1000)); |
4636 | } | 4636 | } |
4637 | 4637 | ||
4638 | /* Adjust CDclk dividers to allow high res or save power if possible */ | 4638 | /* Adjust CDclk dividers to allow high res or save power if possible */ |
@@ -12831,6 +12831,9 @@ static struct intel_quirk intel_quirks[] = { | |||
12831 | /* Acer C720 Chromebook (Core i3 4005U) */ | 12831 | /* Acer C720 Chromebook (Core i3 4005U) */ |
12832 | { 0x0a16, 0x1025, 0x0a11, quirk_backlight_present }, | 12832 | { 0x0a16, 0x1025, 0x0a11, quirk_backlight_present }, |
12833 | 12833 | ||
12834 | /* Apple Macbook 2,1 (Core 2 T7400) */ | ||
12835 | { 0x27a2, 0x8086, 0x7270, quirk_backlight_present }, | ||
12836 | |||
12834 | /* Toshiba CB35 Chromebook (Celeron 2955U) */ | 12837 | /* Toshiba CB35 Chromebook (Celeron 2955U) */ |
12835 | { 0x0a06, 0x1179, 0x0a88, quirk_backlight_present }, | 12838 | { 0x0a06, 0x1179, 0x0a88, quirk_backlight_present }, |
12836 | 12839 | ||
diff --git a/drivers/gpu/drm/i915/intel_dp.c b/drivers/gpu/drm/i915/intel_dp.c index 64c8e047891d..dc4bc90a9df0 100644 --- a/drivers/gpu/drm/i915/intel_dp.c +++ b/drivers/gpu/drm/i915/intel_dp.c | |||
@@ -2870,6 +2870,13 @@ intel_dp_dpcd_read_wake(struct drm_dp_aux *aux, unsigned int offset, | |||
2870 | ssize_t ret; | 2870 | ssize_t ret; |
2871 | int i; | 2871 | int i; |
2872 | 2872 | ||
2873 | /* | ||
2874 | * Sometime we just get the same incorrect byte repeated | ||
2875 | * over the entire buffer. Doing just one throw away read | ||
2876 | * initially seems to "solve" it. | ||
2877 | */ | ||
2878 | drm_dp_dpcd_read(aux, DP_DPCD_REV, buffer, 1); | ||
2879 | |||
2873 | for (i = 0; i < 3; i++) { | 2880 | for (i = 0; i < 3; i++) { |
2874 | ret = drm_dp_dpcd_read(aux, offset, buffer, size); | 2881 | ret = drm_dp_dpcd_read(aux, offset, buffer, size); |
2875 | if (ret == size) | 2882 | if (ret == size) |
@@ -3815,9 +3822,10 @@ intel_dp_get_dpcd(struct intel_dp *intel_dp) | |||
3815 | } | 3822 | } |
3816 | } | 3823 | } |
3817 | 3824 | ||
3818 | /* Training Pattern 3 support */ | 3825 | /* Training Pattern 3 support, both source and sink */ |
3819 | if (intel_dp->dpcd[DP_DPCD_REV] >= 0x12 && | 3826 | if (intel_dp->dpcd[DP_DPCD_REV] >= 0x12 && |
3820 | intel_dp->dpcd[DP_MAX_LANE_COUNT] & DP_TPS3_SUPPORTED) { | 3827 | intel_dp->dpcd[DP_MAX_LANE_COUNT] & DP_TPS3_SUPPORTED && |
3828 | (IS_HASWELL(dev_priv) || INTEL_INFO(dev_priv)->gen >= 8)) { | ||
3821 | intel_dp->use_tps3 = true; | 3829 | intel_dp->use_tps3 = true; |
3822 | DRM_DEBUG_KMS("Displayport TPS3 supported\n"); | 3830 | DRM_DEBUG_KMS("Displayport TPS3 supported\n"); |
3823 | } else | 3831 | } else |
@@ -4604,6 +4612,18 @@ intel_dp_hpd_pulse(struct intel_digital_port *intel_dig_port, bool long_hpd) | |||
4604 | if (intel_dig_port->base.type != INTEL_OUTPUT_EDP) | 4612 | if (intel_dig_port->base.type != INTEL_OUTPUT_EDP) |
4605 | intel_dig_port->base.type = INTEL_OUTPUT_DISPLAYPORT; | 4613 | intel_dig_port->base.type = INTEL_OUTPUT_DISPLAYPORT; |
4606 | 4614 | ||
4615 | if (long_hpd && intel_dig_port->base.type == INTEL_OUTPUT_EDP) { | ||
4616 | /* | ||
4617 | * vdd off can generate a long pulse on eDP which | ||
4618 | * would require vdd on to handle it, and thus we | ||
4619 | * would end up in an endless cycle of | ||
4620 | * "vdd off -> long hpd -> vdd on -> detect -> vdd off -> ..." | ||
4621 | */ | ||
4622 | DRM_DEBUG_KMS("ignoring long hpd on eDP port %c\n", | ||
4623 | port_name(intel_dig_port->port)); | ||
4624 | return false; | ||
4625 | } | ||
4626 | |||
4607 | DRM_DEBUG_KMS("got hpd irq on port %c - %s\n", | 4627 | DRM_DEBUG_KMS("got hpd irq on port %c - %s\n", |
4608 | port_name(intel_dig_port->port), | 4628 | port_name(intel_dig_port->port), |
4609 | long_hpd ? "long" : "short"); | 4629 | long_hpd ? "long" : "short"); |
diff --git a/drivers/gpu/drm/radeon/evergreen.c b/drivers/gpu/drm/radeon/evergreen.c index a31f1ca40c6a..f37d39d2bbbc 100644 --- a/drivers/gpu/drm/radeon/evergreen.c +++ b/drivers/gpu/drm/radeon/evergreen.c | |||
@@ -3005,7 +3005,7 @@ static void evergreen_gpu_init(struct radeon_device *rdev) | |||
3005 | u32 vgt_cache_invalidation; | 3005 | u32 vgt_cache_invalidation; |
3006 | u32 hdp_host_path_cntl, tmp; | 3006 | u32 hdp_host_path_cntl, tmp; |
3007 | u32 disabled_rb_mask; | 3007 | u32 disabled_rb_mask; |
3008 | int i, j, num_shader_engines, ps_thread_count; | 3008 | int i, j, ps_thread_count; |
3009 | 3009 | ||
3010 | switch (rdev->family) { | 3010 | switch (rdev->family) { |
3011 | case CHIP_CYPRESS: | 3011 | case CHIP_CYPRESS: |
@@ -3303,8 +3303,6 @@ static void evergreen_gpu_init(struct radeon_device *rdev) | |||
3303 | rdev->config.evergreen.tile_config |= | 3303 | rdev->config.evergreen.tile_config |= |
3304 | ((gb_addr_config & 0x30000000) >> 28) << 12; | 3304 | ((gb_addr_config & 0x30000000) >> 28) << 12; |
3305 | 3305 | ||
3306 | num_shader_engines = (gb_addr_config & NUM_SHADER_ENGINES(3) >> 12) + 1; | ||
3307 | |||
3308 | if ((rdev->family >= CHIP_CEDAR) && (rdev->family <= CHIP_HEMLOCK)) { | 3306 | if ((rdev->family >= CHIP_CEDAR) && (rdev->family <= CHIP_HEMLOCK)) { |
3309 | u32 efuse_straps_4; | 3307 | u32 efuse_straps_4; |
3310 | u32 efuse_straps_3; | 3308 | u32 efuse_straps_3; |
diff --git a/drivers/gpu/drm/radeon/kv_dpm.c b/drivers/gpu/drm/radeon/kv_dpm.c index 1dd976f447fa..9b42001295ba 100644 --- a/drivers/gpu/drm/radeon/kv_dpm.c +++ b/drivers/gpu/drm/radeon/kv_dpm.c | |||
@@ -2725,7 +2725,11 @@ int kv_dpm_init(struct radeon_device *rdev) | |||
2725 | 2725 | ||
2726 | pi->sram_end = SMC_RAM_END; | 2726 | pi->sram_end = SMC_RAM_END; |
2727 | 2727 | ||
2728 | pi->enable_nb_dpm = true; | 2728 | /* Enabling nb dpm on an asrock system prevents dpm from working */ |
2729 | if (rdev->pdev->subsystem_vendor == 0x1849) | ||
2730 | pi->enable_nb_dpm = false; | ||
2731 | else | ||
2732 | pi->enable_nb_dpm = true; | ||
2729 | 2733 | ||
2730 | pi->caps_power_containment = true; | 2734 | pi->caps_power_containment = true; |
2731 | pi->caps_cac = true; | 2735 | pi->caps_cac = true; |
@@ -2740,10 +2744,19 @@ int kv_dpm_init(struct radeon_device *rdev) | |||
2740 | pi->caps_sclk_ds = true; | 2744 | pi->caps_sclk_ds = true; |
2741 | pi->enable_auto_thermal_throttling = true; | 2745 | pi->enable_auto_thermal_throttling = true; |
2742 | pi->disable_nb_ps3_in_battery = false; | 2746 | pi->disable_nb_ps3_in_battery = false; |
2743 | if (radeon_bapm == 0) | 2747 | if (radeon_bapm == -1) { |
2748 | /* There are stability issues reported on with | ||
2749 | * bapm enabled on an asrock system. | ||
2750 | */ | ||
2751 | if (rdev->pdev->subsystem_vendor == 0x1849) | ||
2752 | pi->bapm_enable = false; | ||
2753 | else | ||
2754 | pi->bapm_enable = true; | ||
2755 | } else if (radeon_bapm == 0) { | ||
2744 | pi->bapm_enable = false; | 2756 | pi->bapm_enable = false; |
2745 | else | 2757 | } else { |
2746 | pi->bapm_enable = true; | 2758 | pi->bapm_enable = true; |
2759 | } | ||
2747 | pi->voltage_drop_t = 0; | 2760 | pi->voltage_drop_t = 0; |
2748 | pi->caps_sclk_throttle_low_notification = false; | 2761 | pi->caps_sclk_throttle_low_notification = false; |
2749 | pi->caps_fps = false; /* true? */ | 2762 | pi->caps_fps = false; /* true? */ |
diff --git a/drivers/gpu/drm/radeon/radeon_bios.c b/drivers/gpu/drm/radeon/radeon_bios.c index 6a03624fadaa..63ccb8fa799c 100644 --- a/drivers/gpu/drm/radeon/radeon_bios.c +++ b/drivers/gpu/drm/radeon/radeon_bios.c | |||
@@ -658,12 +658,10 @@ bool radeon_get_bios(struct radeon_device *rdev) | |||
658 | r = igp_read_bios_from_vram(rdev); | 658 | r = igp_read_bios_from_vram(rdev); |
659 | if (r == false) | 659 | if (r == false) |
660 | r = radeon_read_bios(rdev); | 660 | r = radeon_read_bios(rdev); |
661 | if (r == false) { | 661 | if (r == false) |
662 | r = radeon_read_disabled_bios(rdev); | 662 | r = radeon_read_disabled_bios(rdev); |
663 | } | 663 | if (r == false) |
664 | if (r == false) { | ||
665 | r = radeon_read_platform_bios(rdev); | 664 | r = radeon_read_platform_bios(rdev); |
666 | } | ||
667 | if (r == false || rdev->bios == NULL) { | 665 | if (r == false || rdev->bios == NULL) { |
668 | DRM_ERROR("Unable to locate a BIOS ROM\n"); | 666 | DRM_ERROR("Unable to locate a BIOS ROM\n"); |
669 | rdev->bios = NULL; | 667 | rdev->bios = NULL; |
diff --git a/drivers/gpu/drm/radeon/radeon_cs.c b/drivers/gpu/drm/radeon/radeon_cs.c index 1c893447d7cd..a3e7aed7e680 100644 --- a/drivers/gpu/drm/radeon/radeon_cs.c +++ b/drivers/gpu/drm/radeon/radeon_cs.c | |||
@@ -450,7 +450,7 @@ static void radeon_cs_parser_fini(struct radeon_cs_parser *parser, int error, bo | |||
450 | kfree(parser->track); | 450 | kfree(parser->track); |
451 | kfree(parser->relocs); | 451 | kfree(parser->relocs); |
452 | kfree(parser->relocs_ptr); | 452 | kfree(parser->relocs_ptr); |
453 | kfree(parser->vm_bos); | 453 | drm_free_large(parser->vm_bos); |
454 | for (i = 0; i < parser->nchunks; i++) | 454 | for (i = 0; i < parser->nchunks; i++) |
455 | drm_free_large(parser->chunks[i].kdata); | 455 | drm_free_large(parser->chunks[i].kdata); |
456 | kfree(parser->chunks); | 456 | kfree(parser->chunks); |
diff --git a/drivers/gpu/drm/radeon/radeon_ring.c b/drivers/gpu/drm/radeon/radeon_ring.c index 3d17af34afa7..2456f69efd23 100644 --- a/drivers/gpu/drm/radeon/radeon_ring.c +++ b/drivers/gpu/drm/radeon/radeon_ring.c | |||
@@ -314,7 +314,7 @@ unsigned radeon_ring_backup(struct radeon_device *rdev, struct radeon_ring *ring | |||
314 | } | 314 | } |
315 | 315 | ||
316 | /* and then save the content of the ring */ | 316 | /* and then save the content of the ring */ |
317 | *data = kmalloc_array(size, sizeof(uint32_t), GFP_KERNEL); | 317 | *data = drm_malloc_ab(size, sizeof(uint32_t)); |
318 | if (!*data) { | 318 | if (!*data) { |
319 | mutex_unlock(&rdev->ring_lock); | 319 | mutex_unlock(&rdev->ring_lock); |
320 | return 0; | 320 | return 0; |
@@ -356,7 +356,7 @@ int radeon_ring_restore(struct radeon_device *rdev, struct radeon_ring *ring, | |||
356 | } | 356 | } |
357 | 357 | ||
358 | radeon_ring_unlock_commit(rdev, ring, false); | 358 | radeon_ring_unlock_commit(rdev, ring, false); |
359 | kfree(data); | 359 | drm_free_large(data); |
360 | return 0; | 360 | return 0; |
361 | } | 361 | } |
362 | 362 | ||
diff --git a/drivers/gpu/drm/radeon/radeon_vm.c b/drivers/gpu/drm/radeon/radeon_vm.c index 4532cc76a0a6..dfde266529e2 100644 --- a/drivers/gpu/drm/radeon/radeon_vm.c +++ b/drivers/gpu/drm/radeon/radeon_vm.c | |||
@@ -132,8 +132,8 @@ struct radeon_cs_reloc *radeon_vm_get_bos(struct radeon_device *rdev, | |||
132 | struct radeon_cs_reloc *list; | 132 | struct radeon_cs_reloc *list; |
133 | unsigned i, idx; | 133 | unsigned i, idx; |
134 | 134 | ||
135 | list = kmalloc_array(vm->max_pde_used + 2, | 135 | list = drm_malloc_ab(vm->max_pde_used + 2, |
136 | sizeof(struct radeon_cs_reloc), GFP_KERNEL); | 136 | sizeof(struct radeon_cs_reloc)); |
137 | if (!list) | 137 | if (!list) |
138 | return NULL; | 138 | return NULL; |
139 | 139 | ||
diff --git a/drivers/gpu/drm/radeon/si_dpm.c b/drivers/gpu/drm/radeon/si_dpm.c index a53c2e79d9cb..676e6c2ba90a 100644 --- a/drivers/gpu/drm/radeon/si_dpm.c +++ b/drivers/gpu/drm/radeon/si_dpm.c | |||
@@ -6256,7 +6256,7 @@ static void si_parse_pplib_clock_info(struct radeon_device *rdev, | |||
6256 | if ((rps->class2 & ATOM_PPLIB_CLASSIFICATION2_ULV) && | 6256 | if ((rps->class2 & ATOM_PPLIB_CLASSIFICATION2_ULV) && |
6257 | index == 0) { | 6257 | index == 0) { |
6258 | /* XXX disable for A0 tahiti */ | 6258 | /* XXX disable for A0 tahiti */ |
6259 | si_pi->ulv.supported = true; | 6259 | si_pi->ulv.supported = false; |
6260 | si_pi->ulv.pl = *pl; | 6260 | si_pi->ulv.pl = *pl; |
6261 | si_pi->ulv.one_pcie_lane_in_ulv = false; | 6261 | si_pi->ulv.one_pcie_lane_in_ulv = false; |
6262 | si_pi->ulv.volt_change_delay = SISLANDS_ULVVOLTAGECHANGEDELAY_DFLT; | 6262 | si_pi->ulv.volt_change_delay = SISLANDS_ULVVOLTAGECHANGEDELAY_DFLT; |
diff --git a/drivers/gpu/drm/vmwgfx/vmwgfx_cmdbuf_res.c b/drivers/gpu/drm/vmwgfx/vmwgfx_cmdbuf_res.c index bfeb4b1f2acf..21e9b7f8dad0 100644 --- a/drivers/gpu/drm/vmwgfx/vmwgfx_cmdbuf_res.c +++ b/drivers/gpu/drm/vmwgfx/vmwgfx_cmdbuf_res.c | |||
@@ -246,7 +246,8 @@ int vmw_cmdbuf_res_remove(struct vmw_cmdbuf_res_manager *man, | |||
246 | struct drm_hash_item *hash; | 246 | struct drm_hash_item *hash; |
247 | int ret; | 247 | int ret; |
248 | 248 | ||
249 | ret = drm_ht_find_item(&man->resources, user_key, &hash); | 249 | ret = drm_ht_find_item(&man->resources, user_key | (res_type << 24), |
250 | &hash); | ||
250 | if (likely(ret != 0)) | 251 | if (likely(ret != 0)) |
251 | return -EINVAL; | 252 | return -EINVAL; |
252 | 253 | ||
diff --git a/drivers/gpu/drm/vmwgfx/vmwgfx_drv.c b/drivers/gpu/drm/vmwgfx/vmwgfx_drv.c index 7197af157313..25f3c250fd98 100644 --- a/drivers/gpu/drm/vmwgfx/vmwgfx_drv.c +++ b/drivers/gpu/drm/vmwgfx/vmwgfx_drv.c | |||
@@ -688,7 +688,11 @@ static int vmw_driver_load(struct drm_device *dev, unsigned long chipset) | |||
688 | goto out_err0; | 688 | goto out_err0; |
689 | } | 689 | } |
690 | 690 | ||
691 | if (unlikely(dev_priv->prim_bb_mem < dev_priv->vram_size)) | 691 | /* |
692 | * Limit back buffer size to VRAM size. Remove this once | ||
693 | * screen targets are implemented. | ||
694 | */ | ||
695 | if (dev_priv->prim_bb_mem > dev_priv->vram_size) | ||
692 | dev_priv->prim_bb_mem = dev_priv->vram_size; | 696 | dev_priv->prim_bb_mem = dev_priv->vram_size; |
693 | 697 | ||
694 | mutex_unlock(&dev_priv->hw_mutex); | 698 | mutex_unlock(&dev_priv->hw_mutex); |
diff --git a/drivers/gpu/drm/vmwgfx/vmwgfx_kms.c b/drivers/gpu/drm/vmwgfx/vmwgfx_kms.c index d2bc2b03d4c6..941a7bc0b791 100644 --- a/drivers/gpu/drm/vmwgfx/vmwgfx_kms.c +++ b/drivers/gpu/drm/vmwgfx/vmwgfx_kms.c | |||
@@ -187,7 +187,7 @@ int vmw_du_crtc_cursor_set(struct drm_crtc *crtc, struct drm_file *file_priv, | |||
187 | * can do this since the caller in the drm core doesn't check anything | 187 | * can do this since the caller in the drm core doesn't check anything |
188 | * which is protected by any looks. | 188 | * which is protected by any looks. |
189 | */ | 189 | */ |
190 | drm_modeset_unlock(&crtc->mutex); | 190 | drm_modeset_unlock_crtc(crtc); |
191 | drm_modeset_lock_all(dev_priv->dev); | 191 | drm_modeset_lock_all(dev_priv->dev); |
192 | 192 | ||
193 | /* A lot of the code assumes this */ | 193 | /* A lot of the code assumes this */ |
@@ -252,7 +252,7 @@ int vmw_du_crtc_cursor_set(struct drm_crtc *crtc, struct drm_file *file_priv, | |||
252 | ret = 0; | 252 | ret = 0; |
253 | out: | 253 | out: |
254 | drm_modeset_unlock_all(dev_priv->dev); | 254 | drm_modeset_unlock_all(dev_priv->dev); |
255 | drm_modeset_lock(&crtc->mutex, NULL); | 255 | drm_modeset_lock_crtc(crtc); |
256 | 256 | ||
257 | return ret; | 257 | return ret; |
258 | } | 258 | } |
@@ -273,7 +273,7 @@ int vmw_du_crtc_cursor_move(struct drm_crtc *crtc, int x, int y) | |||
273 | * can do this since the caller in the drm core doesn't check anything | 273 | * can do this since the caller in the drm core doesn't check anything |
274 | * which is protected by any looks. | 274 | * which is protected by any looks. |
275 | */ | 275 | */ |
276 | drm_modeset_unlock(&crtc->mutex); | 276 | drm_modeset_unlock_crtc(crtc); |
277 | drm_modeset_lock_all(dev_priv->dev); | 277 | drm_modeset_lock_all(dev_priv->dev); |
278 | 278 | ||
279 | vmw_cursor_update_position(dev_priv, shown, | 279 | vmw_cursor_update_position(dev_priv, shown, |
@@ -281,7 +281,7 @@ int vmw_du_crtc_cursor_move(struct drm_crtc *crtc, int x, int y) | |||
281 | du->cursor_y + du->hotspot_y); | 281 | du->cursor_y + du->hotspot_y); |
282 | 282 | ||
283 | drm_modeset_unlock_all(dev_priv->dev); | 283 | drm_modeset_unlock_all(dev_priv->dev); |
284 | drm_modeset_lock(&crtc->mutex, NULL); | 284 | drm_modeset_lock_crtc(crtc); |
285 | 285 | ||
286 | return 0; | 286 | return 0; |
287 | } | 287 | } |
@@ -1950,6 +1950,14 @@ int vmw_du_connector_fill_modes(struct drm_connector *connector, | |||
1950 | DRM_MODE_FLAG_NHSYNC | DRM_MODE_FLAG_PVSYNC) | 1950 | DRM_MODE_FLAG_NHSYNC | DRM_MODE_FLAG_PVSYNC) |
1951 | }; | 1951 | }; |
1952 | int i; | 1952 | int i; |
1953 | u32 assumed_bpp = 2; | ||
1954 | |||
1955 | /* | ||
1956 | * If using screen objects, then assume 32-bpp because that's what the | ||
1957 | * SVGA device is assuming | ||
1958 | */ | ||
1959 | if (dev_priv->sou_priv) | ||
1960 | assumed_bpp = 4; | ||
1953 | 1961 | ||
1954 | /* Add preferred mode */ | 1962 | /* Add preferred mode */ |
1955 | { | 1963 | { |
@@ -1960,8 +1968,9 @@ int vmw_du_connector_fill_modes(struct drm_connector *connector, | |||
1960 | mode->vdisplay = du->pref_height; | 1968 | mode->vdisplay = du->pref_height; |
1961 | vmw_guess_mode_timing(mode); | 1969 | vmw_guess_mode_timing(mode); |
1962 | 1970 | ||
1963 | if (vmw_kms_validate_mode_vram(dev_priv, mode->hdisplay * 2, | 1971 | if (vmw_kms_validate_mode_vram(dev_priv, |
1964 | mode->vdisplay)) { | 1972 | mode->hdisplay * assumed_bpp, |
1973 | mode->vdisplay)) { | ||
1965 | drm_mode_probed_add(connector, mode); | 1974 | drm_mode_probed_add(connector, mode); |
1966 | } else { | 1975 | } else { |
1967 | drm_mode_destroy(dev, mode); | 1976 | drm_mode_destroy(dev, mode); |
@@ -1983,7 +1992,8 @@ int vmw_du_connector_fill_modes(struct drm_connector *connector, | |||
1983 | bmode->vdisplay > max_height) | 1992 | bmode->vdisplay > max_height) |
1984 | continue; | 1993 | continue; |
1985 | 1994 | ||
1986 | if (!vmw_kms_validate_mode_vram(dev_priv, bmode->hdisplay * 2, | 1995 | if (!vmw_kms_validate_mode_vram(dev_priv, |
1996 | bmode->hdisplay * assumed_bpp, | ||
1987 | bmode->vdisplay)) | 1997 | bmode->vdisplay)) |
1988 | continue; | 1998 | continue; |
1989 | 1999 | ||
diff --git a/drivers/hid/hid-debug.c b/drivers/hid/hid-debug.c index 84c3cb15ccdd..8bf61d295ffd 100644 --- a/drivers/hid/hid-debug.c +++ b/drivers/hid/hid-debug.c | |||
@@ -946,6 +946,12 @@ static const char *keys[KEY_MAX + 1] = { | |||
946 | [KEY_BRIGHTNESS_MIN] = "BrightnessMin", | 946 | [KEY_BRIGHTNESS_MIN] = "BrightnessMin", |
947 | [KEY_BRIGHTNESS_MAX] = "BrightnessMax", | 947 | [KEY_BRIGHTNESS_MAX] = "BrightnessMax", |
948 | [KEY_BRIGHTNESS_AUTO] = "BrightnessAuto", | 948 | [KEY_BRIGHTNESS_AUTO] = "BrightnessAuto", |
949 | [KEY_KBDINPUTASSIST_PREV] = "KbdInputAssistPrev", | ||
950 | [KEY_KBDINPUTASSIST_NEXT] = "KbdInputAssistNext", | ||
951 | [KEY_KBDINPUTASSIST_PREVGROUP] = "KbdInputAssistPrevGroup", | ||
952 | [KEY_KBDINPUTASSIST_NEXTGROUP] = "KbdInputAssistNextGroup", | ||
953 | [KEY_KBDINPUTASSIST_ACCEPT] = "KbdInputAssistAccept", | ||
954 | [KEY_KBDINPUTASSIST_CANCEL] = "KbdInputAssistCancel", | ||
949 | }; | 955 | }; |
950 | 956 | ||
951 | static const char *relatives[REL_MAX + 1] = { | 957 | static const char *relatives[REL_MAX + 1] = { |
diff --git a/drivers/hid/hid-ids.h b/drivers/hid/hid-ids.h index cd9c9e96cf0e..e23ab8b30626 100644 --- a/drivers/hid/hid-ids.h +++ b/drivers/hid/hid-ids.h | |||
@@ -298,6 +298,8 @@ | |||
298 | 298 | ||
299 | #define USB_VENDOR_ID_ELAN 0x04f3 | 299 | #define USB_VENDOR_ID_ELAN 0x04f3 |
300 | #define USB_DEVICE_ID_ELAN_TOUCHSCREEN 0x0089 | 300 | #define USB_DEVICE_ID_ELAN_TOUCHSCREEN 0x0089 |
301 | #define USB_DEVICE_ID_ELAN_TOUCHSCREEN_009B 0x009b | ||
302 | #define USB_DEVICE_ID_ELAN_TOUCHSCREEN_016F 0x016f | ||
301 | 303 | ||
302 | #define USB_VENDOR_ID_ELECOM 0x056e | 304 | #define USB_VENDOR_ID_ELECOM 0x056e |
303 | #define USB_DEVICE_ID_ELECOM_BM084 0x0061 | 305 | #define USB_DEVICE_ID_ELECOM_BM084 0x0061 |
diff --git a/drivers/hid/hid-input.c b/drivers/hid/hid-input.c index 2df7fddbd119..725f22ca47fc 100644 --- a/drivers/hid/hid-input.c +++ b/drivers/hid/hid-input.c | |||
@@ -695,7 +695,10 @@ static void hidinput_configure_usage(struct hid_input *hidinput, struct hid_fiel | |||
695 | break; | 695 | break; |
696 | 696 | ||
697 | case 0x5b: /* TransducerSerialNumber */ | 697 | case 0x5b: /* TransducerSerialNumber */ |
698 | set_bit(MSC_SERIAL, input->mscbit); | 698 | usage->type = EV_MSC; |
699 | usage->code = MSC_SERIAL; | ||
700 | bit = input->mscbit; | ||
701 | max = MSC_MAX; | ||
699 | break; | 702 | break; |
700 | 703 | ||
701 | default: goto unknown; | 704 | default: goto unknown; |
@@ -862,6 +865,13 @@ static void hidinput_configure_usage(struct hid_input *hidinput, struct hid_fiel | |||
862 | case 0x28b: map_key_clear(KEY_FORWARDMAIL); break; | 865 | case 0x28b: map_key_clear(KEY_FORWARDMAIL); break; |
863 | case 0x28c: map_key_clear(KEY_SEND); break; | 866 | case 0x28c: map_key_clear(KEY_SEND); break; |
864 | 867 | ||
868 | case 0x2c7: map_key_clear(KEY_KBDINPUTASSIST_PREV); break; | ||
869 | case 0x2c8: map_key_clear(KEY_KBDINPUTASSIST_NEXT); break; | ||
870 | case 0x2c9: map_key_clear(KEY_KBDINPUTASSIST_PREVGROUP); break; | ||
871 | case 0x2ca: map_key_clear(KEY_KBDINPUTASSIST_NEXTGROUP); break; | ||
872 | case 0x2cb: map_key_clear(KEY_KBDINPUTASSIST_ACCEPT); break; | ||
873 | case 0x2cc: map_key_clear(KEY_KBDINPUTASSIST_CANCEL); break; | ||
874 | |||
865 | default: goto ignore; | 875 | default: goto ignore; |
866 | } | 876 | } |
867 | break; | 877 | break; |
diff --git a/drivers/hid/usbhid/hid-quirks.c b/drivers/hid/usbhid/hid-quirks.c index f3cb5b0a4345..5014bb567b29 100644 --- a/drivers/hid/usbhid/hid-quirks.c +++ b/drivers/hid/usbhid/hid-quirks.c | |||
@@ -71,6 +71,8 @@ static const struct hid_blacklist { | |||
71 | { USB_VENDOR_ID_CH, USB_DEVICE_ID_CH_AXIS_295, HID_QUIRK_NOGET }, | 71 | { USB_VENDOR_ID_CH, USB_DEVICE_ID_CH_AXIS_295, HID_QUIRK_NOGET }, |
72 | { USB_VENDOR_ID_DMI, USB_DEVICE_ID_DMI_ENC, HID_QUIRK_NOGET }, | 72 | { USB_VENDOR_ID_DMI, USB_DEVICE_ID_DMI_ENC, HID_QUIRK_NOGET }, |
73 | { USB_VENDOR_ID_ELAN, USB_DEVICE_ID_ELAN_TOUCHSCREEN, HID_QUIRK_ALWAYS_POLL }, | 73 | { USB_VENDOR_ID_ELAN, USB_DEVICE_ID_ELAN_TOUCHSCREEN, HID_QUIRK_ALWAYS_POLL }, |
74 | { USB_VENDOR_ID_ELAN, USB_DEVICE_ID_ELAN_TOUCHSCREEN_009B, HID_QUIRK_ALWAYS_POLL }, | ||
75 | { USB_VENDOR_ID_ELAN, USB_DEVICE_ID_ELAN_TOUCHSCREEN_016F, HID_QUIRK_ALWAYS_POLL }, | ||
74 | { USB_VENDOR_ID_ELO, USB_DEVICE_ID_ELO_TS2700, HID_QUIRK_NOGET }, | 76 | { USB_VENDOR_ID_ELO, USB_DEVICE_ID_ELO_TS2700, HID_QUIRK_NOGET }, |
75 | { USB_VENDOR_ID_FORMOSA, USB_DEVICE_ID_FORMOSA_IR_RECEIVER, HID_QUIRK_NO_INIT_REPORTS }, | 77 | { USB_VENDOR_ID_FORMOSA, USB_DEVICE_ID_FORMOSA_IR_RECEIVER, HID_QUIRK_NO_INIT_REPORTS }, |
76 | { USB_VENDOR_ID_FREESCALE, USB_DEVICE_ID_FREESCALE_MX28, HID_QUIRK_NOGET }, | 78 | { USB_VENDOR_ID_FREESCALE, USB_DEVICE_ID_FREESCALE_MX28, HID_QUIRK_NOGET }, |
diff --git a/drivers/i2c/algos/i2c-algo-bit.c b/drivers/i2c/algos/i2c-algo-bit.c index 65ef9664d5da..899bede81b31 100644 --- a/drivers/i2c/algos/i2c-algo-bit.c +++ b/drivers/i2c/algos/i2c-algo-bit.c | |||
@@ -12,11 +12,6 @@ | |||
12 | but WITHOUT ANY WARRANTY; without even the implied warranty of | 12 | but WITHOUT ANY WARRANTY; without even the implied warranty of |
13 | MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the | 13 | MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the |
14 | GNU General Public License for more details. | 14 | GNU General Public License for more details. |
15 | |||
16 | You should have received a copy of the GNU General Public License | ||
17 | along with this program; if not, write to the Free Software | ||
18 | Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, | ||
19 | MA 02110-1301 USA. | ||
20 | * ------------------------------------------------------------------------- */ | 15 | * ------------------------------------------------------------------------- */ |
21 | 16 | ||
22 | /* With some changes from Frodo Looijaard <frodol@dds.nl>, Kyösti Mälkki | 17 | /* With some changes from Frodo Looijaard <frodol@dds.nl>, Kyösti Mälkki |
diff --git a/drivers/i2c/algos/i2c-algo-pca.c b/drivers/i2c/algos/i2c-algo-pca.c index 8b10f88b13d9..580dbf05c148 100644 --- a/drivers/i2c/algos/i2c-algo-pca.c +++ b/drivers/i2c/algos/i2c-algo-pca.c | |||
@@ -12,11 +12,6 @@ | |||
12 | * but WITHOUT ANY WARRANTY; without even the implied warranty of | 12 | * but WITHOUT ANY WARRANTY; without even the implied warranty of |
13 | * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the | 13 | * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the |
14 | * GNU General Public License for more details. | 14 | * GNU General Public License for more details. |
15 | * | ||
16 | * You should have received a copy of the GNU General Public License | ||
17 | * along with this program; if not, write to the Free Software | ||
18 | * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, | ||
19 | * MA 02110-1301 USA. | ||
20 | */ | 15 | */ |
21 | 16 | ||
22 | #include <linux/kernel.h> | 17 | #include <linux/kernel.h> |
diff --git a/drivers/i2c/algos/i2c-algo-pcf.c b/drivers/i2c/algos/i2c-algo-pcf.c index 34370090b753..270d84bfc2c6 100644 --- a/drivers/i2c/algos/i2c-algo-pcf.c +++ b/drivers/i2c/algos/i2c-algo-pcf.c | |||
@@ -14,11 +14,6 @@ | |||
14 | * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the | 14 | * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the |
15 | * GNU General Public License for more details. | 15 | * GNU General Public License for more details. |
16 | * | 16 | * |
17 | * You should have received a copy of the GNU General Public License | ||
18 | * along with this program; if not, write to the Free Software | ||
19 | * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, | ||
20 | * MA 02110-1301 USA. | ||
21 | * | ||
22 | * With some changes from Kyösti Mälkki <kmalkki@cc.hut.fi> and | 17 | * With some changes from Kyösti Mälkki <kmalkki@cc.hut.fi> and |
23 | * Frodo Looijaard <frodol@dds.nl>, and also from Martin Bailey | 18 | * Frodo Looijaard <frodol@dds.nl>, and also from Martin Bailey |
24 | * <mbailey@littlefeet-inc.com> | 19 | * <mbailey@littlefeet-inc.com> |
diff --git a/drivers/i2c/algos/i2c-algo-pcf.h b/drivers/i2c/algos/i2c-algo-pcf.h index 1ec703ee788d..262ee801975b 100644 --- a/drivers/i2c/algos/i2c-algo-pcf.h +++ b/drivers/i2c/algos/i2c-algo-pcf.h | |||
@@ -12,12 +12,7 @@ | |||
12 | This program is distributed in the hope that it will be useful, | 12 | This program is distributed in the hope that it will be useful, |
13 | but WITHOUT ANY WARRANTY; without even the implied warranty of | 13 | but WITHOUT ANY WARRANTY; without even the implied warranty of |
14 | MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the | 14 | MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the |
15 | GNU General Public License for more details. | 15 | GNU General Public License for more details. */ |
16 | |||
17 | You should have received a copy of the GNU General Public License | ||
18 | along with this program; if not, write to the Free Software | ||
19 | Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, | ||
20 | MA 02110-1301 USA. */ | ||
21 | /* -------------------------------------------------------------------- */ | 16 | /* -------------------------------------------------------------------- */ |
22 | 17 | ||
23 | /* With some changes from Frodo Looijaard <frodol@dds.nl> */ | 18 | /* With some changes from Frodo Looijaard <frodol@dds.nl> */ |
diff --git a/drivers/i2c/busses/i2c-ali1535.c b/drivers/i2c/busses/i2c-ali1535.c index 451e305f7971..4f2d78868281 100644 --- a/drivers/i2c/busses/i2c-ali1535.c +++ b/drivers/i2c/busses/i2c-ali1535.c | |||
@@ -14,10 +14,6 @@ | |||
14 | * but WITHOUT ANY WARRANTY; without even the implied warranty of | 14 | * but WITHOUT ANY WARRANTY; without even the implied warranty of |
15 | * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the | 15 | * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the |
16 | * GNU General Public License for more details. | 16 | * GNU General Public License for more details. |
17 | * | ||
18 | * You should have received a copy of the GNU General Public License | ||
19 | * along with this program; if not, write to the Free Software | ||
20 | * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. | ||
21 | */ | 17 | */ |
22 | 18 | ||
23 | /* | 19 | /* |
diff --git a/drivers/i2c/busses/i2c-ali15x3.c b/drivers/i2c/busses/i2c-ali15x3.c index 2fa21ce9682b..45c5c4883022 100644 --- a/drivers/i2c/busses/i2c-ali15x3.c +++ b/drivers/i2c/busses/i2c-ali15x3.c | |||
@@ -12,10 +12,6 @@ | |||
12 | but WITHOUT ANY WARRANTY; without even the implied warranty of | 12 | but WITHOUT ANY WARRANTY; without even the implied warranty of |
13 | MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the | 13 | MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the |
14 | GNU General Public License for more details. | 14 | GNU General Public License for more details. |
15 | |||
16 | You should have received a copy of the GNU General Public License | ||
17 | along with this program; if not, write to the Free Software | ||
18 | Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. | ||
19 | */ | 15 | */ |
20 | 16 | ||
21 | /* | 17 | /* |
diff --git a/drivers/i2c/busses/i2c-amd756-s4882.c b/drivers/i2c/busses/i2c-amd756-s4882.c index 41fc6837fb8b..65e324054970 100644 --- a/drivers/i2c/busses/i2c-amd756-s4882.c +++ b/drivers/i2c/busses/i2c-amd756-s4882.c | |||
@@ -12,10 +12,6 @@ | |||
12 | * but WITHOUT ANY WARRANTY; without even the implied warranty of | 12 | * but WITHOUT ANY WARRANTY; without even the implied warranty of |
13 | * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the | 13 | * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the |
14 | * GNU General Public License for more details. | 14 | * GNU General Public License for more details. |
15 | * | ||
16 | * You should have received a copy of the GNU General Public License | ||
17 | * along with this program; if not, write to the Free Software | ||
18 | * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. | ||
19 | */ | 15 | */ |
20 | 16 | ||
21 | /* | 17 | /* |
diff --git a/drivers/i2c/busses/i2c-amd756.c b/drivers/i2c/busses/i2c-amd756.c index a16f72891358..6c7113d990f8 100644 --- a/drivers/i2c/busses/i2c-amd756.c +++ b/drivers/i2c/busses/i2c-amd756.c | |||
@@ -15,10 +15,6 @@ | |||
15 | but WITHOUT ANY WARRANTY; without even the implied warranty of | 15 | but WITHOUT ANY WARRANTY; without even the implied warranty of |
16 | MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the | 16 | MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the |
17 | GNU General Public License for more details. | 17 | GNU General Public License for more details. |
18 | |||
19 | You should have received a copy of the GNU General Public License | ||
20 | along with this program; if not, write to the Free Software | ||
21 | Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. | ||
22 | */ | 18 | */ |
23 | 19 | ||
24 | /* | 20 | /* |
diff --git a/drivers/i2c/busses/i2c-at91.c b/drivers/i2c/busses/i2c-at91.c index 917d54588d95..e05a672db3e5 100644 --- a/drivers/i2c/busses/i2c-at91.c +++ b/drivers/i2c/busses/i2c-at91.c | |||
@@ -434,7 +434,7 @@ static int at91_do_twi_transfer(struct at91_twi_dev *dev) | |||
434 | } | 434 | } |
435 | } | 435 | } |
436 | 436 | ||
437 | ret = wait_for_completion_io_timeout(&dev->cmd_complete, | 437 | ret = wait_for_completion_timeout(&dev->cmd_complete, |
438 | dev->adapter.timeout); | 438 | dev->adapter.timeout); |
439 | if (ret == 0) { | 439 | if (ret == 0) { |
440 | dev_err(dev->dev, "controller timed out\n"); | 440 | dev_err(dev->dev, "controller timed out\n"); |
diff --git a/drivers/i2c/busses/i2c-au1550.c b/drivers/i2c/busses/i2c-au1550.c index 8762458ca7da..6f8c0756e350 100644 --- a/drivers/i2c/busses/i2c-au1550.c +++ b/drivers/i2c/busses/i2c-au1550.c | |||
@@ -21,10 +21,6 @@ | |||
21 | * but WITHOUT ANY WARRANTY; without even the implied warranty of | 21 | * but WITHOUT ANY WARRANTY; without even the implied warranty of |
22 | * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the | 22 | * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the |
23 | * GNU General Public License for more details. | 23 | * GNU General Public License for more details. |
24 | * | ||
25 | * You should have received a copy of the GNU General Public License | ||
26 | * along with this program; if not, write to the Free Software | ||
27 | * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. | ||
28 | */ | 24 | */ |
29 | 25 | ||
30 | #include <linux/delay.h> | 26 | #include <linux/delay.h> |
diff --git a/drivers/i2c/busses/i2c-cpm.c b/drivers/i2c/busses/i2c-cpm.c index f3b89a4698b6..5bdbc71698d0 100644 --- a/drivers/i2c/busses/i2c-cpm.c +++ b/drivers/i2c/busses/i2c-cpm.c | |||
@@ -23,10 +23,6 @@ | |||
23 | * but WITHOUT ANY WARRANTY; without even the implied warranty of | 23 | * but WITHOUT ANY WARRANTY; without even the implied warranty of |
24 | * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the | 24 | * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the |
25 | * GNU General Public License for more details. | 25 | * GNU General Public License for more details. |
26 | * | ||
27 | * You should have received a copy of the GNU General Public License | ||
28 | * along with this program; if not, write to the Free Software | ||
29 | * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. | ||
30 | */ | 26 | */ |
31 | 27 | ||
32 | #include <linux/kernel.h> | 28 | #include <linux/kernel.h> |
diff --git a/drivers/i2c/busses/i2c-davinci.c b/drivers/i2c/busses/i2c-davinci.c index 4d9614719128..d15b7c9b9219 100644 --- a/drivers/i2c/busses/i2c-davinci.c +++ b/drivers/i2c/busses/i2c-davinci.c | |||
@@ -17,10 +17,6 @@ | |||
17 | * but WITHOUT ANY WARRANTY; without even the implied warranty of | 17 | * but WITHOUT ANY WARRANTY; without even the implied warranty of |
18 | * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the | 18 | * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the |
19 | * GNU General Public License for more details. | 19 | * GNU General Public License for more details. |
20 | * | ||
21 | * You should have received a copy of the GNU General Public License | ||
22 | * along with this program; if not, write to the Free Software | ||
23 | * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. | ||
24 | * ---------------------------------------------------------------------------- | 20 | * ---------------------------------------------------------------------------- |
25 | * | 21 | * |
26 | */ | 22 | */ |
diff --git a/drivers/i2c/busses/i2c-designware-core.c b/drivers/i2c/busses/i2c-designware-core.c index 3c20e4bd6dd1..edca99dbba23 100644 --- a/drivers/i2c/busses/i2c-designware-core.c +++ b/drivers/i2c/busses/i2c-designware-core.c | |||
@@ -18,10 +18,6 @@ | |||
18 | * but WITHOUT ANY WARRANTY; without even the implied warranty of | 18 | * but WITHOUT ANY WARRANTY; without even the implied warranty of |
19 | * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the | 19 | * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the |
20 | * GNU General Public License for more details. | 20 | * GNU General Public License for more details. |
21 | * | ||
22 | * You should have received a copy of the GNU General Public License | ||
23 | * along with this program; if not, write to the Free Software | ||
24 | * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. | ||
25 | * ---------------------------------------------------------------------------- | 21 | * ---------------------------------------------------------------------------- |
26 | * | 22 | * |
27 | */ | 23 | */ |
diff --git a/drivers/i2c/busses/i2c-designware-core.h b/drivers/i2c/busses/i2c-designware-core.h index d66b6cbc9edc..5a410ef17abd 100644 --- a/drivers/i2c/busses/i2c-designware-core.h +++ b/drivers/i2c/busses/i2c-designware-core.h | |||
@@ -18,10 +18,6 @@ | |||
18 | * but WITHOUT ANY WARRANTY; without even the implied warranty of | 18 | * but WITHOUT ANY WARRANTY; without even the implied warranty of |
19 | * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the | 19 | * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the |
20 | * GNU General Public License for more details. | 20 | * GNU General Public License for more details. |
21 | * | ||
22 | * You should have received a copy of the GNU General Public License | ||
23 | * along with this program; if not, write to the Free Software | ||
24 | * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. | ||
25 | * ---------------------------------------------------------------------------- | 21 | * ---------------------------------------------------------------------------- |
26 | * | 22 | * |
27 | */ | 23 | */ |
diff --git a/drivers/i2c/busses/i2c-designware-pcidrv.c b/drivers/i2c/busses/i2c-designware-pcidrv.c index d31d313ab4f7..acb40f95db78 100644 --- a/drivers/i2c/busses/i2c-designware-pcidrv.c +++ b/drivers/i2c/busses/i2c-designware-pcidrv.c | |||
@@ -19,10 +19,6 @@ | |||
19 | * but WITHOUT ANY WARRANTY; without even the implied warranty of | 19 | * but WITHOUT ANY WARRANTY; without even the implied warranty of |
20 | * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the | 20 | * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the |
21 | * GNU General Public License for more details. | 21 | * GNU General Public License for more details. |
22 | * | ||
23 | * You should have received a copy of the GNU General Public License | ||
24 | * along with this program; if not, write to the Free Software | ||
25 | * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. | ||
26 | * ---------------------------------------------------------------------------- | 22 | * ---------------------------------------------------------------------------- |
27 | * | 23 | * |
28 | */ | 24 | */ |
diff --git a/drivers/i2c/busses/i2c-designware-platdrv.c b/drivers/i2c/busses/i2c-designware-platdrv.c index a7431150acf7..373dd4d47765 100644 --- a/drivers/i2c/busses/i2c-designware-platdrv.c +++ b/drivers/i2c/busses/i2c-designware-platdrv.c | |||
@@ -18,10 +18,6 @@ | |||
18 | * but WITHOUT ANY WARRANTY; without even the implied warranty of | 18 | * but WITHOUT ANY WARRANTY; without even the implied warranty of |
19 | * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the | 19 | * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the |
20 | * GNU General Public License for more details. | 20 | * GNU General Public License for more details. |
21 | * | ||
22 | * You should have received a copy of the GNU General Public License | ||
23 | * along with this program; if not, write to the Free Software | ||
24 | * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. | ||
25 | * ---------------------------------------------------------------------------- | 21 | * ---------------------------------------------------------------------------- |
26 | * | 22 | * |
27 | */ | 23 | */ |
diff --git a/drivers/i2c/busses/i2c-eg20t.c b/drivers/i2c/busses/i2c-eg20t.c index a44ea13d1434..76e699f9ed97 100644 --- a/drivers/i2c/busses/i2c-eg20t.c +++ b/drivers/i2c/busses/i2c-eg20t.c | |||
@@ -9,10 +9,6 @@ | |||
9 | * but WITHOUT ANY WARRANTY; without even the implied warranty of | 9 | * but WITHOUT ANY WARRANTY; without even the implied warranty of |
10 | * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the | 10 | * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the |
11 | * GNU General Public License for more details. | 11 | * GNU General Public License for more details. |
12 | * | ||
13 | * You should have received a copy of the GNU General Public License | ||
14 | * along with this program; if not, write to the Free Software | ||
15 | * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307, USA. | ||
16 | */ | 12 | */ |
17 | 13 | ||
18 | #include <linux/module.h> | 14 | #include <linux/module.h> |
diff --git a/drivers/i2c/busses/i2c-elektor.c b/drivers/i2c/busses/i2c-elektor.c index 485497066ed7..92e8c0ce1625 100644 --- a/drivers/i2c/busses/i2c-elektor.c +++ b/drivers/i2c/busses/i2c-elektor.c | |||
@@ -12,11 +12,7 @@ | |||
12 | This program is distributed in the hope that it will be useful, | 12 | This program is distributed in the hope that it will be useful, |
13 | but WITHOUT ANY WARRANTY; without even the implied warranty of | 13 | but WITHOUT ANY WARRANTY; without even the implied warranty of |
14 | MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the | 14 | MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the |
15 | GNU General Public License for more details. | 15 | GNU General Public License for more details. */ |
16 | |||
17 | You should have received a copy of the GNU General Public License | ||
18 | along with this program; if not, write to the Free Software | ||
19 | Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. */ | ||
20 | /* ------------------------------------------------------------------------- */ | 16 | /* ------------------------------------------------------------------------- */ |
21 | 17 | ||
22 | /* With some changes from Kyösti Mälkki <kmalkki@cc.hut.fi> and even | 18 | /* With some changes from Kyösti Mälkki <kmalkki@cc.hut.fi> and even |
diff --git a/drivers/i2c/busses/i2c-hydra.c b/drivers/i2c/busses/i2c-hydra.c index 14d2b76de25f..b7864cf42a72 100644 --- a/drivers/i2c/busses/i2c-hydra.c +++ b/drivers/i2c/busses/i2c-hydra.c | |||
@@ -15,10 +15,6 @@ | |||
15 | but WITHOUT ANY WARRANTY; without even the implied warranty of | 15 | but WITHOUT ANY WARRANTY; without even the implied warranty of |
16 | MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the | 16 | MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the |
17 | GNU General Public License for more details. | 17 | GNU General Public License for more details. |
18 | |||
19 | You should have received a copy of the GNU General Public License | ||
20 | along with this program; if not, write to the Free Software | ||
21 | Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. | ||
22 | */ | 18 | */ |
23 | 19 | ||
24 | #include <linux/kernel.h> | 20 | #include <linux/kernel.h> |
diff --git a/drivers/i2c/busses/i2c-i801.c b/drivers/i2c/busses/i2c-i801.c index 7cfc183b3d63..6ab4f1cb21f3 100644 --- a/drivers/i2c/busses/i2c-i801.c +++ b/drivers/i2c/busses/i2c-i801.c | |||
@@ -15,10 +15,6 @@ | |||
15 | but WITHOUT ANY WARRANTY; without even the implied warranty of | 15 | but WITHOUT ANY WARRANTY; without even the implied warranty of |
16 | MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the | 16 | MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the |
17 | GNU General Public License for more details. | 17 | GNU General Public License for more details. |
18 | |||
19 | You should have received a copy of the GNU General Public License | ||
20 | along with this program; if not, write to the Free Software | ||
21 | Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. | ||
22 | */ | 18 | */ |
23 | 19 | ||
24 | /* | 20 | /* |
diff --git a/drivers/i2c/busses/i2c-imx.c b/drivers/i2c/busses/i2c-imx.c index c48e46af670a..e9fb7cf78612 100644 --- a/drivers/i2c/busses/i2c-imx.c +++ b/drivers/i2c/busses/i2c-imx.c | |||
@@ -11,11 +11,6 @@ | |||
11 | * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the | 11 | * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the |
12 | * GNU General Public License for more details. | 12 | * GNU General Public License for more details. |
13 | * | 13 | * |
14 | * You should have received a copy of the GNU General Public License | ||
15 | * along with this program; if not, write to the Free Software | ||
16 | * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, | ||
17 | * USA. | ||
18 | * | ||
19 | * Author: | 14 | * Author: |
20 | * Darius Augulis, Teltonika Inc. | 15 | * Darius Augulis, Teltonika Inc. |
21 | * | 16 | * |
diff --git a/drivers/i2c/busses/i2c-iop3xx.h b/drivers/i2c/busses/i2c-iop3xx.h index 097e270955d0..2d6929c2bd92 100644 --- a/drivers/i2c/busses/i2c-iop3xx.h +++ b/drivers/i2c/busses/i2c-iop3xx.h | |||
@@ -11,11 +11,7 @@ | |||
11 | This program is distributed in the hope that it will be useful, | 11 | This program is distributed in the hope that it will be useful, |
12 | but WITHOUT ANY WARRANTY; without even the implied warranty of | 12 | but WITHOUT ANY WARRANTY; without even the implied warranty of |
13 | MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the | 13 | MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the |
14 | GNU General Public License for more details. | 14 | GNU General Public License for more details. */ |
15 | |||
16 | You should have received a copy of the GNU General Public License | ||
17 | along with this program; if not, write to the Free Software | ||
18 | Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. */ | ||
19 | /* ------------------------------------------------------------------------- */ | 15 | /* ------------------------------------------------------------------------- */ |
20 | 16 | ||
21 | 17 | ||
diff --git a/drivers/i2c/busses/i2c-isch.c b/drivers/i2c/busses/i2c-isch.c index cf99dbf21fd1..113293d275f6 100644 --- a/drivers/i2c/busses/i2c-isch.c +++ b/drivers/i2c/busses/i2c-isch.c | |||
@@ -14,10 +14,6 @@ | |||
14 | but WITHOUT ANY WARRANTY; without even the implied warranty of | 14 | but WITHOUT ANY WARRANTY; without even the implied warranty of |
15 | MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the | 15 | MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the |
16 | GNU General Public License for more details. | 16 | GNU General Public License for more details. |
17 | |||
18 | You should have received a copy of the GNU General Public License | ||
19 | along with this program; if not, write to the Free Software | ||
20 | Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. | ||
21 | */ | 17 | */ |
22 | 18 | ||
23 | /* | 19 | /* |
diff --git a/drivers/i2c/busses/i2c-ismt.c b/drivers/i2c/busses/i2c-ismt.c index 3f6ecbfb9a56..f2b0ff011631 100644 --- a/drivers/i2c/busses/i2c-ismt.c +++ b/drivers/i2c/busses/i2c-ismt.c | |||
@@ -14,10 +14,6 @@ | |||
14 | * WITHOUT ANY WARRANTY; without even the implied warranty of | 14 | * WITHOUT ANY WARRANTY; without even the implied warranty of |
15 | * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU | 15 | * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU |
16 | * General Public License for more details. | 16 | * General Public License for more details. |
17 | * | ||
18 | * You should have received a copy of the GNU General Public License | ||
19 | * along with this program; if not, write to the Free Software | ||
20 | * Foundation, Inc., 51 Franklin St - Fifth Floor, Boston, MA 02110-1301 USA. | ||
21 | * The full GNU General Public License is included in this distribution | 17 | * The full GNU General Public License is included in this distribution |
22 | * in the file called LICENSE.GPL. | 18 | * in the file called LICENSE.GPL. |
23 | * | 19 | * |
diff --git a/drivers/i2c/busses/i2c-nforce2-s4985.c b/drivers/i2c/busses/i2c-nforce2-s4985.c index b170bdffb5de..88eda09e73c0 100644 --- a/drivers/i2c/busses/i2c-nforce2-s4985.c +++ b/drivers/i2c/busses/i2c-nforce2-s4985.c | |||
@@ -12,10 +12,6 @@ | |||
12 | * but WITHOUT ANY WARRANTY; without even the implied warranty of | 12 | * but WITHOUT ANY WARRANTY; without even the implied warranty of |
13 | * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the | 13 | * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the |
14 | * GNU General Public License for more details. | 14 | * GNU General Public License for more details. |
15 | * | ||
16 | * You should have received a copy of the GNU General Public License | ||
17 | * along with this program; if not, write to the Free Software | ||
18 | * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. | ||
19 | */ | 15 | */ |
20 | 16 | ||
21 | /* | 17 | /* |
diff --git a/drivers/i2c/busses/i2c-nforce2.c b/drivers/i2c/busses/i2c-nforce2.c index ee3a76c7ae97..70b3c9158509 100644 --- a/drivers/i2c/busses/i2c-nforce2.c +++ b/drivers/i2c/busses/i2c-nforce2.c | |||
@@ -17,10 +17,6 @@ | |||
17 | but WITHOUT ANY WARRANTY; without even the implied warranty of | 17 | but WITHOUT ANY WARRANTY; without even the implied warranty of |
18 | MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the | 18 | MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the |
19 | GNU General Public License for more details. | 19 | GNU General Public License for more details. |
20 | |||
21 | You should have received a copy of the GNU General Public License | ||
22 | along with this program; if not, write to the Free Software | ||
23 | Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. | ||
24 | */ | 20 | */ |
25 | 21 | ||
26 | /* | 22 | /* |
diff --git a/drivers/i2c/busses/i2c-omap.c b/drivers/i2c/busses/i2c-omap.c index 0dffb0e62c3b..26942c159de1 100644 --- a/drivers/i2c/busses/i2c-omap.c +++ b/drivers/i2c/busses/i2c-omap.c | |||
@@ -22,10 +22,6 @@ | |||
22 | * but WITHOUT ANY WARRANTY; without even the implied warranty of | 22 | * but WITHOUT ANY WARRANTY; without even the implied warranty of |
23 | * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the | 23 | * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the |
24 | * GNU General Public License for more details. | 24 | * GNU General Public License for more details. |
25 | * | ||
26 | * You should have received a copy of the GNU General Public License | ||
27 | * along with this program; if not, write to the Free Software | ||
28 | * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. | ||
29 | */ | 25 | */ |
30 | 26 | ||
31 | #include <linux/module.h> | 27 | #include <linux/module.h> |
diff --git a/drivers/i2c/busses/i2c-parport-light.c b/drivers/i2c/busses/i2c-parport-light.c index 62f55fe624cb..d1f625f923c7 100644 --- a/drivers/i2c/busses/i2c-parport-light.c +++ b/drivers/i2c/busses/i2c-parport-light.c | |||
@@ -18,10 +18,6 @@ | |||
18 | but WITHOUT ANY WARRANTY; without even the implied warranty of | 18 | but WITHOUT ANY WARRANTY; without even the implied warranty of |
19 | MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the | 19 | MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the |
20 | GNU General Public License for more details. | 20 | GNU General Public License for more details. |
21 | |||
22 | You should have received a copy of the GNU General Public License | ||
23 | along with this program; if not, write to the Free Software | ||
24 | Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. | ||
25 | * ------------------------------------------------------------------------ */ | 21 | * ------------------------------------------------------------------------ */ |
26 | 22 | ||
27 | #include <linux/kernel.h> | 23 | #include <linux/kernel.h> |
diff --git a/drivers/i2c/busses/i2c-parport.c b/drivers/i2c/busses/i2c-parport.c index a27aae2d6757..a1fac5aa9bae 100644 --- a/drivers/i2c/busses/i2c-parport.c +++ b/drivers/i2c/busses/i2c-parport.c | |||
@@ -18,10 +18,6 @@ | |||
18 | but WITHOUT ANY WARRANTY; without even the implied warranty of | 18 | but WITHOUT ANY WARRANTY; without even the implied warranty of |
19 | MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the | 19 | MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the |
20 | GNU General Public License for more details. | 20 | GNU General Public License for more details. |
21 | |||
22 | You should have received a copy of the GNU General Public License | ||
23 | along with this program; if not, write to the Free Software | ||
24 | Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. | ||
25 | * ------------------------------------------------------------------------ */ | 21 | * ------------------------------------------------------------------------ */ |
26 | 22 | ||
27 | #include <linux/kernel.h> | 23 | #include <linux/kernel.h> |
diff --git a/drivers/i2c/busses/i2c-parport.h b/drivers/i2c/busses/i2c-parport.h index e572f3aac0f7..4e1294536805 100644 --- a/drivers/i2c/busses/i2c-parport.h +++ b/drivers/i2c/busses/i2c-parport.h | |||
@@ -12,10 +12,6 @@ | |||
12 | but WITHOUT ANY WARRANTY; without even the implied warranty of | 12 | but WITHOUT ANY WARRANTY; without even the implied warranty of |
13 | MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the | 13 | MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the |
14 | GNU General Public License for more details. | 14 | GNU General Public License for more details. |
15 | |||
16 | You should have received a copy of the GNU General Public License | ||
17 | along with this program; if not, write to the Free Software | ||
18 | Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. | ||
19 | * ------------------------------------------------------------------------ */ | 15 | * ------------------------------------------------------------------------ */ |
20 | 16 | ||
21 | #define PORT_DATA 0 | 17 | #define PORT_DATA 0 |
diff --git a/drivers/i2c/busses/i2c-pasemi.c b/drivers/i2c/busses/i2c-pasemi.c index 7a9dce43e115..df1dbc92a024 100644 --- a/drivers/i2c/busses/i2c-pasemi.c +++ b/drivers/i2c/busses/i2c-pasemi.c | |||
@@ -11,10 +11,6 @@ | |||
11 | * but WITHOUT ANY WARRANTY; without even the implied warranty of | 11 | * but WITHOUT ANY WARRANTY; without even the implied warranty of |
12 | * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the | 12 | * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the |
13 | * GNU General Public License for more details. | 13 | * GNU General Public License for more details. |
14 | * | ||
15 | * You should have received a copy of the GNU General Public License | ||
16 | * along with this program; if not, write to the Free Software | ||
17 | * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA | ||
18 | */ | 14 | */ |
19 | 15 | ||
20 | #include <linux/module.h> | 16 | #include <linux/module.h> |
diff --git a/drivers/i2c/busses/i2c-pca-isa.c b/drivers/i2c/busses/i2c-pca-isa.c index 323f061a3163..e0eb4ca0102e 100644 --- a/drivers/i2c/busses/i2c-pca-isa.c +++ b/drivers/i2c/busses/i2c-pca-isa.c | |||
@@ -12,10 +12,6 @@ | |||
12 | * but WITHOUT ANY WARRANTY; without even the implied warranty of | 12 | * but WITHOUT ANY WARRANTY; without even the implied warranty of |
13 | * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the | 13 | * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the |
14 | * GNU General Public License for more details. | 14 | * GNU General Public License for more details. |
15 | * | ||
16 | * You should have received a copy of the GNU General Public License | ||
17 | * along with this program; if not, write to the Free Software | ||
18 | * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. | ||
19 | */ | 15 | */ |
20 | 16 | ||
21 | #include <linux/kernel.h> | 17 | #include <linux/kernel.h> |
diff --git a/drivers/i2c/busses/i2c-piix4.c b/drivers/i2c/busses/i2c-piix4.c index a6f54ba27e2a..67cbec6796a0 100644 --- a/drivers/i2c/busses/i2c-piix4.c +++ b/drivers/i2c/busses/i2c-piix4.c | |||
@@ -11,10 +11,6 @@ | |||
11 | but WITHOUT ANY WARRANTY; without even the implied warranty of | 11 | but WITHOUT ANY WARRANTY; without even the implied warranty of |
12 | MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the | 12 | MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the |
13 | GNU General Public License for more details. | 13 | GNU General Public License for more details. |
14 | |||
15 | You should have received a copy of the GNU General Public License | ||
16 | along with this program; if not, write to the Free Software | ||
17 | Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. | ||
18 | */ | 14 | */ |
19 | 15 | ||
20 | /* | 16 | /* |
diff --git a/drivers/i2c/busses/i2c-pmcmsp.c b/drivers/i2c/busses/i2c-pmcmsp.c index 8564768fee32..177834e2d841 100644 --- a/drivers/i2c/busses/i2c-pmcmsp.c +++ b/drivers/i2c/busses/i2c-pmcmsp.c | |||
@@ -18,10 +18,6 @@ | |||
18 | * ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT | 18 | * ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT |
19 | * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF | 19 | * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF |
20 | * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. | 20 | * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. |
21 | * | ||
22 | * You should have received a copy of the GNU General Public License along | ||
23 | * with this program; if not, write to the Free Software Foundation, Inc., | ||
24 | * 675 Mass Ave, Cambridge, MA 02139, USA. | ||
25 | */ | 21 | */ |
26 | 22 | ||
27 | #include <linux/kernel.h> | 23 | #include <linux/kernel.h> |
diff --git a/drivers/i2c/busses/i2c-powermac.c b/drivers/i2c/busses/i2c-powermac.c index 01e967763c2a..60a53c169ed2 100644 --- a/drivers/i2c/busses/i2c-powermac.c +++ b/drivers/i2c/busses/i2c-powermac.c | |||
@@ -14,10 +14,6 @@ | |||
14 | MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the | 14 | MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the |
15 | GNU General Public License for more details. | 15 | GNU General Public License for more details. |
16 | 16 | ||
17 | You should have received a copy of the GNU General Public License | ||
18 | along with this program; if not, write to the Free Software | ||
19 | Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. | ||
20 | |||
21 | */ | 17 | */ |
22 | 18 | ||
23 | #include <linux/module.h> | 19 | #include <linux/module.h> |
diff --git a/drivers/i2c/busses/i2c-s3c2410.c b/drivers/i2c/busses/i2c-s3c2410.c index e3b0337faeb7..65244774bfa3 100644 --- a/drivers/i2c/busses/i2c-s3c2410.c +++ b/drivers/i2c/busses/i2c-s3c2410.c | |||
@@ -14,10 +14,6 @@ | |||
14 | * but WITHOUT ANY WARRANTY; without even the implied warranty of | 14 | * but WITHOUT ANY WARRANTY; without even the implied warranty of |
15 | * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the | 15 | * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the |
16 | * GNU General Public License for more details. | 16 | * GNU General Public License for more details. |
17 | * | ||
18 | * You should have received a copy of the GNU General Public License | ||
19 | * along with this program; if not, write to the Free Software | ||
20 | * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA | ||
21 | */ | 17 | */ |
22 | 18 | ||
23 | #include <linux/kernel.h> | 19 | #include <linux/kernel.h> |
diff --git a/drivers/i2c/busses/i2c-sh_mobile.c b/drivers/i2c/busses/i2c-sh_mobile.c index 8b5e79cb4468..4855188747c9 100644 --- a/drivers/i2c/busses/i2c-sh_mobile.c +++ b/drivers/i2c/busses/i2c-sh_mobile.c | |||
@@ -14,10 +14,6 @@ | |||
14 | * but WITHOUT ANY WARRANTY; without even the implied warranty of | 14 | * but WITHOUT ANY WARRANTY; without even the implied warranty of |
15 | * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the | 15 | * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the |
16 | * GNU General Public License for more details. | 16 | * GNU General Public License for more details. |
17 | * | ||
18 | * You should have received a copy of the GNU General Public License | ||
19 | * along with this program; if not, write to the Free Software | ||
20 | * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA | ||
21 | */ | 17 | */ |
22 | 18 | ||
23 | #include <linux/kernel.h> | 19 | #include <linux/kernel.h> |
diff --git a/drivers/i2c/busses/i2c-sibyte.c b/drivers/i2c/busses/i2c-sibyte.c index 0fe505d7abe9..2b6219d86b0f 100644 --- a/drivers/i2c/busses/i2c-sibyte.c +++ b/drivers/i2c/busses/i2c-sibyte.c | |||
@@ -12,10 +12,6 @@ | |||
12 | * but WITHOUT ANY WARRANTY; without even the implied warranty of | 12 | * but WITHOUT ANY WARRANTY; without even the implied warranty of |
13 | * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the | 13 | * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the |
14 | * GNU General Public License for more details. | 14 | * GNU General Public License for more details. |
15 | * | ||
16 | * You should have received a copy of the GNU General Public License | ||
17 | * along with this program; if not, write to the Free Software | ||
18 | * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. | ||
19 | */ | 15 | */ |
20 | 16 | ||
21 | #include <linux/kernel.h> | 17 | #include <linux/kernel.h> |
diff --git a/drivers/i2c/busses/i2c-simtec.c b/drivers/i2c/busses/i2c-simtec.c index 964e5c6f84ab..15ac8395dcd3 100644 --- a/drivers/i2c/busses/i2c-simtec.c +++ b/drivers/i2c/busses/i2c-simtec.c | |||
@@ -12,10 +12,6 @@ | |||
12 | * but WITHOUT ANY WARRANTY; without even the implied warranty of | 12 | * but WITHOUT ANY WARRANTY; without even the implied warranty of |
13 | * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the | 13 | * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the |
14 | * GNU General Public License for more details. | 14 | * GNU General Public License for more details. |
15 | * | ||
16 | * You should have received a copy of the GNU General Public License | ||
17 | * along with this program; if not, write to the Free Software | ||
18 | * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA | ||
19 | */ | 15 | */ |
20 | 16 | ||
21 | #include <linux/kernel.h> | 17 | #include <linux/kernel.h> |
diff --git a/drivers/i2c/busses/i2c-sis5595.c b/drivers/i2c/busses/i2c-sis5595.c index ac9bc33acef4..7d58a40faf2d 100644 --- a/drivers/i2c/busses/i2c-sis5595.c +++ b/drivers/i2c/busses/i2c-sis5595.c | |||
@@ -11,10 +11,6 @@ | |||
11 | but WITHOUT ANY WARRANTY; without even the implied warranty of | 11 | but WITHOUT ANY WARRANTY; without even the implied warranty of |
12 | MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the | 12 | MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the |
13 | GNU General Public License for more details. | 13 | GNU General Public License for more details. |
14 | |||
15 | You should have received a copy of the GNU General Public License | ||
16 | along with this program; if not, write to the Free Software | ||
17 | Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. | ||
18 | */ | 14 | */ |
19 | 15 | ||
20 | /* Note: we assume there can only be one SIS5595 with one SMBus interface */ | 16 | /* Note: we assume there can only be one SIS5595 with one SMBus interface */ |
diff --git a/drivers/i2c/busses/i2c-sis630.c b/drivers/i2c/busses/i2c-sis630.c index c6366733008d..1e6805b5cef2 100644 --- a/drivers/i2c/busses/i2c-sis630.c +++ b/drivers/i2c/busses/i2c-sis630.c | |||
@@ -10,10 +10,6 @@ | |||
10 | but WITHOUT ANY WARRANTY; without even the implied warranty of | 10 | but WITHOUT ANY WARRANTY; without even the implied warranty of |
11 | MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the | 11 | MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the |
12 | GNU General Public License for more details. | 12 | GNU General Public License for more details. |
13 | |||
14 | You should have received a copy of the GNU General Public License | ||
15 | along with this program; if not, write to the Free Software | ||
16 | Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. | ||
17 | */ | 13 | */ |
18 | 14 | ||
19 | /* | 15 | /* |
diff --git a/drivers/i2c/busses/i2c-sis96x.c b/drivers/i2c/busses/i2c-sis96x.c index 8dc2fc5f74ff..44b904426073 100644 --- a/drivers/i2c/busses/i2c-sis96x.c +++ b/drivers/i2c/busses/i2c-sis96x.c | |||
@@ -10,10 +10,6 @@ | |||
10 | but WITHOUT ANY WARRANTY; without even the implied warranty of | 10 | but WITHOUT ANY WARRANTY; without even the implied warranty of |
11 | MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the | 11 | MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the |
12 | GNU General Public License for more details. | 12 | GNU General Public License for more details. |
13 | |||
14 | You should have received a copy of the GNU General Public License | ||
15 | along with this program; if not, write to the Free Software | ||
16 | Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. | ||
17 | */ | 13 | */ |
18 | 14 | ||
19 | /* | 15 | /* |
diff --git a/drivers/i2c/busses/i2c-taos-evm.c b/drivers/i2c/busses/i2c-taos-evm.c index 10855a0b7e7f..4c7fc2d47014 100644 --- a/drivers/i2c/busses/i2c-taos-evm.c +++ b/drivers/i2c/busses/i2c-taos-evm.c | |||
@@ -13,10 +13,6 @@ | |||
13 | * but WITHOUT ANY WARRANTY; without even the implied warranty of | 13 | * but WITHOUT ANY WARRANTY; without even the implied warranty of |
14 | * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the | 14 | * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the |
15 | * GNU General Public License for more details. | 15 | * GNU General Public License for more details. |
16 | * | ||
17 | * You should have received a copy of the GNU General Public License | ||
18 | * along with this program; if not, write to the Free Software | ||
19 | * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA | ||
20 | */ | 16 | */ |
21 | 17 | ||
22 | #include <linux/delay.h> | 18 | #include <linux/delay.h> |
diff --git a/drivers/i2c/busses/i2c-via.c b/drivers/i2c/busses/i2c-via.c index f4a1ed757612..59b1d233ca7b 100644 --- a/drivers/i2c/busses/i2c-via.c +++ b/drivers/i2c/busses/i2c-via.c | |||
@@ -12,10 +12,6 @@ | |||
12 | but WITHOUT ANY WARRANTY; without even the implied warranty of | 12 | but WITHOUT ANY WARRANTY; without even the implied warranty of |
13 | MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the | 13 | MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the |
14 | GNU General Public License for more details. | 14 | GNU General Public License for more details. |
15 | |||
16 | You should have received a copy of the GNU General Public License | ||
17 | along with this program; if not, write to the Free Software | ||
18 | Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. | ||
19 | */ | 15 | */ |
20 | 16 | ||
21 | #include <linux/kernel.h> | 17 | #include <linux/kernel.h> |
diff --git a/drivers/i2c/busses/i2c-viapro.c b/drivers/i2c/busses/i2c-viapro.c index 6841200b6e50..0ee2646f3b00 100644 --- a/drivers/i2c/busses/i2c-viapro.c +++ b/drivers/i2c/busses/i2c-viapro.c | |||
@@ -13,10 +13,6 @@ | |||
13 | but WITHOUT ANY WARRANTY; without even the implied warranty of | 13 | but WITHOUT ANY WARRANTY; without even the implied warranty of |
14 | MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the | 14 | MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the |
15 | GNU General Public License for more details. | 15 | GNU General Public License for more details. |
16 | |||
17 | You should have received a copy of the GNU General Public License | ||
18 | along with this program; if not, write to the Free Software | ||
19 | Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. | ||
20 | */ | 16 | */ |
21 | 17 | ||
22 | /* | 18 | /* |
diff --git a/drivers/i2c/busses/i2c-xiic.c b/drivers/i2c/busses/i2c-xiic.c index ade9223912d3..cc65ea0b818f 100644 --- a/drivers/i2c/busses/i2c-xiic.c +++ b/drivers/i2c/busses/i2c-xiic.c | |||
@@ -12,10 +12,6 @@ | |||
12 | * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the | 12 | * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the |
13 | * GNU General Public License for more details. | 13 | * GNU General Public License for more details. |
14 | * | 14 | * |
15 | * You should have received a copy of the GNU General Public License | ||
16 | * along with this program; if not, write to the Free Software | ||
17 | * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. | ||
18 | * | ||
19 | * | 15 | * |
20 | * This code was implemented by Mocean Laboratories AB when porting linux | 16 | * This code was implemented by Mocean Laboratories AB when porting linux |
21 | * to the automotive development board Russellville. The copyright holder | 17 | * to the automotive development board Russellville. The copyright holder |
diff --git a/drivers/i2c/busses/scx200_acb.c b/drivers/i2c/busses/scx200_acb.c index ff3f5747e43b..5153354b1a6b 100644 --- a/drivers/i2c/busses/scx200_acb.c +++ b/drivers/i2c/busses/scx200_acb.c | |||
@@ -17,10 +17,6 @@ | |||
17 | but WITHOUT ANY WARRANTY; without even the implied warranty of | 17 | but WITHOUT ANY WARRANTY; without even the implied warranty of |
18 | MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU | 18 | MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU |
19 | General Public License for more details. | 19 | General Public License for more details. |
20 | |||
21 | You should have received a copy of the GNU General Public License | ||
22 | along with this program; if not, write to the Free Software | ||
23 | Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. | ||
24 | */ | 20 | */ |
25 | 21 | ||
26 | #define pr_fmt(fmt) KBUILD_MODNAME ": " fmt | 22 | #define pr_fmt(fmt) KBUILD_MODNAME ": " fmt |
diff --git a/drivers/i2c/i2c-boardinfo.c b/drivers/i2c/i2c-boardinfo.c index f24cc64e2e8c..90e322959303 100644 --- a/drivers/i2c/i2c-boardinfo.c +++ b/drivers/i2c/i2c-boardinfo.c | |||
@@ -10,11 +10,6 @@ | |||
10 | * but WITHOUT ANY WARRANTY; without even the implied warranty of | 10 | * but WITHOUT ANY WARRANTY; without even the implied warranty of |
11 | * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the | 11 | * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the |
12 | * GNU General Public License for more details. | 12 | * GNU General Public License for more details. |
13 | * | ||
14 | * You should have received a copy of the GNU General Public License | ||
15 | * along with this program; if not, write to the Free Software | ||
16 | * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, | ||
17 | * MA 02110-1301 USA. | ||
18 | */ | 13 | */ |
19 | 14 | ||
20 | #include <linux/kernel.h> | 15 | #include <linux/kernel.h> |
diff --git a/drivers/i2c/i2c-core.c b/drivers/i2c/i2c-core.c index 2f90ac6a7f79..f43b4e11647a 100644 --- a/drivers/i2c/i2c-core.c +++ b/drivers/i2c/i2c-core.c | |||
@@ -10,12 +10,7 @@ | |||
10 | This program is distributed in the hope that it will be useful, | 10 | This program is distributed in the hope that it will be useful, |
11 | but WITHOUT ANY WARRANTY; without even the implied warranty of | 11 | but WITHOUT ANY WARRANTY; without even the implied warranty of |
12 | MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the | 12 | MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the |
13 | GNU General Public License for more details. | 13 | GNU General Public License for more details. */ |
14 | |||
15 | You should have received a copy of the GNU General Public License | ||
16 | along with this program; if not, write to the Free Software | ||
17 | Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, | ||
18 | MA 02110-1301 USA. */ | ||
19 | /* ------------------------------------------------------------------------- */ | 14 | /* ------------------------------------------------------------------------- */ |
20 | 15 | ||
21 | /* With some changes from Kyösti Mälkki <kmalkki@cc.hut.fi>. | 16 | /* With some changes from Kyösti Mälkki <kmalkki@cc.hut.fi>. |
@@ -670,6 +665,9 @@ static int i2c_device_remove(struct device *dev) | |||
670 | status = driver->remove(client); | 665 | status = driver->remove(client); |
671 | } | 666 | } |
672 | 667 | ||
668 | if (dev->of_node) | ||
669 | irq_dispose_mapping(client->irq); | ||
670 | |||
673 | dev_pm_domain_detach(&client->dev, true); | 671 | dev_pm_domain_detach(&client->dev, true); |
674 | return status; | 672 | return status; |
675 | } | 673 | } |
diff --git a/drivers/i2c/i2c-core.h b/drivers/i2c/i2c-core.h index 18a8fd21d2c2..17700bfddcf5 100644 --- a/drivers/i2c/i2c-core.h +++ b/drivers/i2c/i2c-core.h | |||
@@ -10,11 +10,6 @@ | |||
10 | * but WITHOUT ANY WARRANTY; without even the implied warranty of | 10 | * but WITHOUT ANY WARRANTY; without even the implied warranty of |
11 | * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the | 11 | * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the |
12 | * GNU General Public License for more details. | 12 | * GNU General Public License for more details. |
13 | * | ||
14 | * You should have received a copy of the GNU General Public License | ||
15 | * along with this program; if not, write to the Free Software | ||
16 | * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, | ||
17 | * MA 02110-1301 USA. | ||
18 | */ | 13 | */ |
19 | 14 | ||
20 | #include <linux/rwsem.h> | 15 | #include <linux/rwsem.h> |
diff --git a/drivers/i2c/i2c-dev.c b/drivers/i2c/i2c-dev.c index 80b47e8ce030..71c7a3975b62 100644 --- a/drivers/i2c/i2c-dev.c +++ b/drivers/i2c/i2c-dev.c | |||
@@ -14,11 +14,6 @@ | |||
14 | but WITHOUT ANY WARRANTY; without even the implied warranty of | 14 | but WITHOUT ANY WARRANTY; without even the implied warranty of |
15 | MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the | 15 | MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the |
16 | GNU General Public License for more details. | 16 | GNU General Public License for more details. |
17 | |||
18 | You should have received a copy of the GNU General Public License | ||
19 | along with this program; if not, write to the Free Software | ||
20 | Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, | ||
21 | MA 02110-1301 USA. | ||
22 | */ | 17 | */ |
23 | 18 | ||
24 | /* Note that this is a complete rewrite of Simon Vogl's i2c-dev module. | 19 | /* Note that this is a complete rewrite of Simon Vogl's i2c-dev module. |
diff --git a/drivers/i2c/i2c-smbus.c b/drivers/i2c/i2c-smbus.c index fc99f0d6b4a5..9ebf9cb4ad7a 100644 --- a/drivers/i2c/i2c-smbus.c +++ b/drivers/i2c/i2c-smbus.c | |||
@@ -13,11 +13,6 @@ | |||
13 | * but WITHOUT ANY WARRANTY; without even the implied warranty of | 13 | * but WITHOUT ANY WARRANTY; without even the implied warranty of |
14 | * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the | 14 | * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the |
15 | * GNU General Public License for more details. | 15 | * GNU General Public License for more details. |
16 | * | ||
17 | * You should have received a copy of the GNU General Public License | ||
18 | * along with this program; if not, write to the Free Software | ||
19 | * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, | ||
20 | * MA 02110-1301 USA. | ||
21 | */ | 16 | */ |
22 | 17 | ||
23 | #include <linux/kernel.h> | 18 | #include <linux/kernel.h> |
diff --git a/drivers/i2c/i2c-stub.c b/drivers/i2c/i2c-stub.c index d241aa295d96..af2a94e1140b 100644 --- a/drivers/i2c/i2c-stub.c +++ b/drivers/i2c/i2c-stub.c | |||
@@ -13,10 +13,6 @@ | |||
13 | but WITHOUT ANY WARRANTY; without even the implied warranty of | 13 | but WITHOUT ANY WARRANTY; without even the implied warranty of |
14 | MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the | 14 | MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the |
15 | GNU General Public License for more details. | 15 | GNU General Public License for more details. |
16 | |||
17 | You should have received a copy of the GNU General Public License | ||
18 | along with this program; if not, write to the Free Software | ||
19 | Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. | ||
20 | */ | 16 | */ |
21 | 17 | ||
22 | #define DEBUG 1 | 18 | #define DEBUG 1 |
diff --git a/drivers/iio/accel/kxcjk-1013.c b/drivers/iio/accel/kxcjk-1013.c index 98909a9e284e..a23e58c4ed99 100644 --- a/drivers/iio/accel/kxcjk-1013.c +++ b/drivers/iio/accel/kxcjk-1013.c | |||
@@ -894,7 +894,7 @@ static const struct attribute_group kxcjk1013_attrs_group = { | |||
894 | 894 | ||
895 | static const struct iio_event_spec kxcjk1013_event = { | 895 | static const struct iio_event_spec kxcjk1013_event = { |
896 | .type = IIO_EV_TYPE_THRESH, | 896 | .type = IIO_EV_TYPE_THRESH, |
897 | .dir = IIO_EV_DIR_RISING | IIO_EV_DIR_FALLING, | 897 | .dir = IIO_EV_DIR_EITHER, |
898 | .mask_separate = BIT(IIO_EV_INFO_VALUE) | | 898 | .mask_separate = BIT(IIO_EV_INFO_VALUE) | |
899 | BIT(IIO_EV_INFO_ENABLE) | | 899 | BIT(IIO_EV_INFO_ENABLE) | |
900 | BIT(IIO_EV_INFO_PERIOD) | 900 | BIT(IIO_EV_INFO_PERIOD) |
diff --git a/drivers/iio/common/st_sensors/st_sensors_buffer.c b/drivers/iio/common/st_sensors/st_sensors_buffer.c index 1665c8e4b62b..e18bc6782256 100644 --- a/drivers/iio/common/st_sensors/st_sensors_buffer.c +++ b/drivers/iio/common/st_sensors/st_sensors_buffer.c | |||
@@ -71,7 +71,7 @@ int st_sensors_get_buffer_element(struct iio_dev *indio_dev, u8 *buf) | |||
71 | goto st_sensors_free_memory; | 71 | goto st_sensors_free_memory; |
72 | } | 72 | } |
73 | 73 | ||
74 | for (i = 0; i < n * num_data_channels; i++) { | 74 | for (i = 0; i < n * byte_for_channel; i++) { |
75 | if (i < n) | 75 | if (i < n) |
76 | buf[i] = rx_array[i]; | 76 | buf[i] = rx_array[i]; |
77 | else | 77 | else |
diff --git a/drivers/iio/light/tsl4531.c b/drivers/iio/light/tsl4531.c index a15006efa137..0763b8632573 100644 --- a/drivers/iio/light/tsl4531.c +++ b/drivers/iio/light/tsl4531.c | |||
@@ -230,9 +230,12 @@ static int tsl4531_resume(struct device *dev) | |||
230 | return i2c_smbus_write_byte_data(to_i2c_client(dev), TSL4531_CONTROL, | 230 | return i2c_smbus_write_byte_data(to_i2c_client(dev), TSL4531_CONTROL, |
231 | TSL4531_MODE_NORMAL); | 231 | TSL4531_MODE_NORMAL); |
232 | } | 232 | } |
233 | #endif | ||
234 | 233 | ||
235 | static SIMPLE_DEV_PM_OPS(tsl4531_pm_ops, tsl4531_suspend, tsl4531_resume); | 234 | static SIMPLE_DEV_PM_OPS(tsl4531_pm_ops, tsl4531_suspend, tsl4531_resume); |
235 | #define TSL4531_PM_OPS (&tsl4531_pm_ops) | ||
236 | #else | ||
237 | #define TSL4531_PM_OPS NULL | ||
238 | #endif | ||
236 | 239 | ||
237 | static const struct i2c_device_id tsl4531_id[] = { | 240 | static const struct i2c_device_id tsl4531_id[] = { |
238 | { "tsl4531", 0 }, | 241 | { "tsl4531", 0 }, |
@@ -243,7 +246,7 @@ MODULE_DEVICE_TABLE(i2c, tsl4531_id); | |||
243 | static struct i2c_driver tsl4531_driver = { | 246 | static struct i2c_driver tsl4531_driver = { |
244 | .driver = { | 247 | .driver = { |
245 | .name = TSL4531_DRV_NAME, | 248 | .name = TSL4531_DRV_NAME, |
246 | .pm = &tsl4531_pm_ops, | 249 | .pm = TSL4531_PM_OPS, |
247 | .owner = THIS_MODULE, | 250 | .owner = THIS_MODULE, |
248 | }, | 251 | }, |
249 | .probe = tsl4531_probe, | 252 | .probe = tsl4531_probe, |
diff --git a/drivers/iio/proximity/as3935.c b/drivers/iio/proximity/as3935.c index 5e780ef206f3..8349cc0fdf66 100644 --- a/drivers/iio/proximity/as3935.c +++ b/drivers/iio/proximity/as3935.c | |||
@@ -330,7 +330,7 @@ static int as3935_probe(struct spi_device *spi) | |||
330 | return -EINVAL; | 330 | return -EINVAL; |
331 | } | 331 | } |
332 | 332 | ||
333 | indio_dev = devm_iio_device_alloc(&spi->dev, sizeof(st)); | 333 | indio_dev = devm_iio_device_alloc(&spi->dev, sizeof(*st)); |
334 | if (!indio_dev) | 334 | if (!indio_dev) |
335 | return -ENOMEM; | 335 | return -ENOMEM; |
336 | 336 | ||
diff --git a/drivers/infiniband/hw/mlx4/main.c b/drivers/infiniband/hw/mlx4/main.c index bda5994ceb68..8b72cf392b34 100644 --- a/drivers/infiniband/hw/mlx4/main.c +++ b/drivers/infiniband/hw/mlx4/main.c | |||
@@ -1173,18 +1173,24 @@ static struct ib_flow *mlx4_ib_create_flow(struct ib_qp *qp, | |||
1173 | err = __mlx4_ib_create_flow(qp, flow_attr, domain, type[i], | 1173 | err = __mlx4_ib_create_flow(qp, flow_attr, domain, type[i], |
1174 | &mflow->reg_id[i]); | 1174 | &mflow->reg_id[i]); |
1175 | if (err) | 1175 | if (err) |
1176 | goto err_free; | 1176 | goto err_create_flow; |
1177 | i++; | 1177 | i++; |
1178 | } | 1178 | } |
1179 | 1179 | ||
1180 | if (i < ARRAY_SIZE(type) && flow_attr->type == IB_FLOW_ATTR_NORMAL) { | 1180 | if (i < ARRAY_SIZE(type) && flow_attr->type == IB_FLOW_ATTR_NORMAL) { |
1181 | err = mlx4_ib_tunnel_steer_add(qp, flow_attr, &mflow->reg_id[i]); | 1181 | err = mlx4_ib_tunnel_steer_add(qp, flow_attr, &mflow->reg_id[i]); |
1182 | if (err) | 1182 | if (err) |
1183 | goto err_free; | 1183 | goto err_create_flow; |
1184 | i++; | ||
1184 | } | 1185 | } |
1185 | 1186 | ||
1186 | return &mflow->ibflow; | 1187 | return &mflow->ibflow; |
1187 | 1188 | ||
1189 | err_create_flow: | ||
1190 | while (i) { | ||
1191 | (void)__mlx4_ib_destroy_flow(to_mdev(qp->device)->dev, mflow->reg_id[i]); | ||
1192 | i--; | ||
1193 | } | ||
1188 | err_free: | 1194 | err_free: |
1189 | kfree(mflow); | 1195 | kfree(mflow); |
1190 | return ERR_PTR(err); | 1196 | return ERR_PTR(err); |
diff --git a/drivers/input/keyboard/opencores-kbd.c b/drivers/input/keyboard/opencores-kbd.c index 62abe2c16670..f8502bb29176 100644 --- a/drivers/input/keyboard/opencores-kbd.c +++ b/drivers/input/keyboard/opencores-kbd.c | |||
@@ -70,7 +70,7 @@ static int opencores_kbd_probe(struct platform_device *pdev) | |||
70 | 70 | ||
71 | opencores_kbd->addr = devm_ioremap_resource(&pdev->dev, res); | 71 | opencores_kbd->addr = devm_ioremap_resource(&pdev->dev, res); |
72 | if (IS_ERR(opencores_kbd->addr)) | 72 | if (IS_ERR(opencores_kbd->addr)) |
73 | error = PTR_ERR(opencores_kbd->addr); | 73 | return PTR_ERR(opencores_kbd->addr); |
74 | 74 | ||
75 | input->name = pdev->name; | 75 | input->name = pdev->name; |
76 | input->phys = "opencores-kbd/input0"; | 76 | input->phys = "opencores-kbd/input0"; |
diff --git a/drivers/input/keyboard/stmpe-keypad.c b/drivers/input/keyboard/stmpe-keypad.c index c6727dda68f2..ef5e67fb567e 100644 --- a/drivers/input/keyboard/stmpe-keypad.c +++ b/drivers/input/keyboard/stmpe-keypad.c | |||
@@ -86,7 +86,7 @@ static const struct stmpe_keypad_variant stmpe_keypad_variants[] = { | |||
86 | .max_cols = 8, | 86 | .max_cols = 8, |
87 | .max_rows = 12, | 87 | .max_rows = 12, |
88 | .col_gpios = 0x0000ff, /* GPIO 0 - 7*/ | 88 | .col_gpios = 0x0000ff, /* GPIO 0 - 7*/ |
89 | .row_gpios = 0x1fef00, /* GPIO 8-14, 16-20 */ | 89 | .row_gpios = 0x1f7f00, /* GPIO 8-14, 16-20 */ |
90 | }, | 90 | }, |
91 | [STMPE2403] = { | 91 | [STMPE2403] = { |
92 | .auto_increment = true, | 92 | .auto_increment = true, |
diff --git a/drivers/input/misc/ims-pcu.c b/drivers/input/misc/ims-pcu.c index 719410feb84b..afed8e2b2f94 100644 --- a/drivers/input/misc/ims-pcu.c +++ b/drivers/input/misc/ims-pcu.c | |||
@@ -1381,7 +1381,7 @@ static ssize_t ims_pcu_ofn_reg_addr_store(struct device *dev, | |||
1381 | pcu->ofn_reg_addr = value; | 1381 | pcu->ofn_reg_addr = value; |
1382 | mutex_unlock(&pcu->cmd_mutex); | 1382 | mutex_unlock(&pcu->cmd_mutex); |
1383 | 1383 | ||
1384 | return error ?: count; | 1384 | return count; |
1385 | } | 1385 | } |
1386 | 1386 | ||
1387 | static DEVICE_ATTR(reg_addr, S_IRUGO | S_IWUSR, | 1387 | static DEVICE_ATTR(reg_addr, S_IRUGO | S_IWUSR, |
diff --git a/drivers/input/misc/max77693-haptic.c b/drivers/input/misc/max77693-haptic.c index 7b1fde93799e..ef6a9d650d69 100644 --- a/drivers/input/misc/max77693-haptic.c +++ b/drivers/input/misc/max77693-haptic.c | |||
@@ -194,7 +194,7 @@ static int max77693_haptic_play_effect(struct input_dev *dev, void *data, | |||
194 | struct ff_effect *effect) | 194 | struct ff_effect *effect) |
195 | { | 195 | { |
196 | struct max77693_haptic *haptic = input_get_drvdata(dev); | 196 | struct max77693_haptic *haptic = input_get_drvdata(dev); |
197 | uint64_t period_mag_multi; | 197 | u64 period_mag_multi; |
198 | 198 | ||
199 | haptic->magnitude = effect->u.rumble.strong_magnitude; | 199 | haptic->magnitude = effect->u.rumble.strong_magnitude; |
200 | if (!haptic->magnitude) | 200 | if (!haptic->magnitude) |
@@ -205,8 +205,7 @@ static int max77693_haptic_play_effect(struct input_dev *dev, void *data, | |||
205 | * The formula to convert magnitude to pwm_duty as follows: | 205 | * The formula to convert magnitude to pwm_duty as follows: |
206 | * - pwm_duty = (magnitude * pwm_period) / MAX_MAGNITUDE(0xFFFF) | 206 | * - pwm_duty = (magnitude * pwm_period) / MAX_MAGNITUDE(0xFFFF) |
207 | */ | 207 | */ |
208 | period_mag_multi = (int64_t)(haptic->pwm_dev->period * | 208 | period_mag_multi = (u64)haptic->pwm_dev->period * haptic->magnitude; |
209 | haptic->magnitude); | ||
210 | haptic->pwm_duty = (unsigned int)(period_mag_multi >> | 209 | haptic->pwm_duty = (unsigned int)(period_mag_multi >> |
211 | MAX_MAGNITUDE_SHIFT); | 210 | MAX_MAGNITUDE_SHIFT); |
212 | 211 | ||
diff --git a/drivers/input/misc/soc_button_array.c b/drivers/input/misc/soc_button_array.c index 735604753568..e097f1ab427f 100644 --- a/drivers/input/misc/soc_button_array.c +++ b/drivers/input/misc/soc_button_array.c | |||
@@ -55,7 +55,7 @@ static int soc_button_lookup_gpio(struct device *dev, int acpi_index) | |||
55 | struct gpio_desc *desc; | 55 | struct gpio_desc *desc; |
56 | int gpio; | 56 | int gpio; |
57 | 57 | ||
58 | desc = gpiod_get_index(dev, KBUILD_MODNAME, acpi_index); | 58 | desc = gpiod_get_index(dev, KBUILD_MODNAME, acpi_index, GPIOD_ASIS); |
59 | if (IS_ERR(desc)) | 59 | if (IS_ERR(desc)) |
60 | return PTR_ERR(desc); | 60 | return PTR_ERR(desc); |
61 | 61 | ||
diff --git a/drivers/input/mouse/psmouse-base.c b/drivers/input/mouse/psmouse-base.c index 26994f6a2b2a..95a3a6e2faf6 100644 --- a/drivers/input/mouse/psmouse-base.c +++ b/drivers/input/mouse/psmouse-base.c | |||
@@ -1536,16 +1536,9 @@ static int psmouse_reconnect(struct serio *serio) | |||
1536 | { | 1536 | { |
1537 | struct psmouse *psmouse = serio_get_drvdata(serio); | 1537 | struct psmouse *psmouse = serio_get_drvdata(serio); |
1538 | struct psmouse *parent = NULL; | 1538 | struct psmouse *parent = NULL; |
1539 | struct serio_driver *drv = serio->drv; | ||
1540 | unsigned char type; | 1539 | unsigned char type; |
1541 | int rc = -1; | 1540 | int rc = -1; |
1542 | 1541 | ||
1543 | if (!drv || !psmouse) { | ||
1544 | psmouse_dbg(psmouse, | ||
1545 | "reconnect request, but serio is disconnected, ignoring...\n"); | ||
1546 | return -1; | ||
1547 | } | ||
1548 | |||
1549 | mutex_lock(&psmouse_mutex); | 1542 | mutex_lock(&psmouse_mutex); |
1550 | 1543 | ||
1551 | if (serio->parent && serio->id.type == SERIO_PS_PSTHRU) { | 1544 | if (serio->parent && serio->id.type == SERIO_PS_PSTHRU) { |
diff --git a/drivers/input/mouse/vsxxxaa.c b/drivers/input/mouse/vsxxxaa.c index 38298232124f..abd494411e69 100644 --- a/drivers/input/mouse/vsxxxaa.c +++ b/drivers/input/mouse/vsxxxaa.c | |||
@@ -128,7 +128,7 @@ static void vsxxxaa_drop_bytes(struct vsxxxaa *mouse, int num) | |||
128 | if (num >= mouse->count) { | 128 | if (num >= mouse->count) { |
129 | mouse->count = 0; | 129 | mouse->count = 0; |
130 | } else { | 130 | } else { |
131 | memmove(mouse->buf, mouse->buf + num - 1, BUFLEN - num); | 131 | memmove(mouse->buf, mouse->buf + num, BUFLEN - num); |
132 | mouse->count -= num; | 132 | mouse->count -= num; |
133 | } | 133 | } |
134 | } | 134 | } |
diff --git a/drivers/input/serio/altera_ps2.c b/drivers/input/serio/altera_ps2.c index cce69d6b9587..58781c8a8aec 100644 --- a/drivers/input/serio/altera_ps2.c +++ b/drivers/input/serio/altera_ps2.c | |||
@@ -37,7 +37,7 @@ static irqreturn_t altera_ps2_rxint(int irq, void *dev_id) | |||
37 | { | 37 | { |
38 | struct ps2if *ps2if = dev_id; | 38 | struct ps2if *ps2if = dev_id; |
39 | unsigned int status; | 39 | unsigned int status; |
40 | int handled = IRQ_NONE; | 40 | irqreturn_t handled = IRQ_NONE; |
41 | 41 | ||
42 | while ((status = readl(ps2if->base)) & 0xffff0000) { | 42 | while ((status = readl(ps2if->base)) & 0xffff0000) { |
43 | serio_interrupt(ps2if->io, status & 0xff, 0); | 43 | serio_interrupt(ps2if->io, status & 0xff, 0); |
@@ -74,7 +74,7 @@ static void altera_ps2_close(struct serio *io) | |||
74 | { | 74 | { |
75 | struct ps2if *ps2if = io->port_data; | 75 | struct ps2if *ps2if = io->port_data; |
76 | 76 | ||
77 | writel(0, ps2if->base); /* disable rx irq */ | 77 | writel(0, ps2if->base + 4); /* disable rx irq */ |
78 | } | 78 | } |
79 | 79 | ||
80 | /* | 80 | /* |
diff --git a/drivers/input/serio/i8042-x86ia64io.h b/drivers/input/serio/i8042-x86ia64io.h index a0bcbb64d06d..faeeb1372462 100644 --- a/drivers/input/serio/i8042-x86ia64io.h +++ b/drivers/input/serio/i8042-x86ia64io.h | |||
@@ -207,17 +207,282 @@ static const struct dmi_system_id __initconst i8042_dmi_noloop_table[] = { | |||
207 | }; | 207 | }; |
208 | 208 | ||
209 | /* | 209 | /* |
210 | * Some laptops do implement active multiplexing mode correctly; | 210 | * Some Fujitsu notebooks are having trouble with touchpads if |
211 | * unfortunately they are in minority. | 211 | * active multiplexing mode is activated. Luckily they don't have |
212 | * external PS/2 ports so we can safely disable it. | ||
213 | * ... apparently some Toshibas don't like MUX mode either and | ||
214 | * die horrible death on reboot. | ||
212 | */ | 215 | */ |
213 | static const struct dmi_system_id __initconst i8042_dmi_mux_table[] = { | 216 | static const struct dmi_system_id __initconst i8042_dmi_nomux_table[] = { |
217 | { | ||
218 | /* Fujitsu Lifebook P7010/P7010D */ | ||
219 | .matches = { | ||
220 | DMI_MATCH(DMI_SYS_VENDOR, "FUJITSU"), | ||
221 | DMI_MATCH(DMI_PRODUCT_NAME, "P7010"), | ||
222 | }, | ||
223 | }, | ||
224 | { | ||
225 | /* Fujitsu Lifebook P7010 */ | ||
226 | .matches = { | ||
227 | DMI_MATCH(DMI_SYS_VENDOR, "FUJITSU SIEMENS"), | ||
228 | DMI_MATCH(DMI_PRODUCT_NAME, "0000000000"), | ||
229 | }, | ||
230 | }, | ||
231 | { | ||
232 | /* Fujitsu Lifebook P5020D */ | ||
233 | .matches = { | ||
234 | DMI_MATCH(DMI_SYS_VENDOR, "FUJITSU"), | ||
235 | DMI_MATCH(DMI_PRODUCT_NAME, "LifeBook P Series"), | ||
236 | }, | ||
237 | }, | ||
238 | { | ||
239 | /* Fujitsu Lifebook S2000 */ | ||
240 | .matches = { | ||
241 | DMI_MATCH(DMI_SYS_VENDOR, "FUJITSU"), | ||
242 | DMI_MATCH(DMI_PRODUCT_NAME, "LifeBook S Series"), | ||
243 | }, | ||
244 | }, | ||
245 | { | ||
246 | /* Fujitsu Lifebook S6230 */ | ||
247 | .matches = { | ||
248 | DMI_MATCH(DMI_SYS_VENDOR, "FUJITSU"), | ||
249 | DMI_MATCH(DMI_PRODUCT_NAME, "LifeBook S6230"), | ||
250 | }, | ||
251 | }, | ||
252 | { | ||
253 | /* Fujitsu T70H */ | ||
254 | .matches = { | ||
255 | DMI_MATCH(DMI_SYS_VENDOR, "FUJITSU"), | ||
256 | DMI_MATCH(DMI_PRODUCT_NAME, "FMVLT70H"), | ||
257 | }, | ||
258 | }, | ||
259 | { | ||
260 | /* Fujitsu-Siemens Lifebook T3010 */ | ||
261 | .matches = { | ||
262 | DMI_MATCH(DMI_SYS_VENDOR, "FUJITSU SIEMENS"), | ||
263 | DMI_MATCH(DMI_PRODUCT_NAME, "LIFEBOOK T3010"), | ||
264 | }, | ||
265 | }, | ||
266 | { | ||
267 | /* Fujitsu-Siemens Lifebook E4010 */ | ||
268 | .matches = { | ||
269 | DMI_MATCH(DMI_SYS_VENDOR, "FUJITSU SIEMENS"), | ||
270 | DMI_MATCH(DMI_PRODUCT_NAME, "LIFEBOOK E4010"), | ||
271 | }, | ||
272 | }, | ||
273 | { | ||
274 | /* Fujitsu-Siemens Amilo Pro 2010 */ | ||
275 | .matches = { | ||
276 | DMI_MATCH(DMI_SYS_VENDOR, "FUJITSU SIEMENS"), | ||
277 | DMI_MATCH(DMI_PRODUCT_NAME, "AMILO Pro V2010"), | ||
278 | }, | ||
279 | }, | ||
280 | { | ||
281 | /* Fujitsu-Siemens Amilo Pro 2030 */ | ||
282 | .matches = { | ||
283 | DMI_MATCH(DMI_SYS_VENDOR, "FUJITSU SIEMENS"), | ||
284 | DMI_MATCH(DMI_PRODUCT_NAME, "AMILO PRO V2030"), | ||
285 | }, | ||
286 | }, | ||
287 | { | ||
288 | /* | ||
289 | * No data is coming from the touchscreen unless KBC | ||
290 | * is in legacy mode. | ||
291 | */ | ||
292 | /* Panasonic CF-29 */ | ||
293 | .matches = { | ||
294 | DMI_MATCH(DMI_SYS_VENDOR, "Matsushita"), | ||
295 | DMI_MATCH(DMI_PRODUCT_NAME, "CF-29"), | ||
296 | }, | ||
297 | }, | ||
298 | { | ||
299 | /* | ||
300 | * HP Pavilion DV4017EA - | ||
301 | * errors on MUX ports are reported without raising AUXDATA | ||
302 | * causing "spurious NAK" messages. | ||
303 | */ | ||
304 | .matches = { | ||
305 | DMI_MATCH(DMI_SYS_VENDOR, "Hewlett-Packard"), | ||
306 | DMI_MATCH(DMI_PRODUCT_NAME, "Pavilion dv4000 (EA032EA#ABF)"), | ||
307 | }, | ||
308 | }, | ||
309 | { | ||
310 | /* | ||
311 | * HP Pavilion ZT1000 - | ||
312 | * like DV4017EA does not raise AUXERR for errors on MUX ports. | ||
313 | */ | ||
314 | .matches = { | ||
315 | DMI_MATCH(DMI_SYS_VENDOR, "Hewlett-Packard"), | ||
316 | DMI_MATCH(DMI_PRODUCT_NAME, "HP Pavilion Notebook PC"), | ||
317 | DMI_MATCH(DMI_PRODUCT_VERSION, "HP Pavilion Notebook ZT1000"), | ||
318 | }, | ||
319 | }, | ||
320 | { | ||
321 | /* | ||
322 | * HP Pavilion DV4270ca - | ||
323 | * like DV4017EA does not raise AUXERR for errors on MUX ports. | ||
324 | */ | ||
325 | .matches = { | ||
326 | DMI_MATCH(DMI_SYS_VENDOR, "Hewlett-Packard"), | ||
327 | DMI_MATCH(DMI_PRODUCT_NAME, "Pavilion dv4000 (EH476UA#ABL)"), | ||
328 | }, | ||
329 | }, | ||
330 | { | ||
331 | .matches = { | ||
332 | DMI_MATCH(DMI_SYS_VENDOR, "TOSHIBA"), | ||
333 | DMI_MATCH(DMI_PRODUCT_NAME, "Satellite P10"), | ||
334 | }, | ||
335 | }, | ||
336 | { | ||
337 | .matches = { | ||
338 | DMI_MATCH(DMI_SYS_VENDOR, "TOSHIBA"), | ||
339 | DMI_MATCH(DMI_PRODUCT_NAME, "EQUIUM A110"), | ||
340 | }, | ||
341 | }, | ||
342 | { | ||
343 | .matches = { | ||
344 | DMI_MATCH(DMI_SYS_VENDOR, "TOSHIBA"), | ||
345 | DMI_MATCH(DMI_PRODUCT_NAME, "SATELLITE C850D"), | ||
346 | }, | ||
347 | }, | ||
348 | { | ||
349 | .matches = { | ||
350 | DMI_MATCH(DMI_SYS_VENDOR, "ALIENWARE"), | ||
351 | DMI_MATCH(DMI_PRODUCT_NAME, "Sentia"), | ||
352 | }, | ||
353 | }, | ||
354 | { | ||
355 | /* Sharp Actius MM20 */ | ||
356 | .matches = { | ||
357 | DMI_MATCH(DMI_SYS_VENDOR, "SHARP"), | ||
358 | DMI_MATCH(DMI_PRODUCT_NAME, "PC-MM20 Series"), | ||
359 | }, | ||
360 | }, | ||
361 | { | ||
362 | /* Sony Vaio FS-115b */ | ||
363 | .matches = { | ||
364 | DMI_MATCH(DMI_SYS_VENDOR, "Sony Corporation"), | ||
365 | DMI_MATCH(DMI_PRODUCT_NAME, "VGN-FS115B"), | ||
366 | }, | ||
367 | }, | ||
368 | { | ||
369 | /* | ||
370 | * Sony Vaio FZ-240E - | ||
371 | * reset and GET ID commands issued via KBD port are | ||
372 | * sometimes being delivered to AUX3. | ||
373 | */ | ||
374 | .matches = { | ||
375 | DMI_MATCH(DMI_SYS_VENDOR, "Sony Corporation"), | ||
376 | DMI_MATCH(DMI_PRODUCT_NAME, "VGN-FZ240E"), | ||
377 | }, | ||
378 | }, | ||
214 | { | 379 | { |
215 | /* | 380 | /* |
216 | * Panasonic CF-18 needs to be in MUX mode since the | 381 | * Most (all?) VAIOs do not have external PS/2 ports nor |
217 | * touchscreen is on serio3 and it also has touchpad. | 382 | * they implement active multiplexing properly, and |
383 | * MUX discovery usually messes up keyboard/touchpad. | ||
218 | */ | 384 | */ |
219 | .matches = { | 385 | .matches = { |
220 | DMI_MATCH(DMI_PRODUCT_NAME, "CF-18"), | 386 | DMI_MATCH(DMI_SYS_VENDOR, "Sony Corporation"), |
387 | DMI_MATCH(DMI_BOARD_NAME, "VAIO"), | ||
388 | }, | ||
389 | }, | ||
390 | { | ||
391 | /* Amoi M636/A737 */ | ||
392 | .matches = { | ||
393 | DMI_MATCH(DMI_SYS_VENDOR, "Amoi Electronics CO.,LTD."), | ||
394 | DMI_MATCH(DMI_PRODUCT_NAME, "M636/A737 platform"), | ||
395 | }, | ||
396 | }, | ||
397 | { | ||
398 | /* Lenovo 3000 n100 */ | ||
399 | .matches = { | ||
400 | DMI_MATCH(DMI_SYS_VENDOR, "LENOVO"), | ||
401 | DMI_MATCH(DMI_PRODUCT_NAME, "076804U"), | ||
402 | }, | ||
403 | }, | ||
404 | { | ||
405 | .matches = { | ||
406 | DMI_MATCH(DMI_SYS_VENDOR, "Acer"), | ||
407 | DMI_MATCH(DMI_PRODUCT_NAME, "Aspire 1360"), | ||
408 | }, | ||
409 | }, | ||
410 | { | ||
411 | /* Acer Aspire 5710 */ | ||
412 | .matches = { | ||
413 | DMI_MATCH(DMI_SYS_VENDOR, "Acer"), | ||
414 | DMI_MATCH(DMI_PRODUCT_NAME, "Aspire 5710"), | ||
415 | }, | ||
416 | }, | ||
417 | { | ||
418 | /* Gericom Bellagio */ | ||
419 | .matches = { | ||
420 | DMI_MATCH(DMI_SYS_VENDOR, "Gericom"), | ||
421 | DMI_MATCH(DMI_PRODUCT_NAME, "N34AS6"), | ||
422 | }, | ||
423 | }, | ||
424 | { | ||
425 | /* IBM 2656 */ | ||
426 | .matches = { | ||
427 | DMI_MATCH(DMI_SYS_VENDOR, "IBM"), | ||
428 | DMI_MATCH(DMI_PRODUCT_NAME, "2656"), | ||
429 | }, | ||
430 | }, | ||
431 | { | ||
432 | /* Dell XPS M1530 */ | ||
433 | .matches = { | ||
434 | DMI_MATCH(DMI_SYS_VENDOR, "Dell Inc."), | ||
435 | DMI_MATCH(DMI_PRODUCT_NAME, "XPS M1530"), | ||
436 | }, | ||
437 | }, | ||
438 | { | ||
439 | /* Compal HEL80I */ | ||
440 | .matches = { | ||
441 | DMI_MATCH(DMI_SYS_VENDOR, "COMPAL"), | ||
442 | DMI_MATCH(DMI_PRODUCT_NAME, "HEL80I"), | ||
443 | }, | ||
444 | }, | ||
445 | { | ||
446 | /* Dell Vostro 1510 */ | ||
447 | .matches = { | ||
448 | DMI_MATCH(DMI_SYS_VENDOR, "Dell Inc."), | ||
449 | DMI_MATCH(DMI_PRODUCT_NAME, "Vostro1510"), | ||
450 | }, | ||
451 | }, | ||
452 | { | ||
453 | /* Acer Aspire 5536 */ | ||
454 | .matches = { | ||
455 | DMI_MATCH(DMI_SYS_VENDOR, "Acer"), | ||
456 | DMI_MATCH(DMI_PRODUCT_NAME, "Aspire 5536"), | ||
457 | DMI_MATCH(DMI_PRODUCT_VERSION, "0100"), | ||
458 | }, | ||
459 | }, | ||
460 | { | ||
461 | /* Dell Vostro V13 */ | ||
462 | .matches = { | ||
463 | DMI_MATCH(DMI_SYS_VENDOR, "Dell Inc."), | ||
464 | DMI_MATCH(DMI_PRODUCT_NAME, "Vostro V13"), | ||
465 | }, | ||
466 | }, | ||
467 | { | ||
468 | /* Newer HP Pavilion dv4 models */ | ||
469 | .matches = { | ||
470 | DMI_MATCH(DMI_SYS_VENDOR, "Hewlett-Packard"), | ||
471 | DMI_MATCH(DMI_PRODUCT_NAME, "HP Pavilion dv4 Notebook PC"), | ||
472 | }, | ||
473 | }, | ||
474 | { | ||
475 | /* Asus X450LCP */ | ||
476 | .matches = { | ||
477 | DMI_MATCH(DMI_SYS_VENDOR, "ASUSTeK COMPUTER INC."), | ||
478 | DMI_MATCH(DMI_PRODUCT_NAME, "X450LCP"), | ||
479 | }, | ||
480 | }, | ||
481 | { | ||
482 | /* Avatar AVIU-145A6 */ | ||
483 | .matches = { | ||
484 | DMI_MATCH(DMI_SYS_VENDOR, "Intel"), | ||
485 | DMI_MATCH(DMI_PRODUCT_NAME, "IC4I"), | ||
221 | }, | 486 | }, |
222 | }, | 487 | }, |
223 | { } | 488 | { } |
@@ -364,6 +629,22 @@ static const struct dmi_system_id __initconst i8042_dmi_notimeout_table[] = { | |||
364 | }, | 629 | }, |
365 | }, | 630 | }, |
366 | { | 631 | { |
632 | /* Fujitsu A544 laptop */ | ||
633 | /* https://bugzilla.redhat.com/show_bug.cgi?id=1111138 */ | ||
634 | .matches = { | ||
635 | DMI_MATCH(DMI_SYS_VENDOR, "FUJITSU"), | ||
636 | DMI_MATCH(DMI_PRODUCT_NAME, "LIFEBOOK A544"), | ||
637 | }, | ||
638 | }, | ||
639 | { | ||
640 | /* Fujitsu AH544 laptop */ | ||
641 | /* https://bugzilla.kernel.org/show_bug.cgi?id=69731 */ | ||
642 | .matches = { | ||
643 | DMI_MATCH(DMI_SYS_VENDOR, "FUJITSU"), | ||
644 | DMI_MATCH(DMI_PRODUCT_NAME, "LIFEBOOK AH544"), | ||
645 | }, | ||
646 | }, | ||
647 | { | ||
367 | /* Fujitsu U574 laptop */ | 648 | /* Fujitsu U574 laptop */ |
368 | /* https://bugzilla.kernel.org/show_bug.cgi?id=69731 */ | 649 | /* https://bugzilla.kernel.org/show_bug.cgi?id=69731 */ |
369 | .matches = { | 650 | .matches = { |
@@ -740,8 +1021,8 @@ static int __init i8042_platform_init(void) | |||
740 | if (dmi_check_system(i8042_dmi_noloop_table)) | 1021 | if (dmi_check_system(i8042_dmi_noloop_table)) |
741 | i8042_noloop = true; | 1022 | i8042_noloop = true; |
742 | 1023 | ||
743 | if (dmi_check_system(i8042_dmi_mux_table)) | 1024 | if (dmi_check_system(i8042_dmi_nomux_table)) |
744 | i8042_nomux = false; | 1025 | i8042_nomux = true; |
745 | 1026 | ||
746 | if (dmi_check_system(i8042_dmi_notimeout_table)) | 1027 | if (dmi_check_system(i8042_dmi_notimeout_table)) |
747 | i8042_notimeout = true; | 1028 | i8042_notimeout = true; |
diff --git a/drivers/input/serio/i8042.c b/drivers/input/serio/i8042.c index 9a97c2b10926..f5a98af3b325 100644 --- a/drivers/input/serio/i8042.c +++ b/drivers/input/serio/i8042.c | |||
@@ -39,7 +39,7 @@ static bool i8042_noaux; | |||
39 | module_param_named(noaux, i8042_noaux, bool, 0); | 39 | module_param_named(noaux, i8042_noaux, bool, 0); |
40 | MODULE_PARM_DESC(noaux, "Do not probe or use AUX (mouse) port."); | 40 | MODULE_PARM_DESC(noaux, "Do not probe or use AUX (mouse) port."); |
41 | 41 | ||
42 | static bool i8042_nomux = true; | 42 | static bool i8042_nomux; |
43 | module_param_named(nomux, i8042_nomux, bool, 0); | 43 | module_param_named(nomux, i8042_nomux, bool, 0); |
44 | MODULE_PARM_DESC(nomux, "Do not check whether an active multiplexing controller is present."); | 44 | MODULE_PARM_DESC(nomux, "Do not check whether an active multiplexing controller is present."); |
45 | 45 | ||
diff --git a/drivers/input/touchscreen/wm97xx-core.c b/drivers/input/touchscreen/wm97xx-core.c index d0ef91fc87d1..b1ae77995968 100644 --- a/drivers/input/touchscreen/wm97xx-core.c +++ b/drivers/input/touchscreen/wm97xx-core.c | |||
@@ -70,11 +70,11 @@ | |||
70 | * Documentation/input/input-programming.txt for more details. | 70 | * Documentation/input/input-programming.txt for more details. |
71 | */ | 71 | */ |
72 | 72 | ||
73 | static int abs_x[3] = {350, 3900, 5}; | 73 | static int abs_x[3] = {150, 4000, 5}; |
74 | module_param_array(abs_x, int, NULL, 0); | 74 | module_param_array(abs_x, int, NULL, 0); |
75 | MODULE_PARM_DESC(abs_x, "Touchscreen absolute X min, max, fuzz"); | 75 | MODULE_PARM_DESC(abs_x, "Touchscreen absolute X min, max, fuzz"); |
76 | 76 | ||
77 | static int abs_y[3] = {320, 3750, 40}; | 77 | static int abs_y[3] = {200, 4000, 40}; |
78 | module_param_array(abs_y, int, NULL, 0); | 78 | module_param_array(abs_y, int, NULL, 0); |
79 | MODULE_PARM_DESC(abs_y, "Touchscreen absolute Y min, max, fuzz"); | 79 | MODULE_PARM_DESC(abs_y, "Touchscreen absolute Y min, max, fuzz"); |
80 | 80 | ||
diff --git a/drivers/irqchip/irq-armada-370-xp.c b/drivers/irqchip/irq-armada-370-xp.c index 3e238cd049e6..6a2e168c3ab0 100644 --- a/drivers/irqchip/irq-armada-370-xp.c +++ b/drivers/irqchip/irq-armada-370-xp.c | |||
@@ -43,6 +43,7 @@ | |||
43 | #define ARMADA_370_XP_INT_CLEAR_ENABLE_OFFS (0x34) | 43 | #define ARMADA_370_XP_INT_CLEAR_ENABLE_OFFS (0x34) |
44 | #define ARMADA_370_XP_INT_SOURCE_CTL(irq) (0x100 + irq*4) | 44 | #define ARMADA_370_XP_INT_SOURCE_CTL(irq) (0x100 + irq*4) |
45 | #define ARMADA_370_XP_INT_SOURCE_CPU_MASK 0xF | 45 | #define ARMADA_370_XP_INT_SOURCE_CPU_MASK 0xF |
46 | #define ARMADA_370_XP_INT_IRQ_FIQ_MASK(cpuid) ((BIT(0) | BIT(8)) << cpuid) | ||
46 | 47 | ||
47 | #define ARMADA_370_XP_CPU_INTACK_OFFS (0x44) | 48 | #define ARMADA_370_XP_CPU_INTACK_OFFS (0x44) |
48 | #define ARMADA_375_PPI_CAUSE (0x10) | 49 | #define ARMADA_375_PPI_CAUSE (0x10) |
@@ -406,19 +407,29 @@ static void armada_370_xp_mpic_handle_cascade_irq(unsigned int irq, | |||
406 | struct irq_desc *desc) | 407 | struct irq_desc *desc) |
407 | { | 408 | { |
408 | struct irq_chip *chip = irq_get_chip(irq); | 409 | struct irq_chip *chip = irq_get_chip(irq); |
409 | unsigned long irqmap, irqn; | 410 | unsigned long irqmap, irqn, irqsrc, cpuid; |
410 | unsigned int cascade_irq; | 411 | unsigned int cascade_irq; |
411 | 412 | ||
412 | chained_irq_enter(chip, desc); | 413 | chained_irq_enter(chip, desc); |
413 | 414 | ||
414 | irqmap = readl_relaxed(per_cpu_int_base + ARMADA_375_PPI_CAUSE); | 415 | irqmap = readl_relaxed(per_cpu_int_base + ARMADA_375_PPI_CAUSE); |
415 | 416 | cpuid = cpu_logical_map(smp_processor_id()); | |
416 | if (irqmap & BIT(0)) { | ||
417 | armada_370_xp_handle_msi_irq(NULL, true); | ||
418 | irqmap &= ~BIT(0); | ||
419 | } | ||
420 | 417 | ||
421 | for_each_set_bit(irqn, &irqmap, BITS_PER_LONG) { | 418 | for_each_set_bit(irqn, &irqmap, BITS_PER_LONG) { |
419 | irqsrc = readl_relaxed(main_int_base + | ||
420 | ARMADA_370_XP_INT_SOURCE_CTL(irqn)); | ||
421 | |||
422 | /* Check if the interrupt is not masked on current CPU. | ||
423 | * Test IRQ (0-1) and FIQ (8-9) mask bits. | ||
424 | */ | ||
425 | if (!(irqsrc & ARMADA_370_XP_INT_IRQ_FIQ_MASK(cpuid))) | ||
426 | continue; | ||
427 | |||
428 | if (irqn == 1) { | ||
429 | armada_370_xp_handle_msi_irq(NULL, true); | ||
430 | continue; | ||
431 | } | ||
432 | |||
422 | cascade_irq = irq_find_mapping(armada_370_xp_mpic_domain, irqn); | 433 | cascade_irq = irq_find_mapping(armada_370_xp_mpic_domain, irqn); |
423 | generic_handle_irq(cascade_irq); | 434 | generic_handle_irq(cascade_irq); |
424 | } | 435 | } |
diff --git a/drivers/media/common/saa7146/saa7146_core.c b/drivers/media/common/saa7146/saa7146_core.c index 97afee672d07..4418119cf707 100644 --- a/drivers/media/common/saa7146/saa7146_core.c +++ b/drivers/media/common/saa7146/saa7146_core.c | |||
@@ -364,6 +364,9 @@ static int saa7146_init_one(struct pci_dev *pci, const struct pci_device_id *ent | |||
364 | goto out; | 364 | goto out; |
365 | } | 365 | } |
366 | 366 | ||
367 | /* create a nice device name */ | ||
368 | sprintf(dev->name, "saa7146 (%d)", saa7146_num); | ||
369 | |||
367 | DEB_EE("pci:%p\n", pci); | 370 | DEB_EE("pci:%p\n", pci); |
368 | 371 | ||
369 | err = pci_enable_device(pci); | 372 | err = pci_enable_device(pci); |
@@ -438,9 +441,6 @@ static int saa7146_init_one(struct pci_dev *pci, const struct pci_device_id *ent | |||
438 | 441 | ||
439 | /* the rest + print status message */ | 442 | /* the rest + print status message */ |
440 | 443 | ||
441 | /* create a nice device name */ | ||
442 | sprintf(dev->name, "saa7146 (%d)", saa7146_num); | ||
443 | |||
444 | pr_info("found saa7146 @ mem %p (revision %d, irq %d) (0x%04x,0x%04x)\n", | 444 | pr_info("found saa7146 @ mem %p (revision %d, irq %d) (0x%04x,0x%04x)\n", |
445 | dev->mem, dev->revision, pci->irq, | 445 | dev->mem, dev->revision, pci->irq, |
446 | pci->subsystem_vendor, pci->subsystem_device); | 446 | pci->subsystem_vendor, pci->subsystem_device); |
diff --git a/drivers/media/dvb-core/dvb_frontend.c b/drivers/media/dvb-core/dvb_frontend.c index b8579ee68bd6..2cf30576bf39 100644 --- a/drivers/media/dvb-core/dvb_frontend.c +++ b/drivers/media/dvb-core/dvb_frontend.c | |||
@@ -962,6 +962,11 @@ static int dvb_frontend_clear_cache(struct dvb_frontend *fe) | |||
962 | case SYS_ATSC: | 962 | case SYS_ATSC: |
963 | c->modulation = VSB_8; | 963 | c->modulation = VSB_8; |
964 | break; | 964 | break; |
965 | case SYS_ISDBS: | ||
966 | c->symbol_rate = 28860000; | ||
967 | c->rolloff = ROLLOFF_35; | ||
968 | c->bandwidth_hz = c->symbol_rate / 100 * 135; | ||
969 | break; | ||
965 | default: | 970 | default: |
966 | c->modulation = QAM_AUTO; | 971 | c->modulation = QAM_AUTO; |
967 | break; | 972 | break; |
@@ -2072,6 +2077,7 @@ static int dtv_set_frontend(struct dvb_frontend *fe) | |||
2072 | break; | 2077 | break; |
2073 | case SYS_DVBS: | 2078 | case SYS_DVBS: |
2074 | case SYS_TURBO: | 2079 | case SYS_TURBO: |
2080 | case SYS_ISDBS: | ||
2075 | rolloff = 135; | 2081 | rolloff = 135; |
2076 | break; | 2082 | break; |
2077 | case SYS_DVBS2: | 2083 | case SYS_DVBS2: |
diff --git a/drivers/media/dvb-frontends/ds3000.c b/drivers/media/dvb-frontends/ds3000.c index 335daeff91b9..9d0d0347758f 100644 --- a/drivers/media/dvb-frontends/ds3000.c +++ b/drivers/media/dvb-frontends/ds3000.c | |||
@@ -864,6 +864,13 @@ struct dvb_frontend *ds3000_attach(const struct ds3000_config *config, | |||
864 | memcpy(&state->frontend.ops, &ds3000_ops, | 864 | memcpy(&state->frontend.ops, &ds3000_ops, |
865 | sizeof(struct dvb_frontend_ops)); | 865 | sizeof(struct dvb_frontend_ops)); |
866 | state->frontend.demodulator_priv = state; | 866 | state->frontend.demodulator_priv = state; |
867 | |||
868 | /* | ||
869 | * Some devices like T480 starts with voltage on. Be sure | ||
870 | * to turn voltage off during init, as this can otherwise | ||
871 | * interfere with Unicable SCR systems. | ||
872 | */ | ||
873 | ds3000_set_voltage(&state->frontend, SEC_VOLTAGE_OFF); | ||
867 | return &state->frontend; | 874 | return &state->frontend; |
868 | 875 | ||
869 | error3: | 876 | error3: |
diff --git a/drivers/media/dvb-frontends/sp2.c b/drivers/media/dvb-frontends/sp2.c index 9b684d5c8f91..15bf4318cb74 100644 --- a/drivers/media/dvb-frontends/sp2.c +++ b/drivers/media/dvb-frontends/sp2.c | |||
@@ -266,7 +266,7 @@ int sp2_ci_poll_slot_status(struct dvb_ca_en50221 *en50221, | |||
266 | return s->status; | 266 | return s->status; |
267 | } | 267 | } |
268 | 268 | ||
269 | int sp2_init(struct sp2 *s) | 269 | static int sp2_init(struct sp2 *s) |
270 | { | 270 | { |
271 | int ret = 0; | 271 | int ret = 0; |
272 | u8 buf; | 272 | u8 buf; |
@@ -348,7 +348,7 @@ err: | |||
348 | return ret; | 348 | return ret; |
349 | } | 349 | } |
350 | 350 | ||
351 | int sp2_exit(struct i2c_client *client) | 351 | static int sp2_exit(struct i2c_client *client) |
352 | { | 352 | { |
353 | struct sp2 *s; | 353 | struct sp2 *s; |
354 | 354 | ||
diff --git a/drivers/media/dvb-frontends/tc90522.c b/drivers/media/dvb-frontends/tc90522.c index d9905fb52f84..b35d65c9cc05 100644 --- a/drivers/media/dvb-frontends/tc90522.c +++ b/drivers/media/dvb-frontends/tc90522.c | |||
@@ -216,32 +216,30 @@ static int tc90522s_get_frontend(struct dvb_frontend *fe) | |||
216 | c->delivery_system = SYS_ISDBS; | 216 | c->delivery_system = SYS_ISDBS; |
217 | 217 | ||
218 | layers = 0; | 218 | layers = 0; |
219 | ret = reg_read(state, 0xe8, val, 3); | 219 | ret = reg_read(state, 0xe6, val, 5); |
220 | if (ret == 0) { | 220 | if (ret == 0) { |
221 | int slots; | ||
222 | u8 v; | 221 | u8 v; |
223 | 222 | ||
223 | c->stream_id = val[0] << 8 | val[1]; | ||
224 | |||
224 | /* high/single layer */ | 225 | /* high/single layer */ |
225 | v = (val[0] & 0x70) >> 4; | 226 | v = (val[2] & 0x70) >> 4; |
226 | c->modulation = (v == 7) ? PSK_8 : QPSK; | 227 | c->modulation = (v == 7) ? PSK_8 : QPSK; |
227 | c->fec_inner = fec_conv_sat[v]; | 228 | c->fec_inner = fec_conv_sat[v]; |
228 | c->layer[0].fec = c->fec_inner; | 229 | c->layer[0].fec = c->fec_inner; |
229 | c->layer[0].modulation = c->modulation; | 230 | c->layer[0].modulation = c->modulation; |
230 | c->layer[0].segment_count = val[1] & 0x3f; /* slots */ | 231 | c->layer[0].segment_count = val[3] & 0x3f; /* slots */ |
231 | 232 | ||
232 | /* low layer */ | 233 | /* low layer */ |
233 | v = (val[0] & 0x07); | 234 | v = (val[2] & 0x07); |
234 | c->layer[1].fec = fec_conv_sat[v]; | 235 | c->layer[1].fec = fec_conv_sat[v]; |
235 | if (v == 0) /* no low layer */ | 236 | if (v == 0) /* no low layer */ |
236 | c->layer[1].segment_count = 0; | 237 | c->layer[1].segment_count = 0; |
237 | else | 238 | else |
238 | c->layer[1].segment_count = val[2] & 0x3f; /* slots */ | 239 | c->layer[1].segment_count = val[4] & 0x3f; /* slots */ |
239 | /* actually, BPSK if v==1, but not defined in fe_modulation_t */ | 240 | /* actually, BPSK if v==1, but not defined in fe_modulation_t */ |
240 | c->layer[1].modulation = QPSK; | 241 | c->layer[1].modulation = QPSK; |
241 | layers = (v > 0) ? 2 : 1; | 242 | layers = (v > 0) ? 2 : 1; |
242 | |||
243 | slots = c->layer[0].segment_count + c->layer[1].segment_count; | ||
244 | c->symbol_rate = 28860000 * slots / 48; | ||
245 | } | 243 | } |
246 | 244 | ||
247 | /* statistics */ | 245 | /* statistics */ |
@@ -363,7 +361,7 @@ static int tc90522t_get_frontend(struct dvb_frontend *fe) | |||
363 | u8 v; | 361 | u8 v; |
364 | 362 | ||
365 | c->isdbt_partial_reception = val[0] & 0x01; | 363 | c->isdbt_partial_reception = val[0] & 0x01; |
366 | c->isdbt_sb_mode = (val[0] & 0xc0) == 0x01; | 364 | c->isdbt_sb_mode = (val[0] & 0xc0) == 0x40; |
367 | 365 | ||
368 | /* layer A */ | 366 | /* layer A */ |
369 | v = (val[2] & 0x78) >> 3; | 367 | v = (val[2] & 0x78) >> 3; |
diff --git a/drivers/media/pci/cx23885/cx23885-dvb.c b/drivers/media/pci/cx23885/cx23885-dvb.c index 13734b8c7917..4cb90317ff45 100644 --- a/drivers/media/pci/cx23885/cx23885-dvb.c +++ b/drivers/media/pci/cx23885/cx23885-dvb.c | |||
@@ -1600,6 +1600,7 @@ static int dvb_register(struct cx23885_tsport *port) | |||
1600 | break; | 1600 | break; |
1601 | 1601 | ||
1602 | /* attach tuner */ | 1602 | /* attach tuner */ |
1603 | memset(&m88ts2022_config, 0, sizeof(m88ts2022_config)); | ||
1603 | m88ts2022_config.fe = fe0->dvb.frontend; | 1604 | m88ts2022_config.fe = fe0->dvb.frontend; |
1604 | m88ts2022_config.clock = 27000000; | 1605 | m88ts2022_config.clock = 27000000; |
1605 | memset(&info, 0, sizeof(struct i2c_board_info)); | 1606 | memset(&info, 0, sizeof(struct i2c_board_info)); |
@@ -1635,6 +1636,7 @@ static int dvb_register(struct cx23885_tsport *port) | |||
1635 | /* port c - terrestrial/cable */ | 1636 | /* port c - terrestrial/cable */ |
1636 | case 2: | 1637 | case 2: |
1637 | /* attach frontend */ | 1638 | /* attach frontend */ |
1639 | memset(&si2168_config, 0, sizeof(si2168_config)); | ||
1638 | si2168_config.i2c_adapter = &adapter; | 1640 | si2168_config.i2c_adapter = &adapter; |
1639 | si2168_config.fe = &fe0->dvb.frontend; | 1641 | si2168_config.fe = &fe0->dvb.frontend; |
1640 | si2168_config.ts_mode = SI2168_TS_SERIAL; | 1642 | si2168_config.ts_mode = SI2168_TS_SERIAL; |
@@ -1654,6 +1656,7 @@ static int dvb_register(struct cx23885_tsport *port) | |||
1654 | port->i2c_client_demod = client_demod; | 1656 | port->i2c_client_demod = client_demod; |
1655 | 1657 | ||
1656 | /* attach tuner */ | 1658 | /* attach tuner */ |
1659 | memset(&si2157_config, 0, sizeof(si2157_config)); | ||
1657 | si2157_config.fe = fe0->dvb.frontend; | 1660 | si2157_config.fe = fe0->dvb.frontend; |
1658 | memset(&info, 0, sizeof(struct i2c_board_info)); | 1661 | memset(&info, 0, sizeof(struct i2c_board_info)); |
1659 | strlcpy(info.type, "si2157", I2C_NAME_SIZE); | 1662 | strlcpy(info.type, "si2157", I2C_NAME_SIZE); |
diff --git a/drivers/media/pci/tw68/Kconfig b/drivers/media/pci/tw68/Kconfig index 5425ba1e320d..95d5d5202048 100644 --- a/drivers/media/pci/tw68/Kconfig +++ b/drivers/media/pci/tw68/Kconfig | |||
@@ -1,7 +1,6 @@ | |||
1 | config VIDEO_TW68 | 1 | config VIDEO_TW68 |
2 | tristate "Techwell tw68x Video For Linux" | 2 | tristate "Techwell tw68x Video For Linux" |
3 | depends on VIDEO_DEV && PCI && VIDEO_V4L2 | 3 | depends on VIDEO_DEV && PCI && VIDEO_V4L2 |
4 | select I2C_ALGOBIT | ||
5 | select VIDEOBUF2_DMA_SG | 4 | select VIDEOBUF2_DMA_SG |
6 | ---help--- | 5 | ---help--- |
7 | Support for Techwell tw68xx based frame grabber boards. | 6 | Support for Techwell tw68xx based frame grabber boards. |
diff --git a/drivers/media/pci/tw68/tw68-core.c b/drivers/media/pci/tw68/tw68-core.c index a6fb48cf7aae..63f0b64057cb 100644 --- a/drivers/media/pci/tw68/tw68-core.c +++ b/drivers/media/pci/tw68/tw68-core.c | |||
@@ -306,7 +306,7 @@ static int tw68_initdev(struct pci_dev *pci_dev, | |||
306 | 306 | ||
307 | /* get irq */ | 307 | /* get irq */ |
308 | err = devm_request_irq(&pci_dev->dev, pci_dev->irq, tw68_irq, | 308 | err = devm_request_irq(&pci_dev->dev, pci_dev->irq, tw68_irq, |
309 | IRQF_SHARED | IRQF_DISABLED, dev->name, dev); | 309 | IRQF_SHARED, dev->name, dev); |
310 | if (err < 0) { | 310 | if (err < 0) { |
311 | pr_err("%s: can't get IRQ %d\n", | 311 | pr_err("%s: can't get IRQ %d\n", |
312 | dev->name, pci_dev->irq); | 312 | dev->name, pci_dev->irq); |
diff --git a/drivers/media/platform/Kconfig b/drivers/media/platform/Kconfig index bee9074ebc13..3aac88f1d54a 100644 --- a/drivers/media/platform/Kconfig +++ b/drivers/media/platform/Kconfig | |||
@@ -166,7 +166,7 @@ config VIDEO_MEM2MEM_DEINTERLACE | |||
166 | config VIDEO_SAMSUNG_S5P_G2D | 166 | config VIDEO_SAMSUNG_S5P_G2D |
167 | tristate "Samsung S5P and EXYNOS4 G2D 2d graphics accelerator driver" | 167 | tristate "Samsung S5P and EXYNOS4 G2D 2d graphics accelerator driver" |
168 | depends on VIDEO_DEV && VIDEO_V4L2 | 168 | depends on VIDEO_DEV && VIDEO_V4L2 |
169 | depends on PLAT_S5P || ARCH_EXYNOS || COMPILE_TEST | 169 | depends on ARCH_S5PV210 || ARCH_EXYNOS || COMPILE_TEST |
170 | depends on HAS_DMA | 170 | depends on HAS_DMA |
171 | select VIDEOBUF2_DMA_CONTIG | 171 | select VIDEOBUF2_DMA_CONTIG |
172 | select V4L2_MEM2MEM_DEV | 172 | select V4L2_MEM2MEM_DEV |
@@ -178,7 +178,7 @@ config VIDEO_SAMSUNG_S5P_G2D | |||
178 | config VIDEO_SAMSUNG_S5P_JPEG | 178 | config VIDEO_SAMSUNG_S5P_JPEG |
179 | tristate "Samsung S5P/Exynos3250/Exynos4 JPEG codec driver" | 179 | tristate "Samsung S5P/Exynos3250/Exynos4 JPEG codec driver" |
180 | depends on VIDEO_DEV && VIDEO_V4L2 | 180 | depends on VIDEO_DEV && VIDEO_V4L2 |
181 | depends on PLAT_S5P || ARCH_EXYNOS || COMPILE_TEST | 181 | depends on ARCH_S5PV210 || ARCH_EXYNOS || COMPILE_TEST |
182 | depends on HAS_DMA | 182 | depends on HAS_DMA |
183 | select VIDEOBUF2_DMA_CONTIG | 183 | select VIDEOBUF2_DMA_CONTIG |
184 | select V4L2_MEM2MEM_DEV | 184 | select V4L2_MEM2MEM_DEV |
@@ -189,7 +189,7 @@ config VIDEO_SAMSUNG_S5P_JPEG | |||
189 | config VIDEO_SAMSUNG_S5P_MFC | 189 | config VIDEO_SAMSUNG_S5P_MFC |
190 | tristate "Samsung S5P MFC Video Codec" | 190 | tristate "Samsung S5P MFC Video Codec" |
191 | depends on VIDEO_DEV && VIDEO_V4L2 | 191 | depends on VIDEO_DEV && VIDEO_V4L2 |
192 | depends on PLAT_S5P || ARCH_EXYNOS || COMPILE_TEST | 192 | depends on ARCH_S5PV210 || ARCH_EXYNOS || COMPILE_TEST |
193 | depends on HAS_DMA | 193 | depends on HAS_DMA |
194 | select VIDEOBUF2_DMA_CONTIG | 194 | select VIDEOBUF2_DMA_CONTIG |
195 | default n | 195 | default n |
diff --git a/drivers/media/platform/exynos4-is/Kconfig b/drivers/media/platform/exynos4-is/Kconfig index 77c951237744..b7b2e472240a 100644 --- a/drivers/media/platform/exynos4-is/Kconfig +++ b/drivers/media/platform/exynos4-is/Kconfig | |||
@@ -2,7 +2,7 @@ | |||
2 | config VIDEO_SAMSUNG_EXYNOS4_IS | 2 | config VIDEO_SAMSUNG_EXYNOS4_IS |
3 | bool "Samsung S5P/EXYNOS4 SoC series Camera Subsystem driver" | 3 | bool "Samsung S5P/EXYNOS4 SoC series Camera Subsystem driver" |
4 | depends on VIDEO_V4L2 && VIDEO_V4L2_SUBDEV_API | 4 | depends on VIDEO_V4L2 && VIDEO_V4L2_SUBDEV_API |
5 | depends on (PLAT_S5P || ARCH_EXYNOS || COMPILE_TEST) | 5 | depends on ARCH_S5PV210 || ARCH_EXYNOS || COMPILE_TEST |
6 | depends on OF && COMMON_CLK | 6 | depends on OF && COMMON_CLK |
7 | help | 7 | help |
8 | Say Y here to enable camera host interface devices for | 8 | Say Y here to enable camera host interface devices for |
diff --git a/drivers/media/platform/exynos4-is/fimc-core.c b/drivers/media/platform/exynos4-is/fimc-core.c index b70fd996d794..aee92d908e49 100644 --- a/drivers/media/platform/exynos4-is/fimc-core.c +++ b/drivers/media/platform/exynos4-is/fimc-core.c | |||
@@ -832,6 +832,7 @@ err: | |||
832 | return -ENXIO; | 832 | return -ENXIO; |
833 | } | 833 | } |
834 | 834 | ||
835 | #if defined(CONFIG_PM_RUNTIME) || defined(CONFIG_PM_SLEEP) | ||
835 | static int fimc_m2m_suspend(struct fimc_dev *fimc) | 836 | static int fimc_m2m_suspend(struct fimc_dev *fimc) |
836 | { | 837 | { |
837 | unsigned long flags; | 838 | unsigned long flags; |
@@ -870,6 +871,7 @@ static int fimc_m2m_resume(struct fimc_dev *fimc) | |||
870 | 871 | ||
871 | return 0; | 872 | return 0; |
872 | } | 873 | } |
874 | #endif /* CONFIG_PM_RUNTIME || CONFIG_PM_SLEEP */ | ||
873 | 875 | ||
874 | static const struct of_device_id fimc_of_match[]; | 876 | static const struct of_device_id fimc_of_match[]; |
875 | 877 | ||
diff --git a/drivers/media/platform/s5p-jpeg/jpeg-core.c b/drivers/media/platform/s5p-jpeg/jpeg-core.c index e525a7c8d885..6fcc7f072ace 100644 --- a/drivers/media/platform/s5p-jpeg/jpeg-core.c +++ b/drivers/media/platform/s5p-jpeg/jpeg-core.c | |||
@@ -893,7 +893,7 @@ static bool s5p_jpeg_parse_hdr(struct s5p_jpeg_q_data *result, | |||
893 | unsigned long buffer, unsigned long size, | 893 | unsigned long buffer, unsigned long size, |
894 | struct s5p_jpeg_ctx *ctx) | 894 | struct s5p_jpeg_ctx *ctx) |
895 | { | 895 | { |
896 | int c, components, notfound; | 896 | int c, components = 0, notfound; |
897 | unsigned int height, width, word, subsampling = 0; | 897 | unsigned int height, width, word, subsampling = 0; |
898 | long length; | 898 | long length; |
899 | struct s5p_jpeg_buffer jpeg_buffer; | 899 | struct s5p_jpeg_buffer jpeg_buffer; |
@@ -2632,6 +2632,7 @@ static int s5p_jpeg_remove(struct platform_device *pdev) | |||
2632 | return 0; | 2632 | return 0; |
2633 | } | 2633 | } |
2634 | 2634 | ||
2635 | #if defined(CONFIG_PM_RUNTIME) || defined(CONFIG_PM_SLEEP) | ||
2635 | static int s5p_jpeg_runtime_suspend(struct device *dev) | 2636 | static int s5p_jpeg_runtime_suspend(struct device *dev) |
2636 | { | 2637 | { |
2637 | struct s5p_jpeg *jpeg = dev_get_drvdata(dev); | 2638 | struct s5p_jpeg *jpeg = dev_get_drvdata(dev); |
@@ -2681,7 +2682,9 @@ static int s5p_jpeg_runtime_resume(struct device *dev) | |||
2681 | 2682 | ||
2682 | return 0; | 2683 | return 0; |
2683 | } | 2684 | } |
2685 | #endif /* CONFIG_PM_RUNTIME || CONFIG_PM_SLEEP */ | ||
2684 | 2686 | ||
2687 | #ifdef CONFIG_PM_SLEEP | ||
2685 | static int s5p_jpeg_suspend(struct device *dev) | 2688 | static int s5p_jpeg_suspend(struct device *dev) |
2686 | { | 2689 | { |
2687 | if (pm_runtime_suspended(dev)) | 2690 | if (pm_runtime_suspended(dev)) |
@@ -2697,6 +2700,7 @@ static int s5p_jpeg_resume(struct device *dev) | |||
2697 | 2700 | ||
2698 | return s5p_jpeg_runtime_resume(dev); | 2701 | return s5p_jpeg_runtime_resume(dev); |
2699 | } | 2702 | } |
2703 | #endif | ||
2700 | 2704 | ||
2701 | static const struct dev_pm_ops s5p_jpeg_pm_ops = { | 2705 | static const struct dev_pm_ops s5p_jpeg_pm_ops = { |
2702 | SET_SYSTEM_SLEEP_PM_OPS(s5p_jpeg_suspend, s5p_jpeg_resume) | 2706 | SET_SYSTEM_SLEEP_PM_OPS(s5p_jpeg_suspend, s5p_jpeg_resume) |
diff --git a/drivers/media/platform/s5p-tv/Kconfig b/drivers/media/platform/s5p-tv/Kconfig index a9d56f8936b4..beb180e71ba0 100644 --- a/drivers/media/platform/s5p-tv/Kconfig +++ b/drivers/media/platform/s5p-tv/Kconfig | |||
@@ -9,7 +9,7 @@ | |||
9 | config VIDEO_SAMSUNG_S5P_TV | 9 | config VIDEO_SAMSUNG_S5P_TV |
10 | bool "Samsung TV driver for S5P platform" | 10 | bool "Samsung TV driver for S5P platform" |
11 | depends on PM_RUNTIME | 11 | depends on PM_RUNTIME |
12 | depends on PLAT_S5P || ARCH_EXYNOS || COMPILE_TEST | 12 | depends on ARCH_S5PV210 || ARCH_EXYNOS || COMPILE_TEST |
13 | default n | 13 | default n |
14 | ---help--- | 14 | ---help--- |
15 | Say Y here to enable selecting the TV output devices for | 15 | Say Y here to enable selecting the TV output devices for |
diff --git a/drivers/media/platform/vivid/Kconfig b/drivers/media/platform/vivid/Kconfig index d71139a2ae00..c3090932f06d 100644 --- a/drivers/media/platform/vivid/Kconfig +++ b/drivers/media/platform/vivid/Kconfig | |||
@@ -1,8 +1,11 @@ | |||
1 | config VIDEO_VIVID | 1 | config VIDEO_VIVID |
2 | tristate "Virtual Video Test Driver" | 2 | tristate "Virtual Video Test Driver" |
3 | depends on VIDEO_DEV && VIDEO_V4L2 && !SPARC32 && !SPARC64 | 3 | depends on VIDEO_DEV && VIDEO_V4L2 && !SPARC32 && !SPARC64 && FB |
4 | select FONT_SUPPORT | 4 | select FONT_SUPPORT |
5 | select FONT_8x16 | 5 | select FONT_8x16 |
6 | select FB_CFB_FILLRECT | ||
7 | select FB_CFB_COPYAREA | ||
8 | select FB_CFB_IMAGEBLIT | ||
6 | select VIDEOBUF2_VMALLOC | 9 | select VIDEOBUF2_VMALLOC |
7 | default n | 10 | default n |
8 | ---help--- | 11 | ---help--- |
diff --git a/drivers/media/platform/vivid/vivid-core.c b/drivers/media/platform/vivid/vivid-core.c index 2c61a62ab48b..686c3c2ad05b 100644 --- a/drivers/media/platform/vivid/vivid-core.c +++ b/drivers/media/platform/vivid/vivid-core.c | |||
@@ -100,11 +100,9 @@ MODULE_PARM_DESC(ccs_out_mode, " output crop/compose/scale mode:\n" | |||
100 | "\t\t bit 0=crop, 1=compose, 2=scale,\n" | 100 | "\t\t bit 0=crop, 1=compose, 2=scale,\n" |
101 | "\t\t -1=user-controlled (default)"); | 101 | "\t\t -1=user-controlled (default)"); |
102 | 102 | ||
103 | static unsigned multiplanar[VIVID_MAX_DEVS]; | 103 | static unsigned multiplanar[VIVID_MAX_DEVS] = { [0 ... (VIVID_MAX_DEVS - 1)] = 1 }; |
104 | module_param_array(multiplanar, uint, NULL, 0444); | 104 | module_param_array(multiplanar, uint, NULL, 0444); |
105 | MODULE_PARM_DESC(multiplanar, " 0 (default) is alternating single and multiplanar devices,\n" | 105 | MODULE_PARM_DESC(multiplanar, " 1 (default) creates a single planar device, 2 creates a multiplanar device."); |
106 | "\t\t 1 is single planar devices,\n" | ||
107 | "\t\t 2 is multiplanar devices"); | ||
108 | 106 | ||
109 | /* Default: video + vbi-cap (raw and sliced) + radio rx + radio tx + sdr + vbi-out + vid-out */ | 107 | /* Default: video + vbi-cap (raw and sliced) + radio rx + radio tx + sdr + vbi-out + vid-out */ |
110 | static unsigned node_types[VIVID_MAX_DEVS] = { [0 ... (VIVID_MAX_DEVS - 1)] = 0x1d3d }; | 108 | static unsigned node_types[VIVID_MAX_DEVS] = { [0 ... (VIVID_MAX_DEVS - 1)] = 0x1d3d }; |
@@ -669,10 +667,7 @@ static int __init vivid_create_instance(int inst) | |||
669 | /* start detecting feature set */ | 667 | /* start detecting feature set */ |
670 | 668 | ||
671 | /* do we use single- or multi-planar? */ | 669 | /* do we use single- or multi-planar? */ |
672 | if (multiplanar[inst] == 0) | 670 | dev->multiplanar = multiplanar[inst] > 1; |
673 | dev->multiplanar = inst & 1; | ||
674 | else | ||
675 | dev->multiplanar = multiplanar[inst] > 1; | ||
676 | v4l2_info(&dev->v4l2_dev, "using %splanar format API\n", | 671 | v4l2_info(&dev->v4l2_dev, "using %splanar format API\n", |
677 | dev->multiplanar ? "multi" : "single "); | 672 | dev->multiplanar ? "multi" : "single "); |
678 | 673 | ||
diff --git a/drivers/media/platform/vivid/vivid-tpg.c b/drivers/media/platform/vivid/vivid-tpg.c index 0c6fa53fa646..cbcd6250e7b2 100644 --- a/drivers/media/platform/vivid/vivid-tpg.c +++ b/drivers/media/platform/vivid/vivid-tpg.c | |||
@@ -136,7 +136,7 @@ int tpg_alloc(struct tpg_data *tpg, unsigned max_w) | |||
136 | tpg->black_line[plane] = vzalloc(max_w * pixelsz); | 136 | tpg->black_line[plane] = vzalloc(max_w * pixelsz); |
137 | if (!tpg->black_line[plane]) | 137 | if (!tpg->black_line[plane]) |
138 | return -ENOMEM; | 138 | return -ENOMEM; |
139 | tpg->random_line[plane] = vzalloc(max_w * pixelsz); | 139 | tpg->random_line[plane] = vzalloc(max_w * 2 * pixelsz); |
140 | if (!tpg->random_line[plane]) | 140 | if (!tpg->random_line[plane]) |
141 | return -ENOMEM; | 141 | return -ENOMEM; |
142 | } | 142 | } |
diff --git a/drivers/media/radio/wl128x/fmdrv_common.c b/drivers/media/radio/wl128x/fmdrv_common.c index 6f28f6e02ea5..704397f3c106 100644 --- a/drivers/media/radio/wl128x/fmdrv_common.c +++ b/drivers/media/radio/wl128x/fmdrv_common.c | |||
@@ -1256,7 +1256,7 @@ static int fm_download_firmware(struct fmdev *fmdev, const u8 *fw_name) | |||
1256 | fmerr("Unable to read firmware(%s) content\n", fw_name); | 1256 | fmerr("Unable to read firmware(%s) content\n", fw_name); |
1257 | return ret; | 1257 | return ret; |
1258 | } | 1258 | } |
1259 | fmdbg("Firmware(%s) length : %d bytes\n", fw_name, fw_entry->size); | 1259 | fmdbg("Firmware(%s) length : %zu bytes\n", fw_name, fw_entry->size); |
1260 | 1260 | ||
1261 | fw_data = (void *)fw_entry->data; | 1261 | fw_data = (void *)fw_entry->data; |
1262 | fw_len = fw_entry->size; | 1262 | fw_len = fw_entry->size; |
diff --git a/drivers/media/rc/imon.c b/drivers/media/rc/imon.c index b8837dd39bb2..65f80b8b9f7a 100644 --- a/drivers/media/rc/imon.c +++ b/drivers/media/rc/imon.c | |||
@@ -1678,7 +1678,8 @@ static void imon_incoming_packet(struct imon_context *ictx, | |||
1678 | if (press_type == 0) | 1678 | if (press_type == 0) |
1679 | rc_keyup(ictx->rdev); | 1679 | rc_keyup(ictx->rdev); |
1680 | else { | 1680 | else { |
1681 | if (ictx->rc_type == RC_BIT_RC6_MCE) | 1681 | if (ictx->rc_type == RC_BIT_RC6_MCE || |
1682 | ictx->rc_type == RC_BIT_OTHER) | ||
1682 | rc_keydown(ictx->rdev, | 1683 | rc_keydown(ictx->rdev, |
1683 | ictx->rc_type == RC_BIT_RC6_MCE ? RC_TYPE_RC6_MCE : RC_TYPE_OTHER, | 1684 | ictx->rc_type == RC_BIT_RC6_MCE ? RC_TYPE_RC6_MCE : RC_TYPE_OTHER, |
1684 | ictx->rc_scancode, ictx->rc_toggle); | 1685 | ictx->rc_scancode, ictx->rc_toggle); |
diff --git a/drivers/media/rc/ir-hix5hd2.c b/drivers/media/rc/ir-hix5hd2.c index 08bbd4f508cd..b0df62961c14 100644 --- a/drivers/media/rc/ir-hix5hd2.c +++ b/drivers/media/rc/ir-hix5hd2.c | |||
@@ -297,7 +297,7 @@ static int hix5hd2_ir_remove(struct platform_device *pdev) | |||
297 | return 0; | 297 | return 0; |
298 | } | 298 | } |
299 | 299 | ||
300 | #ifdef CONFIG_PM | 300 | #ifdef CONFIG_PM_SLEEP |
301 | static int hix5hd2_ir_suspend(struct device *dev) | 301 | static int hix5hd2_ir_suspend(struct device *dev) |
302 | { | 302 | { |
303 | struct hix5hd2_ir_priv *priv = dev_get_drvdata(dev); | 303 | struct hix5hd2_ir_priv *priv = dev_get_drvdata(dev); |
diff --git a/drivers/media/rc/ir-rc5-decoder.c b/drivers/media/rc/ir-rc5-decoder.c index 2ef763928ca4..84fa6e9b59a1 100644 --- a/drivers/media/rc/ir-rc5-decoder.c +++ b/drivers/media/rc/ir-rc5-decoder.c | |||
@@ -53,7 +53,7 @@ static int ir_rc5_decode(struct rc_dev *dev, struct ir_raw_event ev) | |||
53 | u32 scancode; | 53 | u32 scancode; |
54 | enum rc_type protocol; | 54 | enum rc_type protocol; |
55 | 55 | ||
56 | if (!(dev->enabled_protocols & (RC_BIT_RC5 | RC_BIT_RC5X))) | 56 | if (!(dev->enabled_protocols & (RC_BIT_RC5 | RC_BIT_RC5X | RC_BIT_RC5_SZ))) |
57 | return 0; | 57 | return 0; |
58 | 58 | ||
59 | if (!is_timing_event(ev)) { | 59 | if (!is_timing_event(ev)) { |
diff --git a/drivers/media/rc/rc-ir-raw.c b/drivers/media/rc/rc-ir-raw.c index e8fff2add265..b732ac6a26d8 100644 --- a/drivers/media/rc/rc-ir-raw.c +++ b/drivers/media/rc/rc-ir-raw.c | |||
@@ -262,7 +262,6 @@ int ir_raw_event_register(struct rc_dev *dev) | |||
262 | return -ENOMEM; | 262 | return -ENOMEM; |
263 | 263 | ||
264 | dev->raw->dev = dev; | 264 | dev->raw->dev = dev; |
265 | dev->enabled_protocols = ~0; | ||
266 | dev->change_protocol = change_protocol; | 265 | dev->change_protocol = change_protocol; |
267 | rc = kfifo_alloc(&dev->raw->kfifo, | 266 | rc = kfifo_alloc(&dev->raw->kfifo, |
268 | sizeof(struct ir_raw_event) * MAX_IR_EVENT_SIZE, | 267 | sizeof(struct ir_raw_event) * MAX_IR_EVENT_SIZE, |
diff --git a/drivers/media/rc/rc-main.c b/drivers/media/rc/rc-main.c index a7991c7d010a..8d3b74c5a717 100644 --- a/drivers/media/rc/rc-main.c +++ b/drivers/media/rc/rc-main.c | |||
@@ -1421,6 +1421,8 @@ int rc_register_device(struct rc_dev *dev) | |||
1421 | 1421 | ||
1422 | if (dev->change_protocol) { | 1422 | if (dev->change_protocol) { |
1423 | u64 rc_type = (1 << rc_map->rc_type); | 1423 | u64 rc_type = (1 << rc_map->rc_type); |
1424 | if (dev->driver_type == RC_DRIVER_IR_RAW) | ||
1425 | rc_type |= RC_BIT_LIRC; | ||
1424 | rc = dev->change_protocol(dev, &rc_type); | 1426 | rc = dev->change_protocol(dev, &rc_type); |
1425 | if (rc < 0) | 1427 | if (rc < 0) |
1426 | goto out_raw; | 1428 | goto out_raw; |
diff --git a/drivers/media/tuners/xc5000.c b/drivers/media/tuners/xc5000.c index e44c8aba6074..803a0e63d47e 100644 --- a/drivers/media/tuners/xc5000.c +++ b/drivers/media/tuners/xc5000.c | |||
@@ -1333,9 +1333,9 @@ static int xc5000_release(struct dvb_frontend *fe) | |||
1333 | 1333 | ||
1334 | if (priv) { | 1334 | if (priv) { |
1335 | cancel_delayed_work(&priv->timer_sleep); | 1335 | cancel_delayed_work(&priv->timer_sleep); |
1336 | hybrid_tuner_release_state(priv); | ||
1337 | if (priv->firmware) | 1336 | if (priv->firmware) |
1338 | release_firmware(priv->firmware); | 1337 | release_firmware(priv->firmware); |
1338 | hybrid_tuner_release_state(priv); | ||
1339 | } | 1339 | } |
1340 | 1340 | ||
1341 | mutex_unlock(&xc5000_list_mutex); | 1341 | mutex_unlock(&xc5000_list_mutex); |
diff --git a/drivers/media/usb/dvb-usb-v2/af9035.c b/drivers/media/usb/dvb-usb-v2/af9035.c index 00758c83eec7..1896ab218b11 100644 --- a/drivers/media/usb/dvb-usb-v2/af9035.c +++ b/drivers/media/usb/dvb-usb-v2/af9035.c | |||
@@ -193,8 +193,8 @@ static int af9035_wr_reg_mask(struct dvb_usb_device *d, u32 reg, u8 val, | |||
193 | return af9035_wr_regs(d, reg, &val, 1); | 193 | return af9035_wr_regs(d, reg, &val, 1); |
194 | } | 194 | } |
195 | 195 | ||
196 | static int af9035_add_i2c_dev(struct dvb_usb_device *d, char *type, u8 addr, | 196 | static int af9035_add_i2c_dev(struct dvb_usb_device *d, const char *type, |
197 | void *platform_data, struct i2c_adapter *adapter) | 197 | u8 addr, void *platform_data, struct i2c_adapter *adapter) |
198 | { | 198 | { |
199 | int ret, num; | 199 | int ret, num; |
200 | struct state *state = d_to_priv(d); | 200 | struct state *state = d_to_priv(d); |
@@ -221,7 +221,7 @@ static int af9035_add_i2c_dev(struct dvb_usb_device *d, char *type, u8 addr, | |||
221 | goto err; | 221 | goto err; |
222 | } | 222 | } |
223 | 223 | ||
224 | request_module(board_info.type); | 224 | request_module("%s", board_info.type); |
225 | 225 | ||
226 | /* register I2C device */ | 226 | /* register I2C device */ |
227 | client = i2c_new_device(adapter, &board_info); | 227 | client = i2c_new_device(adapter, &board_info); |
diff --git a/drivers/media/usb/dvb-usb-v2/anysee.c b/drivers/media/usb/dvb-usb-v2/anysee.c index d3c5f230e97a..ae917c042a52 100644 --- a/drivers/media/usb/dvb-usb-v2/anysee.c +++ b/drivers/media/usb/dvb-usb-v2/anysee.c | |||
@@ -630,8 +630,8 @@ error: | |||
630 | return ret; | 630 | return ret; |
631 | } | 631 | } |
632 | 632 | ||
633 | static int anysee_add_i2c_dev(struct dvb_usb_device *d, char *type, u8 addr, | 633 | static int anysee_add_i2c_dev(struct dvb_usb_device *d, const char *type, |
634 | void *platform_data) | 634 | u8 addr, void *platform_data) |
635 | { | 635 | { |
636 | int ret, num; | 636 | int ret, num; |
637 | struct anysee_state *state = d_to_priv(d); | 637 | struct anysee_state *state = d_to_priv(d); |
@@ -659,7 +659,7 @@ static int anysee_add_i2c_dev(struct dvb_usb_device *d, char *type, u8 addr, | |||
659 | goto err; | 659 | goto err; |
660 | } | 660 | } |
661 | 661 | ||
662 | request_module(board_info.type); | 662 | request_module("%s", board_info.type); |
663 | 663 | ||
664 | /* register I2C device */ | 664 | /* register I2C device */ |
665 | client = i2c_new_device(adapter, &board_info); | 665 | client = i2c_new_device(adapter, &board_info); |
diff --git a/drivers/media/usb/em28xx/em28xx-core.c b/drivers/media/usb/em28xx/em28xx-core.c index b5e52fe7957a..901cf2b952d7 100644 --- a/drivers/media/usb/em28xx/em28xx-core.c +++ b/drivers/media/usb/em28xx/em28xx-core.c | |||
@@ -504,7 +504,7 @@ EXPORT_SYMBOL_GPL(em28xx_audio_analog_set); | |||
504 | int em28xx_audio_setup(struct em28xx *dev) | 504 | int em28xx_audio_setup(struct em28xx *dev) |
505 | { | 505 | { |
506 | int vid1, vid2, feat, cfg; | 506 | int vid1, vid2, feat, cfg; |
507 | u32 vid; | 507 | u32 vid = 0; |
508 | u8 i2s_samplerates; | 508 | u8 i2s_samplerates; |
509 | 509 | ||
510 | if (dev->chip_id == CHIP_ID_EM2870 || | 510 | if (dev->chip_id == CHIP_ID_EM2870 || |
diff --git a/drivers/media/usb/em28xx/em28xx-input.c b/drivers/media/usb/em28xx/em28xx-input.c index 581f6dad4ca9..23f8f6afa2e0 100644 --- a/drivers/media/usb/em28xx/em28xx-input.c +++ b/drivers/media/usb/em28xx/em28xx-input.c | |||
@@ -712,8 +712,10 @@ static int em28xx_ir_init(struct em28xx *dev) | |||
712 | em28xx_info("Registering input extension\n"); | 712 | em28xx_info("Registering input extension\n"); |
713 | 713 | ||
714 | ir = kzalloc(sizeof(*ir), GFP_KERNEL); | 714 | ir = kzalloc(sizeof(*ir), GFP_KERNEL); |
715 | if (!ir) | ||
716 | return -ENOMEM; | ||
715 | rc = rc_allocate_device(); | 717 | rc = rc_allocate_device(); |
716 | if (!ir || !rc) | 718 | if (!rc) |
717 | goto error; | 719 | goto error; |
718 | 720 | ||
719 | /* record handles to ourself */ | 721 | /* record handles to ourself */ |
diff --git a/drivers/media/usb/hackrf/hackrf.c b/drivers/media/usb/hackrf/hackrf.c index 328b5ba47a0a..fd1fa412e094 100644 --- a/drivers/media/usb/hackrf/hackrf.c +++ b/drivers/media/usb/hackrf/hackrf.c | |||
@@ -932,7 +932,7 @@ static int hackrf_set_bandwidth(struct hackrf_dev *dev) | |||
932 | dev->bandwidth->val = bandwidth; | 932 | dev->bandwidth->val = bandwidth; |
933 | dev->bandwidth->cur.val = bandwidth; | 933 | dev->bandwidth->cur.val = bandwidth; |
934 | 934 | ||
935 | dev_dbg(dev->dev, "bandwidth selected=%d\n", bandwidth_lut[i].freq); | 935 | dev_dbg(dev->dev, "bandwidth selected=%d\n", bandwidth); |
936 | 936 | ||
937 | u16tmp = 0; | 937 | u16tmp = 0; |
938 | u16tmp |= ((bandwidth >> 0) & 0xff) << 0; | 938 | u16tmp |= ((bandwidth >> 0) & 0xff) << 0; |
diff --git a/drivers/media/usb/usbvision/usbvision-video.c b/drivers/media/usb/usbvision/usbvision-video.c index 68bc9615660e..9bfa041e3316 100644 --- a/drivers/media/usb/usbvision/usbvision-video.c +++ b/drivers/media/usb/usbvision/usbvision-video.c | |||
@@ -446,6 +446,7 @@ static int usbvision_v4l2_close(struct file *file) | |||
446 | if (usbvision->remove_pending) { | 446 | if (usbvision->remove_pending) { |
447 | printk(KERN_INFO "%s: Final disconnect\n", __func__); | 447 | printk(KERN_INFO "%s: Final disconnect\n", __func__); |
448 | usbvision_release(usbvision); | 448 | usbvision_release(usbvision); |
449 | return 0; | ||
449 | } | 450 | } |
450 | mutex_unlock(&usbvision->v4l2_lock); | 451 | mutex_unlock(&usbvision->v4l2_lock); |
451 | 452 | ||
@@ -1221,6 +1222,7 @@ static int usbvision_radio_close(struct file *file) | |||
1221 | if (usbvision->remove_pending) { | 1222 | if (usbvision->remove_pending) { |
1222 | printk(KERN_INFO "%s: Final disconnect\n", __func__); | 1223 | printk(KERN_INFO "%s: Final disconnect\n", __func__); |
1223 | usbvision_release(usbvision); | 1224 | usbvision_release(usbvision); |
1225 | return err_code; | ||
1224 | } | 1226 | } |
1225 | 1227 | ||
1226 | mutex_unlock(&usbvision->v4l2_lock); | 1228 | mutex_unlock(&usbvision->v4l2_lock); |
diff --git a/drivers/media/usb/uvc/uvc_v4l2.c b/drivers/media/usb/uvc/uvc_v4l2.c index 60a8e2c3631e..378ae02e593b 100644 --- a/drivers/media/usb/uvc/uvc_v4l2.c +++ b/drivers/media/usb/uvc/uvc_v4l2.c | |||
@@ -318,7 +318,6 @@ static int uvc_v4l2_set_format(struct uvc_streaming *stream, | |||
318 | stream->ctrl = probe; | 318 | stream->ctrl = probe; |
319 | stream->cur_format = format; | 319 | stream->cur_format = format; |
320 | stream->cur_frame = frame; | 320 | stream->cur_frame = frame; |
321 | stream->frame_size = fmt->fmt.pix.sizeimage; | ||
322 | 321 | ||
323 | done: | 322 | done: |
324 | mutex_unlock(&stream->mutex); | 323 | mutex_unlock(&stream->mutex); |
diff --git a/drivers/media/usb/uvc/uvc_video.c b/drivers/media/usb/uvc/uvc_video.c index 9ace520bb079..df81b9c4faf1 100644 --- a/drivers/media/usb/uvc/uvc_video.c +++ b/drivers/media/usb/uvc/uvc_video.c | |||
@@ -1143,7 +1143,7 @@ static int uvc_video_encode_data(struct uvc_streaming *stream, | |||
1143 | static void uvc_video_validate_buffer(const struct uvc_streaming *stream, | 1143 | static void uvc_video_validate_buffer(const struct uvc_streaming *stream, |
1144 | struct uvc_buffer *buf) | 1144 | struct uvc_buffer *buf) |
1145 | { | 1145 | { |
1146 | if (stream->frame_size != buf->bytesused && | 1146 | if (stream->ctrl.dwMaxVideoFrameSize != buf->bytesused && |
1147 | !(stream->cur_format->flags & UVC_FMT_FLAG_COMPRESSED)) | 1147 | !(stream->cur_format->flags & UVC_FMT_FLAG_COMPRESSED)) |
1148 | buf->error = 1; | 1148 | buf->error = 1; |
1149 | } | 1149 | } |
diff --git a/drivers/media/usb/uvc/uvcvideo.h b/drivers/media/usb/uvc/uvcvideo.h index 6f676c29ec09..864ada740360 100644 --- a/drivers/media/usb/uvc/uvcvideo.h +++ b/drivers/media/usb/uvc/uvcvideo.h | |||
@@ -457,7 +457,6 @@ struct uvc_streaming { | |||
457 | struct uvc_format *def_format; | 457 | struct uvc_format *def_format; |
458 | struct uvc_format *cur_format; | 458 | struct uvc_format *cur_format; |
459 | struct uvc_frame *cur_frame; | 459 | struct uvc_frame *cur_frame; |
460 | size_t frame_size; | ||
461 | 460 | ||
462 | /* Protect access to ctrl, cur_format, cur_frame and hardware video | 461 | /* Protect access to ctrl, cur_format, cur_frame and hardware video |
463 | * probe control. | 462 | * probe control. |
diff --git a/drivers/media/v4l2-core/videobuf-dma-contig.c b/drivers/media/v4l2-core/videobuf-dma-contig.c index bf80f0f7dfb8..e02353e340dd 100644 --- a/drivers/media/v4l2-core/videobuf-dma-contig.c +++ b/drivers/media/v4l2-core/videobuf-dma-contig.c | |||
@@ -305,6 +305,15 @@ static int __videobuf_mmap_mapper(struct videobuf_queue *q, | |||
305 | /* Try to remap memory */ | 305 | /* Try to remap memory */ |
306 | size = vma->vm_end - vma->vm_start; | 306 | size = vma->vm_end - vma->vm_start; |
307 | vma->vm_page_prot = pgprot_noncached(vma->vm_page_prot); | 307 | vma->vm_page_prot = pgprot_noncached(vma->vm_page_prot); |
308 | |||
309 | /* the "vm_pgoff" is just used in v4l2 to find the | ||
310 | * corresponding buffer data structure which is allocated | ||
311 | * earlier and it does not mean the offset from the physical | ||
312 | * buffer start address as usual. So set it to 0 to pass | ||
313 | * the sanity check in vm_iomap_memory(). | ||
314 | */ | ||
315 | vma->vm_pgoff = 0; | ||
316 | |||
308 | retval = vm_iomap_memory(vma, mem->dma_handle, size); | 317 | retval = vm_iomap_memory(vma, mem->dma_handle, size); |
309 | if (retval) { | 318 | if (retval) { |
310 | dev_err(q->dev, "mmap: remap failed with error %d. ", | 319 | dev_err(q->dev, "mmap: remap failed with error %d. ", |
diff --git a/drivers/misc/cxl/fault.c b/drivers/misc/cxl/fault.c index 69506ebd4d07..c99e896604ee 100644 --- a/drivers/misc/cxl/fault.c +++ b/drivers/misc/cxl/fault.c | |||
@@ -21,60 +21,64 @@ | |||
21 | 21 | ||
22 | #include "cxl.h" | 22 | #include "cxl.h" |
23 | 23 | ||
24 | static struct cxl_sste* find_free_sste(struct cxl_sste *primary_group, | 24 | static bool sste_matches(struct cxl_sste *sste, struct copro_slb *slb) |
25 | bool sec_hash, | ||
26 | struct cxl_sste *secondary_group, | ||
27 | unsigned int *lru) | ||
28 | { | 25 | { |
29 | unsigned int i, entry; | 26 | return ((sste->vsid_data == cpu_to_be64(slb->vsid)) && |
30 | struct cxl_sste *sste, *group = primary_group; | 27 | (sste->esid_data == cpu_to_be64(slb->esid))); |
31 | 28 | } | |
32 | for (i = 0; i < 2; i++) { | 29 | |
33 | for (entry = 0; entry < 8; entry++) { | 30 | /* |
34 | sste = group + entry; | 31 | * This finds a free SSTE for the given SLB, or returns NULL if it's already in |
35 | if (!(be64_to_cpu(sste->esid_data) & SLB_ESID_V)) | 32 | * the segment table. |
36 | return sste; | 33 | */ |
37 | } | 34 | static struct cxl_sste* find_free_sste(struct cxl_context *ctx, |
38 | if (!sec_hash) | 35 | struct copro_slb *slb) |
39 | break; | 36 | { |
40 | group = secondary_group; | 37 | struct cxl_sste *primary, *sste, *ret = NULL; |
38 | unsigned int mask = (ctx->sst_size >> 7) - 1; /* SSTP0[SegTableSize] */ | ||
39 | unsigned int entry; | ||
40 | unsigned int hash; | ||
41 | |||
42 | if (slb->vsid & SLB_VSID_B_1T) | ||
43 | hash = (slb->esid >> SID_SHIFT_1T) & mask; | ||
44 | else /* 256M */ | ||
45 | hash = (slb->esid >> SID_SHIFT) & mask; | ||
46 | |||
47 | primary = ctx->sstp + (hash << 3); | ||
48 | |||
49 | for (entry = 0, sste = primary; entry < 8; entry++, sste++) { | ||
50 | if (!ret && !(be64_to_cpu(sste->esid_data) & SLB_ESID_V)) | ||
51 | ret = sste; | ||
52 | if (sste_matches(sste, slb)) | ||
53 | return NULL; | ||
41 | } | 54 | } |
55 | if (ret) | ||
56 | return ret; | ||
57 | |||
42 | /* Nothing free, select an entry to cast out */ | 58 | /* Nothing free, select an entry to cast out */ |
43 | if (sec_hash && (*lru & 0x8)) | 59 | ret = primary + ctx->sst_lru; |
44 | sste = secondary_group + (*lru & 0x7); | 60 | ctx->sst_lru = (ctx->sst_lru + 1) & 0x7; |
45 | else | ||
46 | sste = primary_group + (*lru & 0x7); | ||
47 | *lru = (*lru + 1) & 0xf; | ||
48 | 61 | ||
49 | return sste; | 62 | return ret; |
50 | } | 63 | } |
51 | 64 | ||
52 | static void cxl_load_segment(struct cxl_context *ctx, struct copro_slb *slb) | 65 | static void cxl_load_segment(struct cxl_context *ctx, struct copro_slb *slb) |
53 | { | 66 | { |
54 | /* mask is the group index, we search primary and secondary here. */ | 67 | /* mask is the group index, we search primary and secondary here. */ |
55 | unsigned int mask = (ctx->sst_size >> 7)-1; /* SSTP0[SegTableSize] */ | ||
56 | bool sec_hash = 1; | ||
57 | struct cxl_sste *sste; | 68 | struct cxl_sste *sste; |
58 | unsigned int hash; | ||
59 | unsigned long flags; | 69 | unsigned long flags; |
60 | 70 | ||
61 | |||
62 | sec_hash = !!(cxl_p1n_read(ctx->afu, CXL_PSL_SR_An) & CXL_PSL_SR_An_SC); | ||
63 | |||
64 | if (slb->vsid & SLB_VSID_B_1T) | ||
65 | hash = (slb->esid >> SID_SHIFT_1T) & mask; | ||
66 | else /* 256M */ | ||
67 | hash = (slb->esid >> SID_SHIFT) & mask; | ||
68 | |||
69 | spin_lock_irqsave(&ctx->sste_lock, flags); | 71 | spin_lock_irqsave(&ctx->sste_lock, flags); |
70 | sste = find_free_sste(ctx->sstp + (hash << 3), sec_hash, | 72 | sste = find_free_sste(ctx, slb); |
71 | ctx->sstp + ((~hash & mask) << 3), &ctx->sst_lru); | 73 | if (!sste) |
74 | goto out_unlock; | ||
72 | 75 | ||
73 | pr_devel("CXL Populating SST[%li]: %#llx %#llx\n", | 76 | pr_devel("CXL Populating SST[%li]: %#llx %#llx\n", |
74 | sste - ctx->sstp, slb->vsid, slb->esid); | 77 | sste - ctx->sstp, slb->vsid, slb->esid); |
75 | 78 | ||
76 | sste->vsid_data = cpu_to_be64(slb->vsid); | 79 | sste->vsid_data = cpu_to_be64(slb->vsid); |
77 | sste->esid_data = cpu_to_be64(slb->esid); | 80 | sste->esid_data = cpu_to_be64(slb->esid); |
81 | out_unlock: | ||
78 | spin_unlock_irqrestore(&ctx->sste_lock, flags); | 82 | spin_unlock_irqrestore(&ctx->sste_lock, flags); |
79 | } | 83 | } |
80 | 84 | ||
diff --git a/drivers/misc/cxl/native.c b/drivers/misc/cxl/native.c index 623286a77114..d47532e8f4f1 100644 --- a/drivers/misc/cxl/native.c +++ b/drivers/misc/cxl/native.c | |||
@@ -417,7 +417,7 @@ static int attach_afu_directed(struct cxl_context *ctx, u64 wed, u64 amr) | |||
417 | ctx->elem->haurp = 0; /* disable */ | 417 | ctx->elem->haurp = 0; /* disable */ |
418 | ctx->elem->sdr = cpu_to_be64(mfspr(SPRN_SDR1)); | 418 | ctx->elem->sdr = cpu_to_be64(mfspr(SPRN_SDR1)); |
419 | 419 | ||
420 | sr = CXL_PSL_SR_An_SC; | 420 | sr = 0; |
421 | if (ctx->master) | 421 | if (ctx->master) |
422 | sr |= CXL_PSL_SR_An_MP; | 422 | sr |= CXL_PSL_SR_An_MP; |
423 | if (mfspr(SPRN_LPCR) & LPCR_TC) | 423 | if (mfspr(SPRN_LPCR) & LPCR_TC) |
@@ -508,7 +508,7 @@ static int attach_dedicated(struct cxl_context *ctx, u64 wed, u64 amr) | |||
508 | u64 sr; | 508 | u64 sr; |
509 | int rc; | 509 | int rc; |
510 | 510 | ||
511 | sr = CXL_PSL_SR_An_SC; | 511 | sr = 0; |
512 | set_endian(sr); | 512 | set_endian(sr); |
513 | if (ctx->master) | 513 | if (ctx->master) |
514 | sr |= CXL_PSL_SR_An_MP; | 514 | sr |= CXL_PSL_SR_An_MP; |
diff --git a/drivers/mmc/core/host.c b/drivers/mmc/core/host.c index 03c53b72a2d6..270d58a4c43d 100644 --- a/drivers/mmc/core/host.c +++ b/drivers/mmc/core/host.c | |||
@@ -311,7 +311,8 @@ int mmc_of_parse(struct mmc_host *host) | |||
311 | struct device_node *np; | 311 | struct device_node *np; |
312 | u32 bus_width; | 312 | u32 bus_width; |
313 | int len, ret; | 313 | int len, ret; |
314 | bool cap_invert, gpio_invert; | 314 | bool cd_cap_invert, cd_gpio_invert = false; |
315 | bool ro_cap_invert, ro_gpio_invert = false; | ||
315 | 316 | ||
316 | if (!host->parent || !host->parent->of_node) | 317 | if (!host->parent || !host->parent->of_node) |
317 | return 0; | 318 | return 0; |
@@ -359,16 +360,13 @@ int mmc_of_parse(struct mmc_host *host) | |||
359 | if (of_find_property(np, "non-removable", &len)) { | 360 | if (of_find_property(np, "non-removable", &len)) { |
360 | host->caps |= MMC_CAP_NONREMOVABLE; | 361 | host->caps |= MMC_CAP_NONREMOVABLE; |
361 | } else { | 362 | } else { |
362 | if (of_property_read_bool(np, "cd-inverted")) | 363 | cd_cap_invert = of_property_read_bool(np, "cd-inverted"); |
363 | cap_invert = true; | ||
364 | else | ||
365 | cap_invert = false; | ||
366 | 364 | ||
367 | if (of_find_property(np, "broken-cd", &len)) | 365 | if (of_find_property(np, "broken-cd", &len)) |
368 | host->caps |= MMC_CAP_NEEDS_POLL; | 366 | host->caps |= MMC_CAP_NEEDS_POLL; |
369 | 367 | ||
370 | ret = mmc_gpiod_request_cd(host, "cd", 0, true, | 368 | ret = mmc_gpiod_request_cd(host, "cd", 0, true, |
371 | 0, &gpio_invert); | 369 | 0, &cd_gpio_invert); |
372 | if (ret) { | 370 | if (ret) { |
373 | if (ret == -EPROBE_DEFER) | 371 | if (ret == -EPROBE_DEFER) |
374 | return ret; | 372 | return ret; |
@@ -391,17 +389,14 @@ int mmc_of_parse(struct mmc_host *host) | |||
391 | * both inverted, the end result is that the CD line is | 389 | * both inverted, the end result is that the CD line is |
392 | * not inverted. | 390 | * not inverted. |
393 | */ | 391 | */ |
394 | if (cap_invert ^ gpio_invert) | 392 | if (cd_cap_invert ^ cd_gpio_invert) |
395 | host->caps2 |= MMC_CAP2_CD_ACTIVE_HIGH; | 393 | host->caps2 |= MMC_CAP2_CD_ACTIVE_HIGH; |
396 | } | 394 | } |
397 | 395 | ||
398 | /* Parse Write Protection */ | 396 | /* Parse Write Protection */ |
399 | if (of_property_read_bool(np, "wp-inverted")) | 397 | ro_cap_invert = of_property_read_bool(np, "wp-inverted"); |
400 | cap_invert = true; | ||
401 | else | ||
402 | cap_invert = false; | ||
403 | 398 | ||
404 | ret = mmc_gpiod_request_ro(host, "wp", 0, false, 0, &gpio_invert); | 399 | ret = mmc_gpiod_request_ro(host, "wp", 0, false, 0, &ro_gpio_invert); |
405 | if (ret) { | 400 | if (ret) { |
406 | if (ret == -EPROBE_DEFER) | 401 | if (ret == -EPROBE_DEFER) |
407 | goto out; | 402 | goto out; |
@@ -414,7 +409,7 @@ int mmc_of_parse(struct mmc_host *host) | |||
414 | dev_info(host->parent, "Got WP GPIO\n"); | 409 | dev_info(host->parent, "Got WP GPIO\n"); |
415 | 410 | ||
416 | /* See the comment on CD inversion above */ | 411 | /* See the comment on CD inversion above */ |
417 | if (cap_invert ^ gpio_invert) | 412 | if (ro_cap_invert ^ ro_gpio_invert) |
418 | host->caps2 |= MMC_CAP2_RO_ACTIVE_HIGH; | 413 | host->caps2 |= MMC_CAP2_RO_ACTIVE_HIGH; |
419 | 414 | ||
420 | if (of_find_property(np, "cap-sd-highspeed", &len)) | 415 | if (of_find_property(np, "cap-sd-highspeed", &len)) |
diff --git a/drivers/mtd/chips/cfi_cmdset_0001.c b/drivers/mtd/chips/cfi_cmdset_0001.c index a7543ba3e190..3096f3ded3ad 100644 --- a/drivers/mtd/chips/cfi_cmdset_0001.c +++ b/drivers/mtd/chips/cfi_cmdset_0001.c | |||
@@ -2590,6 +2590,8 @@ static void cfi_intelext_resume(struct mtd_info *mtd) | |||
2590 | 2590 | ||
2591 | /* Go to known state. Chip may have been power cycled */ | 2591 | /* Go to known state. Chip may have been power cycled */ |
2592 | if (chip->state == FL_PM_SUSPENDED) { | 2592 | if (chip->state == FL_PM_SUSPENDED) { |
2593 | /* Refresh LH28F640BF Partition Config. Register */ | ||
2594 | fixup_LH28F640BF(mtd); | ||
2593 | map_write(map, CMD(0xFF), cfi->chips[i].start); | 2595 | map_write(map, CMD(0xFF), cfi->chips[i].start); |
2594 | chip->oldstate = chip->state = FL_READY; | 2596 | chip->oldstate = chip->state = FL_READY; |
2595 | wake_up(&chip->wq); | 2597 | wake_up(&chip->wq); |
diff --git a/drivers/mtd/devices/m25p80.c b/drivers/mtd/devices/m25p80.c index dcda6287228d..ed827cf894e4 100644 --- a/drivers/mtd/devices/m25p80.c +++ b/drivers/mtd/devices/m25p80.c | |||
@@ -193,10 +193,10 @@ static int m25p_probe(struct spi_device *spi) | |||
193 | { | 193 | { |
194 | struct mtd_part_parser_data ppdata; | 194 | struct mtd_part_parser_data ppdata; |
195 | struct flash_platform_data *data; | 195 | struct flash_platform_data *data; |
196 | const struct spi_device_id *id = NULL; | ||
197 | struct m25p *flash; | 196 | struct m25p *flash; |
198 | struct spi_nor *nor; | 197 | struct spi_nor *nor; |
199 | enum read_mode mode = SPI_NOR_NORMAL; | 198 | enum read_mode mode = SPI_NOR_NORMAL; |
199 | char *flash_name = NULL; | ||
200 | int ret; | 200 | int ret; |
201 | 201 | ||
202 | data = dev_get_platdata(&spi->dev); | 202 | data = dev_get_platdata(&spi->dev); |
@@ -236,13 +236,11 @@ static int m25p_probe(struct spi_device *spi) | |||
236 | * If that's the case, respect "type" and ignore a "name". | 236 | * If that's the case, respect "type" and ignore a "name". |
237 | */ | 237 | */ |
238 | if (data && data->type) | 238 | if (data && data->type) |
239 | id = spi_nor_match_id(data->type); | 239 | flash_name = data->type; |
240 | else | ||
241 | flash_name = spi->modalias; | ||
240 | 242 | ||
241 | /* If we didn't get name from platform, simply use "modalias". */ | 243 | ret = spi_nor_scan(nor, flash_name, mode); |
242 | if (!id) | ||
243 | id = spi_get_device_id(spi); | ||
244 | |||
245 | ret = spi_nor_scan(nor, id, mode); | ||
246 | if (ret) | 244 | if (ret) |
247 | return ret; | 245 | return ret; |
248 | 246 | ||
@@ -263,12 +261,62 @@ static int m25p_remove(struct spi_device *spi) | |||
263 | } | 261 | } |
264 | 262 | ||
265 | 263 | ||
264 | /* | ||
265 | * XXX This needs to be kept in sync with spi_nor_ids. We can't share | ||
266 | * it with spi-nor, because if this is built as a module then modpost | ||
267 | * won't be able to read it and add appropriate aliases. | ||
268 | */ | ||
269 | static const struct spi_device_id m25p_ids[] = { | ||
270 | {"at25fs010"}, {"at25fs040"}, {"at25df041a"}, {"at25df321a"}, | ||
271 | {"at25df641"}, {"at26f004"}, {"at26df081a"}, {"at26df161a"}, | ||
272 | {"at26df321"}, {"at45db081d"}, | ||
273 | {"en25f32"}, {"en25p32"}, {"en25q32b"}, {"en25p64"}, | ||
274 | {"en25q64"}, {"en25qh128"}, {"en25qh256"}, | ||
275 | {"f25l32pa"}, | ||
276 | {"mr25h256"}, {"mr25h10"}, | ||
277 | {"gd25q32"}, {"gd25q64"}, | ||
278 | {"160s33b"}, {"320s33b"}, {"640s33b"}, | ||
279 | {"mx25l2005a"}, {"mx25l4005a"}, {"mx25l8005"}, {"mx25l1606e"}, | ||
280 | {"mx25l3205d"}, {"mx25l3255e"}, {"mx25l6405d"}, {"mx25l12805d"}, | ||
281 | {"mx25l12855e"},{"mx25l25635e"},{"mx25l25655e"},{"mx66l51235l"}, | ||
282 | {"mx66l1g55g"}, | ||
283 | {"n25q064"}, {"n25q128a11"}, {"n25q128a13"}, {"n25q256a"}, | ||
284 | {"n25q512a"}, {"n25q512ax3"}, {"n25q00"}, | ||
285 | {"pm25lv512"}, {"pm25lv010"}, {"pm25lq032"}, | ||
286 | {"s25sl032p"}, {"s25sl064p"}, {"s25fl256s0"}, {"s25fl256s1"}, | ||
287 | {"s25fl512s"}, {"s70fl01gs"}, {"s25sl12800"}, {"s25sl12801"}, | ||
288 | {"s25fl129p0"}, {"s25fl129p1"}, {"s25sl004a"}, {"s25sl008a"}, | ||
289 | {"s25sl016a"}, {"s25sl032a"}, {"s25sl064a"}, {"s25fl008k"}, | ||
290 | {"s25fl016k"}, {"s25fl064k"}, | ||
291 | {"sst25vf040b"},{"sst25vf080b"},{"sst25vf016b"},{"sst25vf032b"}, | ||
292 | {"sst25vf064c"},{"sst25wf512"}, {"sst25wf010"}, {"sst25wf020"}, | ||
293 | {"sst25wf040"}, | ||
294 | {"m25p05"}, {"m25p10"}, {"m25p20"}, {"m25p40"}, | ||
295 | {"m25p80"}, {"m25p16"}, {"m25p32"}, {"m25p64"}, | ||
296 | {"m25p128"}, {"n25q032"}, | ||
297 | {"m25p05-nonjedec"}, {"m25p10-nonjedec"}, {"m25p20-nonjedec"}, | ||
298 | {"m25p40-nonjedec"}, {"m25p80-nonjedec"}, {"m25p16-nonjedec"}, | ||
299 | {"m25p32-nonjedec"}, {"m25p64-nonjedec"}, {"m25p128-nonjedec"}, | ||
300 | {"m45pe10"}, {"m45pe80"}, {"m45pe16"}, | ||
301 | {"m25pe20"}, {"m25pe80"}, {"m25pe16"}, | ||
302 | {"m25px16"}, {"m25px32"}, {"m25px32-s0"}, {"m25px32-s1"}, | ||
303 | {"m25px64"}, | ||
304 | {"w25x10"}, {"w25x20"}, {"w25x40"}, {"w25x80"}, | ||
305 | {"w25x16"}, {"w25x32"}, {"w25q32"}, {"w25q32dw"}, | ||
306 | {"w25x64"}, {"w25q64"}, {"w25q128"}, {"w25q80"}, | ||
307 | {"w25q80bl"}, {"w25q128"}, {"w25q256"}, {"cat25c11"}, | ||
308 | {"cat25c03"}, {"cat25c09"}, {"cat25c17"}, {"cat25128"}, | ||
309 | { }, | ||
310 | }; | ||
311 | MODULE_DEVICE_TABLE(spi, m25p_ids); | ||
312 | |||
313 | |||
266 | static struct spi_driver m25p80_driver = { | 314 | static struct spi_driver m25p80_driver = { |
267 | .driver = { | 315 | .driver = { |
268 | .name = "m25p80", | 316 | .name = "m25p80", |
269 | .owner = THIS_MODULE, | 317 | .owner = THIS_MODULE, |
270 | }, | 318 | }, |
271 | .id_table = spi_nor_ids, | 319 | .id_table = m25p_ids, |
272 | .probe = m25p_probe, | 320 | .probe = m25p_probe, |
273 | .remove = m25p_remove, | 321 | .remove = m25p_remove, |
274 | 322 | ||
diff --git a/drivers/mtd/nand/omap_elm.c b/drivers/mtd/nand/omap_elm.c index b4f61c7fc161..058531044ceb 100644 --- a/drivers/mtd/nand/omap_elm.c +++ b/drivers/mtd/nand/omap_elm.c | |||
@@ -115,7 +115,7 @@ int elm_config(struct device *dev, enum bch_ecc bch_type, | |||
115 | 115 | ||
116 | if (!info) { | 116 | if (!info) { |
117 | dev_err(dev, "Unable to configure elm - device not probed?\n"); | 117 | dev_err(dev, "Unable to configure elm - device not probed?\n"); |
118 | return -ENODEV; | 118 | return -EPROBE_DEFER; |
119 | } | 119 | } |
120 | /* ELM cannot detect ECC errors for chunks > 1KB */ | 120 | /* ELM cannot detect ECC errors for chunks > 1KB */ |
121 | if (ecc_step_size > ((ELM_ECC_SIZE + 1) / 2)) { | 121 | if (ecc_step_size > ((ELM_ECC_SIZE + 1) / 2)) { |
diff --git a/drivers/mtd/spi-nor/fsl-quadspi.c b/drivers/mtd/spi-nor/fsl-quadspi.c index 8d659a2888d5..d5269a26c839 100644 --- a/drivers/mtd/spi-nor/fsl-quadspi.c +++ b/drivers/mtd/spi-nor/fsl-quadspi.c | |||
@@ -881,7 +881,6 @@ static int fsl_qspi_probe(struct platform_device *pdev) | |||
881 | 881 | ||
882 | /* iterate the subnodes. */ | 882 | /* iterate the subnodes. */ |
883 | for_each_available_child_of_node(dev->of_node, np) { | 883 | for_each_available_child_of_node(dev->of_node, np) { |
884 | const struct spi_device_id *id; | ||
885 | char modalias[40]; | 884 | char modalias[40]; |
886 | 885 | ||
887 | /* skip the holes */ | 886 | /* skip the holes */ |
@@ -909,10 +908,6 @@ static int fsl_qspi_probe(struct platform_device *pdev) | |||
909 | if (of_modalias_node(np, modalias, sizeof(modalias)) < 0) | 908 | if (of_modalias_node(np, modalias, sizeof(modalias)) < 0) |
910 | goto map_failed; | 909 | goto map_failed; |
911 | 910 | ||
912 | id = spi_nor_match_id(modalias); | ||
913 | if (!id) | ||
914 | goto map_failed; | ||
915 | |||
916 | ret = of_property_read_u32(np, "spi-max-frequency", | 911 | ret = of_property_read_u32(np, "spi-max-frequency", |
917 | &q->clk_rate); | 912 | &q->clk_rate); |
918 | if (ret < 0) | 913 | if (ret < 0) |
@@ -921,7 +916,7 @@ static int fsl_qspi_probe(struct platform_device *pdev) | |||
921 | /* set the chip address for READID */ | 916 | /* set the chip address for READID */ |
922 | fsl_qspi_set_base_addr(q, nor); | 917 | fsl_qspi_set_base_addr(q, nor); |
923 | 918 | ||
924 | ret = spi_nor_scan(nor, id, SPI_NOR_QUAD); | 919 | ret = spi_nor_scan(nor, modalias, SPI_NOR_QUAD); |
925 | if (ret) | 920 | if (ret) |
926 | goto map_failed; | 921 | goto map_failed; |
927 | 922 | ||
diff --git a/drivers/mtd/spi-nor/spi-nor.c b/drivers/mtd/spi-nor/spi-nor.c index ae16aa2f6885..c51ee52386a7 100644 --- a/drivers/mtd/spi-nor/spi-nor.c +++ b/drivers/mtd/spi-nor/spi-nor.c | |||
@@ -28,6 +28,8 @@ | |||
28 | 28 | ||
29 | #define JEDEC_MFR(_jedec_id) ((_jedec_id) >> 16) | 29 | #define JEDEC_MFR(_jedec_id) ((_jedec_id) >> 16) |
30 | 30 | ||
31 | static const struct spi_device_id *spi_nor_match_id(const char *name); | ||
32 | |||
31 | /* | 33 | /* |
32 | * Read the status register, returning its value in the location | 34 | * Read the status register, returning its value in the location |
33 | * Return the status register value. | 35 | * Return the status register value. |
@@ -473,7 +475,7 @@ struct flash_info { | |||
473 | * more nor chips. This current list focusses on newer chips, which | 475 | * more nor chips. This current list focusses on newer chips, which |
474 | * have been converging on command sets which including JEDEC ID. | 476 | * have been converging on command sets which including JEDEC ID. |
475 | */ | 477 | */ |
476 | const struct spi_device_id spi_nor_ids[] = { | 478 | static const struct spi_device_id spi_nor_ids[] = { |
477 | /* Atmel -- some are (confusingly) marketed as "DataFlash" */ | 479 | /* Atmel -- some are (confusingly) marketed as "DataFlash" */ |
478 | { "at25fs010", INFO(0x1f6601, 0, 32 * 1024, 4, SECT_4K) }, | 480 | { "at25fs010", INFO(0x1f6601, 0, 32 * 1024, 4, SECT_4K) }, |
479 | { "at25fs040", INFO(0x1f6604, 0, 64 * 1024, 8, SECT_4K) }, | 481 | { "at25fs040", INFO(0x1f6604, 0, 64 * 1024, 8, SECT_4K) }, |
@@ -637,7 +639,6 @@ const struct spi_device_id spi_nor_ids[] = { | |||
637 | { "cat25128", CAT25_INFO(2048, 8, 64, 2, SPI_NOR_NO_ERASE | SPI_NOR_NO_FR) }, | 639 | { "cat25128", CAT25_INFO(2048, 8, 64, 2, SPI_NOR_NO_ERASE | SPI_NOR_NO_FR) }, |
638 | { }, | 640 | { }, |
639 | }; | 641 | }; |
640 | EXPORT_SYMBOL_GPL(spi_nor_ids); | ||
641 | 642 | ||
642 | static const struct spi_device_id *spi_nor_read_id(struct spi_nor *nor) | 643 | static const struct spi_device_id *spi_nor_read_id(struct spi_nor *nor) |
643 | { | 644 | { |
@@ -911,9 +912,9 @@ static int spi_nor_check(struct spi_nor *nor) | |||
911 | return 0; | 912 | return 0; |
912 | } | 913 | } |
913 | 914 | ||
914 | int spi_nor_scan(struct spi_nor *nor, const struct spi_device_id *id, | 915 | int spi_nor_scan(struct spi_nor *nor, const char *name, enum read_mode mode) |
915 | enum read_mode mode) | ||
916 | { | 916 | { |
917 | const struct spi_device_id *id = NULL; | ||
917 | struct flash_info *info; | 918 | struct flash_info *info; |
918 | struct device *dev = nor->dev; | 919 | struct device *dev = nor->dev; |
919 | struct mtd_info *mtd = nor->mtd; | 920 | struct mtd_info *mtd = nor->mtd; |
@@ -925,6 +926,10 @@ int spi_nor_scan(struct spi_nor *nor, const struct spi_device_id *id, | |||
925 | if (ret) | 926 | if (ret) |
926 | return ret; | 927 | return ret; |
927 | 928 | ||
929 | id = spi_nor_match_id(name); | ||
930 | if (!id) | ||
931 | return -ENOENT; | ||
932 | |||
928 | info = (void *)id->driver_data; | 933 | info = (void *)id->driver_data; |
929 | 934 | ||
930 | if (info->jedec_id) { | 935 | if (info->jedec_id) { |
@@ -1113,7 +1118,7 @@ int spi_nor_scan(struct spi_nor *nor, const struct spi_device_id *id, | |||
1113 | } | 1118 | } |
1114 | EXPORT_SYMBOL_GPL(spi_nor_scan); | 1119 | EXPORT_SYMBOL_GPL(spi_nor_scan); |
1115 | 1120 | ||
1116 | const struct spi_device_id *spi_nor_match_id(char *name) | 1121 | static const struct spi_device_id *spi_nor_match_id(const char *name) |
1117 | { | 1122 | { |
1118 | const struct spi_device_id *id = spi_nor_ids; | 1123 | const struct spi_device_id *id = spi_nor_ids; |
1119 | 1124 | ||
@@ -1124,7 +1129,6 @@ const struct spi_device_id *spi_nor_match_id(char *name) | |||
1124 | } | 1129 | } |
1125 | return NULL; | 1130 | return NULL; |
1126 | } | 1131 | } |
1127 | EXPORT_SYMBOL_GPL(spi_nor_match_id); | ||
1128 | 1132 | ||
1129 | MODULE_LICENSE("GPL"); | 1133 | MODULE_LICENSE("GPL"); |
1130 | MODULE_AUTHOR("Huang Shijie <shijie8@gmail.com>"); | 1134 | MODULE_AUTHOR("Huang Shijie <shijie8@gmail.com>"); |
diff --git a/drivers/net/Kconfig b/drivers/net/Kconfig index 4706386b7d34..f9009be3f307 100644 --- a/drivers/net/Kconfig +++ b/drivers/net/Kconfig | |||
@@ -135,6 +135,7 @@ config MACVLAN | |||
135 | config MACVTAP | 135 | config MACVTAP |
136 | tristate "MAC-VLAN based tap driver" | 136 | tristate "MAC-VLAN based tap driver" |
137 | depends on MACVLAN | 137 | depends on MACVLAN |
138 | depends on INET | ||
138 | help | 139 | help |
139 | This adds a specialized tap character device driver that is based | 140 | This adds a specialized tap character device driver that is based |
140 | on the MAC-VLAN network interface, called macvtap. A macvtap device | 141 | on the MAC-VLAN network interface, called macvtap. A macvtap device |
@@ -200,6 +201,7 @@ config RIONET_RX_SIZE | |||
200 | 201 | ||
201 | config TUN | 202 | config TUN |
202 | tristate "Universal TUN/TAP device driver support" | 203 | tristate "Universal TUN/TAP device driver support" |
204 | depends on INET | ||
203 | select CRC32 | 205 | select CRC32 |
204 | ---help--- | 206 | ---help--- |
205 | TUN/TAP provides packet reception and transmission for user space | 207 | TUN/TAP provides packet reception and transmission for user space |
diff --git a/drivers/net/dsa/mv88e6171.c b/drivers/net/dsa/mv88e6171.c index 1020a7af67cf..78d8e876f3aa 100644 --- a/drivers/net/dsa/mv88e6171.c +++ b/drivers/net/dsa/mv88e6171.c | |||
@@ -395,7 +395,7 @@ static int mv88e6171_get_sset_count(struct dsa_switch *ds) | |||
395 | } | 395 | } |
396 | 396 | ||
397 | struct dsa_switch_driver mv88e6171_switch_driver = { | 397 | struct dsa_switch_driver mv88e6171_switch_driver = { |
398 | .tag_protocol = DSA_TAG_PROTO_DSA, | 398 | .tag_protocol = DSA_TAG_PROTO_EDSA, |
399 | .priv_size = sizeof(struct mv88e6xxx_priv_state), | 399 | .priv_size = sizeof(struct mv88e6xxx_priv_state), |
400 | .probe = mv88e6171_probe, | 400 | .probe = mv88e6171_probe, |
401 | .setup = mv88e6171_setup, | 401 | .setup = mv88e6171_setup, |
diff --git a/drivers/net/ethernet/amd/xgbe/xgbe-drv.c b/drivers/net/ethernet/amd/xgbe/xgbe-drv.c index 29554992215a..2349ea970255 100644 --- a/drivers/net/ethernet/amd/xgbe/xgbe-drv.c +++ b/drivers/net/ethernet/amd/xgbe/xgbe-drv.c | |||
@@ -1465,7 +1465,7 @@ static int xgbe_set_features(struct net_device *netdev, | |||
1465 | { | 1465 | { |
1466 | struct xgbe_prv_data *pdata = netdev_priv(netdev); | 1466 | struct xgbe_prv_data *pdata = netdev_priv(netdev); |
1467 | struct xgbe_hw_if *hw_if = &pdata->hw_if; | 1467 | struct xgbe_hw_if *hw_if = &pdata->hw_if; |
1468 | unsigned int rxcsum, rxvlan, rxvlan_filter; | 1468 | netdev_features_t rxcsum, rxvlan, rxvlan_filter; |
1469 | 1469 | ||
1470 | rxcsum = pdata->netdev_features & NETIF_F_RXCSUM; | 1470 | rxcsum = pdata->netdev_features & NETIF_F_RXCSUM; |
1471 | rxvlan = pdata->netdev_features & NETIF_F_HW_VLAN_CTAG_RX; | 1471 | rxvlan = pdata->netdev_features & NETIF_F_HW_VLAN_CTAG_RX; |
@@ -1598,7 +1598,8 @@ static int xgbe_rx_poll(struct xgbe_channel *channel, int budget) | |||
1598 | struct skb_shared_hwtstamps *hwtstamps; | 1598 | struct skb_shared_hwtstamps *hwtstamps; |
1599 | unsigned int incomplete, error, context_next, context; | 1599 | unsigned int incomplete, error, context_next, context; |
1600 | unsigned int len, put_len, max_len; | 1600 | unsigned int len, put_len, max_len; |
1601 | int received = 0; | 1601 | unsigned int received = 0; |
1602 | int packet_count = 0; | ||
1602 | 1603 | ||
1603 | DBGPR("-->xgbe_rx_poll: budget=%d\n", budget); | 1604 | DBGPR("-->xgbe_rx_poll: budget=%d\n", budget); |
1604 | 1605 | ||
@@ -1608,7 +1609,7 @@ static int xgbe_rx_poll(struct xgbe_channel *channel, int budget) | |||
1608 | 1609 | ||
1609 | rdata = XGBE_GET_DESC_DATA(ring, ring->cur); | 1610 | rdata = XGBE_GET_DESC_DATA(ring, ring->cur); |
1610 | packet = &ring->packet_data; | 1611 | packet = &ring->packet_data; |
1611 | while (received < budget) { | 1612 | while (packet_count < budget) { |
1612 | DBGPR(" cur = %d\n", ring->cur); | 1613 | DBGPR(" cur = %d\n", ring->cur); |
1613 | 1614 | ||
1614 | /* First time in loop see if we need to restore state */ | 1615 | /* First time in loop see if we need to restore state */ |
@@ -1662,7 +1663,7 @@ read_again: | |||
1662 | if (packet->errors) | 1663 | if (packet->errors) |
1663 | DBGPR("Error in received packet\n"); | 1664 | DBGPR("Error in received packet\n"); |
1664 | dev_kfree_skb(skb); | 1665 | dev_kfree_skb(skb); |
1665 | continue; | 1666 | goto next_packet; |
1666 | } | 1667 | } |
1667 | 1668 | ||
1668 | if (!context) { | 1669 | if (!context) { |
@@ -1677,7 +1678,7 @@ read_again: | |||
1677 | } | 1678 | } |
1678 | 1679 | ||
1679 | dev_kfree_skb(skb); | 1680 | dev_kfree_skb(skb); |
1680 | continue; | 1681 | goto next_packet; |
1681 | } | 1682 | } |
1682 | memcpy(skb_tail_pointer(skb), rdata->skb->data, | 1683 | memcpy(skb_tail_pointer(skb), rdata->skb->data, |
1683 | put_len); | 1684 | put_len); |
@@ -1694,7 +1695,7 @@ read_again: | |||
1694 | 1695 | ||
1695 | /* Stray Context Descriptor? */ | 1696 | /* Stray Context Descriptor? */ |
1696 | if (!skb) | 1697 | if (!skb) |
1697 | continue; | 1698 | goto next_packet; |
1698 | 1699 | ||
1699 | /* Be sure we don't exceed the configured MTU */ | 1700 | /* Be sure we don't exceed the configured MTU */ |
1700 | max_len = netdev->mtu + ETH_HLEN; | 1701 | max_len = netdev->mtu + ETH_HLEN; |
@@ -1705,7 +1706,7 @@ read_again: | |||
1705 | if (skb->len > max_len) { | 1706 | if (skb->len > max_len) { |
1706 | DBGPR("packet length exceeds configured MTU\n"); | 1707 | DBGPR("packet length exceeds configured MTU\n"); |
1707 | dev_kfree_skb(skb); | 1708 | dev_kfree_skb(skb); |
1708 | continue; | 1709 | goto next_packet; |
1709 | } | 1710 | } |
1710 | 1711 | ||
1711 | #ifdef XGMAC_ENABLE_RX_PKT_DUMP | 1712 | #ifdef XGMAC_ENABLE_RX_PKT_DUMP |
@@ -1739,6 +1740,9 @@ read_again: | |||
1739 | 1740 | ||
1740 | netdev->last_rx = jiffies; | 1741 | netdev->last_rx = jiffies; |
1741 | napi_gro_receive(&pdata->napi, skb); | 1742 | napi_gro_receive(&pdata->napi, skb); |
1743 | |||
1744 | next_packet: | ||
1745 | packet_count++; | ||
1742 | } | 1746 | } |
1743 | 1747 | ||
1744 | /* Check if we need to save state before leaving */ | 1748 | /* Check if we need to save state before leaving */ |
@@ -1752,9 +1756,9 @@ read_again: | |||
1752 | rdata->state.error = error; | 1756 | rdata->state.error = error; |
1753 | } | 1757 | } |
1754 | 1758 | ||
1755 | DBGPR("<--xgbe_rx_poll: received = %d\n", received); | 1759 | DBGPR("<--xgbe_rx_poll: packet_count = %d\n", packet_count); |
1756 | 1760 | ||
1757 | return received; | 1761 | return packet_count; |
1758 | } | 1762 | } |
1759 | 1763 | ||
1760 | static int xgbe_poll(struct napi_struct *napi, int budget) | 1764 | static int xgbe_poll(struct napi_struct *napi, int budget) |
diff --git a/drivers/net/ethernet/apm/xgene/xgene_enet_sgmac.c b/drivers/net/ethernet/apm/xgene/xgene_enet_sgmac.c index e6d24c210198..c22f32622fa9 100644 --- a/drivers/net/ethernet/apm/xgene/xgene_enet_sgmac.c +++ b/drivers/net/ethernet/apm/xgene/xgene_enet_sgmac.c | |||
@@ -124,20 +124,18 @@ static int xgene_enet_ecc_init(struct xgene_enet_pdata *p) | |||
124 | { | 124 | { |
125 | struct net_device *ndev = p->ndev; | 125 | struct net_device *ndev = p->ndev; |
126 | u32 data; | 126 | u32 data; |
127 | int i; | 127 | int i = 0; |
128 | 128 | ||
129 | xgene_enet_wr_diag_csr(p, ENET_CFG_MEM_RAM_SHUTDOWN_ADDR, 0); | 129 | xgene_enet_wr_diag_csr(p, ENET_CFG_MEM_RAM_SHUTDOWN_ADDR, 0); |
130 | for (i = 0; i < 10 && data != ~0U ; i++) { | 130 | do { |
131 | usleep_range(100, 110); | 131 | usleep_range(100, 110); |
132 | data = xgene_enet_rd_diag_csr(p, ENET_BLOCK_MEM_RDY_ADDR); | 132 | data = xgene_enet_rd_diag_csr(p, ENET_BLOCK_MEM_RDY_ADDR); |
133 | } | 133 | if (data == ~0U) |
134 | return 0; | ||
135 | } while (++i < 10); | ||
134 | 136 | ||
135 | if (data != ~0U) { | 137 | netdev_err(ndev, "Failed to release memory from shutdown\n"); |
136 | netdev_err(ndev, "Failed to release memory from shutdown\n"); | 138 | return -ENODEV; |
137 | return -ENODEV; | ||
138 | } | ||
139 | |||
140 | return 0; | ||
141 | } | 139 | } |
142 | 140 | ||
143 | static void xgene_enet_config_ring_if_assoc(struct xgene_enet_pdata *p) | 141 | static void xgene_enet_config_ring_if_assoc(struct xgene_enet_pdata *p) |
diff --git a/drivers/net/ethernet/broadcom/bcmsysport.c b/drivers/net/ethernet/broadcom/bcmsysport.c index 9ae36979bdee..3a6778a667f4 100644 --- a/drivers/net/ethernet/broadcom/bcmsysport.c +++ b/drivers/net/ethernet/broadcom/bcmsysport.c | |||
@@ -1397,6 +1397,9 @@ static void bcm_sysport_netif_start(struct net_device *dev) | |||
1397 | /* Enable NAPI */ | 1397 | /* Enable NAPI */ |
1398 | napi_enable(&priv->napi); | 1398 | napi_enable(&priv->napi); |
1399 | 1399 | ||
1400 | /* Enable RX interrupt and TX ring full interrupt */ | ||
1401 | intrl2_0_mask_clear(priv, INTRL2_0_RDMA_MBDONE | INTRL2_0_TX_RING_FULL); | ||
1402 | |||
1400 | phy_start(priv->phydev); | 1403 | phy_start(priv->phydev); |
1401 | 1404 | ||
1402 | /* Enable TX interrupts for the 32 TXQs */ | 1405 | /* Enable TX interrupts for the 32 TXQs */ |
@@ -1499,9 +1502,6 @@ static int bcm_sysport_open(struct net_device *dev) | |||
1499 | if (ret) | 1502 | if (ret) |
1500 | goto out_free_rx_ring; | 1503 | goto out_free_rx_ring; |
1501 | 1504 | ||
1502 | /* Enable RX interrupt and TX ring full interrupt */ | ||
1503 | intrl2_0_mask_clear(priv, INTRL2_0_RDMA_MBDONE | INTRL2_0_TX_RING_FULL); | ||
1504 | |||
1505 | /* Turn on TDMA */ | 1505 | /* Turn on TDMA */ |
1506 | ret = tdma_enable_set(priv, 1); | 1506 | ret = tdma_enable_set(priv, 1); |
1507 | if (ret) | 1507 | if (ret) |
@@ -1858,6 +1858,8 @@ static int bcm_sysport_resume(struct device *d) | |||
1858 | if (!netif_running(dev)) | 1858 | if (!netif_running(dev)) |
1859 | return 0; | 1859 | return 0; |
1860 | 1860 | ||
1861 | umac_reset(priv); | ||
1862 | |||
1861 | /* We may have been suspended and never received a WOL event that | 1863 | /* We may have been suspended and never received a WOL event that |
1862 | * would turn off MPD detection, take care of that now | 1864 | * would turn off MPD detection, take care of that now |
1863 | */ | 1865 | */ |
@@ -1885,9 +1887,6 @@ static int bcm_sysport_resume(struct device *d) | |||
1885 | 1887 | ||
1886 | netif_device_attach(dev); | 1888 | netif_device_attach(dev); |
1887 | 1889 | ||
1888 | /* Enable RX interrupt and TX ring full interrupt */ | ||
1889 | intrl2_0_mask_clear(priv, INTRL2_0_RDMA_MBDONE | INTRL2_0_TX_RING_FULL); | ||
1890 | |||
1891 | /* RX pipe enable */ | 1890 | /* RX pipe enable */ |
1892 | topctrl_writel(priv, 0, RX_FLUSH_CNTL); | 1891 | topctrl_writel(priv, 0, RX_FLUSH_CNTL); |
1893 | 1892 | ||
diff --git a/drivers/net/ethernet/broadcom/cnic.c b/drivers/net/ethernet/broadcom/cnic.c index 23f23c97c2ad..f05fab65d78a 100644 --- a/drivers/net/ethernet/broadcom/cnic.c +++ b/drivers/net/ethernet/broadcom/cnic.c | |||
@@ -382,10 +382,8 @@ static int cnic_iscsi_nl_msg_recv(struct cnic_dev *dev, u32 msg_type, | |||
382 | if (l5_cid >= MAX_CM_SK_TBL_SZ) | 382 | if (l5_cid >= MAX_CM_SK_TBL_SZ) |
383 | break; | 383 | break; |
384 | 384 | ||
385 | rcu_read_lock(); | ||
386 | if (!rcu_access_pointer(cp->ulp_ops[CNIC_ULP_L4])) { | 385 | if (!rcu_access_pointer(cp->ulp_ops[CNIC_ULP_L4])) { |
387 | rc = -ENODEV; | 386 | rc = -ENODEV; |
388 | rcu_read_unlock(); | ||
389 | break; | 387 | break; |
390 | } | 388 | } |
391 | csk = &cp->csk_tbl[l5_cid]; | 389 | csk = &cp->csk_tbl[l5_cid]; |
@@ -414,7 +412,6 @@ static int cnic_iscsi_nl_msg_recv(struct cnic_dev *dev, u32 msg_type, | |||
414 | } | 412 | } |
415 | } | 413 | } |
416 | csk_put(csk); | 414 | csk_put(csk); |
417 | rcu_read_unlock(); | ||
418 | rc = 0; | 415 | rc = 0; |
419 | } | 416 | } |
420 | } | 417 | } |
@@ -615,7 +612,7 @@ static int cnic_unregister_device(struct cnic_dev *dev, int ulp_type) | |||
615 | cnic_send_nlmsg(cp, ISCSI_KEVENT_IF_DOWN, NULL); | 612 | cnic_send_nlmsg(cp, ISCSI_KEVENT_IF_DOWN, NULL); |
616 | 613 | ||
617 | mutex_lock(&cnic_lock); | 614 | mutex_lock(&cnic_lock); |
618 | if (rcu_dereference(cp->ulp_ops[ulp_type])) { | 615 | if (rcu_access_pointer(cp->ulp_ops[ulp_type])) { |
619 | RCU_INIT_POINTER(cp->ulp_ops[ulp_type], NULL); | 616 | RCU_INIT_POINTER(cp->ulp_ops[ulp_type], NULL); |
620 | cnic_put(dev); | 617 | cnic_put(dev); |
621 | } else { | 618 | } else { |
diff --git a/drivers/net/ethernet/chelsio/cxgb4/cxgb4_dcb.c b/drivers/net/ethernet/chelsio/cxgb4/cxgb4_dcb.c index 8edf0f5bd679..6fe300e316c3 100644 --- a/drivers/net/ethernet/chelsio/cxgb4/cxgb4_dcb.c +++ b/drivers/net/ethernet/chelsio/cxgb4/cxgb4_dcb.c | |||
@@ -60,6 +60,42 @@ void cxgb4_dcb_version_init(struct net_device *dev) | |||
60 | dcb->dcb_version = FW_PORT_DCB_VER_AUTO; | 60 | dcb->dcb_version = FW_PORT_DCB_VER_AUTO; |
61 | } | 61 | } |
62 | 62 | ||
63 | static void cxgb4_dcb_cleanup_apps(struct net_device *dev) | ||
64 | { | ||
65 | struct port_info *pi = netdev2pinfo(dev); | ||
66 | struct adapter *adap = pi->adapter; | ||
67 | struct port_dcb_info *dcb = &pi->dcb; | ||
68 | struct dcb_app app; | ||
69 | int i, err; | ||
70 | |||
71 | /* zero priority implies remove */ | ||
72 | app.priority = 0; | ||
73 | |||
74 | for (i = 0; i < CXGB4_MAX_DCBX_APP_SUPPORTED; i++) { | ||
75 | /* Check if app list is exhausted */ | ||
76 | if (!dcb->app_priority[i].protocolid) | ||
77 | break; | ||
78 | |||
79 | app.protocol = dcb->app_priority[i].protocolid; | ||
80 | |||
81 | if (dcb->dcb_version == FW_PORT_DCB_VER_IEEE) { | ||
82 | app.selector = dcb->app_priority[i].sel_field + 1; | ||
83 | err = dcb_ieee_setapp(dev, &app); | ||
84 | } else { | ||
85 | app.selector = !!(dcb->app_priority[i].sel_field); | ||
86 | err = dcb_setapp(dev, &app); | ||
87 | } | ||
88 | |||
89 | if (err) { | ||
90 | dev_err(adap->pdev_dev, | ||
91 | "Failed DCB Clear %s Application Priority: sel=%d, prot=%d, , err=%d\n", | ||
92 | dcb_ver_array[dcb->dcb_version], app.selector, | ||
93 | app.protocol, -err); | ||
94 | break; | ||
95 | } | ||
96 | } | ||
97 | } | ||
98 | |||
63 | /* Finite State machine for Data Center Bridging. | 99 | /* Finite State machine for Data Center Bridging. |
64 | */ | 100 | */ |
65 | void cxgb4_dcb_state_fsm(struct net_device *dev, | 101 | void cxgb4_dcb_state_fsm(struct net_device *dev, |
@@ -80,7 +116,6 @@ void cxgb4_dcb_state_fsm(struct net_device *dev, | |||
80 | /* we're going to use Host DCB */ | 116 | /* we're going to use Host DCB */ |
81 | dcb->state = CXGB4_DCB_STATE_HOST; | 117 | dcb->state = CXGB4_DCB_STATE_HOST; |
82 | dcb->supported = CXGB4_DCBX_HOST_SUPPORT; | 118 | dcb->supported = CXGB4_DCBX_HOST_SUPPORT; |
83 | dcb->enabled = 1; | ||
84 | break; | 119 | break; |
85 | } | 120 | } |
86 | 121 | ||
@@ -145,6 +180,7 @@ void cxgb4_dcb_state_fsm(struct net_device *dev, | |||
145 | * state. We need to reset back to a ground state | 180 | * state. We need to reset back to a ground state |
146 | * of incomplete. | 181 | * of incomplete. |
147 | */ | 182 | */ |
183 | cxgb4_dcb_cleanup_apps(dev); | ||
148 | cxgb4_dcb_state_init(dev); | 184 | cxgb4_dcb_state_init(dev); |
149 | dcb->state = CXGB4_DCB_STATE_FW_INCOMPLETE; | 185 | dcb->state = CXGB4_DCB_STATE_FW_INCOMPLETE; |
150 | dcb->supported = CXGB4_DCBX_FW_SUPPORT; | 186 | dcb->supported = CXGB4_DCBX_FW_SUPPORT; |
@@ -349,6 +385,12 @@ static u8 cxgb4_setstate(struct net_device *dev, u8 enabled) | |||
349 | { | 385 | { |
350 | struct port_info *pi = netdev2pinfo(dev); | 386 | struct port_info *pi = netdev2pinfo(dev); |
351 | 387 | ||
388 | /* If DCBx is host-managed, dcb is enabled by outside lldp agents */ | ||
389 | if (pi->dcb.state == CXGB4_DCB_STATE_HOST) { | ||
390 | pi->dcb.enabled = enabled; | ||
391 | return 0; | ||
392 | } | ||
393 | |||
352 | /* Firmware doesn't provide any mechanism to control the DCB state. | 394 | /* Firmware doesn't provide any mechanism to control the DCB state. |
353 | */ | 395 | */ |
354 | if (enabled != (pi->dcb.state == CXGB4_DCB_STATE_FW_ALLSYNCED)) | 396 | if (enabled != (pi->dcb.state == CXGB4_DCB_STATE_FW_ALLSYNCED)) |
@@ -833,11 +875,16 @@ static int cxgb4_setapp(struct net_device *dev, u8 app_idtype, u16 app_id, | |||
833 | 875 | ||
834 | /* Return whether IEEE Data Center Bridging has been negotiated. | 876 | /* Return whether IEEE Data Center Bridging has been negotiated. |
835 | */ | 877 | */ |
836 | static inline int cxgb4_ieee_negotiation_complete(struct net_device *dev) | 878 | static inline int |
879 | cxgb4_ieee_negotiation_complete(struct net_device *dev, | ||
880 | enum cxgb4_dcb_fw_msgs dcb_subtype) | ||
837 | { | 881 | { |
838 | struct port_info *pi = netdev2pinfo(dev); | 882 | struct port_info *pi = netdev2pinfo(dev); |
839 | struct port_dcb_info *dcb = &pi->dcb; | 883 | struct port_dcb_info *dcb = &pi->dcb; |
840 | 884 | ||
885 | if (dcb_subtype && !(dcb->msgs & dcb_subtype)) | ||
886 | return 0; | ||
887 | |||
841 | return (dcb->state == CXGB4_DCB_STATE_FW_ALLSYNCED && | 888 | return (dcb->state == CXGB4_DCB_STATE_FW_ALLSYNCED && |
842 | (dcb->supported & DCB_CAP_DCBX_VER_IEEE)); | 889 | (dcb->supported & DCB_CAP_DCBX_VER_IEEE)); |
843 | } | 890 | } |
@@ -850,7 +897,7 @@ static int cxgb4_ieee_getapp(struct net_device *dev, struct dcb_app *app) | |||
850 | { | 897 | { |
851 | int prio; | 898 | int prio; |
852 | 899 | ||
853 | if (!cxgb4_ieee_negotiation_complete(dev)) | 900 | if (!cxgb4_ieee_negotiation_complete(dev, CXGB4_DCB_FW_APP_ID)) |
854 | return -EINVAL; | 901 | return -EINVAL; |
855 | if (!(app->selector && app->protocol)) | 902 | if (!(app->selector && app->protocol)) |
856 | return -EINVAL; | 903 | return -EINVAL; |
@@ -872,7 +919,7 @@ static int cxgb4_ieee_setapp(struct net_device *dev, struct dcb_app *app) | |||
872 | { | 919 | { |
873 | int ret; | 920 | int ret; |
874 | 921 | ||
875 | if (!cxgb4_ieee_negotiation_complete(dev)) | 922 | if (!cxgb4_ieee_negotiation_complete(dev, CXGB4_DCB_FW_APP_ID)) |
876 | return -EINVAL; | 923 | return -EINVAL; |
877 | if (!(app->selector && app->protocol)) | 924 | if (!(app->selector && app->protocol)) |
878 | return -EINVAL; | 925 | return -EINVAL; |
diff --git a/drivers/net/ethernet/chelsio/cxgb4/cxgb4_main.c b/drivers/net/ethernet/chelsio/cxgb4/cxgb4_main.c index 3f60070f2519..8520d5529df8 100644 --- a/drivers/net/ethernet/chelsio/cxgb4/cxgb4_main.c +++ b/drivers/net/ethernet/chelsio/cxgb4/cxgb4_main.c | |||
@@ -694,7 +694,11 @@ int cxgb4_dcb_enabled(const struct net_device *dev) | |||
694 | #ifdef CONFIG_CHELSIO_T4_DCB | 694 | #ifdef CONFIG_CHELSIO_T4_DCB |
695 | struct port_info *pi = netdev_priv(dev); | 695 | struct port_info *pi = netdev_priv(dev); |
696 | 696 | ||
697 | return pi->dcb.state == CXGB4_DCB_STATE_FW_ALLSYNCED; | 697 | if (!pi->dcb.enabled) |
698 | return 0; | ||
699 | |||
700 | return ((pi->dcb.state == CXGB4_DCB_STATE_FW_ALLSYNCED) || | ||
701 | (pi->dcb.state == CXGB4_DCB_STATE_HOST)); | ||
698 | #else | 702 | #else |
699 | return 0; | 703 | return 0; |
700 | #endif | 704 | #endif |
@@ -6610,6 +6614,7 @@ static int init_one(struct pci_dev *pdev, const struct pci_device_id *ent) | |||
6610 | 6614 | ||
6611 | spin_lock_init(&adapter->stats_lock); | 6615 | spin_lock_init(&adapter->stats_lock); |
6612 | spin_lock_init(&adapter->tid_release_lock); | 6616 | spin_lock_init(&adapter->tid_release_lock); |
6617 | spin_lock_init(&adapter->win0_lock); | ||
6613 | 6618 | ||
6614 | INIT_WORK(&adapter->tid_release_task, process_tid_release_list); | 6619 | INIT_WORK(&adapter->tid_release_task, process_tid_release_list); |
6615 | INIT_WORK(&adapter->db_full_task, process_db_full); | 6620 | INIT_WORK(&adapter->db_full_task, process_db_full); |
diff --git a/drivers/net/ethernet/chelsio/cxgb4vf/cxgb4vf_main.c b/drivers/net/ethernet/chelsio/cxgb4vf/cxgb4vf_main.c index bfa398d91826..0b42bddaf284 100644 --- a/drivers/net/ethernet/chelsio/cxgb4vf/cxgb4vf_main.c +++ b/drivers/net/ethernet/chelsio/cxgb4vf/cxgb4vf_main.c | |||
@@ -2929,14 +2929,14 @@ static const struct pci_device_id cxgb4vf_pci_tbl[] = { | |||
2929 | CH_DEVICE(0x480d), /* T480-cr */ | 2929 | CH_DEVICE(0x480d), /* T480-cr */ |
2930 | CH_DEVICE(0x480e), /* T440-lp-cr */ | 2930 | CH_DEVICE(0x480e), /* T440-lp-cr */ |
2931 | CH_DEVICE(0x4880), | 2931 | CH_DEVICE(0x4880), |
2932 | CH_DEVICE(0x4880), | 2932 | CH_DEVICE(0x4881), |
2933 | CH_DEVICE(0x4880), | 2933 | CH_DEVICE(0x4882), |
2934 | CH_DEVICE(0x4880), | 2934 | CH_DEVICE(0x4883), |
2935 | CH_DEVICE(0x4880), | 2935 | CH_DEVICE(0x4884), |
2936 | CH_DEVICE(0x4880), | 2936 | CH_DEVICE(0x4885), |
2937 | CH_DEVICE(0x4880), | 2937 | CH_DEVICE(0x4886), |
2938 | CH_DEVICE(0x4880), | 2938 | CH_DEVICE(0x4887), |
2939 | CH_DEVICE(0x4880), | 2939 | CH_DEVICE(0x4888), |
2940 | CH_DEVICE(0x5801), /* T520-cr */ | 2940 | CH_DEVICE(0x5801), /* T520-cr */ |
2941 | CH_DEVICE(0x5802), /* T522-cr */ | 2941 | CH_DEVICE(0x5802), /* T522-cr */ |
2942 | CH_DEVICE(0x5803), /* T540-cr */ | 2942 | CH_DEVICE(0x5803), /* T540-cr */ |
diff --git a/drivers/net/ethernet/cisco/enic/enic_clsf.c b/drivers/net/ethernet/cisco/enic/enic_clsf.c index 69dfd3c9e529..0be6850be8a2 100644 --- a/drivers/net/ethernet/cisco/enic/enic_clsf.c +++ b/drivers/net/ethernet/cisco/enic/enic_clsf.c | |||
@@ -86,7 +86,7 @@ void enic_rfs_flw_tbl_free(struct enic *enic) | |||
86 | int i; | 86 | int i; |
87 | 87 | ||
88 | enic_rfs_timer_stop(enic); | 88 | enic_rfs_timer_stop(enic); |
89 | spin_lock(&enic->rfs_h.lock); | 89 | spin_lock_bh(&enic->rfs_h.lock); |
90 | enic->rfs_h.free = 0; | 90 | enic->rfs_h.free = 0; |
91 | for (i = 0; i < (1 << ENIC_RFS_FLW_BITSHIFT); i++) { | 91 | for (i = 0; i < (1 << ENIC_RFS_FLW_BITSHIFT); i++) { |
92 | struct hlist_head *hhead; | 92 | struct hlist_head *hhead; |
@@ -100,7 +100,7 @@ void enic_rfs_flw_tbl_free(struct enic *enic) | |||
100 | kfree(n); | 100 | kfree(n); |
101 | } | 101 | } |
102 | } | 102 | } |
103 | spin_unlock(&enic->rfs_h.lock); | 103 | spin_unlock_bh(&enic->rfs_h.lock); |
104 | } | 104 | } |
105 | 105 | ||
106 | struct enic_rfs_fltr_node *htbl_fltr_search(struct enic *enic, u16 fltr_id) | 106 | struct enic_rfs_fltr_node *htbl_fltr_search(struct enic *enic, u16 fltr_id) |
@@ -128,7 +128,7 @@ void enic_flow_may_expire(unsigned long data) | |||
128 | bool res; | 128 | bool res; |
129 | int j; | 129 | int j; |
130 | 130 | ||
131 | spin_lock(&enic->rfs_h.lock); | 131 | spin_lock_bh(&enic->rfs_h.lock); |
132 | for (j = 0; j < ENIC_CLSF_EXPIRE_COUNT; j++) { | 132 | for (j = 0; j < ENIC_CLSF_EXPIRE_COUNT; j++) { |
133 | struct hlist_head *hhead; | 133 | struct hlist_head *hhead; |
134 | struct hlist_node *tmp; | 134 | struct hlist_node *tmp; |
@@ -148,7 +148,7 @@ void enic_flow_may_expire(unsigned long data) | |||
148 | } | 148 | } |
149 | } | 149 | } |
150 | } | 150 | } |
151 | spin_unlock(&enic->rfs_h.lock); | 151 | spin_unlock_bh(&enic->rfs_h.lock); |
152 | mod_timer(&enic->rfs_h.rfs_may_expire, jiffies + HZ/4); | 152 | mod_timer(&enic->rfs_h.rfs_may_expire, jiffies + HZ/4); |
153 | } | 153 | } |
154 | 154 | ||
@@ -183,7 +183,7 @@ int enic_rx_flow_steer(struct net_device *dev, const struct sk_buff *skb, | |||
183 | return -EPROTONOSUPPORT; | 183 | return -EPROTONOSUPPORT; |
184 | 184 | ||
185 | tbl_idx = skb_get_hash_raw(skb) & ENIC_RFS_FLW_MASK; | 185 | tbl_idx = skb_get_hash_raw(skb) & ENIC_RFS_FLW_MASK; |
186 | spin_lock(&enic->rfs_h.lock); | 186 | spin_lock_bh(&enic->rfs_h.lock); |
187 | n = htbl_key_search(&enic->rfs_h.ht_head[tbl_idx], &keys); | 187 | n = htbl_key_search(&enic->rfs_h.ht_head[tbl_idx], &keys); |
188 | 188 | ||
189 | if (n) { /* entry already present */ | 189 | if (n) { /* entry already present */ |
@@ -277,7 +277,7 @@ int enic_rx_flow_steer(struct net_device *dev, const struct sk_buff *skb, | |||
277 | } | 277 | } |
278 | 278 | ||
279 | ret_unlock: | 279 | ret_unlock: |
280 | spin_unlock(&enic->rfs_h.lock); | 280 | spin_unlock_bh(&enic->rfs_h.lock); |
281 | return res; | 281 | return res; |
282 | } | 282 | } |
283 | 283 | ||
diff --git a/drivers/net/ethernet/cisco/enic/enic_main.c b/drivers/net/ethernet/cisco/enic/enic_main.c index 929bfe70080a..180e53fa628f 100644 --- a/drivers/net/ethernet/cisco/enic/enic_main.c +++ b/drivers/net/ethernet/cisco/enic/enic_main.c | |||
@@ -1674,13 +1674,13 @@ static int enic_stop(struct net_device *netdev) | |||
1674 | 1674 | ||
1675 | enic_dev_disable(enic); | 1675 | enic_dev_disable(enic); |
1676 | 1676 | ||
1677 | local_bh_disable(); | ||
1678 | for (i = 0; i < enic->rq_count; i++) { | 1677 | for (i = 0; i < enic->rq_count; i++) { |
1679 | napi_disable(&enic->napi[i]); | 1678 | napi_disable(&enic->napi[i]); |
1679 | local_bh_disable(); | ||
1680 | while (!enic_poll_lock_napi(&enic->rq[i])) | 1680 | while (!enic_poll_lock_napi(&enic->rq[i])) |
1681 | mdelay(1); | 1681 | mdelay(1); |
1682 | local_bh_enable(); | ||
1682 | } | 1683 | } |
1683 | local_bh_enable(); | ||
1684 | 1684 | ||
1685 | netif_carrier_off(netdev); | 1685 | netif_carrier_off(netdev); |
1686 | netif_tx_disable(netdev); | 1686 | netif_tx_disable(netdev); |
diff --git a/drivers/net/ethernet/freescale/fec_main.c b/drivers/net/ethernet/freescale/fec_main.c index 81b96cf87574..50a851db2852 100644 --- a/drivers/net/ethernet/freescale/fec_main.c +++ b/drivers/net/ethernet/freescale/fec_main.c | |||
@@ -1581,7 +1581,8 @@ fec_enet_interrupt(int irq, void *dev_id) | |||
1581 | complete(&fep->mdio_done); | 1581 | complete(&fep->mdio_done); |
1582 | } | 1582 | } |
1583 | 1583 | ||
1584 | fec_ptp_check_pps_event(fep); | 1584 | if (fep->ptp_clock) |
1585 | fec_ptp_check_pps_event(fep); | ||
1585 | 1586 | ||
1586 | return ret; | 1587 | return ret; |
1587 | } | 1588 | } |
diff --git a/drivers/net/ethernet/freescale/fs_enet/mac-fec.c b/drivers/net/ethernet/freescale/fs_enet/mac-fec.c index 3d4e08be1709..b34214e2df5f 100644 --- a/drivers/net/ethernet/freescale/fs_enet/mac-fec.c +++ b/drivers/net/ethernet/freescale/fs_enet/mac-fec.c | |||
@@ -341,6 +341,9 @@ static void restart(struct net_device *dev) | |||
341 | FC(fecp, x_cntrl, FEC_TCNTRL_FDEN); /* FD disable */ | 341 | FC(fecp, x_cntrl, FEC_TCNTRL_FDEN); /* FD disable */ |
342 | } | 342 | } |
343 | 343 | ||
344 | /* Restore multicast and promiscuous settings */ | ||
345 | set_multicast_list(dev); | ||
346 | |||
344 | /* | 347 | /* |
345 | * Enable interrupts we wish to service. | 348 | * Enable interrupts we wish to service. |
346 | */ | 349 | */ |
diff --git a/drivers/net/ethernet/freescale/fs_enet/mac-scc.c b/drivers/net/ethernet/freescale/fs_enet/mac-scc.c index f30411f0701f..7a184e8816a4 100644 --- a/drivers/net/ethernet/freescale/fs_enet/mac-scc.c +++ b/drivers/net/ethernet/freescale/fs_enet/mac-scc.c | |||
@@ -355,6 +355,9 @@ static void restart(struct net_device *dev) | |||
355 | if (fep->phydev->duplex) | 355 | if (fep->phydev->duplex) |
356 | S16(sccp, scc_psmr, SCC_PSMR_LPB | SCC_PSMR_FDE); | 356 | S16(sccp, scc_psmr, SCC_PSMR_LPB | SCC_PSMR_FDE); |
357 | 357 | ||
358 | /* Restore multicast and promiscuous settings */ | ||
359 | set_multicast_list(dev); | ||
360 | |||
358 | S32(sccp, scc_gsmrl, SCC_GSMRL_ENR | SCC_GSMRL_ENT); | 361 | S32(sccp, scc_gsmrl, SCC_GSMRL_ENR | SCC_GSMRL_ENT); |
359 | } | 362 | } |
360 | 363 | ||
diff --git a/drivers/net/ethernet/intel/e1000/e1000_main.c b/drivers/net/ethernet/intel/e1000/e1000_main.c index 5f6aded512f5..24f3986cfae2 100644 --- a/drivers/net/ethernet/intel/e1000/e1000_main.c +++ b/drivers/net/ethernet/intel/e1000/e1000_main.c | |||
@@ -1075,7 +1075,10 @@ static int e1000_probe(struct pci_dev *pdev, const struct pci_device_id *ent) | |||
1075 | NETIF_F_HW_CSUM | | 1075 | NETIF_F_HW_CSUM | |
1076 | NETIF_F_SG); | 1076 | NETIF_F_SG); |
1077 | 1077 | ||
1078 | netdev->priv_flags |= IFF_UNICAST_FLT; | 1078 | /* Do not set IFF_UNICAST_FLT for VMWare's 82545EM */ |
1079 | if (hw->device_id != E1000_DEV_ID_82545EM_COPPER || | ||
1080 | hw->subsystem_vendor_id != PCI_VENDOR_ID_VMWARE) | ||
1081 | netdev->priv_flags |= IFF_UNICAST_FLT; | ||
1079 | 1082 | ||
1080 | adapter->en_mng_pt = e1000_enable_mng_pass_thru(hw); | 1083 | adapter->en_mng_pt = e1000_enable_mng_pass_thru(hw); |
1081 | 1084 | ||
diff --git a/drivers/net/ethernet/intel/i40e/i40e_main.c b/drivers/net/ethernet/intel/i40e/i40e_main.c index ed5f1c15fb0f..c3a7f4a4b775 100644 --- a/drivers/net/ethernet/intel/i40e/i40e_main.c +++ b/drivers/net/ethernet/intel/i40e/i40e_main.c | |||
@@ -6151,7 +6151,7 @@ static void i40e_handle_mdd_event(struct i40e_pf *pf) | |||
6151 | I40E_GL_MDET_TX_PF_NUM_SHIFT; | 6151 | I40E_GL_MDET_TX_PF_NUM_SHIFT; |
6152 | u8 vf_num = (reg & I40E_GL_MDET_TX_VF_NUM_MASK) >> | 6152 | u8 vf_num = (reg & I40E_GL_MDET_TX_VF_NUM_MASK) >> |
6153 | I40E_GL_MDET_TX_VF_NUM_SHIFT; | 6153 | I40E_GL_MDET_TX_VF_NUM_SHIFT; |
6154 | u8 event = (reg & I40E_GL_MDET_TX_EVENT_SHIFT) >> | 6154 | u8 event = (reg & I40E_GL_MDET_TX_EVENT_MASK) >> |
6155 | I40E_GL_MDET_TX_EVENT_SHIFT; | 6155 | I40E_GL_MDET_TX_EVENT_SHIFT; |
6156 | u8 queue = (reg & I40E_GL_MDET_TX_QUEUE_MASK) >> | 6156 | u8 queue = (reg & I40E_GL_MDET_TX_QUEUE_MASK) >> |
6157 | I40E_GL_MDET_TX_QUEUE_SHIFT; | 6157 | I40E_GL_MDET_TX_QUEUE_SHIFT; |
@@ -6165,7 +6165,7 @@ static void i40e_handle_mdd_event(struct i40e_pf *pf) | |||
6165 | if (reg & I40E_GL_MDET_RX_VALID_MASK) { | 6165 | if (reg & I40E_GL_MDET_RX_VALID_MASK) { |
6166 | u8 func = (reg & I40E_GL_MDET_RX_FUNCTION_MASK) >> | 6166 | u8 func = (reg & I40E_GL_MDET_RX_FUNCTION_MASK) >> |
6167 | I40E_GL_MDET_RX_FUNCTION_SHIFT; | 6167 | I40E_GL_MDET_RX_FUNCTION_SHIFT; |
6168 | u8 event = (reg & I40E_GL_MDET_RX_EVENT_SHIFT) >> | 6168 | u8 event = (reg & I40E_GL_MDET_RX_EVENT_MASK) >> |
6169 | I40E_GL_MDET_RX_EVENT_SHIFT; | 6169 | I40E_GL_MDET_RX_EVENT_SHIFT; |
6170 | u8 queue = (reg & I40E_GL_MDET_RX_QUEUE_MASK) >> | 6170 | u8 queue = (reg & I40E_GL_MDET_RX_QUEUE_MASK) >> |
6171 | I40E_GL_MDET_RX_QUEUE_SHIFT; | 6171 | I40E_GL_MDET_RX_QUEUE_SHIFT; |
diff --git a/drivers/net/ethernet/intel/igb/igb_main.c b/drivers/net/ethernet/intel/igb/igb_main.c index a21b14495ebd..a2d72a87cbde 100644 --- a/drivers/net/ethernet/intel/igb/igb_main.c +++ b/drivers/net/ethernet/intel/igb/igb_main.c | |||
@@ -6537,6 +6537,9 @@ static bool igb_can_reuse_rx_page(struct igb_rx_buffer *rx_buffer, | |||
6537 | if (unlikely(page_to_nid(page) != numa_node_id())) | 6537 | if (unlikely(page_to_nid(page) != numa_node_id())) |
6538 | return false; | 6538 | return false; |
6539 | 6539 | ||
6540 | if (unlikely(page->pfmemalloc)) | ||
6541 | return false; | ||
6542 | |||
6540 | #if (PAGE_SIZE < 8192) | 6543 | #if (PAGE_SIZE < 8192) |
6541 | /* if we are only owner of page we can reuse it */ | 6544 | /* if we are only owner of page we can reuse it */ |
6542 | if (unlikely(page_count(page) != 1)) | 6545 | if (unlikely(page_count(page) != 1)) |
@@ -6603,7 +6606,8 @@ static bool igb_add_rx_frag(struct igb_ring *rx_ring, | |||
6603 | memcpy(__skb_put(skb, size), va, ALIGN(size, sizeof(long))); | 6606 | memcpy(__skb_put(skb, size), va, ALIGN(size, sizeof(long))); |
6604 | 6607 | ||
6605 | /* we can reuse buffer as-is, just make sure it is local */ | 6608 | /* we can reuse buffer as-is, just make sure it is local */ |
6606 | if (likely(page_to_nid(page) == numa_node_id())) | 6609 | if (likely((page_to_nid(page) == numa_node_id()) && |
6610 | !page->pfmemalloc)) | ||
6607 | return true; | 6611 | return true; |
6608 | 6612 | ||
6609 | /* this page cannot be reused so discard it */ | 6613 | /* this page cannot be reused so discard it */ |
diff --git a/drivers/net/ethernet/intel/ixgbe/ixgbe_ethtool.c b/drivers/net/ethernet/intel/ixgbe/ixgbe_ethtool.c index 3ce4a258f945..0ae038b9af90 100644 --- a/drivers/net/ethernet/intel/ixgbe/ixgbe_ethtool.c +++ b/drivers/net/ethernet/intel/ixgbe/ixgbe_ethtool.c | |||
@@ -342,12 +342,16 @@ static int ixgbe_set_settings(struct net_device *netdev, | |||
342 | if (old == advertised) | 342 | if (old == advertised) |
343 | return err; | 343 | return err; |
344 | /* this sets the link speed and restarts auto-neg */ | 344 | /* this sets the link speed and restarts auto-neg */ |
345 | while (test_and_set_bit(__IXGBE_IN_SFP_INIT, &adapter->state)) | ||
346 | usleep_range(1000, 2000); | ||
347 | |||
345 | hw->mac.autotry_restart = true; | 348 | hw->mac.autotry_restart = true; |
346 | err = hw->mac.ops.setup_link(hw, advertised, true); | 349 | err = hw->mac.ops.setup_link(hw, advertised, true); |
347 | if (err) { | 350 | if (err) { |
348 | e_info(probe, "setup link failed with code %d\n", err); | 351 | e_info(probe, "setup link failed with code %d\n", err); |
349 | hw->mac.ops.setup_link(hw, old, true); | 352 | hw->mac.ops.setup_link(hw, old, true); |
350 | } | 353 | } |
354 | clear_bit(__IXGBE_IN_SFP_INIT, &adapter->state); | ||
351 | } else { | 355 | } else { |
352 | /* in this case we currently only support 10Gb/FULL */ | 356 | /* in this case we currently only support 10Gb/FULL */ |
353 | u32 speed = ethtool_cmd_speed(ecmd); | 357 | u32 speed = ethtool_cmd_speed(ecmd); |
diff --git a/drivers/net/ethernet/intel/ixgbe/ixgbe_main.c b/drivers/net/ethernet/intel/ixgbe/ixgbe_main.c index fec5212d4337..d2df4e3d1032 100644 --- a/drivers/net/ethernet/intel/ixgbe/ixgbe_main.c +++ b/drivers/net/ethernet/intel/ixgbe/ixgbe_main.c | |||
@@ -4321,8 +4321,8 @@ static void ixgbe_clean_rx_ring(struct ixgbe_ring *rx_ring) | |||
4321 | IXGBE_CB(skb)->page_released = false; | 4321 | IXGBE_CB(skb)->page_released = false; |
4322 | } | 4322 | } |
4323 | dev_kfree_skb(skb); | 4323 | dev_kfree_skb(skb); |
4324 | rx_buffer->skb = NULL; | ||
4324 | } | 4325 | } |
4325 | rx_buffer->skb = NULL; | ||
4326 | if (rx_buffer->dma) | 4326 | if (rx_buffer->dma) |
4327 | dma_unmap_page(dev, rx_buffer->dma, | 4327 | dma_unmap_page(dev, rx_buffer->dma, |
4328 | ixgbe_rx_pg_size(rx_ring), | 4328 | ixgbe_rx_pg_size(rx_ring), |
diff --git a/drivers/net/ethernet/mellanox/mlx4/en_tx.c b/drivers/net/ethernet/mellanox/mlx4/en_tx.c index 34c137878545..454d9fea640e 100644 --- a/drivers/net/ethernet/mellanox/mlx4/en_tx.c +++ b/drivers/net/ethernet/mellanox/mlx4/en_tx.c | |||
@@ -836,8 +836,11 @@ netdev_tx_t mlx4_en_xmit(struct sk_buff *skb, struct net_device *dev) | |||
836 | * whether LSO is used */ | 836 | * whether LSO is used */ |
837 | tx_desc->ctrl.srcrb_flags = priv->ctrl_flags; | 837 | tx_desc->ctrl.srcrb_flags = priv->ctrl_flags; |
838 | if (likely(skb->ip_summed == CHECKSUM_PARTIAL)) { | 838 | if (likely(skb->ip_summed == CHECKSUM_PARTIAL)) { |
839 | tx_desc->ctrl.srcrb_flags |= cpu_to_be32(MLX4_WQE_CTRL_IP_CSUM | | 839 | if (!skb->encapsulation) |
840 | MLX4_WQE_CTRL_TCP_UDP_CSUM); | 840 | tx_desc->ctrl.srcrb_flags |= cpu_to_be32(MLX4_WQE_CTRL_IP_CSUM | |
841 | MLX4_WQE_CTRL_TCP_UDP_CSUM); | ||
842 | else | ||
843 | tx_desc->ctrl.srcrb_flags |= cpu_to_be32(MLX4_WQE_CTRL_IP_CSUM); | ||
841 | ring->tx_csum++; | 844 | ring->tx_csum++; |
842 | } | 845 | } |
843 | 846 | ||
diff --git a/drivers/net/ethernet/mellanox/mlx4/eq.c b/drivers/net/ethernet/mellanox/mlx4/eq.c index a49c9d11d8a5..49290a405903 100644 --- a/drivers/net/ethernet/mellanox/mlx4/eq.c +++ b/drivers/net/ethernet/mellanox/mlx4/eq.c | |||
@@ -1026,6 +1026,7 @@ static void mlx4_free_eq(struct mlx4_dev *dev, | |||
1026 | pr_cont("\n"); | 1026 | pr_cont("\n"); |
1027 | } | 1027 | } |
1028 | } | 1028 | } |
1029 | synchronize_irq(eq->irq); | ||
1029 | 1030 | ||
1030 | mlx4_mtt_cleanup(dev, &eq->mtt); | 1031 | mlx4_mtt_cleanup(dev, &eq->mtt); |
1031 | for (i = 0; i < npages; ++i) | 1032 | for (i = 0; i < npages; ++i) |
diff --git a/drivers/net/ethernet/mellanox/mlx4/mcg.c b/drivers/net/ethernet/mellanox/mlx4/mcg.c index ca0f98c95105..872843179f44 100644 --- a/drivers/net/ethernet/mellanox/mlx4/mcg.c +++ b/drivers/net/ethernet/mellanox/mlx4/mcg.c | |||
@@ -955,6 +955,10 @@ static void mlx4_err_rule(struct mlx4_dev *dev, char *str, | |||
955 | cur->ib.dst_gid_msk); | 955 | cur->ib.dst_gid_msk); |
956 | break; | 956 | break; |
957 | 957 | ||
958 | case MLX4_NET_TRANS_RULE_ID_VXLAN: | ||
959 | len += snprintf(buf + len, BUF_SIZE - len, | ||
960 | "VNID = %d ", be32_to_cpu(cur->vxlan.vni)); | ||
961 | break; | ||
958 | case MLX4_NET_TRANS_RULE_ID_IPV6: | 962 | case MLX4_NET_TRANS_RULE_ID_IPV6: |
959 | break; | 963 | break; |
960 | 964 | ||
diff --git a/drivers/net/ethernet/mellanox/mlx5/core/eq.c b/drivers/net/ethernet/mellanox/mlx5/core/eq.c index ed53291468f3..a278238a2db6 100644 --- a/drivers/net/ethernet/mellanox/mlx5/core/eq.c +++ b/drivers/net/ethernet/mellanox/mlx5/core/eq.c | |||
@@ -420,6 +420,7 @@ int mlx5_destroy_unmap_eq(struct mlx5_core_dev *dev, struct mlx5_eq *eq) | |||
420 | if (err) | 420 | if (err) |
421 | mlx5_core_warn(dev, "failed to destroy a previously created eq: eqn %d\n", | 421 | mlx5_core_warn(dev, "failed to destroy a previously created eq: eqn %d\n", |
422 | eq->eqn); | 422 | eq->eqn); |
423 | synchronize_irq(table->msix_arr[eq->irqn].vector); | ||
423 | mlx5_buf_free(dev, &eq->buf); | 424 | mlx5_buf_free(dev, &eq->buf); |
424 | 425 | ||
425 | return err; | 426 | return err; |
diff --git a/drivers/net/ethernet/sfc/tx.c b/drivers/net/ethernet/sfc/tx.c index ee84a90e371c..aaf2987512b5 100644 --- a/drivers/net/ethernet/sfc/tx.c +++ b/drivers/net/ethernet/sfc/tx.c | |||
@@ -343,8 +343,6 @@ netdev_tx_t efx_enqueue_skb(struct efx_tx_queue *tx_queue, struct sk_buff *skb) | |||
343 | unsigned short dma_flags; | 343 | unsigned short dma_flags; |
344 | int i = 0; | 344 | int i = 0; |
345 | 345 | ||
346 | EFX_BUG_ON_PARANOID(tx_queue->write_count > tx_queue->insert_count); | ||
347 | |||
348 | if (skb_shinfo(skb)->gso_size) | 346 | if (skb_shinfo(skb)->gso_size) |
349 | return efx_enqueue_skb_tso(tx_queue, skb); | 347 | return efx_enqueue_skb_tso(tx_queue, skb); |
350 | 348 | ||
@@ -1258,8 +1256,6 @@ static int efx_enqueue_skb_tso(struct efx_tx_queue *tx_queue, | |||
1258 | /* Find the packet protocol and sanity-check it */ | 1256 | /* Find the packet protocol and sanity-check it */ |
1259 | state.protocol = efx_tso_check_protocol(skb); | 1257 | state.protocol = efx_tso_check_protocol(skb); |
1260 | 1258 | ||
1261 | EFX_BUG_ON_PARANOID(tx_queue->write_count > tx_queue->insert_count); | ||
1262 | |||
1263 | rc = tso_start(&state, efx, skb); | 1259 | rc = tso_start(&state, efx, skb); |
1264 | if (rc) | 1260 | if (rc) |
1265 | goto mem_err; | 1261 | goto mem_err; |
diff --git a/drivers/net/ethernet/smsc/smc91x.c b/drivers/net/ethernet/smsc/smc91x.c index 5e94d00b96b3..2c62208077fe 100644 --- a/drivers/net/ethernet/smsc/smc91x.c +++ b/drivers/net/ethernet/smsc/smc91x.c | |||
@@ -81,6 +81,7 @@ static const char version[] = | |||
81 | #include <linux/workqueue.h> | 81 | #include <linux/workqueue.h> |
82 | #include <linux/of.h> | 82 | #include <linux/of.h> |
83 | #include <linux/of_device.h> | 83 | #include <linux/of_device.h> |
84 | #include <linux/of_gpio.h> | ||
84 | 85 | ||
85 | #include <linux/netdevice.h> | 86 | #include <linux/netdevice.h> |
86 | #include <linux/etherdevice.h> | 87 | #include <linux/etherdevice.h> |
@@ -2188,6 +2189,41 @@ static const struct of_device_id smc91x_match[] = { | |||
2188 | {}, | 2189 | {}, |
2189 | }; | 2190 | }; |
2190 | MODULE_DEVICE_TABLE(of, smc91x_match); | 2191 | MODULE_DEVICE_TABLE(of, smc91x_match); |
2192 | |||
2193 | /** | ||
2194 | * of_try_set_control_gpio - configure a gpio if it exists | ||
2195 | */ | ||
2196 | static int try_toggle_control_gpio(struct device *dev, | ||
2197 | struct gpio_desc **desc, | ||
2198 | const char *name, int index, | ||
2199 | int value, unsigned int nsdelay) | ||
2200 | { | ||
2201 | struct gpio_desc *gpio = *desc; | ||
2202 | int res; | ||
2203 | |||
2204 | gpio = devm_gpiod_get_index(dev, name, index); | ||
2205 | if (IS_ERR(gpio)) { | ||
2206 | if (PTR_ERR(gpio) == -ENOENT) { | ||
2207 | *desc = NULL; | ||
2208 | return 0; | ||
2209 | } | ||
2210 | |||
2211 | return PTR_ERR(gpio); | ||
2212 | } | ||
2213 | res = gpiod_direction_output(gpio, !value); | ||
2214 | if (res) { | ||
2215 | dev_err(dev, "unable to toggle gpio %s: %i\n", name, res); | ||
2216 | devm_gpiod_put(dev, gpio); | ||
2217 | gpio = NULL; | ||
2218 | return res; | ||
2219 | } | ||
2220 | if (nsdelay) | ||
2221 | usleep_range(nsdelay, 2 * nsdelay); | ||
2222 | gpiod_set_value_cansleep(gpio, value); | ||
2223 | *desc = gpio; | ||
2224 | |||
2225 | return 0; | ||
2226 | } | ||
2191 | #endif | 2227 | #endif |
2192 | 2228 | ||
2193 | /* | 2229 | /* |
@@ -2237,6 +2273,28 @@ static int smc_drv_probe(struct platform_device *pdev) | |||
2237 | struct device_node *np = pdev->dev.of_node; | 2273 | struct device_node *np = pdev->dev.of_node; |
2238 | u32 val; | 2274 | u32 val; |
2239 | 2275 | ||
2276 | /* Optional pwrdwn GPIO configured? */ | ||
2277 | ret = try_toggle_control_gpio(&pdev->dev, &lp->power_gpio, | ||
2278 | "power", 0, 0, 100); | ||
2279 | if (ret) | ||
2280 | return ret; | ||
2281 | |||
2282 | /* | ||
2283 | * Optional reset GPIO configured? Minimum 100 ns reset needed | ||
2284 | * according to LAN91C96 datasheet page 14. | ||
2285 | */ | ||
2286 | ret = try_toggle_control_gpio(&pdev->dev, &lp->reset_gpio, | ||
2287 | "reset", 0, 0, 100); | ||
2288 | if (ret) | ||
2289 | return ret; | ||
2290 | |||
2291 | /* | ||
2292 | * Need to wait for optional EEPROM to load, max 750 us according | ||
2293 | * to LAN91C96 datasheet page 55. | ||
2294 | */ | ||
2295 | if (lp->reset_gpio) | ||
2296 | usleep_range(750, 1000); | ||
2297 | |||
2240 | /* Combination of IO widths supported, default to 16-bit */ | 2298 | /* Combination of IO widths supported, default to 16-bit */ |
2241 | if (!of_property_read_u32(np, "reg-io-width", &val)) { | 2299 | if (!of_property_read_u32(np, "reg-io-width", &val)) { |
2242 | if (val & 1) | 2300 | if (val & 1) |
diff --git a/drivers/net/ethernet/smsc/smc91x.h b/drivers/net/ethernet/smsc/smc91x.h index 47dce918eb0f..2a38dacbbd27 100644 --- a/drivers/net/ethernet/smsc/smc91x.h +++ b/drivers/net/ethernet/smsc/smc91x.h | |||
@@ -298,6 +298,9 @@ struct smc_local { | |||
298 | struct sk_buff *pending_tx_skb; | 298 | struct sk_buff *pending_tx_skb; |
299 | struct tasklet_struct tx_task; | 299 | struct tasklet_struct tx_task; |
300 | 300 | ||
301 | struct gpio_desc *power_gpio; | ||
302 | struct gpio_desc *reset_gpio; | ||
303 | |||
301 | /* version/revision of the SMC91x chip */ | 304 | /* version/revision of the SMC91x chip */ |
302 | int version; | 305 | int version; |
303 | 306 | ||
diff --git a/drivers/net/ethernet/stmicro/stmmac/stmmac_pci.c b/drivers/net/ethernet/stmicro/stmmac/stmmac_pci.c index 655a23bbc451..e17a970eaf2b 100644 --- a/drivers/net/ethernet/stmicro/stmmac/stmmac_pci.c +++ b/drivers/net/ethernet/stmicro/stmmac/stmmac_pci.c | |||
@@ -33,6 +33,7 @@ static struct stmmac_dma_cfg dma_cfg; | |||
33 | static void stmmac_default_data(void) | 33 | static void stmmac_default_data(void) |
34 | { | 34 | { |
35 | memset(&plat_dat, 0, sizeof(struct plat_stmmacenet_data)); | 35 | memset(&plat_dat, 0, sizeof(struct plat_stmmacenet_data)); |
36 | |||
36 | plat_dat.bus_id = 1; | 37 | plat_dat.bus_id = 1; |
37 | plat_dat.phy_addr = 0; | 38 | plat_dat.phy_addr = 0; |
38 | plat_dat.interface = PHY_INTERFACE_MODE_GMII; | 39 | plat_dat.interface = PHY_INTERFACE_MODE_GMII; |
@@ -47,6 +48,12 @@ static void stmmac_default_data(void) | |||
47 | dma_cfg.pbl = 32; | 48 | dma_cfg.pbl = 32; |
48 | dma_cfg.burst_len = DMA_AXI_BLEN_256; | 49 | dma_cfg.burst_len = DMA_AXI_BLEN_256; |
49 | plat_dat.dma_cfg = &dma_cfg; | 50 | plat_dat.dma_cfg = &dma_cfg; |
51 | |||
52 | /* Set default value for multicast hash bins */ | ||
53 | plat_dat.multicast_filter_bins = HASH_TABLE_SIZE; | ||
54 | |||
55 | /* Set default value for unicast filter entries */ | ||
56 | plat_dat.unicast_filter_entries = 1; | ||
50 | } | 57 | } |
51 | 58 | ||
52 | /** | 59 | /** |
diff --git a/drivers/net/ethernet/ti/cpsw.c b/drivers/net/ethernet/ti/cpsw.c index 952e1e4764b7..d8794488f80a 100644 --- a/drivers/net/ethernet/ti/cpsw.c +++ b/drivers/net/ethernet/ti/cpsw.c | |||
@@ -591,8 +591,8 @@ static void cpsw_set_promiscious(struct net_device *ndev, bool enable) | |||
591 | if (enable) { | 591 | if (enable) { |
592 | unsigned long timeout = jiffies + HZ; | 592 | unsigned long timeout = jiffies + HZ; |
593 | 593 | ||
594 | /* Disable Learn for all ports */ | 594 | /* Disable Learn for all ports (host is port 0 and slaves are port 1 and up */ |
595 | for (i = 0; i < priv->data.slaves; i++) { | 595 | for (i = 0; i <= priv->data.slaves; i++) { |
596 | cpsw_ale_control_set(ale, i, | 596 | cpsw_ale_control_set(ale, i, |
597 | ALE_PORT_NOLEARN, 1); | 597 | ALE_PORT_NOLEARN, 1); |
598 | cpsw_ale_control_set(ale, i, | 598 | cpsw_ale_control_set(ale, i, |
@@ -616,11 +616,11 @@ static void cpsw_set_promiscious(struct net_device *ndev, bool enable) | |||
616 | cpsw_ale_control_set(ale, 0, ALE_P0_UNI_FLOOD, 1); | 616 | cpsw_ale_control_set(ale, 0, ALE_P0_UNI_FLOOD, 1); |
617 | dev_dbg(&ndev->dev, "promiscuity enabled\n"); | 617 | dev_dbg(&ndev->dev, "promiscuity enabled\n"); |
618 | } else { | 618 | } else { |
619 | /* Flood All Unicast Packets to Host port */ | 619 | /* Don't Flood All Unicast Packets to Host port */ |
620 | cpsw_ale_control_set(ale, 0, ALE_P0_UNI_FLOOD, 0); | 620 | cpsw_ale_control_set(ale, 0, ALE_P0_UNI_FLOOD, 0); |
621 | 621 | ||
622 | /* Enable Learn for all ports */ | 622 | /* Enable Learn for all ports (host is port 0 and slaves are port 1 and up */ |
623 | for (i = 0; i < priv->data.slaves; i++) { | 623 | for (i = 0; i <= priv->data.slaves; i++) { |
624 | cpsw_ale_control_set(ale, i, | 624 | cpsw_ale_control_set(ale, i, |
625 | ALE_PORT_NOLEARN, 0); | 625 | ALE_PORT_NOLEARN, 0); |
626 | cpsw_ale_control_set(ale, i, | 626 | cpsw_ale_control_set(ale, i, |
@@ -638,12 +638,16 @@ static void cpsw_ndo_set_rx_mode(struct net_device *ndev) | |||
638 | if (ndev->flags & IFF_PROMISC) { | 638 | if (ndev->flags & IFF_PROMISC) { |
639 | /* Enable promiscuous mode */ | 639 | /* Enable promiscuous mode */ |
640 | cpsw_set_promiscious(ndev, true); | 640 | cpsw_set_promiscious(ndev, true); |
641 | cpsw_ale_set_allmulti(priv->ale, IFF_ALLMULTI); | ||
641 | return; | 642 | return; |
642 | } else { | 643 | } else { |
643 | /* Disable promiscuous mode */ | 644 | /* Disable promiscuous mode */ |
644 | cpsw_set_promiscious(ndev, false); | 645 | cpsw_set_promiscious(ndev, false); |
645 | } | 646 | } |
646 | 647 | ||
648 | /* Restore allmulti on vlans if necessary */ | ||
649 | cpsw_ale_set_allmulti(priv->ale, priv->ndev->flags & IFF_ALLMULTI); | ||
650 | |||
647 | /* Clear all mcast from ALE */ | 651 | /* Clear all mcast from ALE */ |
648 | cpsw_ale_flush_multicast(priv->ale, ALE_ALL_PORTS << priv->host_port); | 652 | cpsw_ale_flush_multicast(priv->ale, ALE_ALL_PORTS << priv->host_port); |
649 | 653 | ||
@@ -1149,6 +1153,7 @@ static inline void cpsw_add_default_vlan(struct cpsw_priv *priv) | |||
1149 | const int port = priv->host_port; | 1153 | const int port = priv->host_port; |
1150 | u32 reg; | 1154 | u32 reg; |
1151 | int i; | 1155 | int i; |
1156 | int unreg_mcast_mask; | ||
1152 | 1157 | ||
1153 | reg = (priv->version == CPSW_VERSION_1) ? CPSW1_PORT_VLAN : | 1158 | reg = (priv->version == CPSW_VERSION_1) ? CPSW1_PORT_VLAN : |
1154 | CPSW2_PORT_VLAN; | 1159 | CPSW2_PORT_VLAN; |
@@ -1158,9 +1163,14 @@ static inline void cpsw_add_default_vlan(struct cpsw_priv *priv) | |||
1158 | for (i = 0; i < priv->data.slaves; i++) | 1163 | for (i = 0; i < priv->data.slaves; i++) |
1159 | slave_write(priv->slaves + i, vlan, reg); | 1164 | slave_write(priv->slaves + i, vlan, reg); |
1160 | 1165 | ||
1166 | if (priv->ndev->flags & IFF_ALLMULTI) | ||
1167 | unreg_mcast_mask = ALE_ALL_PORTS; | ||
1168 | else | ||
1169 | unreg_mcast_mask = ALE_PORT_1 | ALE_PORT_2; | ||
1170 | |||
1161 | cpsw_ale_add_vlan(priv->ale, vlan, ALE_ALL_PORTS << port, | 1171 | cpsw_ale_add_vlan(priv->ale, vlan, ALE_ALL_PORTS << port, |
1162 | ALE_ALL_PORTS << port, ALE_ALL_PORTS << port, | 1172 | ALE_ALL_PORTS << port, ALE_ALL_PORTS << port, |
1163 | (ALE_PORT_1 | ALE_PORT_2) << port); | 1173 | unreg_mcast_mask << port); |
1164 | } | 1174 | } |
1165 | 1175 | ||
1166 | static void cpsw_init_host_port(struct cpsw_priv *priv) | 1176 | static void cpsw_init_host_port(struct cpsw_priv *priv) |
@@ -1620,11 +1630,17 @@ static inline int cpsw_add_vlan_ale_entry(struct cpsw_priv *priv, | |||
1620 | unsigned short vid) | 1630 | unsigned short vid) |
1621 | { | 1631 | { |
1622 | int ret; | 1632 | int ret; |
1633 | int unreg_mcast_mask; | ||
1634 | |||
1635 | if (priv->ndev->flags & IFF_ALLMULTI) | ||
1636 | unreg_mcast_mask = ALE_ALL_PORTS; | ||
1637 | else | ||
1638 | unreg_mcast_mask = ALE_PORT_1 | ALE_PORT_2; | ||
1623 | 1639 | ||
1624 | ret = cpsw_ale_add_vlan(priv->ale, vid, | 1640 | ret = cpsw_ale_add_vlan(priv->ale, vid, |
1625 | ALE_ALL_PORTS << priv->host_port, | 1641 | ALE_ALL_PORTS << priv->host_port, |
1626 | 0, ALE_ALL_PORTS << priv->host_port, | 1642 | 0, ALE_ALL_PORTS << priv->host_port, |
1627 | (ALE_PORT_1 | ALE_PORT_2) << priv->host_port); | 1643 | unreg_mcast_mask << priv->host_port); |
1628 | if (ret != 0) | 1644 | if (ret != 0) |
1629 | return ret; | 1645 | return ret; |
1630 | 1646 | ||
@@ -2006,7 +2022,7 @@ static int cpsw_probe_dt(struct cpsw_platform_data *data, | |||
2006 | parp = of_get_property(slave_node, "phy_id", &lenp); | 2022 | parp = of_get_property(slave_node, "phy_id", &lenp); |
2007 | if ((parp == NULL) || (lenp != (sizeof(void *) * 2))) { | 2023 | if ((parp == NULL) || (lenp != (sizeof(void *) * 2))) { |
2008 | dev_err(&pdev->dev, "Missing slave[%d] phy_id property\n", i); | 2024 | dev_err(&pdev->dev, "Missing slave[%d] phy_id property\n", i); |
2009 | return -EINVAL; | 2025 | goto no_phy_slave; |
2010 | } | 2026 | } |
2011 | mdio_node = of_find_node_by_phandle(be32_to_cpup(parp)); | 2027 | mdio_node = of_find_node_by_phandle(be32_to_cpup(parp)); |
2012 | phyid = be32_to_cpup(parp+1); | 2028 | phyid = be32_to_cpup(parp+1); |
@@ -2019,6 +2035,14 @@ static int cpsw_probe_dt(struct cpsw_platform_data *data, | |||
2019 | snprintf(slave_data->phy_id, sizeof(slave_data->phy_id), | 2035 | snprintf(slave_data->phy_id, sizeof(slave_data->phy_id), |
2020 | PHY_ID_FMT, mdio->name, phyid); | 2036 | PHY_ID_FMT, mdio->name, phyid); |
2021 | 2037 | ||
2038 | slave_data->phy_if = of_get_phy_mode(slave_node); | ||
2039 | if (slave_data->phy_if < 0) { | ||
2040 | dev_err(&pdev->dev, "Missing or malformed slave[%d] phy-mode property\n", | ||
2041 | i); | ||
2042 | return slave_data->phy_if; | ||
2043 | } | ||
2044 | |||
2045 | no_phy_slave: | ||
2022 | mac_addr = of_get_mac_address(slave_node); | 2046 | mac_addr = of_get_mac_address(slave_node); |
2023 | if (mac_addr) { | 2047 | if (mac_addr) { |
2024 | memcpy(slave_data->mac_addr, mac_addr, ETH_ALEN); | 2048 | memcpy(slave_data->mac_addr, mac_addr, ETH_ALEN); |
@@ -2030,14 +2054,6 @@ static int cpsw_probe_dt(struct cpsw_platform_data *data, | |||
2030 | return ret; | 2054 | return ret; |
2031 | } | 2055 | } |
2032 | } | 2056 | } |
2033 | |||
2034 | slave_data->phy_if = of_get_phy_mode(slave_node); | ||
2035 | if (slave_data->phy_if < 0) { | ||
2036 | dev_err(&pdev->dev, "Missing or malformed slave[%d] phy-mode property\n", | ||
2037 | i); | ||
2038 | return slave_data->phy_if; | ||
2039 | } | ||
2040 | |||
2041 | if (data->dual_emac) { | 2057 | if (data->dual_emac) { |
2042 | if (of_property_read_u32(slave_node, "dual_emac_res_vlan", | 2058 | if (of_property_read_u32(slave_node, "dual_emac_res_vlan", |
2043 | &prop)) { | 2059 | &prop)) { |
diff --git a/drivers/net/ethernet/ti/cpsw_ale.c b/drivers/net/ethernet/ti/cpsw_ale.c index 0579b2243bb6..3ae83879a75f 100644 --- a/drivers/net/ethernet/ti/cpsw_ale.c +++ b/drivers/net/ethernet/ti/cpsw_ale.c | |||
@@ -443,6 +443,35 @@ int cpsw_ale_del_vlan(struct cpsw_ale *ale, u16 vid, int port_mask) | |||
443 | return 0; | 443 | return 0; |
444 | } | 444 | } |
445 | 445 | ||
446 | void cpsw_ale_set_allmulti(struct cpsw_ale *ale, int allmulti) | ||
447 | { | ||
448 | u32 ale_entry[ALE_ENTRY_WORDS]; | ||
449 | int type, idx; | ||
450 | int unreg_mcast = 0; | ||
451 | |||
452 | /* Only bother doing the work if the setting is actually changing */ | ||
453 | if (ale->allmulti == allmulti) | ||
454 | return; | ||
455 | |||
456 | /* Remember the new setting to check against next time */ | ||
457 | ale->allmulti = allmulti; | ||
458 | |||
459 | for (idx = 0; idx < ale->params.ale_entries; idx++) { | ||
460 | cpsw_ale_read(ale, idx, ale_entry); | ||
461 | type = cpsw_ale_get_entry_type(ale_entry); | ||
462 | if (type != ALE_TYPE_VLAN) | ||
463 | continue; | ||
464 | |||
465 | unreg_mcast = cpsw_ale_get_vlan_unreg_mcast(ale_entry); | ||
466 | if (allmulti) | ||
467 | unreg_mcast |= 1; | ||
468 | else | ||
469 | unreg_mcast &= ~1; | ||
470 | cpsw_ale_set_vlan_unreg_mcast(ale_entry, unreg_mcast); | ||
471 | cpsw_ale_write(ale, idx, ale_entry); | ||
472 | } | ||
473 | } | ||
474 | |||
446 | struct ale_control_info { | 475 | struct ale_control_info { |
447 | const char *name; | 476 | const char *name; |
448 | int offset, port_offset; | 477 | int offset, port_offset; |
diff --git a/drivers/net/ethernet/ti/cpsw_ale.h b/drivers/net/ethernet/ti/cpsw_ale.h index 31cf43cab42e..c0d4127aa549 100644 --- a/drivers/net/ethernet/ti/cpsw_ale.h +++ b/drivers/net/ethernet/ti/cpsw_ale.h | |||
@@ -27,6 +27,7 @@ struct cpsw_ale { | |||
27 | struct cpsw_ale_params params; | 27 | struct cpsw_ale_params params; |
28 | struct timer_list timer; | 28 | struct timer_list timer; |
29 | unsigned long ageout; | 29 | unsigned long ageout; |
30 | int allmulti; | ||
30 | }; | 31 | }; |
31 | 32 | ||
32 | enum cpsw_ale_control { | 33 | enum cpsw_ale_control { |
@@ -103,6 +104,7 @@ int cpsw_ale_del_mcast(struct cpsw_ale *ale, u8 *addr, int port_mask, | |||
103 | int cpsw_ale_add_vlan(struct cpsw_ale *ale, u16 vid, int port, int untag, | 104 | int cpsw_ale_add_vlan(struct cpsw_ale *ale, u16 vid, int port, int untag, |
104 | int reg_mcast, int unreg_mcast); | 105 | int reg_mcast, int unreg_mcast); |
105 | int cpsw_ale_del_vlan(struct cpsw_ale *ale, u16 vid, int port); | 106 | int cpsw_ale_del_vlan(struct cpsw_ale *ale, u16 vid, int port); |
107 | void cpsw_ale_set_allmulti(struct cpsw_ale *ale, int allmulti); | ||
106 | 108 | ||
107 | int cpsw_ale_control_get(struct cpsw_ale *ale, int port, int control); | 109 | int cpsw_ale_control_get(struct cpsw_ale *ale, int port, int control); |
108 | int cpsw_ale_control_set(struct cpsw_ale *ale, int port, | 110 | int cpsw_ale_control_set(struct cpsw_ale *ale, int port, |
diff --git a/drivers/net/hyperv/netvsc_drv.c b/drivers/net/hyperv/netvsc_drv.c index 9e17d1a91e71..78ec33f5100b 100644 --- a/drivers/net/hyperv/netvsc_drv.c +++ b/drivers/net/hyperv/netvsc_drv.c | |||
@@ -550,6 +550,7 @@ do_lso: | |||
550 | do_send: | 550 | do_send: |
551 | /* Start filling in the page buffers with the rndis hdr */ | 551 | /* Start filling in the page buffers with the rndis hdr */ |
552 | rndis_msg->msg_len += rndis_msg_size; | 552 | rndis_msg->msg_len += rndis_msg_size; |
553 | packet->total_data_buflen = rndis_msg->msg_len; | ||
553 | packet->page_buf_cnt = init_page_array(rndis_msg, rndis_msg_size, | 554 | packet->page_buf_cnt = init_page_array(rndis_msg, rndis_msg_size, |
554 | skb, &packet->page_buf[0]); | 555 | skb, &packet->page_buf[0]); |
555 | 556 | ||
diff --git a/drivers/net/macvlan.c b/drivers/net/macvlan.c index 29b3bb410781..bfb0b6ec8c56 100644 --- a/drivers/net/macvlan.c +++ b/drivers/net/macvlan.c | |||
@@ -272,7 +272,7 @@ static void macvlan_process_broadcast(struct work_struct *w) | |||
272 | struct sk_buff *skb; | 272 | struct sk_buff *skb; |
273 | struct sk_buff_head list; | 273 | struct sk_buff_head list; |
274 | 274 | ||
275 | skb_queue_head_init(&list); | 275 | __skb_queue_head_init(&list); |
276 | 276 | ||
277 | spin_lock_bh(&port->bc_queue.lock); | 277 | spin_lock_bh(&port->bc_queue.lock); |
278 | skb_queue_splice_tail_init(&port->bc_queue, &list); | 278 | skb_queue_splice_tail_init(&port->bc_queue, &list); |
@@ -1082,9 +1082,15 @@ static void macvlan_port_destroy(struct net_device *dev) | |||
1082 | { | 1082 | { |
1083 | struct macvlan_port *port = macvlan_port_get_rtnl(dev); | 1083 | struct macvlan_port *port = macvlan_port_get_rtnl(dev); |
1084 | 1084 | ||
1085 | cancel_work_sync(&port->bc_work); | ||
1086 | dev->priv_flags &= ~IFF_MACVLAN_PORT; | 1085 | dev->priv_flags &= ~IFF_MACVLAN_PORT; |
1087 | netdev_rx_handler_unregister(dev); | 1086 | netdev_rx_handler_unregister(dev); |
1087 | |||
1088 | /* After this point, no packet can schedule bc_work anymore, | ||
1089 | * but we need to cancel it and purge left skbs if any. | ||
1090 | */ | ||
1091 | cancel_work_sync(&port->bc_work); | ||
1092 | __skb_queue_purge(&port->bc_queue); | ||
1093 | |||
1088 | kfree_rcu(port, rcu); | 1094 | kfree_rcu(port, rcu); |
1089 | } | 1095 | } |
1090 | 1096 | ||
diff --git a/drivers/net/macvtap.c b/drivers/net/macvtap.c index 65e2892342bd..6f226de655a4 100644 --- a/drivers/net/macvtap.c +++ b/drivers/net/macvtap.c | |||
@@ -16,6 +16,7 @@ | |||
16 | #include <linux/idr.h> | 16 | #include <linux/idr.h> |
17 | #include <linux/fs.h> | 17 | #include <linux/fs.h> |
18 | 18 | ||
19 | #include <net/ipv6.h> | ||
19 | #include <net/net_namespace.h> | 20 | #include <net/net_namespace.h> |
20 | #include <net/rtnetlink.h> | 21 | #include <net/rtnetlink.h> |
21 | #include <net/sock.h> | 22 | #include <net/sock.h> |
@@ -65,7 +66,7 @@ static struct cdev macvtap_cdev; | |||
65 | static const struct proto_ops macvtap_socket_ops; | 66 | static const struct proto_ops macvtap_socket_ops; |
66 | 67 | ||
67 | #define TUN_OFFLOADS (NETIF_F_HW_CSUM | NETIF_F_TSO_ECN | NETIF_F_TSO | \ | 68 | #define TUN_OFFLOADS (NETIF_F_HW_CSUM | NETIF_F_TSO_ECN | NETIF_F_TSO | \ |
68 | NETIF_F_TSO6 | NETIF_F_UFO) | 69 | NETIF_F_TSO6) |
69 | #define RX_OFFLOADS (NETIF_F_GRO | NETIF_F_LRO) | 70 | #define RX_OFFLOADS (NETIF_F_GRO | NETIF_F_LRO) |
70 | #define TAP_FEATURES (NETIF_F_GSO | NETIF_F_SG) | 71 | #define TAP_FEATURES (NETIF_F_GSO | NETIF_F_SG) |
71 | 72 | ||
@@ -569,7 +570,11 @@ static int macvtap_skb_from_vnet_hdr(struct sk_buff *skb, | |||
569 | gso_type = SKB_GSO_TCPV6; | 570 | gso_type = SKB_GSO_TCPV6; |
570 | break; | 571 | break; |
571 | case VIRTIO_NET_HDR_GSO_UDP: | 572 | case VIRTIO_NET_HDR_GSO_UDP: |
573 | pr_warn_once("macvtap: %s: using disabled UFO feature; please fix this program\n", | ||
574 | current->comm); | ||
572 | gso_type = SKB_GSO_UDP; | 575 | gso_type = SKB_GSO_UDP; |
576 | if (skb->protocol == htons(ETH_P_IPV6)) | ||
577 | ipv6_proxy_select_ident(skb); | ||
573 | break; | 578 | break; |
574 | default: | 579 | default: |
575 | return -EINVAL; | 580 | return -EINVAL; |
@@ -614,8 +619,6 @@ static void macvtap_skb_to_vnet_hdr(const struct sk_buff *skb, | |||
614 | vnet_hdr->gso_type = VIRTIO_NET_HDR_GSO_TCPV4; | 619 | vnet_hdr->gso_type = VIRTIO_NET_HDR_GSO_TCPV4; |
615 | else if (sinfo->gso_type & SKB_GSO_TCPV6) | 620 | else if (sinfo->gso_type & SKB_GSO_TCPV6) |
616 | vnet_hdr->gso_type = VIRTIO_NET_HDR_GSO_TCPV6; | 621 | vnet_hdr->gso_type = VIRTIO_NET_HDR_GSO_TCPV6; |
617 | else if (sinfo->gso_type & SKB_GSO_UDP) | ||
618 | vnet_hdr->gso_type = VIRTIO_NET_HDR_GSO_UDP; | ||
619 | else | 622 | else |
620 | BUG(); | 623 | BUG(); |
621 | if (sinfo->gso_type & SKB_GSO_TCP_ECN) | 624 | if (sinfo->gso_type & SKB_GSO_TCP_ECN) |
@@ -950,9 +953,6 @@ static int set_offload(struct macvtap_queue *q, unsigned long arg) | |||
950 | if (arg & TUN_F_TSO6) | 953 | if (arg & TUN_F_TSO6) |
951 | feature_mask |= NETIF_F_TSO6; | 954 | feature_mask |= NETIF_F_TSO6; |
952 | } | 955 | } |
953 | |||
954 | if (arg & TUN_F_UFO) | ||
955 | feature_mask |= NETIF_F_UFO; | ||
956 | } | 956 | } |
957 | 957 | ||
958 | /* tun/tap driver inverts the usage for TSO offloads, where | 958 | /* tun/tap driver inverts the usage for TSO offloads, where |
@@ -963,7 +963,7 @@ static int set_offload(struct macvtap_queue *q, unsigned long arg) | |||
963 | * When user space turns off TSO, we turn off GSO/LRO so that | 963 | * When user space turns off TSO, we turn off GSO/LRO so that |
964 | * user-space will not receive TSO frames. | 964 | * user-space will not receive TSO frames. |
965 | */ | 965 | */ |
966 | if (feature_mask & (NETIF_F_TSO | NETIF_F_TSO6 | NETIF_F_UFO)) | 966 | if (feature_mask & (NETIF_F_TSO | NETIF_F_TSO6)) |
967 | features |= RX_OFFLOADS; | 967 | features |= RX_OFFLOADS; |
968 | else | 968 | else |
969 | features &= ~RX_OFFLOADS; | 969 | features &= ~RX_OFFLOADS; |
@@ -1064,7 +1064,7 @@ static long macvtap_ioctl(struct file *file, unsigned int cmd, | |||
1064 | case TUNSETOFFLOAD: | 1064 | case TUNSETOFFLOAD: |
1065 | /* let the user check for future flags */ | 1065 | /* let the user check for future flags */ |
1066 | if (arg & ~(TUN_F_CSUM | TUN_F_TSO4 | TUN_F_TSO6 | | 1066 | if (arg & ~(TUN_F_CSUM | TUN_F_TSO4 | TUN_F_TSO6 | |
1067 | TUN_F_TSO_ECN | TUN_F_UFO)) | 1067 | TUN_F_TSO_ECN)) |
1068 | return -EINVAL; | 1068 | return -EINVAL; |
1069 | 1069 | ||
1070 | rtnl_lock(); | 1070 | rtnl_lock(); |
diff --git a/drivers/net/phy/marvell.c b/drivers/net/phy/marvell.c index bd37e45c89c0..225c033b08f3 100644 --- a/drivers/net/phy/marvell.c +++ b/drivers/net/phy/marvell.c | |||
@@ -50,10 +50,15 @@ | |||
50 | #define MII_M1011_PHY_SCR 0x10 | 50 | #define MII_M1011_PHY_SCR 0x10 |
51 | #define MII_M1011_PHY_SCR_AUTO_CROSS 0x0060 | 51 | #define MII_M1011_PHY_SCR_AUTO_CROSS 0x0060 |
52 | 52 | ||
53 | #define MII_M1145_PHY_EXT_SR 0x1b | ||
53 | #define MII_M1145_PHY_EXT_CR 0x14 | 54 | #define MII_M1145_PHY_EXT_CR 0x14 |
54 | #define MII_M1145_RGMII_RX_DELAY 0x0080 | 55 | #define MII_M1145_RGMII_RX_DELAY 0x0080 |
55 | #define MII_M1145_RGMII_TX_DELAY 0x0002 | 56 | #define MII_M1145_RGMII_TX_DELAY 0x0002 |
56 | 57 | ||
58 | #define MII_M1145_HWCFG_MODE_SGMII_NO_CLK 0x4 | ||
59 | #define MII_M1145_HWCFG_MODE_MASK 0xf | ||
60 | #define MII_M1145_HWCFG_FIBER_COPPER_AUTO 0x8000 | ||
61 | |||
57 | #define MII_M1111_PHY_LED_CONTROL 0x18 | 62 | #define MII_M1111_PHY_LED_CONTROL 0x18 |
58 | #define MII_M1111_PHY_LED_DIRECT 0x4100 | 63 | #define MII_M1111_PHY_LED_DIRECT 0x4100 |
59 | #define MII_M1111_PHY_LED_COMBINE 0x411c | 64 | #define MII_M1111_PHY_LED_COMBINE 0x411c |
@@ -676,6 +681,20 @@ static int m88e1145_config_init(struct phy_device *phydev) | |||
676 | } | 681 | } |
677 | } | 682 | } |
678 | 683 | ||
684 | if (phydev->interface == PHY_INTERFACE_MODE_SGMII) { | ||
685 | int temp = phy_read(phydev, MII_M1145_PHY_EXT_SR); | ||
686 | if (temp < 0) | ||
687 | return temp; | ||
688 | |||
689 | temp &= ~MII_M1145_HWCFG_MODE_MASK; | ||
690 | temp |= MII_M1145_HWCFG_MODE_SGMII_NO_CLK; | ||
691 | temp |= MII_M1145_HWCFG_FIBER_COPPER_AUTO; | ||
692 | |||
693 | err = phy_write(phydev, MII_M1145_PHY_EXT_SR, temp); | ||
694 | if (err < 0) | ||
695 | return err; | ||
696 | } | ||
697 | |||
679 | err = marvell_of_reg_init(phydev); | 698 | err = marvell_of_reg_init(phydev); |
680 | if (err < 0) | 699 | if (err < 0) |
681 | return err; | 700 | return err; |
diff --git a/drivers/net/tun.c b/drivers/net/tun.c index 186ce541c657..7302398f0b1f 100644 --- a/drivers/net/tun.c +++ b/drivers/net/tun.c | |||
@@ -65,6 +65,7 @@ | |||
65 | #include <linux/nsproxy.h> | 65 | #include <linux/nsproxy.h> |
66 | #include <linux/virtio_net.h> | 66 | #include <linux/virtio_net.h> |
67 | #include <linux/rcupdate.h> | 67 | #include <linux/rcupdate.h> |
68 | #include <net/ipv6.h> | ||
68 | #include <net/net_namespace.h> | 69 | #include <net/net_namespace.h> |
69 | #include <net/netns/generic.h> | 70 | #include <net/netns/generic.h> |
70 | #include <net/rtnetlink.h> | 71 | #include <net/rtnetlink.h> |
@@ -174,7 +175,7 @@ struct tun_struct { | |||
174 | struct net_device *dev; | 175 | struct net_device *dev; |
175 | netdev_features_t set_features; | 176 | netdev_features_t set_features; |
176 | #define TUN_USER_FEATURES (NETIF_F_HW_CSUM|NETIF_F_TSO_ECN|NETIF_F_TSO| \ | 177 | #define TUN_USER_FEATURES (NETIF_F_HW_CSUM|NETIF_F_TSO_ECN|NETIF_F_TSO| \ |
177 | NETIF_F_TSO6|NETIF_F_UFO) | 178 | NETIF_F_TSO6) |
178 | 179 | ||
179 | int vnet_hdr_sz; | 180 | int vnet_hdr_sz; |
180 | int sndbuf; | 181 | int sndbuf; |
@@ -1139,6 +1140,8 @@ static ssize_t tun_get_user(struct tun_struct *tun, struct tun_file *tfile, | |||
1139 | break; | 1140 | break; |
1140 | } | 1141 | } |
1141 | 1142 | ||
1143 | skb_reset_network_header(skb); | ||
1144 | |||
1142 | if (gso.gso_type != VIRTIO_NET_HDR_GSO_NONE) { | 1145 | if (gso.gso_type != VIRTIO_NET_HDR_GSO_NONE) { |
1143 | pr_debug("GSO!\n"); | 1146 | pr_debug("GSO!\n"); |
1144 | switch (gso.gso_type & ~VIRTIO_NET_HDR_GSO_ECN) { | 1147 | switch (gso.gso_type & ~VIRTIO_NET_HDR_GSO_ECN) { |
@@ -1149,8 +1152,20 @@ static ssize_t tun_get_user(struct tun_struct *tun, struct tun_file *tfile, | |||
1149 | skb_shinfo(skb)->gso_type = SKB_GSO_TCPV6; | 1152 | skb_shinfo(skb)->gso_type = SKB_GSO_TCPV6; |
1150 | break; | 1153 | break; |
1151 | case VIRTIO_NET_HDR_GSO_UDP: | 1154 | case VIRTIO_NET_HDR_GSO_UDP: |
1155 | { | ||
1156 | static bool warned; | ||
1157 | |||
1158 | if (!warned) { | ||
1159 | warned = true; | ||
1160 | netdev_warn(tun->dev, | ||
1161 | "%s: using disabled UFO feature; please fix this program\n", | ||
1162 | current->comm); | ||
1163 | } | ||
1152 | skb_shinfo(skb)->gso_type = SKB_GSO_UDP; | 1164 | skb_shinfo(skb)->gso_type = SKB_GSO_UDP; |
1165 | if (skb->protocol == htons(ETH_P_IPV6)) | ||
1166 | ipv6_proxy_select_ident(skb); | ||
1153 | break; | 1167 | break; |
1168 | } | ||
1154 | default: | 1169 | default: |
1155 | tun->dev->stats.rx_frame_errors++; | 1170 | tun->dev->stats.rx_frame_errors++; |
1156 | kfree_skb(skb); | 1171 | kfree_skb(skb); |
@@ -1179,7 +1194,6 @@ static ssize_t tun_get_user(struct tun_struct *tun, struct tun_file *tfile, | |||
1179 | skb_shinfo(skb)->tx_flags |= SKBTX_SHARED_FRAG; | 1194 | skb_shinfo(skb)->tx_flags |= SKBTX_SHARED_FRAG; |
1180 | } | 1195 | } |
1181 | 1196 | ||
1182 | skb_reset_network_header(skb); | ||
1183 | skb_probe_transport_header(skb, 0); | 1197 | skb_probe_transport_header(skb, 0); |
1184 | 1198 | ||
1185 | rxhash = skb_get_hash(skb); | 1199 | rxhash = skb_get_hash(skb); |
@@ -1251,8 +1265,6 @@ static ssize_t tun_put_user(struct tun_struct *tun, | |||
1251 | gso.gso_type = VIRTIO_NET_HDR_GSO_TCPV4; | 1265 | gso.gso_type = VIRTIO_NET_HDR_GSO_TCPV4; |
1252 | else if (sinfo->gso_type & SKB_GSO_TCPV6) | 1266 | else if (sinfo->gso_type & SKB_GSO_TCPV6) |
1253 | gso.gso_type = VIRTIO_NET_HDR_GSO_TCPV6; | 1267 | gso.gso_type = VIRTIO_NET_HDR_GSO_TCPV6; |
1254 | else if (sinfo->gso_type & SKB_GSO_UDP) | ||
1255 | gso.gso_type = VIRTIO_NET_HDR_GSO_UDP; | ||
1256 | else { | 1268 | else { |
1257 | pr_err("unexpected GSO type: " | 1269 | pr_err("unexpected GSO type: " |
1258 | "0x%x, gso_size %d, hdr_len %d\n", | 1270 | "0x%x, gso_size %d, hdr_len %d\n", |
@@ -1762,11 +1774,6 @@ static int set_offload(struct tun_struct *tun, unsigned long arg) | |||
1762 | features |= NETIF_F_TSO6; | 1774 | features |= NETIF_F_TSO6; |
1763 | arg &= ~(TUN_F_TSO4|TUN_F_TSO6); | 1775 | arg &= ~(TUN_F_TSO4|TUN_F_TSO6); |
1764 | } | 1776 | } |
1765 | |||
1766 | if (arg & TUN_F_UFO) { | ||
1767 | features |= NETIF_F_UFO; | ||
1768 | arg &= ~TUN_F_UFO; | ||
1769 | } | ||
1770 | } | 1777 | } |
1771 | 1778 | ||
1772 | /* This gives the user a way to test for new features in future by | 1779 | /* This gives the user a way to test for new features in future by |
diff --git a/drivers/net/usb/ax88179_178a.c b/drivers/net/usb/ax88179_178a.c index be4275721039..e6338c16081a 100644 --- a/drivers/net/usb/ax88179_178a.c +++ b/drivers/net/usb/ax88179_178a.c | |||
@@ -937,6 +937,7 @@ static int ax88179_set_mac_addr(struct net_device *net, void *p) | |||
937 | { | 937 | { |
938 | struct usbnet *dev = netdev_priv(net); | 938 | struct usbnet *dev = netdev_priv(net); |
939 | struct sockaddr *addr = p; | 939 | struct sockaddr *addr = p; |
940 | int ret; | ||
940 | 941 | ||
941 | if (netif_running(net)) | 942 | if (netif_running(net)) |
942 | return -EBUSY; | 943 | return -EBUSY; |
@@ -946,8 +947,12 @@ static int ax88179_set_mac_addr(struct net_device *net, void *p) | |||
946 | memcpy(net->dev_addr, addr->sa_data, ETH_ALEN); | 947 | memcpy(net->dev_addr, addr->sa_data, ETH_ALEN); |
947 | 948 | ||
948 | /* Set the MAC address */ | 949 | /* Set the MAC address */ |
949 | return ax88179_write_cmd(dev, AX_ACCESS_MAC, AX_NODE_ID, ETH_ALEN, | 950 | ret = ax88179_write_cmd(dev, AX_ACCESS_MAC, AX_NODE_ID, ETH_ALEN, |
950 | ETH_ALEN, net->dev_addr); | 951 | ETH_ALEN, net->dev_addr); |
952 | if (ret < 0) | ||
953 | return ret; | ||
954 | |||
955 | return 0; | ||
951 | } | 956 | } |
952 | 957 | ||
953 | static const struct net_device_ops ax88179_netdev_ops = { | 958 | static const struct net_device_ops ax88179_netdev_ops = { |
diff --git a/drivers/net/usb/cdc_ether.c b/drivers/net/usb/cdc_ether.c index 2a32d9167d3b..d3920b54a92c 100644 --- a/drivers/net/usb/cdc_ether.c +++ b/drivers/net/usb/cdc_ether.c | |||
@@ -67,6 +67,35 @@ static const u8 mbm_guid[16] = { | |||
67 | 0xa6, 0x07, 0xc0, 0xff, 0xcb, 0x7e, 0x39, 0x2a, | 67 | 0xa6, 0x07, 0xc0, 0xff, 0xcb, 0x7e, 0x39, 0x2a, |
68 | }; | 68 | }; |
69 | 69 | ||
70 | static void usbnet_cdc_update_filter(struct usbnet *dev) | ||
71 | { | ||
72 | struct cdc_state *info = (void *) &dev->data; | ||
73 | struct usb_interface *intf = info->control; | ||
74 | |||
75 | u16 cdc_filter = | ||
76 | USB_CDC_PACKET_TYPE_ALL_MULTICAST | USB_CDC_PACKET_TYPE_DIRECTED | | ||
77 | USB_CDC_PACKET_TYPE_BROADCAST; | ||
78 | |||
79 | if (dev->net->flags & IFF_PROMISC) | ||
80 | cdc_filter |= USB_CDC_PACKET_TYPE_PROMISCUOUS; | ||
81 | |||
82 | /* FIXME cdc-ether has some multicast code too, though it complains | ||
83 | * in routine cases. info->ether describes the multicast support. | ||
84 | * Implement that here, manipulating the cdc filter as needed. | ||
85 | */ | ||
86 | |||
87 | usb_control_msg(dev->udev, | ||
88 | usb_sndctrlpipe(dev->udev, 0), | ||
89 | USB_CDC_SET_ETHERNET_PACKET_FILTER, | ||
90 | USB_TYPE_CLASS | USB_RECIP_INTERFACE, | ||
91 | cdc_filter, | ||
92 | intf->cur_altsetting->desc.bInterfaceNumber, | ||
93 | NULL, | ||
94 | 0, | ||
95 | USB_CTRL_SET_TIMEOUT | ||
96 | ); | ||
97 | } | ||
98 | |||
70 | /* probes control interface, claims data interface, collects the bulk | 99 | /* probes control interface, claims data interface, collects the bulk |
71 | * endpoints, activates data interface (if needed), maybe sets MTU. | 100 | * endpoints, activates data interface (if needed), maybe sets MTU. |
72 | * all pure cdc, except for certain firmware workarounds, and knowing | 101 | * all pure cdc, except for certain firmware workarounds, and knowing |
@@ -347,16 +376,8 @@ next_desc: | |||
347 | * don't do reset all the way. So the packet filter should | 376 | * don't do reset all the way. So the packet filter should |
348 | * be set to a sane initial value. | 377 | * be set to a sane initial value. |
349 | */ | 378 | */ |
350 | usb_control_msg(dev->udev, | 379 | usbnet_cdc_update_filter(dev); |
351 | usb_sndctrlpipe(dev->udev, 0), | 380 | |
352 | USB_CDC_SET_ETHERNET_PACKET_FILTER, | ||
353 | USB_TYPE_CLASS | USB_RECIP_INTERFACE, | ||
354 | USB_CDC_PACKET_TYPE_ALL_MULTICAST | USB_CDC_PACKET_TYPE_DIRECTED | USB_CDC_PACKET_TYPE_BROADCAST, | ||
355 | intf->cur_altsetting->desc.bInterfaceNumber, | ||
356 | NULL, | ||
357 | 0, | ||
358 | USB_CTRL_SET_TIMEOUT | ||
359 | ); | ||
360 | return 0; | 381 | return 0; |
361 | 382 | ||
362 | bad_desc: | 383 | bad_desc: |
@@ -468,10 +489,6 @@ int usbnet_cdc_bind(struct usbnet *dev, struct usb_interface *intf) | |||
468 | return status; | 489 | return status; |
469 | } | 490 | } |
470 | 491 | ||
471 | /* FIXME cdc-ether has some multicast code too, though it complains | ||
472 | * in routine cases. info->ether describes the multicast support. | ||
473 | * Implement that here, manipulating the cdc filter as needed. | ||
474 | */ | ||
475 | return 0; | 492 | return 0; |
476 | } | 493 | } |
477 | EXPORT_SYMBOL_GPL(usbnet_cdc_bind); | 494 | EXPORT_SYMBOL_GPL(usbnet_cdc_bind); |
@@ -482,6 +499,7 @@ static const struct driver_info cdc_info = { | |||
482 | .bind = usbnet_cdc_bind, | 499 | .bind = usbnet_cdc_bind, |
483 | .unbind = usbnet_cdc_unbind, | 500 | .unbind = usbnet_cdc_unbind, |
484 | .status = usbnet_cdc_status, | 501 | .status = usbnet_cdc_status, |
502 | .set_rx_mode = usbnet_cdc_update_filter, | ||
485 | .manage_power = usbnet_manage_power, | 503 | .manage_power = usbnet_manage_power, |
486 | }; | 504 | }; |
487 | 505 | ||
@@ -491,6 +509,7 @@ static const struct driver_info wwan_info = { | |||
491 | .bind = usbnet_cdc_bind, | 509 | .bind = usbnet_cdc_bind, |
492 | .unbind = usbnet_cdc_unbind, | 510 | .unbind = usbnet_cdc_unbind, |
493 | .status = usbnet_cdc_status, | 511 | .status = usbnet_cdc_status, |
512 | .set_rx_mode = usbnet_cdc_update_filter, | ||
494 | .manage_power = usbnet_manage_power, | 513 | .manage_power = usbnet_manage_power, |
495 | }; | 514 | }; |
496 | 515 | ||
diff --git a/drivers/net/usb/r8152.c b/drivers/net/usb/r8152.c index e3d84c322e4e..c6554c7a8147 100644 --- a/drivers/net/usb/r8152.c +++ b/drivers/net/usb/r8152.c | |||
@@ -1162,6 +1162,9 @@ static void intr_callback(struct urb *urb) | |||
1162 | case -ESHUTDOWN: | 1162 | case -ESHUTDOWN: |
1163 | netif_device_detach(tp->netdev); | 1163 | netif_device_detach(tp->netdev); |
1164 | case -ENOENT: | 1164 | case -ENOENT: |
1165 | case -EPROTO: | ||
1166 | netif_info(tp, intr, tp->netdev, | ||
1167 | "Stop submitting intr, status %d\n", status); | ||
1165 | return; | 1168 | return; |
1166 | case -EOVERFLOW: | 1169 | case -EOVERFLOW: |
1167 | netif_info(tp, intr, tp->netdev, "intr status -EOVERFLOW\n"); | 1170 | netif_info(tp, intr, tp->netdev, "intr status -EOVERFLOW\n"); |
@@ -2891,6 +2894,9 @@ static int rtl8152_open(struct net_device *netdev) | |||
2891 | if (res) | 2894 | if (res) |
2892 | goto out; | 2895 | goto out; |
2893 | 2896 | ||
2897 | /* set speed to 0 to avoid autoresume try to submit rx */ | ||
2898 | tp->speed = 0; | ||
2899 | |||
2894 | res = usb_autopm_get_interface(tp->intf); | 2900 | res = usb_autopm_get_interface(tp->intf); |
2895 | if (res < 0) { | 2901 | if (res < 0) { |
2896 | free_all_mem(tp); | 2902 | free_all_mem(tp); |
@@ -2904,6 +2910,8 @@ static int rtl8152_open(struct net_device *netdev) | |||
2904 | clear_bit(WORK_ENABLE, &tp->flags); | 2910 | clear_bit(WORK_ENABLE, &tp->flags); |
2905 | usb_kill_urb(tp->intr_urb); | 2911 | usb_kill_urb(tp->intr_urb); |
2906 | cancel_delayed_work_sync(&tp->schedule); | 2912 | cancel_delayed_work_sync(&tp->schedule); |
2913 | |||
2914 | /* disable the tx/rx, if the workqueue has enabled them. */ | ||
2907 | if (tp->speed & LINK_STATUS) | 2915 | if (tp->speed & LINK_STATUS) |
2908 | tp->rtl_ops.disable(tp); | 2916 | tp->rtl_ops.disable(tp); |
2909 | } | 2917 | } |
@@ -2955,10 +2963,7 @@ static int rtl8152_close(struct net_device *netdev) | |||
2955 | * be disable when autoresume occurs, because the | 2963 | * be disable when autoresume occurs, because the |
2956 | * netif_running() would be false. | 2964 | * netif_running() would be false. |
2957 | */ | 2965 | */ |
2958 | if (test_bit(SELECTIVE_SUSPEND, &tp->flags)) { | 2966 | rtl_runtime_suspend_enable(tp, false); |
2959 | rtl_runtime_suspend_enable(tp, false); | ||
2960 | clear_bit(SELECTIVE_SUSPEND, &tp->flags); | ||
2961 | } | ||
2962 | 2967 | ||
2963 | tasklet_disable(&tp->tl); | 2968 | tasklet_disable(&tp->tl); |
2964 | tp->rtl_ops.down(tp); | 2969 | tp->rtl_ops.down(tp); |
@@ -3205,7 +3210,7 @@ static int rtl8152_suspend(struct usb_interface *intf, pm_message_t message) | |||
3205 | netif_device_detach(netdev); | 3210 | netif_device_detach(netdev); |
3206 | } | 3211 | } |
3207 | 3212 | ||
3208 | if (netif_running(netdev)) { | 3213 | if (netif_running(netdev) && test_bit(WORK_ENABLE, &tp->flags)) { |
3209 | clear_bit(WORK_ENABLE, &tp->flags); | 3214 | clear_bit(WORK_ENABLE, &tp->flags); |
3210 | usb_kill_urb(tp->intr_urb); | 3215 | usb_kill_urb(tp->intr_urb); |
3211 | tasklet_disable(&tp->tl); | 3216 | tasklet_disable(&tp->tl); |
@@ -3253,6 +3258,8 @@ static int rtl8152_resume(struct usb_interface *intf) | |||
3253 | set_bit(WORK_ENABLE, &tp->flags); | 3258 | set_bit(WORK_ENABLE, &tp->flags); |
3254 | } | 3259 | } |
3255 | usb_submit_urb(tp->intr_urb, GFP_KERNEL); | 3260 | usb_submit_urb(tp->intr_urb, GFP_KERNEL); |
3261 | } else if (test_bit(SELECTIVE_SUSPEND, &tp->flags)) { | ||
3262 | clear_bit(SELECTIVE_SUSPEND, &tp->flags); | ||
3256 | } | 3263 | } |
3257 | 3264 | ||
3258 | mutex_unlock(&tp->control); | 3265 | mutex_unlock(&tp->control); |
diff --git a/drivers/net/usb/usbnet.c b/drivers/net/usb/usbnet.c index 20615bbd693b..3a6770a65d78 100644 --- a/drivers/net/usb/usbnet.c +++ b/drivers/net/usb/usbnet.c | |||
@@ -1052,6 +1052,21 @@ static void __handle_link_change(struct usbnet *dev) | |||
1052 | clear_bit(EVENT_LINK_CHANGE, &dev->flags); | 1052 | clear_bit(EVENT_LINK_CHANGE, &dev->flags); |
1053 | } | 1053 | } |
1054 | 1054 | ||
1055 | static void usbnet_set_rx_mode(struct net_device *net) | ||
1056 | { | ||
1057 | struct usbnet *dev = netdev_priv(net); | ||
1058 | |||
1059 | usbnet_defer_kevent(dev, EVENT_SET_RX_MODE); | ||
1060 | } | ||
1061 | |||
1062 | static void __handle_set_rx_mode(struct usbnet *dev) | ||
1063 | { | ||
1064 | if (dev->driver_info->set_rx_mode) | ||
1065 | (dev->driver_info->set_rx_mode)(dev); | ||
1066 | |||
1067 | clear_bit(EVENT_SET_RX_MODE, &dev->flags); | ||
1068 | } | ||
1069 | |||
1055 | /* work that cannot be done in interrupt context uses keventd. | 1070 | /* work that cannot be done in interrupt context uses keventd. |
1056 | * | 1071 | * |
1057 | * NOTE: with 2.5 we could do more of this using completion callbacks, | 1072 | * NOTE: with 2.5 we could do more of this using completion callbacks, |
@@ -1157,6 +1172,10 @@ skip_reset: | |||
1157 | if (test_bit (EVENT_LINK_CHANGE, &dev->flags)) | 1172 | if (test_bit (EVENT_LINK_CHANGE, &dev->flags)) |
1158 | __handle_link_change(dev); | 1173 | __handle_link_change(dev); |
1159 | 1174 | ||
1175 | if (test_bit (EVENT_SET_RX_MODE, &dev->flags)) | ||
1176 | __handle_set_rx_mode(dev); | ||
1177 | |||
1178 | |||
1160 | if (dev->flags) | 1179 | if (dev->flags) |
1161 | netdev_dbg(dev->net, "kevent done, flags = 0x%lx\n", dev->flags); | 1180 | netdev_dbg(dev->net, "kevent done, flags = 0x%lx\n", dev->flags); |
1162 | } | 1181 | } |
@@ -1525,6 +1544,7 @@ static const struct net_device_ops usbnet_netdev_ops = { | |||
1525 | .ndo_stop = usbnet_stop, | 1544 | .ndo_stop = usbnet_stop, |
1526 | .ndo_start_xmit = usbnet_start_xmit, | 1545 | .ndo_start_xmit = usbnet_start_xmit, |
1527 | .ndo_tx_timeout = usbnet_tx_timeout, | 1546 | .ndo_tx_timeout = usbnet_tx_timeout, |
1547 | .ndo_set_rx_mode = usbnet_set_rx_mode, | ||
1528 | .ndo_change_mtu = usbnet_change_mtu, | 1548 | .ndo_change_mtu = usbnet_change_mtu, |
1529 | .ndo_set_mac_address = eth_mac_addr, | 1549 | .ndo_set_mac_address = eth_mac_addr, |
1530 | .ndo_validate_addr = eth_validate_addr, | 1550 | .ndo_validate_addr = eth_validate_addr, |
diff --git a/drivers/net/virtio_net.c b/drivers/net/virtio_net.c index d75256bd1a6a..ec2a8b41ed41 100644 --- a/drivers/net/virtio_net.c +++ b/drivers/net/virtio_net.c | |||
@@ -491,8 +491,17 @@ static void receive_buf(struct receive_queue *rq, void *buf, unsigned int len) | |||
491 | skb_shinfo(skb)->gso_type = SKB_GSO_TCPV4; | 491 | skb_shinfo(skb)->gso_type = SKB_GSO_TCPV4; |
492 | break; | 492 | break; |
493 | case VIRTIO_NET_HDR_GSO_UDP: | 493 | case VIRTIO_NET_HDR_GSO_UDP: |
494 | { | ||
495 | static bool warned; | ||
496 | |||
497 | if (!warned) { | ||
498 | warned = true; | ||
499 | netdev_warn(dev, | ||
500 | "host using disabled UFO feature; please fix it\n"); | ||
501 | } | ||
494 | skb_shinfo(skb)->gso_type = SKB_GSO_UDP; | 502 | skb_shinfo(skb)->gso_type = SKB_GSO_UDP; |
495 | break; | 503 | break; |
504 | } | ||
496 | case VIRTIO_NET_HDR_GSO_TCPV6: | 505 | case VIRTIO_NET_HDR_GSO_TCPV6: |
497 | skb_shinfo(skb)->gso_type = SKB_GSO_TCPV6; | 506 | skb_shinfo(skb)->gso_type = SKB_GSO_TCPV6; |
498 | break; | 507 | break; |
@@ -881,8 +890,6 @@ static int xmit_skb(struct send_queue *sq, struct sk_buff *skb) | |||
881 | hdr->hdr.gso_type = VIRTIO_NET_HDR_GSO_TCPV4; | 890 | hdr->hdr.gso_type = VIRTIO_NET_HDR_GSO_TCPV4; |
882 | else if (skb_shinfo(skb)->gso_type & SKB_GSO_TCPV6) | 891 | else if (skb_shinfo(skb)->gso_type & SKB_GSO_TCPV6) |
883 | hdr->hdr.gso_type = VIRTIO_NET_HDR_GSO_TCPV6; | 892 | hdr->hdr.gso_type = VIRTIO_NET_HDR_GSO_TCPV6; |
884 | else if (skb_shinfo(skb)->gso_type & SKB_GSO_UDP) | ||
885 | hdr->hdr.gso_type = VIRTIO_NET_HDR_GSO_UDP; | ||
886 | else | 893 | else |
887 | BUG(); | 894 | BUG(); |
888 | if (skb_shinfo(skb)->gso_type & SKB_GSO_TCP_ECN) | 895 | if (skb_shinfo(skb)->gso_type & SKB_GSO_TCP_ECN) |
@@ -1705,7 +1712,7 @@ static int virtnet_probe(struct virtio_device *vdev) | |||
1705 | dev->features |= NETIF_F_HW_CSUM|NETIF_F_SG|NETIF_F_FRAGLIST; | 1712 | dev->features |= NETIF_F_HW_CSUM|NETIF_F_SG|NETIF_F_FRAGLIST; |
1706 | 1713 | ||
1707 | if (virtio_has_feature(vdev, VIRTIO_NET_F_GSO)) { | 1714 | if (virtio_has_feature(vdev, VIRTIO_NET_F_GSO)) { |
1708 | dev->hw_features |= NETIF_F_TSO | NETIF_F_UFO | 1715 | dev->hw_features |= NETIF_F_TSO |
1709 | | NETIF_F_TSO_ECN | NETIF_F_TSO6; | 1716 | | NETIF_F_TSO_ECN | NETIF_F_TSO6; |
1710 | } | 1717 | } |
1711 | /* Individual feature bits: what can host handle? */ | 1718 | /* Individual feature bits: what can host handle? */ |
@@ -1715,11 +1722,9 @@ static int virtnet_probe(struct virtio_device *vdev) | |||
1715 | dev->hw_features |= NETIF_F_TSO6; | 1722 | dev->hw_features |= NETIF_F_TSO6; |
1716 | if (virtio_has_feature(vdev, VIRTIO_NET_F_HOST_ECN)) | 1723 | if (virtio_has_feature(vdev, VIRTIO_NET_F_HOST_ECN)) |
1717 | dev->hw_features |= NETIF_F_TSO_ECN; | 1724 | dev->hw_features |= NETIF_F_TSO_ECN; |
1718 | if (virtio_has_feature(vdev, VIRTIO_NET_F_HOST_UFO)) | ||
1719 | dev->hw_features |= NETIF_F_UFO; | ||
1720 | 1725 | ||
1721 | if (gso) | 1726 | if (gso) |
1722 | dev->features |= dev->hw_features & (NETIF_F_ALL_TSO|NETIF_F_UFO); | 1727 | dev->features |= dev->hw_features & NETIF_F_ALL_TSO; |
1723 | /* (!csum && gso) case will be fixed by register_netdev() */ | 1728 | /* (!csum && gso) case will be fixed by register_netdev() */ |
1724 | } | 1729 | } |
1725 | if (virtio_has_feature(vdev, VIRTIO_NET_F_GUEST_CSUM)) | 1730 | if (virtio_has_feature(vdev, VIRTIO_NET_F_GUEST_CSUM)) |
@@ -1757,8 +1762,7 @@ static int virtnet_probe(struct virtio_device *vdev) | |||
1757 | /* If we can receive ANY GSO packets, we must allocate large ones. */ | 1762 | /* If we can receive ANY GSO packets, we must allocate large ones. */ |
1758 | if (virtio_has_feature(vdev, VIRTIO_NET_F_GUEST_TSO4) || | 1763 | if (virtio_has_feature(vdev, VIRTIO_NET_F_GUEST_TSO4) || |
1759 | virtio_has_feature(vdev, VIRTIO_NET_F_GUEST_TSO6) || | 1764 | virtio_has_feature(vdev, VIRTIO_NET_F_GUEST_TSO6) || |
1760 | virtio_has_feature(vdev, VIRTIO_NET_F_GUEST_ECN) || | 1765 | virtio_has_feature(vdev, VIRTIO_NET_F_GUEST_ECN)) |
1761 | virtio_has_feature(vdev, VIRTIO_NET_F_GUEST_UFO)) | ||
1762 | vi->big_packets = true; | 1766 | vi->big_packets = true; |
1763 | 1767 | ||
1764 | if (virtio_has_feature(vdev, VIRTIO_NET_F_MRG_RXBUF)) | 1768 | if (virtio_has_feature(vdev, VIRTIO_NET_F_MRG_RXBUF)) |
@@ -1952,9 +1956,9 @@ static struct virtio_device_id id_table[] = { | |||
1952 | static unsigned int features[] = { | 1956 | static unsigned int features[] = { |
1953 | VIRTIO_NET_F_CSUM, VIRTIO_NET_F_GUEST_CSUM, | 1957 | VIRTIO_NET_F_CSUM, VIRTIO_NET_F_GUEST_CSUM, |
1954 | VIRTIO_NET_F_GSO, VIRTIO_NET_F_MAC, | 1958 | VIRTIO_NET_F_GSO, VIRTIO_NET_F_MAC, |
1955 | VIRTIO_NET_F_HOST_TSO4, VIRTIO_NET_F_HOST_UFO, VIRTIO_NET_F_HOST_TSO6, | 1959 | VIRTIO_NET_F_HOST_TSO4, VIRTIO_NET_F_HOST_TSO6, |
1956 | VIRTIO_NET_F_HOST_ECN, VIRTIO_NET_F_GUEST_TSO4, VIRTIO_NET_F_GUEST_TSO6, | 1960 | VIRTIO_NET_F_HOST_ECN, VIRTIO_NET_F_GUEST_TSO4, VIRTIO_NET_F_GUEST_TSO6, |
1957 | VIRTIO_NET_F_GUEST_ECN, VIRTIO_NET_F_GUEST_UFO, | 1961 | VIRTIO_NET_F_GUEST_ECN, |
1958 | VIRTIO_NET_F_MRG_RXBUF, VIRTIO_NET_F_STATUS, VIRTIO_NET_F_CTRL_VQ, | 1962 | VIRTIO_NET_F_MRG_RXBUF, VIRTIO_NET_F_STATUS, VIRTIO_NET_F_CTRL_VQ, |
1959 | VIRTIO_NET_F_CTRL_RX, VIRTIO_NET_F_CTRL_VLAN, | 1963 | VIRTIO_NET_F_CTRL_RX, VIRTIO_NET_F_CTRL_VLAN, |
1960 | VIRTIO_NET_F_GUEST_ANNOUNCE, VIRTIO_NET_F_MQ, | 1964 | VIRTIO_NET_F_GUEST_ANNOUNCE, VIRTIO_NET_F_MQ, |
diff --git a/drivers/net/wireless/ath/ath.h b/drivers/net/wireless/ath/ath.h index e5ba6faf3281..86907e5ba6ca 100644 --- a/drivers/net/wireless/ath/ath.h +++ b/drivers/net/wireless/ath/ath.h | |||
@@ -80,6 +80,7 @@ struct reg_dmn_pair_mapping { | |||
80 | 80 | ||
81 | struct ath_regulatory { | 81 | struct ath_regulatory { |
82 | char alpha2[2]; | 82 | char alpha2[2]; |
83 | enum nl80211_dfs_regions region; | ||
83 | u16 country_code; | 84 | u16 country_code; |
84 | u16 max_power_level; | 85 | u16 max_power_level; |
85 | u16 current_rd; | 86 | u16 current_rd; |
diff --git a/drivers/net/wireless/ath/ath9k/common.c b/drivers/net/wireless/ath/ath9k/common.c index c6dd7f1fed65..33b0c7aef2ea 100644 --- a/drivers/net/wireless/ath/ath9k/common.c +++ b/drivers/net/wireless/ath/ath9k/common.c | |||
@@ -368,11 +368,11 @@ void ath9k_cmn_update_txpow(struct ath_hw *ah, u16 cur_txpow, | |||
368 | { | 368 | { |
369 | struct ath_regulatory *reg = ath9k_hw_regulatory(ah); | 369 | struct ath_regulatory *reg = ath9k_hw_regulatory(ah); |
370 | 370 | ||
371 | if (reg->power_limit != new_txpow) { | 371 | if (reg->power_limit != new_txpow) |
372 | ath9k_hw_set_txpowerlimit(ah, new_txpow, false); | 372 | ath9k_hw_set_txpowerlimit(ah, new_txpow, false); |
373 | /* read back in case value is clamped */ | 373 | |
374 | *txpower = reg->max_power_level; | 374 | /* read back in case value is clamped */ |
375 | } | 375 | *txpower = reg->max_power_level; |
376 | } | 376 | } |
377 | EXPORT_SYMBOL(ath9k_cmn_update_txpow); | 377 | EXPORT_SYMBOL(ath9k_cmn_update_txpow); |
378 | 378 | ||
diff --git a/drivers/net/wireless/ath/ath9k/debug.c b/drivers/net/wireless/ath/ath9k/debug.c index 46f20a309b5f..5c45e787814e 100644 --- a/drivers/net/wireless/ath/ath9k/debug.c +++ b/drivers/net/wireless/ath/ath9k/debug.c | |||
@@ -455,7 +455,7 @@ static ssize_t read_file_dma(struct file *file, char __user *user_buf, | |||
455 | "%2d %2x %1x %2x %2x\n", | 455 | "%2d %2x %1x %2x %2x\n", |
456 | i, (*qcuBase & (0x7 << qcuOffset)) >> qcuOffset, | 456 | i, (*qcuBase & (0x7 << qcuOffset)) >> qcuOffset, |
457 | (*qcuBase & (0x8 << qcuOffset)) >> (qcuOffset + 3), | 457 | (*qcuBase & (0x8 << qcuOffset)) >> (qcuOffset + 3), |
458 | val[2] & (0x7 << (i * 3)) >> (i * 3), | 458 | (val[2] & (0x7 << (i * 3))) >> (i * 3), |
459 | (*dcuBase & (0x1f << dcuOffset)) >> dcuOffset); | 459 | (*dcuBase & (0x1f << dcuOffset)) >> dcuOffset); |
460 | } | 460 | } |
461 | 461 | ||
diff --git a/drivers/net/wireless/ath/ath9k/init.c b/drivers/net/wireless/ath/ath9k/init.c index 156a944134dc..3bd030494986 100644 --- a/drivers/net/wireless/ath/ath9k/init.c +++ b/drivers/net/wireless/ath/ath9k/init.c | |||
@@ -734,6 +734,32 @@ static const struct ieee80211_iface_combination if_comb[] = { | |||
734 | #endif | 734 | #endif |
735 | }; | 735 | }; |
736 | 736 | ||
737 | #ifdef CONFIG_ATH9K_CHANNEL_CONTEXT | ||
738 | static void ath9k_set_mcc_capab(struct ath_softc *sc, struct ieee80211_hw *hw) | ||
739 | { | ||
740 | struct ath_hw *ah = sc->sc_ah; | ||
741 | struct ath_common *common = ath9k_hw_common(ah); | ||
742 | |||
743 | if (!ath9k_is_chanctx_enabled()) | ||
744 | return; | ||
745 | |||
746 | hw->flags |= IEEE80211_HW_QUEUE_CONTROL; | ||
747 | hw->queues = ATH9K_NUM_TX_QUEUES; | ||
748 | hw->offchannel_tx_hw_queue = hw->queues - 1; | ||
749 | hw->wiphy->interface_modes &= ~ BIT(NL80211_IFTYPE_WDS); | ||
750 | hw->wiphy->iface_combinations = if_comb_multi; | ||
751 | hw->wiphy->n_iface_combinations = ARRAY_SIZE(if_comb_multi); | ||
752 | hw->wiphy->max_scan_ssids = 255; | ||
753 | hw->wiphy->max_scan_ie_len = IEEE80211_MAX_DATA_LEN; | ||
754 | hw->wiphy->max_remain_on_channel_duration = 10000; | ||
755 | hw->chanctx_data_size = sizeof(void *); | ||
756 | hw->extra_beacon_tailroom = | ||
757 | sizeof(struct ieee80211_p2p_noa_attr) + 9; | ||
758 | |||
759 | ath_dbg(common, CHAN_CTX, "Use channel contexts\n"); | ||
760 | } | ||
761 | #endif /* CONFIG_ATH9K_CHANNEL_CONTEXT */ | ||
762 | |||
737 | static void ath9k_set_hw_capab(struct ath_softc *sc, struct ieee80211_hw *hw) | 763 | static void ath9k_set_hw_capab(struct ath_softc *sc, struct ieee80211_hw *hw) |
738 | { | 764 | { |
739 | struct ath_hw *ah = sc->sc_ah; | 765 | struct ath_hw *ah = sc->sc_ah; |
@@ -746,7 +772,6 @@ static void ath9k_set_hw_capab(struct ath_softc *sc, struct ieee80211_hw *hw) | |||
746 | IEEE80211_HW_SPECTRUM_MGMT | | 772 | IEEE80211_HW_SPECTRUM_MGMT | |
747 | IEEE80211_HW_REPORTS_TX_ACK_STATUS | | 773 | IEEE80211_HW_REPORTS_TX_ACK_STATUS | |
748 | IEEE80211_HW_SUPPORTS_RC_TABLE | | 774 | IEEE80211_HW_SUPPORTS_RC_TABLE | |
749 | IEEE80211_HW_QUEUE_CONTROL | | ||
750 | IEEE80211_HW_SUPPORTS_HT_CCK_RATES; | 775 | IEEE80211_HW_SUPPORTS_HT_CCK_RATES; |
751 | 776 | ||
752 | if (ath9k_ps_enable) | 777 | if (ath9k_ps_enable) |
@@ -781,24 +806,6 @@ static void ath9k_set_hw_capab(struct ath_softc *sc, struct ieee80211_hw *hw) | |||
781 | hw->wiphy->n_iface_combinations = ARRAY_SIZE(if_comb); | 806 | hw->wiphy->n_iface_combinations = ARRAY_SIZE(if_comb); |
782 | } | 807 | } |
783 | 808 | ||
784 | #ifdef CONFIG_ATH9K_CHANNEL_CONTEXT | ||
785 | |||
786 | if (ath9k_is_chanctx_enabled()) { | ||
787 | hw->wiphy->interface_modes &= ~ BIT(NL80211_IFTYPE_WDS); | ||
788 | hw->wiphy->iface_combinations = if_comb_multi; | ||
789 | hw->wiphy->n_iface_combinations = ARRAY_SIZE(if_comb_multi); | ||
790 | hw->wiphy->max_scan_ssids = 255; | ||
791 | hw->wiphy->max_scan_ie_len = IEEE80211_MAX_DATA_LEN; | ||
792 | hw->wiphy->max_remain_on_channel_duration = 10000; | ||
793 | hw->chanctx_data_size = sizeof(void *); | ||
794 | hw->extra_beacon_tailroom = | ||
795 | sizeof(struct ieee80211_p2p_noa_attr) + 9; | ||
796 | |||
797 | ath_dbg(common, CHAN_CTX, "Use channel contexts\n"); | ||
798 | } | ||
799 | |||
800 | #endif /* CONFIG_ATH9K_CHANNEL_CONTEXT */ | ||
801 | |||
802 | hw->wiphy->flags &= ~WIPHY_FLAG_PS_ON_BY_DEFAULT; | 809 | hw->wiphy->flags &= ~WIPHY_FLAG_PS_ON_BY_DEFAULT; |
803 | 810 | ||
804 | hw->wiphy->flags |= WIPHY_FLAG_IBSS_RSN; | 811 | hw->wiphy->flags |= WIPHY_FLAG_IBSS_RSN; |
@@ -808,12 +815,7 @@ static void ath9k_set_hw_capab(struct ath_softc *sc, struct ieee80211_hw *hw) | |||
808 | hw->wiphy->flags |= WIPHY_FLAG_HAS_CHANNEL_SWITCH; | 815 | hw->wiphy->flags |= WIPHY_FLAG_HAS_CHANNEL_SWITCH; |
809 | hw->wiphy->flags |= WIPHY_FLAG_AP_UAPSD; | 816 | hw->wiphy->flags |= WIPHY_FLAG_AP_UAPSD; |
810 | 817 | ||
811 | /* allow 4 queues per channel context + | 818 | hw->queues = 4; |
812 | * 1 cab queue + 1 offchannel tx queue | ||
813 | */ | ||
814 | hw->queues = ATH9K_NUM_TX_QUEUES; | ||
815 | /* last queue for offchannel */ | ||
816 | hw->offchannel_tx_hw_queue = hw->queues - 1; | ||
817 | hw->max_rates = 4; | 819 | hw->max_rates = 4; |
818 | hw->max_listen_interval = 10; | 820 | hw->max_listen_interval = 10; |
819 | hw->max_rate_tries = 10; | 821 | hw->max_rate_tries = 10; |
@@ -837,6 +839,9 @@ static void ath9k_set_hw_capab(struct ath_softc *sc, struct ieee80211_hw *hw) | |||
837 | hw->wiphy->bands[IEEE80211_BAND_5GHZ] = | 839 | hw->wiphy->bands[IEEE80211_BAND_5GHZ] = |
838 | &common->sbands[IEEE80211_BAND_5GHZ]; | 840 | &common->sbands[IEEE80211_BAND_5GHZ]; |
839 | 841 | ||
842 | #ifdef CONFIG_ATH9K_CHANNEL_CONTEXT | ||
843 | ath9k_set_mcc_capab(sc, hw); | ||
844 | #endif | ||
840 | ath9k_init_wow(hw); | 845 | ath9k_init_wow(hw); |
841 | ath9k_cmn_reload_chainmask(ah); | 846 | ath9k_cmn_reload_chainmask(ah); |
842 | 847 | ||
diff --git a/drivers/net/wireless/ath/ath9k/main.c b/drivers/net/wireless/ath/ath9k/main.c index 6f6a974f7fdb..30c66dfcd7a0 100644 --- a/drivers/net/wireless/ath/ath9k/main.c +++ b/drivers/net/wireless/ath/ath9k/main.c | |||
@@ -1162,6 +1162,9 @@ static void ath9k_assign_hw_queues(struct ieee80211_hw *hw, | |||
1162 | { | 1162 | { |
1163 | int i; | 1163 | int i; |
1164 | 1164 | ||
1165 | if (!ath9k_is_chanctx_enabled()) | ||
1166 | return; | ||
1167 | |||
1165 | for (i = 0; i < IEEE80211_NUM_ACS; i++) | 1168 | for (i = 0; i < IEEE80211_NUM_ACS; i++) |
1166 | vif->hw_queue[i] = i; | 1169 | vif->hw_queue[i] = i; |
1167 | 1170 | ||
diff --git a/drivers/net/wireless/ath/ath9k/xmit.c b/drivers/net/wireless/ath/ath9k/xmit.c index 493a183d0aaf..d6e54a3c88f6 100644 --- a/drivers/net/wireless/ath/ath9k/xmit.c +++ b/drivers/net/wireless/ath/ath9k/xmit.c | |||
@@ -169,7 +169,10 @@ static void ath_txq_skb_done(struct ath_softc *sc, struct ath_txq *txq, | |||
169 | 169 | ||
170 | if (txq->stopped && | 170 | if (txq->stopped && |
171 | txq->pending_frames < sc->tx.txq_max_pending[q]) { | 171 | txq->pending_frames < sc->tx.txq_max_pending[q]) { |
172 | ieee80211_wake_queue(sc->hw, info->hw_queue); | 172 | if (ath9k_is_chanctx_enabled()) |
173 | ieee80211_wake_queue(sc->hw, info->hw_queue); | ||
174 | else | ||
175 | ieee80211_wake_queue(sc->hw, q); | ||
173 | txq->stopped = false; | 176 | txq->stopped = false; |
174 | } | 177 | } |
175 | } | 178 | } |
@@ -2247,7 +2250,10 @@ int ath_tx_start(struct ieee80211_hw *hw, struct sk_buff *skb, | |||
2247 | fi->txq = q; | 2250 | fi->txq = q; |
2248 | if (++txq->pending_frames > sc->tx.txq_max_pending[q] && | 2251 | if (++txq->pending_frames > sc->tx.txq_max_pending[q] && |
2249 | !txq->stopped) { | 2252 | !txq->stopped) { |
2250 | ieee80211_stop_queue(sc->hw, info->hw_queue); | 2253 | if (ath9k_is_chanctx_enabled()) |
2254 | ieee80211_stop_queue(sc->hw, info->hw_queue); | ||
2255 | else | ||
2256 | ieee80211_stop_queue(sc->hw, q); | ||
2251 | txq->stopped = true; | 2257 | txq->stopped = true; |
2252 | } | 2258 | } |
2253 | } | 2259 | } |
diff --git a/drivers/net/wireless/ath/regd.c b/drivers/net/wireless/ath/regd.c index 415393dfb6fc..06ea6cc9e30a 100644 --- a/drivers/net/wireless/ath/regd.c +++ b/drivers/net/wireless/ath/regd.c | |||
@@ -515,6 +515,7 @@ void ath_reg_notifier_apply(struct wiphy *wiphy, | |||
515 | if (!request) | 515 | if (!request) |
516 | return; | 516 | return; |
517 | 517 | ||
518 | reg->region = request->dfs_region; | ||
518 | switch (request->initiator) { | 519 | switch (request->initiator) { |
519 | case NL80211_REGDOM_SET_BY_CORE: | 520 | case NL80211_REGDOM_SET_BY_CORE: |
520 | /* | 521 | /* |
@@ -779,6 +780,19 @@ u32 ath_regd_get_band_ctl(struct ath_regulatory *reg, | |||
779 | return SD_NO_CTL; | 780 | return SD_NO_CTL; |
780 | } | 781 | } |
781 | 782 | ||
783 | if (ath_regd_get_eepromRD(reg) == CTRY_DEFAULT) { | ||
784 | switch (reg->region) { | ||
785 | case NL80211_DFS_FCC: | ||
786 | return CTL_FCC; | ||
787 | case NL80211_DFS_ETSI: | ||
788 | return CTL_ETSI; | ||
789 | case NL80211_DFS_JP: | ||
790 | return CTL_MKK; | ||
791 | default: | ||
792 | break; | ||
793 | } | ||
794 | } | ||
795 | |||
782 | switch (band) { | 796 | switch (band) { |
783 | case IEEE80211_BAND_2GHZ: | 797 | case IEEE80211_BAND_2GHZ: |
784 | return reg->regpair->reg_2ghz_ctl; | 798 | return reg->regpair->reg_2ghz_ctl; |
diff --git a/drivers/net/wireless/brcm80211/brcmfmac/dhd_sdio.c b/drivers/net/wireless/brcm80211/brcmfmac/dhd_sdio.c index f55f625fd06b..d20d4e6f391a 100644 --- a/drivers/net/wireless/brcm80211/brcmfmac/dhd_sdio.c +++ b/drivers/net/wireless/brcm80211/brcmfmac/dhd_sdio.c | |||
@@ -670,7 +670,6 @@ static int brcmf_sdio_get_fwnames(struct brcmf_chip *ci, | |||
670 | struct brcmf_sdio_dev *sdiodev) | 670 | struct brcmf_sdio_dev *sdiodev) |
671 | { | 671 | { |
672 | int i; | 672 | int i; |
673 | uint fw_len, nv_len; | ||
674 | char end; | 673 | char end; |
675 | 674 | ||
676 | for (i = 0; i < ARRAY_SIZE(brcmf_fwname_data); i++) { | 675 | for (i = 0; i < ARRAY_SIZE(brcmf_fwname_data); i++) { |
@@ -684,25 +683,25 @@ static int brcmf_sdio_get_fwnames(struct brcmf_chip *ci, | |||
684 | return -ENODEV; | 683 | return -ENODEV; |
685 | } | 684 | } |
686 | 685 | ||
687 | fw_len = sizeof(sdiodev->fw_name) - 1; | ||
688 | nv_len = sizeof(sdiodev->nvram_name) - 1; | ||
689 | /* check if firmware path is provided by module parameter */ | 686 | /* check if firmware path is provided by module parameter */ |
690 | if (brcmf_firmware_path[0] != '\0') { | 687 | if (brcmf_firmware_path[0] != '\0') { |
691 | strncpy(sdiodev->fw_name, brcmf_firmware_path, fw_len); | 688 | strlcpy(sdiodev->fw_name, brcmf_firmware_path, |
692 | strncpy(sdiodev->nvram_name, brcmf_firmware_path, nv_len); | 689 | sizeof(sdiodev->fw_name)); |
693 | fw_len -= strlen(sdiodev->fw_name); | 690 | strlcpy(sdiodev->nvram_name, brcmf_firmware_path, |
694 | nv_len -= strlen(sdiodev->nvram_name); | 691 | sizeof(sdiodev->nvram_name)); |
695 | 692 | ||
696 | end = brcmf_firmware_path[strlen(brcmf_firmware_path) - 1]; | 693 | end = brcmf_firmware_path[strlen(brcmf_firmware_path) - 1]; |
697 | if (end != '/') { | 694 | if (end != '/') { |
698 | strncat(sdiodev->fw_name, "/", fw_len); | 695 | strlcat(sdiodev->fw_name, "/", |
699 | strncat(sdiodev->nvram_name, "/", nv_len); | 696 | sizeof(sdiodev->fw_name)); |
700 | fw_len--; | 697 | strlcat(sdiodev->nvram_name, "/", |
701 | nv_len--; | 698 | sizeof(sdiodev->nvram_name)); |
702 | } | 699 | } |
703 | } | 700 | } |
704 | strncat(sdiodev->fw_name, brcmf_fwname_data[i].bin, fw_len); | 701 | strlcat(sdiodev->fw_name, brcmf_fwname_data[i].bin, |
705 | strncat(sdiodev->nvram_name, brcmf_fwname_data[i].nv, nv_len); | 702 | sizeof(sdiodev->fw_name)); |
703 | strlcat(sdiodev->nvram_name, brcmf_fwname_data[i].nv, | ||
704 | sizeof(sdiodev->nvram_name)); | ||
706 | 705 | ||
707 | return 0; | 706 | return 0; |
708 | } | 707 | } |
diff --git a/drivers/net/wireless/iwlwifi/dvm/mac80211.c b/drivers/net/wireless/iwlwifi/dvm/mac80211.c index 2364a3c09b9e..cae692ff1013 100644 --- a/drivers/net/wireless/iwlwifi/dvm/mac80211.c +++ b/drivers/net/wireless/iwlwifi/dvm/mac80211.c | |||
@@ -1095,6 +1095,7 @@ static void iwlagn_mac_flush(struct ieee80211_hw *hw, struct ieee80211_vif *vif, | |||
1095 | u32 queues, bool drop) | 1095 | u32 queues, bool drop) |
1096 | { | 1096 | { |
1097 | struct iwl_priv *priv = IWL_MAC80211_GET_DVM(hw); | 1097 | struct iwl_priv *priv = IWL_MAC80211_GET_DVM(hw); |
1098 | u32 scd_queues; | ||
1098 | 1099 | ||
1099 | mutex_lock(&priv->mutex); | 1100 | mutex_lock(&priv->mutex); |
1100 | IWL_DEBUG_MAC80211(priv, "enter\n"); | 1101 | IWL_DEBUG_MAC80211(priv, "enter\n"); |
@@ -1108,18 +1109,19 @@ static void iwlagn_mac_flush(struct ieee80211_hw *hw, struct ieee80211_vif *vif, | |||
1108 | goto done; | 1109 | goto done; |
1109 | } | 1110 | } |
1110 | 1111 | ||
1111 | /* | 1112 | scd_queues = BIT(priv->cfg->base_params->num_of_queues) - 1; |
1112 | * mac80211 will not push any more frames for transmit | 1113 | scd_queues &= ~(BIT(IWL_IPAN_CMD_QUEUE_NUM) | |
1113 | * until the flush is completed | 1114 | BIT(IWL_DEFAULT_CMD_QUEUE_NUM)); |
1114 | */ | 1115 | |
1115 | if (drop) { | 1116 | if (vif) |
1116 | IWL_DEBUG_MAC80211(priv, "send flush command\n"); | 1117 | scd_queues &= ~BIT(vif->hw_queue[IEEE80211_AC_VO]); |
1117 | if (iwlagn_txfifo_flush(priv, 0)) { | 1118 | |
1118 | IWL_ERR(priv, "flush request fail\n"); | 1119 | IWL_DEBUG_TX_QUEUES(priv, "Flushing SCD queues: 0x%x\n", scd_queues); |
1119 | goto done; | 1120 | if (iwlagn_txfifo_flush(priv, scd_queues)) { |
1120 | } | 1121 | IWL_ERR(priv, "flush request fail\n"); |
1122 | goto done; | ||
1121 | } | 1123 | } |
1122 | IWL_DEBUG_MAC80211(priv, "wait transmit/flush all frames\n"); | 1124 | IWL_DEBUG_TX_QUEUES(priv, "wait transmit/flush all frames\n"); |
1123 | iwl_trans_wait_tx_queue_empty(priv->trans, 0xffffffff); | 1125 | iwl_trans_wait_tx_queue_empty(priv->trans, 0xffffffff); |
1124 | done: | 1126 | done: |
1125 | mutex_unlock(&priv->mutex); | 1127 | mutex_unlock(&priv->mutex); |
diff --git a/drivers/net/wireless/iwlwifi/iwl-8000.c b/drivers/net/wireless/iwlwifi/iwl-8000.c index e4351487ca72..d2b7234b1c73 100644 --- a/drivers/net/wireless/iwlwifi/iwl-8000.c +++ b/drivers/net/wireless/iwlwifi/iwl-8000.c | |||
@@ -82,7 +82,8 @@ | |||
82 | #define IWL8000_TX_POWER_VERSION 0xffff /* meaningless */ | 82 | #define IWL8000_TX_POWER_VERSION 0xffff /* meaningless */ |
83 | 83 | ||
84 | #define IWL8000_FW_PRE "iwlwifi-8000" | 84 | #define IWL8000_FW_PRE "iwlwifi-8000" |
85 | #define IWL8000_MODULE_FIRMWARE(api) IWL8000_FW_PRE __stringify(api) ".ucode" | 85 | #define IWL8000_MODULE_FIRMWARE(api) \ |
86 | IWL8000_FW_PRE "-" __stringify(api) ".ucode" | ||
86 | 87 | ||
87 | #define NVM_HW_SECTION_NUM_FAMILY_8000 10 | 88 | #define NVM_HW_SECTION_NUM_FAMILY_8000 10 |
88 | #define DEFAULT_NVM_FILE_FAMILY_8000 "iwl_nvm_8000.bin" | 89 | #define DEFAULT_NVM_FILE_FAMILY_8000 "iwl_nvm_8000.bin" |
diff --git a/drivers/net/wireless/iwlwifi/iwl-trans.h b/drivers/net/wireless/iwlwifi/iwl-trans.h index 9eb85249e89c..d8fc548c0d6c 100644 --- a/drivers/net/wireless/iwlwifi/iwl-trans.h +++ b/drivers/net/wireless/iwlwifi/iwl-trans.h | |||
@@ -563,6 +563,7 @@ enum iwl_trans_state { | |||
563 | * Set during transport allocation. | 563 | * Set during transport allocation. |
564 | * @hw_id_str: a string with info about HW ID. Set during transport allocation. | 564 | * @hw_id_str: a string with info about HW ID. Set during transport allocation. |
565 | * @pm_support: set to true in start_hw if link pm is supported | 565 | * @pm_support: set to true in start_hw if link pm is supported |
566 | * @ltr_enabled: set to true if the LTR is enabled | ||
566 | * @dev_cmd_pool: pool for Tx cmd allocation - for internal use only. | 567 | * @dev_cmd_pool: pool for Tx cmd allocation - for internal use only. |
567 | * The user should use iwl_trans_{alloc,free}_tx_cmd. | 568 | * The user should use iwl_trans_{alloc,free}_tx_cmd. |
568 | * @dev_cmd_headroom: room needed for the transport's private use before the | 569 | * @dev_cmd_headroom: room needed for the transport's private use before the |
@@ -589,6 +590,7 @@ struct iwl_trans { | |||
589 | u8 rx_mpdu_cmd, rx_mpdu_cmd_hdr_size; | 590 | u8 rx_mpdu_cmd, rx_mpdu_cmd_hdr_size; |
590 | 591 | ||
591 | bool pm_support; | 592 | bool pm_support; |
593 | bool ltr_enabled; | ||
592 | 594 | ||
593 | /* The following fields are internal only */ | 595 | /* The following fields are internal only */ |
594 | struct kmem_cache *dev_cmd_pool; | 596 | struct kmem_cache *dev_cmd_pool; |
diff --git a/drivers/net/wireless/iwlwifi/mvm/coex.c b/drivers/net/wireless/iwlwifi/mvm/coex.c index 8df2021f9856..da2ffb785194 100644 --- a/drivers/net/wireless/iwlwifi/mvm/coex.c +++ b/drivers/net/wireless/iwlwifi/mvm/coex.c | |||
@@ -303,8 +303,8 @@ static const __le64 iwl_ci_mask[][3] = { | |||
303 | }; | 303 | }; |
304 | 304 | ||
305 | static const __le32 iwl_bt_mprio_lut[BT_COEX_MULTI_PRIO_LUT_SIZE] = { | 305 | static const __le32 iwl_bt_mprio_lut[BT_COEX_MULTI_PRIO_LUT_SIZE] = { |
306 | cpu_to_le32(0x28412201), | 306 | cpu_to_le32(0x2e402280), |
307 | cpu_to_le32(0x11118451), | 307 | cpu_to_le32(0x7711a751), |
308 | }; | 308 | }; |
309 | 309 | ||
310 | struct corunning_block_luts { | 310 | struct corunning_block_luts { |
diff --git a/drivers/net/wireless/iwlwifi/mvm/coex_legacy.c b/drivers/net/wireless/iwlwifi/mvm/coex_legacy.c index 585c0ab4a3ec..8a1d2f33d5b7 100644 --- a/drivers/net/wireless/iwlwifi/mvm/coex_legacy.c +++ b/drivers/net/wireless/iwlwifi/mvm/coex_legacy.c | |||
@@ -291,8 +291,8 @@ static const __le64 iwl_ci_mask[][3] = { | |||
291 | }; | 291 | }; |
292 | 292 | ||
293 | static const __le32 iwl_bt_mprio_lut[BT_COEX_MULTI_PRIO_LUT_SIZE] = { | 293 | static const __le32 iwl_bt_mprio_lut[BT_COEX_MULTI_PRIO_LUT_SIZE] = { |
294 | cpu_to_le32(0x28412201), | 294 | cpu_to_le32(0x2e402280), |
295 | cpu_to_le32(0x11118451), | 295 | cpu_to_le32(0x7711a751), |
296 | }; | 296 | }; |
297 | 297 | ||
298 | struct corunning_block_luts { | 298 | struct corunning_block_luts { |
diff --git a/drivers/net/wireless/iwlwifi/mvm/fw-api-power.h b/drivers/net/wireless/iwlwifi/mvm/fw-api-power.h index 27dd86395b39..2fd8ad4633e0 100644 --- a/drivers/net/wireless/iwlwifi/mvm/fw-api-power.h +++ b/drivers/net/wireless/iwlwifi/mvm/fw-api-power.h | |||
@@ -68,13 +68,46 @@ | |||
68 | 68 | ||
69 | /* Power Management Commands, Responses, Notifications */ | 69 | /* Power Management Commands, Responses, Notifications */ |
70 | 70 | ||
71 | /** | ||
72 | * enum iwl_ltr_config_flags - masks for LTR config command flags | ||
73 | * @LTR_CFG_FLAG_FEATURE_ENABLE: Feature operational status | ||
74 | * @LTR_CFG_FLAG_HW_DIS_ON_SHADOW_REG_ACCESS: allow LTR change on shadow | ||
75 | * memory access | ||
76 | * @LTR_CFG_FLAG_HW_EN_SHRT_WR_THROUGH: allow LTR msg send on ANY LTR | ||
77 | * reg change | ||
78 | * @LTR_CFG_FLAG_HW_DIS_ON_D0_2_D3: allow LTR msg send on transition from | ||
79 | * D0 to D3 | ||
80 | * @LTR_CFG_FLAG_SW_SET_SHORT: fixed static short LTR register | ||
81 | * @LTR_CFG_FLAG_SW_SET_LONG: fixed static short LONG register | ||
82 | * @LTR_CFG_FLAG_DENIE_C10_ON_PD: allow going into C10 on PD | ||
83 | */ | ||
84 | enum iwl_ltr_config_flags { | ||
85 | LTR_CFG_FLAG_FEATURE_ENABLE = BIT(0), | ||
86 | LTR_CFG_FLAG_HW_DIS_ON_SHADOW_REG_ACCESS = BIT(1), | ||
87 | LTR_CFG_FLAG_HW_EN_SHRT_WR_THROUGH = BIT(2), | ||
88 | LTR_CFG_FLAG_HW_DIS_ON_D0_2_D3 = BIT(3), | ||
89 | LTR_CFG_FLAG_SW_SET_SHORT = BIT(4), | ||
90 | LTR_CFG_FLAG_SW_SET_LONG = BIT(5), | ||
91 | LTR_CFG_FLAG_DENIE_C10_ON_PD = BIT(6), | ||
92 | }; | ||
93 | |||
94 | /** | ||
95 | * struct iwl_ltr_config_cmd - configures the LTR | ||
96 | * @flags: See %enum iwl_ltr_config_flags | ||
97 | */ | ||
98 | struct iwl_ltr_config_cmd { | ||
99 | __le32 flags; | ||
100 | __le32 static_long; | ||
101 | __le32 static_short; | ||
102 | } __packed; | ||
103 | |||
71 | /* Radio LP RX Energy Threshold measured in dBm */ | 104 | /* Radio LP RX Energy Threshold measured in dBm */ |
72 | #define POWER_LPRX_RSSI_THRESHOLD 75 | 105 | #define POWER_LPRX_RSSI_THRESHOLD 75 |
73 | #define POWER_LPRX_RSSI_THRESHOLD_MAX 94 | 106 | #define POWER_LPRX_RSSI_THRESHOLD_MAX 94 |
74 | #define POWER_LPRX_RSSI_THRESHOLD_MIN 30 | 107 | #define POWER_LPRX_RSSI_THRESHOLD_MIN 30 |
75 | 108 | ||
76 | /** | 109 | /** |
77 | * enum iwl_scan_flags - masks for power table command flags | 110 | * enum iwl_power_flags - masks for power table command flags |
78 | * @POWER_FLAGS_POWER_SAVE_ENA_MSK: '1' Allow to save power by turning off | 111 | * @POWER_FLAGS_POWER_SAVE_ENA_MSK: '1' Allow to save power by turning off |
79 | * receiver and transmitter. '0' - does not allow. | 112 | * receiver and transmitter. '0' - does not allow. |
80 | * @POWER_FLAGS_POWER_MANAGEMENT_ENA_MSK: '0' Driver disables power management, | 113 | * @POWER_FLAGS_POWER_MANAGEMENT_ENA_MSK: '0' Driver disables power management, |
diff --git a/drivers/net/wireless/iwlwifi/mvm/fw-api.h b/drivers/net/wireless/iwlwifi/mvm/fw-api.h index 667a92274c87..c62575d86bcd 100644 --- a/drivers/net/wireless/iwlwifi/mvm/fw-api.h +++ b/drivers/net/wireless/iwlwifi/mvm/fw-api.h | |||
@@ -157,6 +157,7 @@ enum { | |||
157 | /* Power - legacy power table command */ | 157 | /* Power - legacy power table command */ |
158 | POWER_TABLE_CMD = 0x77, | 158 | POWER_TABLE_CMD = 0x77, |
159 | PSM_UAPSD_AP_MISBEHAVING_NOTIFICATION = 0x78, | 159 | PSM_UAPSD_AP_MISBEHAVING_NOTIFICATION = 0x78, |
160 | LTR_CONFIG = 0xee, | ||
160 | 161 | ||
161 | /* Thermal Throttling*/ | 162 | /* Thermal Throttling*/ |
162 | REPLY_THERMAL_MNG_BACKOFF = 0x7e, | 163 | REPLY_THERMAL_MNG_BACKOFF = 0x7e, |
diff --git a/drivers/net/wireless/iwlwifi/mvm/fw.c b/drivers/net/wireless/iwlwifi/mvm/fw.c index 23fd711a67e4..e0d9f19650b0 100644 --- a/drivers/net/wireless/iwlwifi/mvm/fw.c +++ b/drivers/net/wireless/iwlwifi/mvm/fw.c | |||
@@ -480,6 +480,15 @@ int iwl_mvm_up(struct iwl_mvm *mvm) | |||
480 | /* Initialize tx backoffs to the minimal possible */ | 480 | /* Initialize tx backoffs to the minimal possible */ |
481 | iwl_mvm_tt_tx_backoff(mvm, 0); | 481 | iwl_mvm_tt_tx_backoff(mvm, 0); |
482 | 482 | ||
483 | if (mvm->trans->ltr_enabled) { | ||
484 | struct iwl_ltr_config_cmd cmd = { | ||
485 | .flags = cpu_to_le32(LTR_CFG_FLAG_FEATURE_ENABLE), | ||
486 | }; | ||
487 | |||
488 | WARN_ON(iwl_mvm_send_cmd_pdu(mvm, LTR_CONFIG, 0, | ||
489 | sizeof(cmd), &cmd)); | ||
490 | } | ||
491 | |||
483 | ret = iwl_mvm_power_update_device(mvm); | 492 | ret = iwl_mvm_power_update_device(mvm); |
484 | if (ret) | 493 | if (ret) |
485 | goto error; | 494 | goto error; |
diff --git a/drivers/net/wireless/iwlwifi/mvm/mac80211.c b/drivers/net/wireless/iwlwifi/mvm/mac80211.c index c7a73c68bdab..585fe5b7100f 100644 --- a/drivers/net/wireless/iwlwifi/mvm/mac80211.c +++ b/drivers/net/wireless/iwlwifi/mvm/mac80211.c | |||
@@ -526,7 +526,8 @@ static void iwl_mvm_mac_tx(struct ieee80211_hw *hw, | |||
526 | } | 526 | } |
527 | 527 | ||
528 | if (IEEE80211_SKB_CB(skb)->hw_queue == IWL_MVM_OFFCHANNEL_QUEUE && | 528 | if (IEEE80211_SKB_CB(skb)->hw_queue == IWL_MVM_OFFCHANNEL_QUEUE && |
529 | !test_bit(IWL_MVM_STATUS_ROC_RUNNING, &mvm->status)) | 529 | !test_bit(IWL_MVM_STATUS_ROC_RUNNING, &mvm->status) && |
530 | !test_bit(IWL_MVM_STATUS_ROC_AUX_RUNNING, &mvm->status)) | ||
530 | goto drop; | 531 | goto drop; |
531 | 532 | ||
532 | /* treat non-bufferable MMPDUs as broadcast if sta is sleeping */ | 533 | /* treat non-bufferable MMPDUs as broadcast if sta is sleeping */ |
@@ -1734,6 +1735,13 @@ iwl_mvm_bss_info_changed_ap_ibss(struct iwl_mvm *mvm, | |||
1734 | if (changes & BSS_CHANGED_BEACON && | 1735 | if (changes & BSS_CHANGED_BEACON && |
1735 | iwl_mvm_mac_ctxt_beacon_changed(mvm, vif)) | 1736 | iwl_mvm_mac_ctxt_beacon_changed(mvm, vif)) |
1736 | IWL_WARN(mvm, "Failed updating beacon data\n"); | 1737 | IWL_WARN(mvm, "Failed updating beacon data\n"); |
1738 | |||
1739 | if (changes & BSS_CHANGED_TXPOWER) { | ||
1740 | IWL_DEBUG_CALIB(mvm, "Changing TX Power to %d\n", | ||
1741 | bss_conf->txpower); | ||
1742 | iwl_mvm_set_tx_power(mvm, vif, bss_conf->txpower); | ||
1743 | } | ||
1744 | |||
1737 | } | 1745 | } |
1738 | 1746 | ||
1739 | static void iwl_mvm_bss_info_changed(struct ieee80211_hw *hw, | 1747 | static void iwl_mvm_bss_info_changed(struct ieee80211_hw *hw, |
@@ -2367,14 +2375,19 @@ static int iwl_mvm_send_aux_roc_cmd(struct iwl_mvm *mvm, | |||
2367 | /* Set the node address */ | 2375 | /* Set the node address */ |
2368 | memcpy(aux_roc_req.node_addr, vif->addr, ETH_ALEN); | 2376 | memcpy(aux_roc_req.node_addr, vif->addr, ETH_ALEN); |
2369 | 2377 | ||
2378 | lockdep_assert_held(&mvm->mutex); | ||
2379 | |||
2380 | spin_lock_bh(&mvm->time_event_lock); | ||
2381 | |||
2382 | if (WARN_ON(te_data->id == HOT_SPOT_CMD)) { | ||
2383 | spin_unlock_bh(&mvm->time_event_lock); | ||
2384 | return -EIO; | ||
2385 | } | ||
2386 | |||
2370 | te_data->vif = vif; | 2387 | te_data->vif = vif; |
2371 | te_data->duration = duration; | 2388 | te_data->duration = duration; |
2372 | te_data->id = HOT_SPOT_CMD; | 2389 | te_data->id = HOT_SPOT_CMD; |
2373 | 2390 | ||
2374 | lockdep_assert_held(&mvm->mutex); | ||
2375 | |||
2376 | spin_lock_bh(&mvm->time_event_lock); | ||
2377 | list_add_tail(&te_data->list, &mvm->time_event_list); | ||
2378 | spin_unlock_bh(&mvm->time_event_lock); | 2391 | spin_unlock_bh(&mvm->time_event_lock); |
2379 | 2392 | ||
2380 | /* | 2393 | /* |
@@ -2430,22 +2443,23 @@ static int iwl_mvm_roc(struct ieee80211_hw *hw, | |||
2430 | IWL_DEBUG_MAC80211(mvm, "enter (%d, %d, %d)\n", channel->hw_value, | 2443 | IWL_DEBUG_MAC80211(mvm, "enter (%d, %d, %d)\n", channel->hw_value, |
2431 | duration, type); | 2444 | duration, type); |
2432 | 2445 | ||
2446 | mutex_lock(&mvm->mutex); | ||
2447 | |||
2433 | switch (vif->type) { | 2448 | switch (vif->type) { |
2434 | case NL80211_IFTYPE_STATION: | 2449 | case NL80211_IFTYPE_STATION: |
2435 | /* Use aux roc framework (HS20) */ | 2450 | /* Use aux roc framework (HS20) */ |
2436 | ret = iwl_mvm_send_aux_roc_cmd(mvm, channel, | 2451 | ret = iwl_mvm_send_aux_roc_cmd(mvm, channel, |
2437 | vif, duration); | 2452 | vif, duration); |
2438 | return ret; | 2453 | goto out_unlock; |
2439 | case NL80211_IFTYPE_P2P_DEVICE: | 2454 | case NL80211_IFTYPE_P2P_DEVICE: |
2440 | /* handle below */ | 2455 | /* handle below */ |
2441 | break; | 2456 | break; |
2442 | default: | 2457 | default: |
2443 | IWL_ERR(mvm, "vif isn't P2P_DEVICE: %d\n", vif->type); | 2458 | IWL_ERR(mvm, "vif isn't P2P_DEVICE: %d\n", vif->type); |
2444 | return -EINVAL; | 2459 | ret = -EINVAL; |
2460 | goto out_unlock; | ||
2445 | } | 2461 | } |
2446 | 2462 | ||
2447 | mutex_lock(&mvm->mutex); | ||
2448 | |||
2449 | for (i = 0; i < NUM_PHY_CTX; i++) { | 2463 | for (i = 0; i < NUM_PHY_CTX; i++) { |
2450 | phy_ctxt = &mvm->phy_ctxts[i]; | 2464 | phy_ctxt = &mvm->phy_ctxts[i]; |
2451 | if (phy_ctxt->ref == 0 || mvmvif->phy_ctxt == phy_ctxt) | 2465 | if (phy_ctxt->ref == 0 || mvmvif->phy_ctxt == phy_ctxt) |
diff --git a/drivers/net/wireless/iwlwifi/mvm/ops.c b/drivers/net/wireless/iwlwifi/mvm/ops.c index 15aa298ee79c..48cb25a93591 100644 --- a/drivers/net/wireless/iwlwifi/mvm/ops.c +++ b/drivers/net/wireless/iwlwifi/mvm/ops.c | |||
@@ -336,6 +336,7 @@ static const char *const iwl_mvm_cmd_strings[REPLY_MAX] = { | |||
336 | CMD(DTS_MEASUREMENT_NOTIFICATION), | 336 | CMD(DTS_MEASUREMENT_NOTIFICATION), |
337 | CMD(REPLY_THERMAL_MNG_BACKOFF), | 337 | CMD(REPLY_THERMAL_MNG_BACKOFF), |
338 | CMD(MAC_PM_POWER_TABLE), | 338 | CMD(MAC_PM_POWER_TABLE), |
339 | CMD(LTR_CONFIG), | ||
339 | CMD(BT_COEX_CI), | 340 | CMD(BT_COEX_CI), |
340 | CMD(BT_COEX_UPDATE_SW_BOOST), | 341 | CMD(BT_COEX_UPDATE_SW_BOOST), |
341 | CMD(BT_COEX_UPDATE_CORUN_LUT), | 342 | CMD(BT_COEX_UPDATE_CORUN_LUT), |
diff --git a/drivers/net/wireless/iwlwifi/mvm/scan.c b/drivers/net/wireless/iwlwifi/mvm/scan.c index cb85e63c20aa..b280d5d87127 100644 --- a/drivers/net/wireless/iwlwifi/mvm/scan.c +++ b/drivers/net/wireless/iwlwifi/mvm/scan.c | |||
@@ -459,7 +459,8 @@ int iwl_mvm_scan_request(struct iwl_mvm *mvm, | |||
459 | basic_ssid ? 1 : 0); | 459 | basic_ssid ? 1 : 0); |
460 | 460 | ||
461 | cmd->tx_cmd.tx_flags = cpu_to_le32(TX_CMD_FLG_SEQ_CTL | | 461 | cmd->tx_cmd.tx_flags = cpu_to_le32(TX_CMD_FLG_SEQ_CTL | |
462 | TX_CMD_FLG_BT_DIS); | 462 | 3 << TX_CMD_FLG_BT_PRIO_POS); |
463 | |||
463 | cmd->tx_cmd.sta_id = mvm->aux_sta.sta_id; | 464 | cmd->tx_cmd.sta_id = mvm->aux_sta.sta_id; |
464 | cmd->tx_cmd.life_time = cpu_to_le32(TX_CMD_LIFE_TIME_INFINITE); | 465 | cmd->tx_cmd.life_time = cpu_to_le32(TX_CMD_LIFE_TIME_INFINITE); |
465 | cmd->tx_cmd.rate_n_flags = | 466 | cmd->tx_cmd.rate_n_flags = |
diff --git a/drivers/net/wireless/iwlwifi/mvm/time-event.c b/drivers/net/wireless/iwlwifi/mvm/time-event.c index b7f9e61d14e2..6dfad230be5e 100644 --- a/drivers/net/wireless/iwlwifi/mvm/time-event.c +++ b/drivers/net/wireless/iwlwifi/mvm/time-event.c | |||
@@ -305,8 +305,8 @@ static int iwl_mvm_aux_roc_te_handle_notif(struct iwl_mvm *mvm, | |||
305 | te_data->running = false; | 305 | te_data->running = false; |
306 | te_data->vif = NULL; | 306 | te_data->vif = NULL; |
307 | te_data->uid = 0; | 307 | te_data->uid = 0; |
308 | te_data->id = TE_MAX; | ||
308 | } else if (le32_to_cpu(notif->action) == TE_V2_NOTIF_HOST_EVENT_START) { | 309 | } else if (le32_to_cpu(notif->action) == TE_V2_NOTIF_HOST_EVENT_START) { |
309 | set_bit(IWL_MVM_STATUS_ROC_RUNNING, &mvm->status); | ||
310 | set_bit(IWL_MVM_STATUS_ROC_AUX_RUNNING, &mvm->status); | 310 | set_bit(IWL_MVM_STATUS_ROC_AUX_RUNNING, &mvm->status); |
311 | te_data->running = true; | 311 | te_data->running = true; |
312 | ieee80211_ready_on_channel(mvm->hw); /* Start TE */ | 312 | ieee80211_ready_on_channel(mvm->hw); /* Start TE */ |
diff --git a/drivers/net/wireless/iwlwifi/mvm/tx.c b/drivers/net/wireless/iwlwifi/mvm/tx.c index 1cb793a498ac..c6a517c771df 100644 --- a/drivers/net/wireless/iwlwifi/mvm/tx.c +++ b/drivers/net/wireless/iwlwifi/mvm/tx.c | |||
@@ -175,14 +175,10 @@ static void iwl_mvm_set_tx_cmd_rate(struct iwl_mvm *mvm, | |||
175 | 175 | ||
176 | /* | 176 | /* |
177 | * for data packets, rate info comes from the table inside the fw. This | 177 | * for data packets, rate info comes from the table inside the fw. This |
178 | * table is controlled by LINK_QUALITY commands. Exclude ctrl port | 178 | * table is controlled by LINK_QUALITY commands |
179 | * frames like EAPOLs which should be treated as mgmt frames. This | ||
180 | * avoids them being sent initially in high rates which increases the | ||
181 | * chances for completion of the 4-Way handshake. | ||
182 | */ | 179 | */ |
183 | 180 | ||
184 | if (ieee80211_is_data(fc) && sta && | 181 | if (ieee80211_is_data(fc) && sta) { |
185 | !(info->control.flags & IEEE80211_TX_CTRL_PORT_CTRL_PROTO)) { | ||
186 | tx_cmd->initial_rate_index = 0; | 182 | tx_cmd->initial_rate_index = 0; |
187 | tx_cmd->tx_flags |= cpu_to_le32(TX_CMD_FLG_STA_RATE); | 183 | tx_cmd->tx_flags |= cpu_to_le32(TX_CMD_FLG_STA_RATE); |
188 | return; | 184 | return; |
diff --git a/drivers/net/wireless/iwlwifi/pcie/trans.c b/drivers/net/wireless/iwlwifi/pcie/trans.c index 1393bac0025c..3781b029e54a 100644 --- a/drivers/net/wireless/iwlwifi/pcie/trans.c +++ b/drivers/net/wireless/iwlwifi/pcie/trans.c | |||
@@ -174,6 +174,7 @@ static void iwl_pcie_apm_config(struct iwl_trans *trans) | |||
174 | { | 174 | { |
175 | struct iwl_trans_pcie *trans_pcie = IWL_TRANS_GET_PCIE_TRANS(trans); | 175 | struct iwl_trans_pcie *trans_pcie = IWL_TRANS_GET_PCIE_TRANS(trans); |
176 | u16 lctl; | 176 | u16 lctl; |
177 | u16 cap; | ||
177 | 178 | ||
178 | /* | 179 | /* |
179 | * HW bug W/A for instability in PCIe bus L0S->L1 transition. | 180 | * HW bug W/A for instability in PCIe bus L0S->L1 transition. |
@@ -184,16 +185,17 @@ static void iwl_pcie_apm_config(struct iwl_trans *trans) | |||
184 | * power savings, even without L1. | 185 | * power savings, even without L1. |
185 | */ | 186 | */ |
186 | pcie_capability_read_word(trans_pcie->pci_dev, PCI_EXP_LNKCTL, &lctl); | 187 | pcie_capability_read_word(trans_pcie->pci_dev, PCI_EXP_LNKCTL, &lctl); |
187 | if (lctl & PCI_EXP_LNKCTL_ASPM_L1) { | 188 | if (lctl & PCI_EXP_LNKCTL_ASPM_L1) |
188 | /* L1-ASPM enabled; disable(!) L0S */ | ||
189 | iwl_set_bit(trans, CSR_GIO_REG, CSR_GIO_REG_VAL_L0S_ENABLED); | 189 | iwl_set_bit(trans, CSR_GIO_REG, CSR_GIO_REG_VAL_L0S_ENABLED); |
190 | dev_info(trans->dev, "L1 Enabled; Disabling L0S\n"); | 190 | else |
191 | } else { | ||
192 | /* L1-ASPM disabled; enable(!) L0S */ | ||
193 | iwl_clear_bit(trans, CSR_GIO_REG, CSR_GIO_REG_VAL_L0S_ENABLED); | 191 | iwl_clear_bit(trans, CSR_GIO_REG, CSR_GIO_REG_VAL_L0S_ENABLED); |
194 | dev_info(trans->dev, "L1 Disabled; Enabling L0S\n"); | ||
195 | } | ||
196 | trans->pm_support = !(lctl & PCI_EXP_LNKCTL_ASPM_L0S); | 192 | trans->pm_support = !(lctl & PCI_EXP_LNKCTL_ASPM_L0S); |
193 | |||
194 | pcie_capability_read_word(trans_pcie->pci_dev, PCI_EXP_DEVCTL2, &cap); | ||
195 | trans->ltr_enabled = cap & PCI_EXP_DEVCTL2_LTR_EN; | ||
196 | dev_info(trans->dev, "L1 %sabled - LTR %sabled\n", | ||
197 | (lctl & PCI_EXP_LNKCTL_ASPM_L1) ? "En" : "Dis", | ||
198 | trans->ltr_enabled ? "En" : "Dis"); | ||
197 | } | 199 | } |
198 | 200 | ||
199 | /* | 201 | /* |
@@ -428,7 +430,7 @@ static int iwl_pcie_apm_stop_master(struct iwl_trans *trans) | |||
428 | ret = iwl_poll_bit(trans, CSR_RESET, | 430 | ret = iwl_poll_bit(trans, CSR_RESET, |
429 | CSR_RESET_REG_FLAG_MASTER_DISABLED, | 431 | CSR_RESET_REG_FLAG_MASTER_DISABLED, |
430 | CSR_RESET_REG_FLAG_MASTER_DISABLED, 100); | 432 | CSR_RESET_REG_FLAG_MASTER_DISABLED, 100); |
431 | if (ret) | 433 | if (ret < 0) |
432 | IWL_WARN(trans, "Master Disable Timed Out, 100 usec\n"); | 434 | IWL_WARN(trans, "Master Disable Timed Out, 100 usec\n"); |
433 | 435 | ||
434 | IWL_DEBUG_INFO(trans, "stop master\n"); | 436 | IWL_DEBUG_INFO(trans, "stop master\n"); |
@@ -544,7 +546,7 @@ static int iwl_pcie_prepare_card_hw(struct iwl_trans *trans) | |||
544 | msleep(25); | 546 | msleep(25); |
545 | } | 547 | } |
546 | 548 | ||
547 | IWL_DEBUG_INFO(trans, "got NIC after %d iterations\n", iter); | 549 | IWL_ERR(trans, "Couldn't prepare the card\n"); |
548 | 550 | ||
549 | return ret; | 551 | return ret; |
550 | } | 552 | } |
@@ -1043,7 +1045,7 @@ static int iwl_trans_pcie_d3_resume(struct iwl_trans *trans, | |||
1043 | CSR_GP_CNTRL_REG_FLAG_MAC_CLOCK_READY, | 1045 | CSR_GP_CNTRL_REG_FLAG_MAC_CLOCK_READY, |
1044 | CSR_GP_CNTRL_REG_FLAG_MAC_CLOCK_READY, | 1046 | CSR_GP_CNTRL_REG_FLAG_MAC_CLOCK_READY, |
1045 | 25000); | 1047 | 25000); |
1046 | if (ret) { | 1048 | if (ret < 0) { |
1047 | IWL_ERR(trans, "Failed to resume the device (mac ready)\n"); | 1049 | IWL_ERR(trans, "Failed to resume the device (mac ready)\n"); |
1048 | return ret; | 1050 | return ret; |
1049 | } | 1051 | } |
diff --git a/drivers/net/wireless/mwifiex/11n_rxreorder.c b/drivers/net/wireless/mwifiex/11n_rxreorder.c index 40057079ffb9..5ef5a0eeba50 100644 --- a/drivers/net/wireless/mwifiex/11n_rxreorder.c +++ b/drivers/net/wireless/mwifiex/11n_rxreorder.c | |||
@@ -196,6 +196,7 @@ mwifiex_del_rx_reorder_entry(struct mwifiex_private *priv, | |||
196 | mwifiex_11n_dispatch_pkt_until_start_win(priv, tbl, start_win); | 196 | mwifiex_11n_dispatch_pkt_until_start_win(priv, tbl, start_win); |
197 | 197 | ||
198 | del_timer_sync(&tbl->timer_context.timer); | 198 | del_timer_sync(&tbl->timer_context.timer); |
199 | tbl->timer_context.timer_is_set = false; | ||
199 | 200 | ||
200 | spin_lock_irqsave(&priv->rx_reorder_tbl_lock, flags); | 201 | spin_lock_irqsave(&priv->rx_reorder_tbl_lock, flags); |
201 | list_del(&tbl->list); | 202 | list_del(&tbl->list); |
@@ -297,6 +298,7 @@ mwifiex_flush_data(unsigned long context) | |||
297 | (struct reorder_tmr_cnxt *) context; | 298 | (struct reorder_tmr_cnxt *) context; |
298 | int start_win, seq_num; | 299 | int start_win, seq_num; |
299 | 300 | ||
301 | ctx->timer_is_set = false; | ||
300 | seq_num = mwifiex_11n_find_last_seq_num(ctx); | 302 | seq_num = mwifiex_11n_find_last_seq_num(ctx); |
301 | 303 | ||
302 | if (seq_num < 0) | 304 | if (seq_num < 0) |
@@ -385,6 +387,7 @@ mwifiex_11n_create_rx_reorder_tbl(struct mwifiex_private *priv, u8 *ta, | |||
385 | 387 | ||
386 | new_node->timer_context.ptr = new_node; | 388 | new_node->timer_context.ptr = new_node; |
387 | new_node->timer_context.priv = priv; | 389 | new_node->timer_context.priv = priv; |
390 | new_node->timer_context.timer_is_set = false; | ||
388 | 391 | ||
389 | init_timer(&new_node->timer_context.timer); | 392 | init_timer(&new_node->timer_context.timer); |
390 | new_node->timer_context.timer.function = mwifiex_flush_data; | 393 | new_node->timer_context.timer.function = mwifiex_flush_data; |
@@ -399,6 +402,22 @@ mwifiex_11n_create_rx_reorder_tbl(struct mwifiex_private *priv, u8 *ta, | |||
399 | spin_unlock_irqrestore(&priv->rx_reorder_tbl_lock, flags); | 402 | spin_unlock_irqrestore(&priv->rx_reorder_tbl_lock, flags); |
400 | } | 403 | } |
401 | 404 | ||
405 | static void | ||
406 | mwifiex_11n_rxreorder_timer_restart(struct mwifiex_rx_reorder_tbl *tbl) | ||
407 | { | ||
408 | u32 min_flush_time; | ||
409 | |||
410 | if (tbl->win_size >= MWIFIEX_BA_WIN_SIZE_32) | ||
411 | min_flush_time = MIN_FLUSH_TIMER_15_MS; | ||
412 | else | ||
413 | min_flush_time = MIN_FLUSH_TIMER_MS; | ||
414 | |||
415 | mod_timer(&tbl->timer_context.timer, | ||
416 | jiffies + msecs_to_jiffies(min_flush_time * tbl->win_size)); | ||
417 | |||
418 | tbl->timer_context.timer_is_set = true; | ||
419 | } | ||
420 | |||
402 | /* | 421 | /* |
403 | * This function prepares command for adding a BA request. | 422 | * This function prepares command for adding a BA request. |
404 | * | 423 | * |
@@ -523,31 +542,31 @@ int mwifiex_11n_rx_reorder_pkt(struct mwifiex_private *priv, | |||
523 | u8 *ta, u8 pkt_type, void *payload) | 542 | u8 *ta, u8 pkt_type, void *payload) |
524 | { | 543 | { |
525 | struct mwifiex_rx_reorder_tbl *tbl; | 544 | struct mwifiex_rx_reorder_tbl *tbl; |
526 | int start_win, end_win, win_size; | 545 | int prev_start_win, start_win, end_win, win_size; |
527 | u16 pkt_index; | 546 | u16 pkt_index; |
528 | bool init_window_shift = false; | 547 | bool init_window_shift = false; |
548 | int ret = 0; | ||
529 | 549 | ||
530 | tbl = mwifiex_11n_get_rx_reorder_tbl(priv, tid, ta); | 550 | tbl = mwifiex_11n_get_rx_reorder_tbl(priv, tid, ta); |
531 | if (!tbl) { | 551 | if (!tbl) { |
532 | if (pkt_type != PKT_TYPE_BAR) | 552 | if (pkt_type != PKT_TYPE_BAR) |
533 | mwifiex_11n_dispatch_pkt(priv, payload); | 553 | mwifiex_11n_dispatch_pkt(priv, payload); |
534 | return 0; | 554 | return ret; |
535 | } | 555 | } |
536 | 556 | ||
537 | if ((pkt_type == PKT_TYPE_AMSDU) && !tbl->amsdu) { | 557 | if ((pkt_type == PKT_TYPE_AMSDU) && !tbl->amsdu) { |
538 | mwifiex_11n_dispatch_pkt(priv, payload); | 558 | mwifiex_11n_dispatch_pkt(priv, payload); |
539 | return 0; | 559 | return ret; |
540 | } | 560 | } |
541 | 561 | ||
542 | start_win = tbl->start_win; | 562 | start_win = tbl->start_win; |
563 | prev_start_win = start_win; | ||
543 | win_size = tbl->win_size; | 564 | win_size = tbl->win_size; |
544 | end_win = ((start_win + win_size) - 1) & (MAX_TID_VALUE - 1); | 565 | end_win = ((start_win + win_size) - 1) & (MAX_TID_VALUE - 1); |
545 | if (tbl->flags & RXREOR_INIT_WINDOW_SHIFT) { | 566 | if (tbl->flags & RXREOR_INIT_WINDOW_SHIFT) { |
546 | init_window_shift = true; | 567 | init_window_shift = true; |
547 | tbl->flags &= ~RXREOR_INIT_WINDOW_SHIFT; | 568 | tbl->flags &= ~RXREOR_INIT_WINDOW_SHIFT; |
548 | } | 569 | } |
549 | mod_timer(&tbl->timer_context.timer, | ||
550 | jiffies + msecs_to_jiffies(MIN_FLUSH_TIMER_MS * win_size)); | ||
551 | 570 | ||
552 | if (tbl->flags & RXREOR_FORCE_NO_DROP) { | 571 | if (tbl->flags & RXREOR_FORCE_NO_DROP) { |
553 | dev_dbg(priv->adapter->dev, | 572 | dev_dbg(priv->adapter->dev, |
@@ -568,11 +587,14 @@ int mwifiex_11n_rx_reorder_pkt(struct mwifiex_private *priv, | |||
568 | if ((start_win + TWOPOW11) > (MAX_TID_VALUE - 1)) { | 587 | if ((start_win + TWOPOW11) > (MAX_TID_VALUE - 1)) { |
569 | if (seq_num >= ((start_win + TWOPOW11) & | 588 | if (seq_num >= ((start_win + TWOPOW11) & |
570 | (MAX_TID_VALUE - 1)) && | 589 | (MAX_TID_VALUE - 1)) && |
571 | seq_num < start_win) | 590 | seq_num < start_win) { |
572 | return -1; | 591 | ret = -1; |
592 | goto done; | ||
593 | } | ||
573 | } else if ((seq_num < start_win) || | 594 | } else if ((seq_num < start_win) || |
574 | (seq_num > (start_win + TWOPOW11))) { | 595 | (seq_num >= (start_win + TWOPOW11))) { |
575 | return -1; | 596 | ret = -1; |
597 | goto done; | ||
576 | } | 598 | } |
577 | } | 599 | } |
578 | 600 | ||
@@ -601,8 +623,10 @@ int mwifiex_11n_rx_reorder_pkt(struct mwifiex_private *priv, | |||
601 | else | 623 | else |
602 | pkt_index = (seq_num+MAX_TID_VALUE) - start_win; | 624 | pkt_index = (seq_num+MAX_TID_VALUE) - start_win; |
603 | 625 | ||
604 | if (tbl->rx_reorder_ptr[pkt_index]) | 626 | if (tbl->rx_reorder_ptr[pkt_index]) { |
605 | return -1; | 627 | ret = -1; |
628 | goto done; | ||
629 | } | ||
606 | 630 | ||
607 | tbl->rx_reorder_ptr[pkt_index] = payload; | 631 | tbl->rx_reorder_ptr[pkt_index] = payload; |
608 | } | 632 | } |
@@ -613,7 +637,11 @@ int mwifiex_11n_rx_reorder_pkt(struct mwifiex_private *priv, | |||
613 | */ | 637 | */ |
614 | mwifiex_11n_scan_and_dispatch(priv, tbl); | 638 | mwifiex_11n_scan_and_dispatch(priv, tbl); |
615 | 639 | ||
616 | return 0; | 640 | done: |
641 | if (!tbl->timer_context.timer_is_set || | ||
642 | prev_start_win != tbl->start_win) | ||
643 | mwifiex_11n_rxreorder_timer_restart(tbl); | ||
644 | return ret; | ||
617 | } | 645 | } |
618 | 646 | ||
619 | /* | 647 | /* |
diff --git a/drivers/net/wireless/mwifiex/11n_rxreorder.h b/drivers/net/wireless/mwifiex/11n_rxreorder.h index 3a87bb0e3a62..63ecea89b4ab 100644 --- a/drivers/net/wireless/mwifiex/11n_rxreorder.h +++ b/drivers/net/wireless/mwifiex/11n_rxreorder.h | |||
@@ -21,6 +21,8 @@ | |||
21 | #define _MWIFIEX_11N_RXREORDER_H_ | 21 | #define _MWIFIEX_11N_RXREORDER_H_ |
22 | 22 | ||
23 | #define MIN_FLUSH_TIMER_MS 50 | 23 | #define MIN_FLUSH_TIMER_MS 50 |
24 | #define MIN_FLUSH_TIMER_15_MS 15 | ||
25 | #define MWIFIEX_BA_WIN_SIZE_32 32 | ||
24 | 26 | ||
25 | #define PKT_TYPE_BAR 0xE7 | 27 | #define PKT_TYPE_BAR 0xE7 |
26 | #define MAX_TID_VALUE (2 << 11) | 28 | #define MAX_TID_VALUE (2 << 11) |
diff --git a/drivers/net/wireless/mwifiex/main.h b/drivers/net/wireless/mwifiex/main.h index e2635747d966..f55658d15c60 100644 --- a/drivers/net/wireless/mwifiex/main.h +++ b/drivers/net/wireless/mwifiex/main.h | |||
@@ -592,6 +592,7 @@ struct reorder_tmr_cnxt { | |||
592 | struct timer_list timer; | 592 | struct timer_list timer; |
593 | struct mwifiex_rx_reorder_tbl *ptr; | 593 | struct mwifiex_rx_reorder_tbl *ptr; |
594 | struct mwifiex_private *priv; | 594 | struct mwifiex_private *priv; |
595 | u8 timer_is_set; | ||
595 | }; | 596 | }; |
596 | 597 | ||
597 | struct mwifiex_rx_reorder_tbl { | 598 | struct mwifiex_rx_reorder_tbl { |
diff --git a/drivers/net/wireless/rt2x00/rt2800usb.c b/drivers/net/wireless/rt2x00/rt2800usb.c index 573897b8e878..8444313eabe2 100644 --- a/drivers/net/wireless/rt2x00/rt2800usb.c +++ b/drivers/net/wireless/rt2x00/rt2800usb.c | |||
@@ -1111,6 +1111,7 @@ static struct usb_device_id rt2800usb_device_table[] = { | |||
1111 | /* Ovislink */ | 1111 | /* Ovislink */ |
1112 | { USB_DEVICE(0x1b75, 0x3071) }, | 1112 | { USB_DEVICE(0x1b75, 0x3071) }, |
1113 | { USB_DEVICE(0x1b75, 0x3072) }, | 1113 | { USB_DEVICE(0x1b75, 0x3072) }, |
1114 | { USB_DEVICE(0x1b75, 0xa200) }, | ||
1114 | /* Para */ | 1115 | /* Para */ |
1115 | { USB_DEVICE(0x20b8, 0x8888) }, | 1116 | { USB_DEVICE(0x20b8, 0x8888) }, |
1116 | /* Pegatron */ | 1117 | /* Pegatron */ |
diff --git a/drivers/net/wireless/rtlwifi/base.c b/drivers/net/wireless/rtlwifi/base.c index 58ba71830886..40b6d1d006d7 100644 --- a/drivers/net/wireless/rtlwifi/base.c +++ b/drivers/net/wireless/rtlwifi/base.c | |||
@@ -467,7 +467,7 @@ static void _rtl_init_deferred_work(struct ieee80211_hw *hw) | |||
467 | rtl_easy_concurrent_retrytimer_callback, (unsigned long)hw); | 467 | rtl_easy_concurrent_retrytimer_callback, (unsigned long)hw); |
468 | /* <2> work queue */ | 468 | /* <2> work queue */ |
469 | rtlpriv->works.hw = hw; | 469 | rtlpriv->works.hw = hw; |
470 | rtlpriv->works.rtl_wq = alloc_workqueue(rtlpriv->cfg->name, 0, 0); | 470 | rtlpriv->works.rtl_wq = alloc_workqueue("%s", 0, 0, rtlpriv->cfg->name); |
471 | INIT_DELAYED_WORK(&rtlpriv->works.watchdog_wq, | 471 | INIT_DELAYED_WORK(&rtlpriv->works.watchdog_wq, |
472 | (void *)rtl_watchdog_wq_callback); | 472 | (void *)rtl_watchdog_wq_callback); |
473 | INIT_DELAYED_WORK(&rtlpriv->works.ips_nic_off_wq, | 473 | INIT_DELAYED_WORK(&rtlpriv->works.ips_nic_off_wq, |
diff --git a/drivers/net/wireless/rtlwifi/core.c b/drivers/net/wireless/rtlwifi/core.c index f6179bc06086..07dae0d44abc 100644 --- a/drivers/net/wireless/rtlwifi/core.c +++ b/drivers/net/wireless/rtlwifi/core.c | |||
@@ -1828,3 +1828,9 @@ const struct ieee80211_ops rtl_ops = { | |||
1828 | .flush = rtl_op_flush, | 1828 | .flush = rtl_op_flush, |
1829 | }; | 1829 | }; |
1830 | EXPORT_SYMBOL_GPL(rtl_ops); | 1830 | EXPORT_SYMBOL_GPL(rtl_ops); |
1831 | |||
1832 | bool rtl_btc_status_false(void) | ||
1833 | { | ||
1834 | return false; | ||
1835 | } | ||
1836 | EXPORT_SYMBOL_GPL(rtl_btc_status_false); | ||
diff --git a/drivers/net/wireless/rtlwifi/core.h b/drivers/net/wireless/rtlwifi/core.h index 59cd3b9dca25..624e1dc16d31 100644 --- a/drivers/net/wireless/rtlwifi/core.h +++ b/drivers/net/wireless/rtlwifi/core.h | |||
@@ -42,5 +42,6 @@ void rtl_rfreg_delay(struct ieee80211_hw *hw, enum radio_path rfpath, u32 addr, | |||
42 | u32 mask, u32 data); | 42 | u32 mask, u32 data); |
43 | void rtl_bb_delay(struct ieee80211_hw *hw, u32 addr, u32 data); | 43 | void rtl_bb_delay(struct ieee80211_hw *hw, u32 addr, u32 data); |
44 | bool rtl_cmd_send_packet(struct ieee80211_hw *hw, struct sk_buff *skb); | 44 | bool rtl_cmd_send_packet(struct ieee80211_hw *hw, struct sk_buff *skb); |
45 | bool rtl_btc_status_false(void); | ||
45 | 46 | ||
46 | #endif | 47 | #endif |
diff --git a/drivers/net/wireless/rtlwifi/pci.c b/drivers/net/wireless/rtlwifi/pci.c index 667aba81246c..25daa8715219 100644 --- a/drivers/net/wireless/rtlwifi/pci.c +++ b/drivers/net/wireless/rtlwifi/pci.c | |||
@@ -1796,7 +1796,8 @@ static int rtl_pci_start(struct ieee80211_hw *hw) | |||
1796 | rtl_pci_reset_trx_ring(hw); | 1796 | rtl_pci_reset_trx_ring(hw); |
1797 | 1797 | ||
1798 | rtlpci->driver_is_goingto_unload = false; | 1798 | rtlpci->driver_is_goingto_unload = false; |
1799 | if (rtlpriv->cfg->ops->get_btc_status()) { | 1799 | if (rtlpriv->cfg->ops->get_btc_status && |
1800 | rtlpriv->cfg->ops->get_btc_status()) { | ||
1800 | rtlpriv->btcoexist.btc_ops->btc_init_variables(rtlpriv); | 1801 | rtlpriv->btcoexist.btc_ops->btc_init_variables(rtlpriv); |
1801 | rtlpriv->btcoexist.btc_ops->btc_init_hal_vars(rtlpriv); | 1802 | rtlpriv->btcoexist.btc_ops->btc_init_hal_vars(rtlpriv); |
1802 | } | 1803 | } |
diff --git a/drivers/net/wireless/rtlwifi/rtl8192c/fw_common.c b/drivers/net/wireless/rtlwifi/rtl8192c/fw_common.c index a00861b26ece..29983bc96a89 100644 --- a/drivers/net/wireless/rtlwifi/rtl8192c/fw_common.c +++ b/drivers/net/wireless/rtlwifi/rtl8192c/fw_common.c | |||
@@ -656,7 +656,8 @@ static u8 reserved_page_packet[TOTAL_RESERVED_PKT_LEN] = { | |||
656 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, | 656 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, |
657 | }; | 657 | }; |
658 | 658 | ||
659 | void rtl92c_set_fw_rsvdpagepkt(struct ieee80211_hw *hw, bool b_dl_finished) | 659 | void rtl92c_set_fw_rsvdpagepkt(struct ieee80211_hw *hw, |
660 | bool (*cmd_send_packet)(struct ieee80211_hw *, struct sk_buff *)) | ||
660 | { | 661 | { |
661 | struct rtl_priv *rtlpriv = rtl_priv(hw); | 662 | struct rtl_priv *rtlpriv = rtl_priv(hw); |
662 | struct rtl_mac *mac = rtl_mac(rtl_priv(hw)); | 663 | struct rtl_mac *mac = rtl_mac(rtl_priv(hw)); |
@@ -722,7 +723,10 @@ void rtl92c_set_fw_rsvdpagepkt(struct ieee80211_hw *hw, bool b_dl_finished) | |||
722 | memcpy((u8 *)skb_put(skb, totalpacketlen), | 723 | memcpy((u8 *)skb_put(skb, totalpacketlen), |
723 | &reserved_page_packet, totalpacketlen); | 724 | &reserved_page_packet, totalpacketlen); |
724 | 725 | ||
725 | rtstatus = rtl_cmd_send_packet(hw, skb); | 726 | if (cmd_send_packet) |
727 | rtstatus = cmd_send_packet(hw, skb); | ||
728 | else | ||
729 | rtstatus = rtl_cmd_send_packet(hw, skb); | ||
726 | 730 | ||
727 | if (rtstatus) | 731 | if (rtstatus) |
728 | b_dlok = true; | 732 | b_dlok = true; |
diff --git a/drivers/net/wireless/rtlwifi/rtl8192c/fw_common.h b/drivers/net/wireless/rtlwifi/rtl8192c/fw_common.h index a815bd6273da..b64ae45dc674 100644 --- a/drivers/net/wireless/rtlwifi/rtl8192c/fw_common.h +++ b/drivers/net/wireless/rtlwifi/rtl8192c/fw_common.h | |||
@@ -109,7 +109,9 @@ void rtl92c_fill_h2c_cmd(struct ieee80211_hw *hw, u8 element_id, | |||
109 | u32 cmd_len, u8 *p_cmdbuffer); | 109 | u32 cmd_len, u8 *p_cmdbuffer); |
110 | void rtl92c_firmware_selfreset(struct ieee80211_hw *hw); | 110 | void rtl92c_firmware_selfreset(struct ieee80211_hw *hw); |
111 | void rtl92c_set_fw_pwrmode_cmd(struct ieee80211_hw *hw, u8 mode); | 111 | void rtl92c_set_fw_pwrmode_cmd(struct ieee80211_hw *hw, u8 mode); |
112 | void rtl92c_set_fw_rsvdpagepkt(struct ieee80211_hw *hw, bool b_dl_finished); | 112 | void rtl92c_set_fw_rsvdpagepkt |
113 | (struct ieee80211_hw *hw, | ||
114 | bool (*cmd_send_packet)(struct ieee80211_hw *, struct sk_buff *)); | ||
113 | void rtl92c_set_fw_joinbss_report_cmd(struct ieee80211_hw *hw, u8 mstatus); | 115 | void rtl92c_set_fw_joinbss_report_cmd(struct ieee80211_hw *hw, u8 mstatus); |
114 | void usb_writeN_async(struct rtl_priv *rtlpriv, u32 addr, void *data, u16 len); | 116 | void usb_writeN_async(struct rtl_priv *rtlpriv, u32 addr, void *data, u16 len); |
115 | void rtl92c_set_p2p_ps_offload_cmd(struct ieee80211_hw *hw, u8 p2p_ps_state); | 117 | void rtl92c_set_p2p_ps_offload_cmd(struct ieee80211_hw *hw, u8 p2p_ps_state); |
diff --git a/drivers/net/wireless/rtlwifi/rtl8192ce/def.h b/drivers/net/wireless/rtlwifi/rtl8192ce/def.h index 831df101d7b7..9b660df6fd71 100644 --- a/drivers/net/wireless/rtlwifi/rtl8192ce/def.h +++ b/drivers/net/wireless/rtlwifi/rtl8192ce/def.h | |||
@@ -114,6 +114,8 @@ | |||
114 | LE_BITS_TO_4BYTE(((__pcmdfbhdr) + 4), 16, 4) | 114 | LE_BITS_TO_4BYTE(((__pcmdfbhdr) + 4), 16, 4) |
115 | #define GET_C2H_CMD_FEEDBACK_CCX_SEQ(__pcmdfbhdr) \ | 115 | #define GET_C2H_CMD_FEEDBACK_CCX_SEQ(__pcmdfbhdr) \ |
116 | LE_BITS_TO_4BYTE(((__pcmdfbhdr) + 4), 20, 12) | 116 | LE_BITS_TO_4BYTE(((__pcmdfbhdr) + 4), 20, 12) |
117 | #define GET_RX_STATUS_DESC_BUFF_ADDR(__pdesc) \ | ||
118 | SHIFT_AND_MASK_LE(__pdesc + 24, 0, 32) | ||
117 | 119 | ||
118 | #define CHIP_VER_B BIT(4) | 120 | #define CHIP_VER_B BIT(4) |
119 | #define CHIP_BONDING_IDENTIFIER(_value) (((_value) >> 22) & 0x3) | 121 | #define CHIP_BONDING_IDENTIFIER(_value) (((_value) >> 22) & 0x3) |
diff --git a/drivers/net/wireless/rtlwifi/rtl8192ce/hw.c b/drivers/net/wireless/rtlwifi/rtl8192ce/hw.c index 8ec0f031f48a..55357d69397a 100644 --- a/drivers/net/wireless/rtlwifi/rtl8192ce/hw.c +++ b/drivers/net/wireless/rtlwifi/rtl8192ce/hw.c | |||
@@ -459,7 +459,7 @@ void rtl92ce_set_hw_reg(struct ieee80211_hw *hw, u8 variable, u8 *val) | |||
459 | rtl_write_byte(rtlpriv, REG_FWHW_TXQ_CTRL + 2, | 459 | rtl_write_byte(rtlpriv, REG_FWHW_TXQ_CTRL + 2, |
460 | tmp_reg422 & (~BIT(6))); | 460 | tmp_reg422 & (~BIT(6))); |
461 | 461 | ||
462 | rtl92c_set_fw_rsvdpagepkt(hw, 0); | 462 | rtl92c_set_fw_rsvdpagepkt(hw, NULL); |
463 | 463 | ||
464 | _rtl92ce_set_bcn_ctrl_reg(hw, BIT(3), 0); | 464 | _rtl92ce_set_bcn_ctrl_reg(hw, BIT(3), 0); |
465 | _rtl92ce_set_bcn_ctrl_reg(hw, 0, BIT(4)); | 465 | _rtl92ce_set_bcn_ctrl_reg(hw, 0, BIT(4)); |
diff --git a/drivers/net/wireless/rtlwifi/rtl8192ce/sw.c b/drivers/net/wireless/rtlwifi/rtl8192ce/sw.c index d86b5b566444..46ea07605eb4 100644 --- a/drivers/net/wireless/rtlwifi/rtl8192ce/sw.c +++ b/drivers/net/wireless/rtlwifi/rtl8192ce/sw.c | |||
@@ -244,6 +244,7 @@ static struct rtl_hal_ops rtl8192ce_hal_ops = { | |||
244 | .phy_lc_calibrate = _rtl92ce_phy_lc_calibrate, | 244 | .phy_lc_calibrate = _rtl92ce_phy_lc_calibrate, |
245 | .phy_set_bw_mode_callback = rtl92ce_phy_set_bw_mode_callback, | 245 | .phy_set_bw_mode_callback = rtl92ce_phy_set_bw_mode_callback, |
246 | .dm_dynamic_txpower = rtl92ce_dm_dynamic_txpower, | 246 | .dm_dynamic_txpower = rtl92ce_dm_dynamic_txpower, |
247 | .get_btc_status = rtl_btc_status_false, | ||
247 | }; | 248 | }; |
248 | 249 | ||
249 | static struct rtl_mod_params rtl92ce_mod_params = { | 250 | static struct rtl_mod_params rtl92ce_mod_params = { |
diff --git a/drivers/net/wireless/rtlwifi/rtl8192ce/trx.c b/drivers/net/wireless/rtlwifi/rtl8192ce/trx.c index 2fb9c7acb76a..dc3d20b17a26 100644 --- a/drivers/net/wireless/rtlwifi/rtl8192ce/trx.c +++ b/drivers/net/wireless/rtlwifi/rtl8192ce/trx.c | |||
@@ -728,6 +728,9 @@ u32 rtl92ce_get_desc(u8 *p_desc, bool istx, u8 desc_name) | |||
728 | case HW_DESC_RXPKT_LEN: | 728 | case HW_DESC_RXPKT_LEN: |
729 | ret = GET_RX_DESC_PKT_LEN(pdesc); | 729 | ret = GET_RX_DESC_PKT_LEN(pdesc); |
730 | break; | 730 | break; |
731 | case HW_DESC_RXBUFF_ADDR: | ||
732 | ret = GET_RX_STATUS_DESC_BUFF_ADDR(pdesc); | ||
733 | break; | ||
731 | default: | 734 | default: |
732 | RT_ASSERT(false, "ERR rxdesc :%d not process\n", | 735 | RT_ASSERT(false, "ERR rxdesc :%d not process\n", |
733 | desc_name); | 736 | desc_name); |
diff --git a/drivers/net/wireless/rtlwifi/rtl8192cu/hw.c b/drivers/net/wireless/rtlwifi/rtl8192cu/hw.c index 04aa0b5f5b3d..873363acbacf 100644 --- a/drivers/net/wireless/rtlwifi/rtl8192cu/hw.c +++ b/drivers/net/wireless/rtlwifi/rtl8192cu/hw.c | |||
@@ -1592,6 +1592,20 @@ void rtl92cu_get_hw_reg(struct ieee80211_hw *hw, u8 variable, u8 *val) | |||
1592 | } | 1592 | } |
1593 | } | 1593 | } |
1594 | 1594 | ||
1595 | bool usb_cmd_send_packet(struct ieee80211_hw *hw, struct sk_buff *skb) | ||
1596 | { | ||
1597 | /* Currently nothing happens here. | ||
1598 | * Traffic stops after some seconds in WPA2 802.11n mode. | ||
1599 | * Maybe because rtl8192cu chip should be set from here? | ||
1600 | * If I understand correctly, the realtek vendor driver sends some urbs | ||
1601 | * if its "here". | ||
1602 | * | ||
1603 | * This is maybe necessary: | ||
1604 | * rtlpriv->cfg->ops->fill_tx_cmddesc(hw, buffer, 1, 1, skb); | ||
1605 | */ | ||
1606 | return true; | ||
1607 | } | ||
1608 | |||
1595 | void rtl92cu_set_hw_reg(struct ieee80211_hw *hw, u8 variable, u8 *val) | 1609 | void rtl92cu_set_hw_reg(struct ieee80211_hw *hw, u8 variable, u8 *val) |
1596 | { | 1610 | { |
1597 | struct rtl_priv *rtlpriv = rtl_priv(hw); | 1611 | struct rtl_priv *rtlpriv = rtl_priv(hw); |
@@ -1939,7 +1953,8 @@ void rtl92cu_set_hw_reg(struct ieee80211_hw *hw, u8 variable, u8 *val) | |||
1939 | recover = true; | 1953 | recover = true; |
1940 | rtl_write_byte(rtlpriv, REG_FWHW_TXQ_CTRL + 2, | 1954 | rtl_write_byte(rtlpriv, REG_FWHW_TXQ_CTRL + 2, |
1941 | tmp_reg422 & (~BIT(6))); | 1955 | tmp_reg422 & (~BIT(6))); |
1942 | rtl92c_set_fw_rsvdpagepkt(hw, 0); | 1956 | rtl92c_set_fw_rsvdpagepkt(hw, |
1957 | &usb_cmd_send_packet); | ||
1943 | _rtl92cu_set_bcn_ctrl_reg(hw, BIT(3), 0); | 1958 | _rtl92cu_set_bcn_ctrl_reg(hw, BIT(3), 0); |
1944 | _rtl92cu_set_bcn_ctrl_reg(hw, 0, BIT(4)); | 1959 | _rtl92cu_set_bcn_ctrl_reg(hw, 0, BIT(4)); |
1945 | if (recover) | 1960 | if (recover) |
diff --git a/drivers/net/wireless/rtlwifi/rtl8192cu/hw.h b/drivers/net/wireless/rtlwifi/rtl8192cu/hw.h index 0f7812e0c8aa..c1e33b0228c0 100644 --- a/drivers/net/wireless/rtlwifi/rtl8192cu/hw.h +++ b/drivers/net/wireless/rtlwifi/rtl8192cu/hw.h | |||
@@ -104,7 +104,6 @@ bool rtl92cu_gpio_radio_on_off_checking(struct ieee80211_hw *hw, u8 * valid); | |||
104 | void rtl92cu_set_check_bssid(struct ieee80211_hw *hw, bool check_bssid); | 104 | void rtl92cu_set_check_bssid(struct ieee80211_hw *hw, bool check_bssid); |
105 | int rtl92c_download_fw(struct ieee80211_hw *hw); | 105 | int rtl92c_download_fw(struct ieee80211_hw *hw); |
106 | void rtl92c_set_fw_pwrmode_cmd(struct ieee80211_hw *hw, u8 mode); | 106 | void rtl92c_set_fw_pwrmode_cmd(struct ieee80211_hw *hw, u8 mode); |
107 | void rtl92c_set_fw_rsvdpagepkt(struct ieee80211_hw *hw, bool dl_finished); | ||
108 | void rtl92c_set_fw_joinbss_report_cmd(struct ieee80211_hw *hw, u8 mstatus); | 107 | void rtl92c_set_fw_joinbss_report_cmd(struct ieee80211_hw *hw, u8 mstatus); |
109 | void rtl92c_fill_h2c_cmd(struct ieee80211_hw *hw, | 108 | void rtl92c_fill_h2c_cmd(struct ieee80211_hw *hw, |
110 | u8 element_id, u32 cmd_len, u8 *p_cmdbuffer); | 109 | u8 element_id, u32 cmd_len, u8 *p_cmdbuffer); |
diff --git a/drivers/net/wireless/rtlwifi/rtl8192cu/sw.c b/drivers/net/wireless/rtlwifi/rtl8192cu/sw.c index 7c5fbaf5fee0..e06bafee37f9 100644 --- a/drivers/net/wireless/rtlwifi/rtl8192cu/sw.c +++ b/drivers/net/wireless/rtlwifi/rtl8192cu/sw.c | |||
@@ -101,6 +101,12 @@ static void rtl92cu_deinit_sw_vars(struct ieee80211_hw *hw) | |||
101 | } | 101 | } |
102 | } | 102 | } |
103 | 103 | ||
104 | /* get bt coexist status */ | ||
105 | static bool rtl92cu_get_btc_status(void) | ||
106 | { | ||
107 | return false; | ||
108 | } | ||
109 | |||
104 | static struct rtl_hal_ops rtl8192cu_hal_ops = { | 110 | static struct rtl_hal_ops rtl8192cu_hal_ops = { |
105 | .init_sw_vars = rtl92cu_init_sw_vars, | 111 | .init_sw_vars = rtl92cu_init_sw_vars, |
106 | .deinit_sw_vars = rtl92cu_deinit_sw_vars, | 112 | .deinit_sw_vars = rtl92cu_deinit_sw_vars, |
@@ -148,6 +154,7 @@ static struct rtl_hal_ops rtl8192cu_hal_ops = { | |||
148 | .phy_set_bw_mode_callback = rtl92cu_phy_set_bw_mode_callback, | 154 | .phy_set_bw_mode_callback = rtl92cu_phy_set_bw_mode_callback, |
149 | .dm_dynamic_txpower = rtl92cu_dm_dynamic_txpower, | 155 | .dm_dynamic_txpower = rtl92cu_dm_dynamic_txpower, |
150 | .fill_h2c_cmd = rtl92c_fill_h2c_cmd, | 156 | .fill_h2c_cmd = rtl92c_fill_h2c_cmd, |
157 | .get_btc_status = rtl92cu_get_btc_status, | ||
151 | }; | 158 | }; |
152 | 159 | ||
153 | static struct rtl_mod_params rtl92cu_mod_params = { | 160 | static struct rtl_mod_params rtl92cu_mod_params = { |
diff --git a/drivers/net/wireless/rtlwifi/rtl8192de/sw.c b/drivers/net/wireless/rtlwifi/rtl8192de/sw.c index edab5a5351b5..a0aba088259a 100644 --- a/drivers/net/wireless/rtlwifi/rtl8192de/sw.c +++ b/drivers/net/wireless/rtlwifi/rtl8192de/sw.c | |||
@@ -251,6 +251,7 @@ static struct rtl_hal_ops rtl8192de_hal_ops = { | |||
251 | .get_rfreg = rtl92d_phy_query_rf_reg, | 251 | .get_rfreg = rtl92d_phy_query_rf_reg, |
252 | .set_rfreg = rtl92d_phy_set_rf_reg, | 252 | .set_rfreg = rtl92d_phy_set_rf_reg, |
253 | .linked_set_reg = rtl92d_linked_set_reg, | 253 | .linked_set_reg = rtl92d_linked_set_reg, |
254 | .get_btc_status = rtl_btc_status_false, | ||
254 | }; | 255 | }; |
255 | 256 | ||
256 | static struct rtl_mod_params rtl92de_mod_params = { | 257 | static struct rtl_mod_params rtl92de_mod_params = { |
diff --git a/drivers/net/wireless/rtlwifi/rtl8192ee/hw.c b/drivers/net/wireless/rtlwifi/rtl8192ee/hw.c index dfdc9b20e4ad..1a87edca2c3f 100644 --- a/drivers/net/wireless/rtlwifi/rtl8192ee/hw.c +++ b/drivers/net/wireless/rtlwifi/rtl8192ee/hw.c | |||
@@ -362,7 +362,7 @@ void rtl92ee_get_hw_reg(struct ieee80211_hw *hw, u8 variable, u8 *val) | |||
362 | } | 362 | } |
363 | break; | 363 | break; |
364 | default: | 364 | default: |
365 | RT_TRACE(rtlpriv, COMP_ERR, DBG_EMERG, | 365 | RT_TRACE(rtlpriv, COMP_ERR, DBG_DMESG, |
366 | "switch case not process %x\n", variable); | 366 | "switch case not process %x\n", variable); |
367 | break; | 367 | break; |
368 | } | 368 | } |
@@ -591,7 +591,7 @@ void rtl92ee_set_hw_reg(struct ieee80211_hw *hw, u8 variable, u8 *val) | |||
591 | acm_ctrl &= (~ACMHW_BEQEN); | 591 | acm_ctrl &= (~ACMHW_BEQEN); |
592 | break; | 592 | break; |
593 | default: | 593 | default: |
594 | RT_TRACE(rtlpriv, COMP_ERR, DBG_EMERG, | 594 | RT_TRACE(rtlpriv, COMP_ERR, DBG_DMESG, |
595 | "switch case not process\n"); | 595 | "switch case not process\n"); |
596 | break; | 596 | break; |
597 | } | 597 | } |
@@ -710,7 +710,7 @@ void rtl92ee_set_hw_reg(struct ieee80211_hw *hw, u8 variable, u8 *val) | |||
710 | } | 710 | } |
711 | break; | 711 | break; |
712 | default: | 712 | default: |
713 | RT_TRACE(rtlpriv, COMP_ERR, DBG_EMERG, | 713 | RT_TRACE(rtlpriv, COMP_ERR, DBG_DMESG, |
714 | "switch case not process %x\n", variable); | 714 | "switch case not process %x\n", variable); |
715 | break; | 715 | break; |
716 | } | 716 | } |
@@ -2424,7 +2424,7 @@ void rtl92ee_set_key(struct ieee80211_hw *hw, u32 key_index, | |||
2424 | enc_algo = CAM_AES; | 2424 | enc_algo = CAM_AES; |
2425 | break; | 2425 | break; |
2426 | default: | 2426 | default: |
2427 | RT_TRACE(rtlpriv, COMP_ERR, DBG_EMERG, | 2427 | RT_TRACE(rtlpriv, COMP_ERR, DBG_DMESG, |
2428 | "switch case not process\n"); | 2428 | "switch case not process\n"); |
2429 | enc_algo = CAM_TKIP; | 2429 | enc_algo = CAM_TKIP; |
2430 | break; | 2430 | break; |
diff --git a/drivers/net/wireless/rtlwifi/rtl8192se/def.h b/drivers/net/wireless/rtlwifi/rtl8192se/def.h index 83c98674bfd3..6e7a70b43949 100644 --- a/drivers/net/wireless/rtlwifi/rtl8192se/def.h +++ b/drivers/net/wireless/rtlwifi/rtl8192se/def.h | |||
@@ -446,6 +446,8 @@ | |||
446 | /* DWORD 6 */ | 446 | /* DWORD 6 */ |
447 | #define SET_RX_STATUS__DESC_BUFF_ADDR(__pdesc, __val) \ | 447 | #define SET_RX_STATUS__DESC_BUFF_ADDR(__pdesc, __val) \ |
448 | SET_BITS_OFFSET_LE(__pdesc + 24, 0, 32, __val) | 448 | SET_BITS_OFFSET_LE(__pdesc + 24, 0, 32, __val) |
449 | #define GET_RX_STATUS_DESC_BUFF_ADDR(__pdesc) \ | ||
450 | SHIFT_AND_MASK_LE(__pdesc + 24, 0, 32) | ||
449 | 451 | ||
450 | #define SE_RX_HAL_IS_CCK_RATE(_pdesc)\ | 452 | #define SE_RX_HAL_IS_CCK_RATE(_pdesc)\ |
451 | (GET_RX_STATUS_DESC_RX_MCS(_pdesc) == DESC92_RATE1M || \ | 453 | (GET_RX_STATUS_DESC_RX_MCS(_pdesc) == DESC92_RATE1M || \ |
diff --git a/drivers/net/wireless/rtlwifi/rtl8192se/sw.c b/drivers/net/wireless/rtlwifi/rtl8192se/sw.c index 1bff2a0f7600..aadba29c167a 100644 --- a/drivers/net/wireless/rtlwifi/rtl8192se/sw.c +++ b/drivers/net/wireless/rtlwifi/rtl8192se/sw.c | |||
@@ -87,11 +87,8 @@ static void rtl92s_init_aspm_vars(struct ieee80211_hw *hw) | |||
87 | static void rtl92se_fw_cb(const struct firmware *firmware, void *context) | 87 | static void rtl92se_fw_cb(const struct firmware *firmware, void *context) |
88 | { | 88 | { |
89 | struct ieee80211_hw *hw = context; | 89 | struct ieee80211_hw *hw = context; |
90 | struct rtl_pci_priv *pcipriv = rtl_pcipriv(hw); | ||
91 | struct rtl_priv *rtlpriv = rtl_priv(hw); | 90 | struct rtl_priv *rtlpriv = rtl_priv(hw); |
92 | struct rtl_pci *rtlpci = rtl_pcidev(pcipriv); | ||
93 | struct rt_firmware *pfirmware = NULL; | 91 | struct rt_firmware *pfirmware = NULL; |
94 | int err; | ||
95 | 92 | ||
96 | RT_TRACE(rtlpriv, COMP_ERR, DBG_LOUD, | 93 | RT_TRACE(rtlpriv, COMP_ERR, DBG_LOUD, |
97 | "Firmware callback routine entered!\n"); | 94 | "Firmware callback routine entered!\n"); |
@@ -112,20 +109,6 @@ static void rtl92se_fw_cb(const struct firmware *firmware, void *context) | |||
112 | memcpy(pfirmware->sz_fw_tmpbuffer, firmware->data, firmware->size); | 109 | memcpy(pfirmware->sz_fw_tmpbuffer, firmware->data, firmware->size); |
113 | pfirmware->sz_fw_tmpbufferlen = firmware->size; | 110 | pfirmware->sz_fw_tmpbufferlen = firmware->size; |
114 | release_firmware(firmware); | 111 | release_firmware(firmware); |
115 | |||
116 | err = ieee80211_register_hw(hw); | ||
117 | if (err) { | ||
118 | RT_TRACE(rtlpriv, COMP_ERR, DBG_EMERG, | ||
119 | "Can't register mac80211 hw\n"); | ||
120 | return; | ||
121 | } else { | ||
122 | rtlpriv->mac80211.mac80211_registered = 1; | ||
123 | } | ||
124 | rtlpci->irq_alloc = 1; | ||
125 | set_bit(RTL_STATUS_INTERFACE_START, &rtlpriv->status); | ||
126 | |||
127 | /*init rfkill */ | ||
128 | rtl_init_rfkill(hw); | ||
129 | } | 112 | } |
130 | 113 | ||
131 | static int rtl92s_init_sw_vars(struct ieee80211_hw *hw) | 114 | static int rtl92s_init_sw_vars(struct ieee80211_hw *hw) |
@@ -226,8 +209,8 @@ static int rtl92s_init_sw_vars(struct ieee80211_hw *hw) | |||
226 | if (!rtlpriv->rtlhal.pfirmware) | 209 | if (!rtlpriv->rtlhal.pfirmware) |
227 | return 1; | 210 | return 1; |
228 | 211 | ||
229 | rtlpriv->max_fw_size = RTL8190_MAX_RAW_FIRMWARE_CODE_SIZE; | 212 | rtlpriv->max_fw_size = RTL8190_MAX_FIRMWARE_CODE_SIZE*2 + |
230 | 213 | sizeof(struct fw_hdr); | |
231 | pr_info("Driver for Realtek RTL8192SE/RTL8191SE\n" | 214 | pr_info("Driver for Realtek RTL8192SE/RTL8191SE\n" |
232 | "Loading firmware %s\n", rtlpriv->cfg->fw_name); | 215 | "Loading firmware %s\n", rtlpriv->cfg->fw_name); |
233 | /* request fw */ | 216 | /* request fw */ |
@@ -294,6 +277,7 @@ static struct rtl_hal_ops rtl8192se_hal_ops = { | |||
294 | .set_bbreg = rtl92s_phy_set_bb_reg, | 277 | .set_bbreg = rtl92s_phy_set_bb_reg, |
295 | .get_rfreg = rtl92s_phy_query_rf_reg, | 278 | .get_rfreg = rtl92s_phy_query_rf_reg, |
296 | .set_rfreg = rtl92s_phy_set_rf_reg, | 279 | .set_rfreg = rtl92s_phy_set_rf_reg, |
280 | .get_btc_status = rtl_btc_status_false, | ||
297 | }; | 281 | }; |
298 | 282 | ||
299 | static struct rtl_mod_params rtl92se_mod_params = { | 283 | static struct rtl_mod_params rtl92se_mod_params = { |
diff --git a/drivers/net/wireless/rtlwifi/rtl8192se/trx.c b/drivers/net/wireless/rtlwifi/rtl8192se/trx.c index b358ebce8942..672fd3b02835 100644 --- a/drivers/net/wireless/rtlwifi/rtl8192se/trx.c +++ b/drivers/net/wireless/rtlwifi/rtl8192se/trx.c | |||
@@ -640,6 +640,9 @@ u32 rtl92se_get_desc(u8 *desc, bool istx, u8 desc_name) | |||
640 | case HW_DESC_RXPKT_LEN: | 640 | case HW_DESC_RXPKT_LEN: |
641 | ret = GET_RX_STATUS_DESC_PKT_LEN(desc); | 641 | ret = GET_RX_STATUS_DESC_PKT_LEN(desc); |
642 | break; | 642 | break; |
643 | case HW_DESC_RXBUFF_ADDR: | ||
644 | ret = GET_RX_STATUS_DESC_BUFF_ADDR(desc); | ||
645 | break; | ||
643 | default: | 646 | default: |
644 | RT_ASSERT(false, "ERR rxdesc :%d not process\n", | 647 | RT_ASSERT(false, "ERR rxdesc :%d not process\n", |
645 | desc_name); | 648 | desc_name); |
diff --git a/drivers/net/wireless/rtlwifi/rtl8821ae/phy.c b/drivers/net/wireless/rtlwifi/rtl8821ae/phy.c index 9786313dc62f..1e9570fa874f 100644 --- a/drivers/net/wireless/rtlwifi/rtl8821ae/phy.c +++ b/drivers/net/wireless/rtlwifi/rtl8821ae/phy.c | |||
@@ -1889,15 +1889,18 @@ static void _rtl8821ae_store_tx_power_by_rate(struct ieee80211_hw *hw, | |||
1889 | struct rtl_phy *rtlphy = &rtlpriv->phy; | 1889 | struct rtl_phy *rtlphy = &rtlpriv->phy; |
1890 | u8 rate_section = _rtl8821ae_get_rate_section_index(regaddr); | 1890 | u8 rate_section = _rtl8821ae_get_rate_section_index(regaddr); |
1891 | 1891 | ||
1892 | if (band != BAND_ON_2_4G && band != BAND_ON_5G) | 1892 | if (band != BAND_ON_2_4G && band != BAND_ON_5G) { |
1893 | RT_TRACE(rtlpriv, COMP_INIT, DBG_WARNING, "Invalid Band %d\n", band); | 1893 | RT_TRACE(rtlpriv, COMP_INIT, DBG_WARNING, "Invalid Band %d\n", band); |
1894 | 1894 | band = BAND_ON_2_4G; | |
1895 | if (rfpath >= MAX_RF_PATH) | 1895 | } |
1896 | if (rfpath >= MAX_RF_PATH) { | ||
1896 | RT_TRACE(rtlpriv, COMP_INIT, DBG_WARNING, "Invalid RfPath %d\n", rfpath); | 1897 | RT_TRACE(rtlpriv, COMP_INIT, DBG_WARNING, "Invalid RfPath %d\n", rfpath); |
1897 | 1898 | rfpath = MAX_RF_PATH - 1; | |
1898 | if (txnum >= MAX_RF_PATH) | 1899 | } |
1900 | if (txnum >= MAX_RF_PATH) { | ||
1899 | RT_TRACE(rtlpriv, COMP_INIT, DBG_WARNING, "Invalid TxNum %d\n", txnum); | 1901 | RT_TRACE(rtlpriv, COMP_INIT, DBG_WARNING, "Invalid TxNum %d\n", txnum); |
1900 | 1902 | txnum = MAX_RF_PATH - 1; | |
1903 | } | ||
1901 | rtlphy->tx_power_by_rate_offset[band][rfpath][txnum][rate_section] = data; | 1904 | rtlphy->tx_power_by_rate_offset[band][rfpath][txnum][rate_section] = data; |
1902 | RT_TRACE(rtlpriv, COMP_INIT, DBG_LOUD, | 1905 | RT_TRACE(rtlpriv, COMP_INIT, DBG_LOUD, |
1903 | "TxPwrByRateOffset[Band %d][RfPath %d][TxNum %d][RateSection %d] = 0x%x\n", | 1906 | "TxPwrByRateOffset[Band %d][RfPath %d][TxNum %d][RateSection %d] = 0x%x\n", |
diff --git a/drivers/net/wireless/rtlwifi/usb.c b/drivers/net/wireless/rtlwifi/usb.c index 10cf69c4bc42..46ee956d0235 100644 --- a/drivers/net/wireless/rtlwifi/usb.c +++ b/drivers/net/wireless/rtlwifi/usb.c | |||
@@ -1117,7 +1117,18 @@ int rtl_usb_probe(struct usb_interface *intf, | |||
1117 | } | 1117 | } |
1118 | rtlpriv->cfg->ops->init_sw_leds(hw); | 1118 | rtlpriv->cfg->ops->init_sw_leds(hw); |
1119 | 1119 | ||
1120 | err = ieee80211_register_hw(hw); | ||
1121 | if (err) { | ||
1122 | RT_TRACE(rtlpriv, COMP_ERR, DBG_EMERG, | ||
1123 | "Can't register mac80211 hw.\n"); | ||
1124 | err = -ENODEV; | ||
1125 | goto error_out; | ||
1126 | } | ||
1127 | rtlpriv->mac80211.mac80211_registered = 1; | ||
1128 | |||
1129 | set_bit(RTL_STATUS_INTERFACE_START, &rtlpriv->status); | ||
1120 | return 0; | 1130 | return 0; |
1131 | |||
1121 | error_out: | 1132 | error_out: |
1122 | rtl_deinit_core(hw); | 1133 | rtl_deinit_core(hw); |
1123 | _rtl_usb_io_handler_release(hw); | 1134 | _rtl_usb_io_handler_release(hw); |
diff --git a/drivers/net/xen-netback/common.h b/drivers/net/xen-netback/common.h index d4eb8d2e9cb7..083ecc93fe5e 100644 --- a/drivers/net/xen-netback/common.h +++ b/drivers/net/xen-netback/common.h | |||
@@ -176,10 +176,11 @@ struct xenvif_queue { /* Per-queue data for xenvif */ | |||
176 | char rx_irq_name[IRQ_NAME_SIZE]; /* DEVNAME-qN-rx */ | 176 | char rx_irq_name[IRQ_NAME_SIZE]; /* DEVNAME-qN-rx */ |
177 | struct xen_netif_rx_back_ring rx; | 177 | struct xen_netif_rx_back_ring rx; |
178 | struct sk_buff_head rx_queue; | 178 | struct sk_buff_head rx_queue; |
179 | RING_IDX rx_last_skb_slots; | ||
180 | unsigned long status; | ||
181 | 179 | ||
182 | struct timer_list rx_stalled; | 180 | unsigned int rx_queue_max; |
181 | unsigned int rx_queue_len; | ||
182 | unsigned long last_rx_time; | ||
183 | bool stalled; | ||
183 | 184 | ||
184 | struct gnttab_copy grant_copy_op[MAX_GRANT_COPY_OPS]; | 185 | struct gnttab_copy grant_copy_op[MAX_GRANT_COPY_OPS]; |
185 | 186 | ||
@@ -199,18 +200,14 @@ struct xenvif_queue { /* Per-queue data for xenvif */ | |||
199 | struct xenvif_stats stats; | 200 | struct xenvif_stats stats; |
200 | }; | 201 | }; |
201 | 202 | ||
203 | /* Maximum number of Rx slots a to-guest packet may use, including the | ||
204 | * slot needed for GSO meta-data. | ||
205 | */ | ||
206 | #define XEN_NETBK_RX_SLOTS_MAX (MAX_SKB_FRAGS + 1) | ||
207 | |||
202 | enum state_bit_shift { | 208 | enum state_bit_shift { |
203 | /* This bit marks that the vif is connected */ | 209 | /* This bit marks that the vif is connected */ |
204 | VIF_STATUS_CONNECTED, | 210 | VIF_STATUS_CONNECTED, |
205 | /* This bit signals the RX thread that queuing was stopped (in | ||
206 | * start_xmit), and either the timer fired or an RX interrupt came | ||
207 | */ | ||
208 | QUEUE_STATUS_RX_PURGE_EVENT, | ||
209 | /* This bit tells the interrupt handler that this queue was the reason | ||
210 | * for the carrier off, so it should kick the thread. Only queues which | ||
211 | * brought it down can turn on the carrier. | ||
212 | */ | ||
213 | QUEUE_STATUS_RX_STALLED | ||
214 | }; | 211 | }; |
215 | 212 | ||
216 | struct xenvif { | 213 | struct xenvif { |
@@ -228,9 +225,6 @@ struct xenvif { | |||
228 | u8 ip_csum:1; | 225 | u8 ip_csum:1; |
229 | u8 ipv6_csum:1; | 226 | u8 ipv6_csum:1; |
230 | 227 | ||
231 | /* Internal feature information. */ | ||
232 | u8 can_queue:1; /* can queue packets for receiver? */ | ||
233 | |||
234 | /* Is this interface disabled? True when backend discovers | 228 | /* Is this interface disabled? True when backend discovers |
235 | * frontend is rogue. | 229 | * frontend is rogue. |
236 | */ | 230 | */ |
@@ -240,6 +234,9 @@ struct xenvif { | |||
240 | /* Queues */ | 234 | /* Queues */ |
241 | struct xenvif_queue *queues; | 235 | struct xenvif_queue *queues; |
242 | unsigned int num_queues; /* active queues, resource allocated */ | 236 | unsigned int num_queues; /* active queues, resource allocated */ |
237 | unsigned int stalled_queues; | ||
238 | |||
239 | spinlock_t lock; | ||
243 | 240 | ||
244 | #ifdef CONFIG_DEBUG_FS | 241 | #ifdef CONFIG_DEBUG_FS |
245 | struct dentry *xenvif_dbg_root; | 242 | struct dentry *xenvif_dbg_root; |
@@ -249,6 +246,14 @@ struct xenvif { | |||
249 | struct net_device *dev; | 246 | struct net_device *dev; |
250 | }; | 247 | }; |
251 | 248 | ||
249 | struct xenvif_rx_cb { | ||
250 | unsigned long expires; | ||
251 | int meta_slots_used; | ||
252 | bool full_coalesce; | ||
253 | }; | ||
254 | |||
255 | #define XENVIF_RX_CB(skb) ((struct xenvif_rx_cb *)(skb)->cb) | ||
256 | |||
252 | static inline struct xenbus_device *xenvif_to_xenbus_device(struct xenvif *vif) | 257 | static inline struct xenbus_device *xenvif_to_xenbus_device(struct xenvif *vif) |
253 | { | 258 | { |
254 | return to_xenbus_device(vif->dev->dev.parent); | 259 | return to_xenbus_device(vif->dev->dev.parent); |
@@ -272,8 +277,6 @@ void xenvif_xenbus_fini(void); | |||
272 | 277 | ||
273 | int xenvif_schedulable(struct xenvif *vif); | 278 | int xenvif_schedulable(struct xenvif *vif); |
274 | 279 | ||
275 | int xenvif_must_stop_queue(struct xenvif_queue *queue); | ||
276 | |||
277 | int xenvif_queue_stopped(struct xenvif_queue *queue); | 280 | int xenvif_queue_stopped(struct xenvif_queue *queue); |
278 | void xenvif_wake_queue(struct xenvif_queue *queue); | 281 | void xenvif_wake_queue(struct xenvif_queue *queue); |
279 | 282 | ||
@@ -296,6 +299,8 @@ void xenvif_kick_thread(struct xenvif_queue *queue); | |||
296 | 299 | ||
297 | int xenvif_dealloc_kthread(void *data); | 300 | int xenvif_dealloc_kthread(void *data); |
298 | 301 | ||
302 | void xenvif_rx_queue_tail(struct xenvif_queue *queue, struct sk_buff *skb); | ||
303 | |||
299 | /* Determine whether the needed number of slots (req) are available, | 304 | /* Determine whether the needed number of slots (req) are available, |
300 | * and set req_event if not. | 305 | * and set req_event if not. |
301 | */ | 306 | */ |
diff --git a/drivers/net/xen-netback/interface.c b/drivers/net/xen-netback/interface.c index f379689dde30..895fe84011e7 100644 --- a/drivers/net/xen-netback/interface.c +++ b/drivers/net/xen-netback/interface.c | |||
@@ -43,6 +43,9 @@ | |||
43 | #define XENVIF_QUEUE_LENGTH 32 | 43 | #define XENVIF_QUEUE_LENGTH 32 |
44 | #define XENVIF_NAPI_WEIGHT 64 | 44 | #define XENVIF_NAPI_WEIGHT 64 |
45 | 45 | ||
46 | /* Number of bytes allowed on the internal guest Rx queue. */ | ||
47 | #define XENVIF_RX_QUEUE_BYTES (XEN_NETIF_RX_RING_SIZE/2 * PAGE_SIZE) | ||
48 | |||
46 | /* This function is used to set SKBTX_DEV_ZEROCOPY as well as | 49 | /* This function is used to set SKBTX_DEV_ZEROCOPY as well as |
47 | * increasing the inflight counter. We need to increase the inflight | 50 | * increasing the inflight counter. We need to increase the inflight |
48 | * counter because core driver calls into xenvif_zerocopy_callback | 51 | * counter because core driver calls into xenvif_zerocopy_callback |
@@ -60,20 +63,11 @@ void xenvif_skb_zerocopy_complete(struct xenvif_queue *queue) | |||
60 | atomic_dec(&queue->inflight_packets); | 63 | atomic_dec(&queue->inflight_packets); |
61 | } | 64 | } |
62 | 65 | ||
63 | static inline void xenvif_stop_queue(struct xenvif_queue *queue) | ||
64 | { | ||
65 | struct net_device *dev = queue->vif->dev; | ||
66 | |||
67 | if (!queue->vif->can_queue) | ||
68 | return; | ||
69 | |||
70 | netif_tx_stop_queue(netdev_get_tx_queue(dev, queue->id)); | ||
71 | } | ||
72 | |||
73 | int xenvif_schedulable(struct xenvif *vif) | 66 | int xenvif_schedulable(struct xenvif *vif) |
74 | { | 67 | { |
75 | return netif_running(vif->dev) && | 68 | return netif_running(vif->dev) && |
76 | test_bit(VIF_STATUS_CONNECTED, &vif->status); | 69 | test_bit(VIF_STATUS_CONNECTED, &vif->status) && |
70 | !vif->disabled; | ||
77 | } | 71 | } |
78 | 72 | ||
79 | static irqreturn_t xenvif_tx_interrupt(int irq, void *dev_id) | 73 | static irqreturn_t xenvif_tx_interrupt(int irq, void *dev_id) |
@@ -114,16 +108,7 @@ int xenvif_poll(struct napi_struct *napi, int budget) | |||
114 | static irqreturn_t xenvif_rx_interrupt(int irq, void *dev_id) | 108 | static irqreturn_t xenvif_rx_interrupt(int irq, void *dev_id) |
115 | { | 109 | { |
116 | struct xenvif_queue *queue = dev_id; | 110 | struct xenvif_queue *queue = dev_id; |
117 | struct netdev_queue *net_queue = | ||
118 | netdev_get_tx_queue(queue->vif->dev, queue->id); | ||
119 | 111 | ||
120 | /* QUEUE_STATUS_RX_PURGE_EVENT is only set if either QDisc was off OR | ||
121 | * the carrier went down and this queue was previously blocked | ||
122 | */ | ||
123 | if (unlikely(netif_tx_queue_stopped(net_queue) || | ||
124 | (!netif_carrier_ok(queue->vif->dev) && | ||
125 | test_bit(QUEUE_STATUS_RX_STALLED, &queue->status)))) | ||
126 | set_bit(QUEUE_STATUS_RX_PURGE_EVENT, &queue->status); | ||
127 | xenvif_kick_thread(queue); | 112 | xenvif_kick_thread(queue); |
128 | 113 | ||
129 | return IRQ_HANDLED; | 114 | return IRQ_HANDLED; |
@@ -151,24 +136,13 @@ void xenvif_wake_queue(struct xenvif_queue *queue) | |||
151 | netif_tx_wake_queue(netdev_get_tx_queue(dev, id)); | 136 | netif_tx_wake_queue(netdev_get_tx_queue(dev, id)); |
152 | } | 137 | } |
153 | 138 | ||
154 | /* Callback to wake the queue's thread and turn the carrier off on timeout */ | ||
155 | static void xenvif_rx_stalled(unsigned long data) | ||
156 | { | ||
157 | struct xenvif_queue *queue = (struct xenvif_queue *)data; | ||
158 | |||
159 | if (xenvif_queue_stopped(queue)) { | ||
160 | set_bit(QUEUE_STATUS_RX_PURGE_EVENT, &queue->status); | ||
161 | xenvif_kick_thread(queue); | ||
162 | } | ||
163 | } | ||
164 | |||
165 | static int xenvif_start_xmit(struct sk_buff *skb, struct net_device *dev) | 139 | static int xenvif_start_xmit(struct sk_buff *skb, struct net_device *dev) |
166 | { | 140 | { |
167 | struct xenvif *vif = netdev_priv(dev); | 141 | struct xenvif *vif = netdev_priv(dev); |
168 | struct xenvif_queue *queue = NULL; | 142 | struct xenvif_queue *queue = NULL; |
169 | unsigned int num_queues = vif->num_queues; | 143 | unsigned int num_queues = vif->num_queues; |
170 | u16 index; | 144 | u16 index; |
171 | int min_slots_needed; | 145 | struct xenvif_rx_cb *cb; |
172 | 146 | ||
173 | BUG_ON(skb->dev != dev); | 147 | BUG_ON(skb->dev != dev); |
174 | 148 | ||
@@ -191,30 +165,10 @@ static int xenvif_start_xmit(struct sk_buff *skb, struct net_device *dev) | |||
191 | !xenvif_schedulable(vif)) | 165 | !xenvif_schedulable(vif)) |
192 | goto drop; | 166 | goto drop; |
193 | 167 | ||
194 | /* At best we'll need one slot for the header and one for each | 168 | cb = XENVIF_RX_CB(skb); |
195 | * frag. | 169 | cb->expires = jiffies + rx_drain_timeout_jiffies; |
196 | */ | ||
197 | min_slots_needed = 1 + skb_shinfo(skb)->nr_frags; | ||
198 | |||
199 | /* If the skb is GSO then we'll also need an extra slot for the | ||
200 | * metadata. | ||
201 | */ | ||
202 | if (skb_is_gso(skb)) | ||
203 | min_slots_needed++; | ||
204 | 170 | ||
205 | /* If the skb can't possibly fit in the remaining slots | 171 | xenvif_rx_queue_tail(queue, skb); |
206 | * then turn off the queue to give the ring a chance to | ||
207 | * drain. | ||
208 | */ | ||
209 | if (!xenvif_rx_ring_slots_available(queue, min_slots_needed)) { | ||
210 | queue->rx_stalled.function = xenvif_rx_stalled; | ||
211 | queue->rx_stalled.data = (unsigned long)queue; | ||
212 | xenvif_stop_queue(queue); | ||
213 | mod_timer(&queue->rx_stalled, | ||
214 | jiffies + rx_drain_timeout_jiffies); | ||
215 | } | ||
216 | |||
217 | skb_queue_tail(&queue->rx_queue, skb); | ||
218 | xenvif_kick_thread(queue); | 172 | xenvif_kick_thread(queue); |
219 | 173 | ||
220 | return NETDEV_TX_OK; | 174 | return NETDEV_TX_OK; |
@@ -465,6 +419,8 @@ struct xenvif *xenvif_alloc(struct device *parent, domid_t domid, | |||
465 | vif->queues = NULL; | 419 | vif->queues = NULL; |
466 | vif->num_queues = 0; | 420 | vif->num_queues = 0; |
467 | 421 | ||
422 | spin_lock_init(&vif->lock); | ||
423 | |||
468 | dev->netdev_ops = &xenvif_netdev_ops; | 424 | dev->netdev_ops = &xenvif_netdev_ops; |
469 | dev->hw_features = NETIF_F_SG | | 425 | dev->hw_features = NETIF_F_SG | |
470 | NETIF_F_IP_CSUM | NETIF_F_IPV6_CSUM | | 426 | NETIF_F_IP_CSUM | NETIF_F_IPV6_CSUM | |
@@ -508,6 +464,8 @@ int xenvif_init_queue(struct xenvif_queue *queue) | |||
508 | init_timer(&queue->credit_timeout); | 464 | init_timer(&queue->credit_timeout); |
509 | queue->credit_window_start = get_jiffies_64(); | 465 | queue->credit_window_start = get_jiffies_64(); |
510 | 466 | ||
467 | queue->rx_queue_max = XENVIF_RX_QUEUE_BYTES; | ||
468 | |||
511 | skb_queue_head_init(&queue->rx_queue); | 469 | skb_queue_head_init(&queue->rx_queue); |
512 | skb_queue_head_init(&queue->tx_queue); | 470 | skb_queue_head_init(&queue->tx_queue); |
513 | 471 | ||
@@ -539,8 +497,6 @@ int xenvif_init_queue(struct xenvif_queue *queue) | |||
539 | queue->grant_tx_handle[i] = NETBACK_INVALID_HANDLE; | 497 | queue->grant_tx_handle[i] = NETBACK_INVALID_HANDLE; |
540 | } | 498 | } |
541 | 499 | ||
542 | init_timer(&queue->rx_stalled); | ||
543 | |||
544 | return 0; | 500 | return 0; |
545 | } | 501 | } |
546 | 502 | ||
@@ -551,7 +507,6 @@ void xenvif_carrier_on(struct xenvif *vif) | |||
551 | dev_set_mtu(vif->dev, ETH_DATA_LEN); | 507 | dev_set_mtu(vif->dev, ETH_DATA_LEN); |
552 | netdev_update_features(vif->dev); | 508 | netdev_update_features(vif->dev); |
553 | set_bit(VIF_STATUS_CONNECTED, &vif->status); | 509 | set_bit(VIF_STATUS_CONNECTED, &vif->status); |
554 | netif_carrier_on(vif->dev); | ||
555 | if (netif_running(vif->dev)) | 510 | if (netif_running(vif->dev)) |
556 | xenvif_up(vif); | 511 | xenvif_up(vif); |
557 | rtnl_unlock(); | 512 | rtnl_unlock(); |
@@ -611,6 +566,8 @@ int xenvif_connect(struct xenvif_queue *queue, unsigned long tx_ring_ref, | |||
611 | disable_irq(queue->rx_irq); | 566 | disable_irq(queue->rx_irq); |
612 | } | 567 | } |
613 | 568 | ||
569 | queue->stalled = true; | ||
570 | |||
614 | task = kthread_create(xenvif_kthread_guest_rx, | 571 | task = kthread_create(xenvif_kthread_guest_rx, |
615 | (void *)queue, "%s-guest-rx", queue->name); | 572 | (void *)queue, "%s-guest-rx", queue->name); |
616 | if (IS_ERR(task)) { | 573 | if (IS_ERR(task)) { |
@@ -674,7 +631,6 @@ void xenvif_disconnect(struct xenvif *vif) | |||
674 | netif_napi_del(&queue->napi); | 631 | netif_napi_del(&queue->napi); |
675 | 632 | ||
676 | if (queue->task) { | 633 | if (queue->task) { |
677 | del_timer_sync(&queue->rx_stalled); | ||
678 | kthread_stop(queue->task); | 634 | kthread_stop(queue->task); |
679 | queue->task = NULL; | 635 | queue->task = NULL; |
680 | } | 636 | } |
diff --git a/drivers/net/xen-netback/netback.c b/drivers/net/xen-netback/netback.c index 08f65996534c..6563f0713fc0 100644 --- a/drivers/net/xen-netback/netback.c +++ b/drivers/net/xen-netback/netback.c | |||
@@ -55,13 +55,20 @@ | |||
55 | bool separate_tx_rx_irq = 1; | 55 | bool separate_tx_rx_irq = 1; |
56 | module_param(separate_tx_rx_irq, bool, 0644); | 56 | module_param(separate_tx_rx_irq, bool, 0644); |
57 | 57 | ||
58 | /* When guest ring is filled up, qdisc queues the packets for us, but we have | 58 | /* The time that packets can stay on the guest Rx internal queue |
59 | * to timeout them, otherwise other guests' packets can get stuck there | 59 | * before they are dropped. |
60 | */ | 60 | */ |
61 | unsigned int rx_drain_timeout_msecs = 10000; | 61 | unsigned int rx_drain_timeout_msecs = 10000; |
62 | module_param(rx_drain_timeout_msecs, uint, 0444); | 62 | module_param(rx_drain_timeout_msecs, uint, 0444); |
63 | unsigned int rx_drain_timeout_jiffies; | 63 | unsigned int rx_drain_timeout_jiffies; |
64 | 64 | ||
65 | /* The length of time before the frontend is considered unresponsive | ||
66 | * because it isn't providing Rx slots. | ||
67 | */ | ||
68 | static unsigned int rx_stall_timeout_msecs = 60000; | ||
69 | module_param(rx_stall_timeout_msecs, uint, 0444); | ||
70 | static unsigned int rx_stall_timeout_jiffies; | ||
71 | |||
65 | unsigned int xenvif_max_queues; | 72 | unsigned int xenvif_max_queues; |
66 | module_param_named(max_queues, xenvif_max_queues, uint, 0644); | 73 | module_param_named(max_queues, xenvif_max_queues, uint, 0644); |
67 | MODULE_PARM_DESC(max_queues, | 74 | MODULE_PARM_DESC(max_queues, |
@@ -83,7 +90,6 @@ static void make_tx_response(struct xenvif_queue *queue, | |||
83 | s8 st); | 90 | s8 st); |
84 | 91 | ||
85 | static inline int tx_work_todo(struct xenvif_queue *queue); | 92 | static inline int tx_work_todo(struct xenvif_queue *queue); |
86 | static inline int rx_work_todo(struct xenvif_queue *queue); | ||
87 | 93 | ||
88 | static struct xen_netif_rx_response *make_rx_response(struct xenvif_queue *queue, | 94 | static struct xen_netif_rx_response *make_rx_response(struct xenvif_queue *queue, |
89 | u16 id, | 95 | u16 id, |
@@ -163,6 +169,69 @@ bool xenvif_rx_ring_slots_available(struct xenvif_queue *queue, int needed) | |||
163 | return false; | 169 | return false; |
164 | } | 170 | } |
165 | 171 | ||
172 | void xenvif_rx_queue_tail(struct xenvif_queue *queue, struct sk_buff *skb) | ||
173 | { | ||
174 | unsigned long flags; | ||
175 | |||
176 | spin_lock_irqsave(&queue->rx_queue.lock, flags); | ||
177 | |||
178 | __skb_queue_tail(&queue->rx_queue, skb); | ||
179 | |||
180 | queue->rx_queue_len += skb->len; | ||
181 | if (queue->rx_queue_len > queue->rx_queue_max) | ||
182 | netif_tx_stop_queue(netdev_get_tx_queue(queue->vif->dev, queue->id)); | ||
183 | |||
184 | spin_unlock_irqrestore(&queue->rx_queue.lock, flags); | ||
185 | } | ||
186 | |||
187 | static struct sk_buff *xenvif_rx_dequeue(struct xenvif_queue *queue) | ||
188 | { | ||
189 | struct sk_buff *skb; | ||
190 | |||
191 | spin_lock_irq(&queue->rx_queue.lock); | ||
192 | |||
193 | skb = __skb_dequeue(&queue->rx_queue); | ||
194 | if (skb) | ||
195 | queue->rx_queue_len -= skb->len; | ||
196 | |||
197 | spin_unlock_irq(&queue->rx_queue.lock); | ||
198 | |||
199 | return skb; | ||
200 | } | ||
201 | |||
202 | static void xenvif_rx_queue_maybe_wake(struct xenvif_queue *queue) | ||
203 | { | ||
204 | spin_lock_irq(&queue->rx_queue.lock); | ||
205 | |||
206 | if (queue->rx_queue_len < queue->rx_queue_max) | ||
207 | netif_tx_wake_queue(netdev_get_tx_queue(queue->vif->dev, queue->id)); | ||
208 | |||
209 | spin_unlock_irq(&queue->rx_queue.lock); | ||
210 | } | ||
211 | |||
212 | |||
213 | static void xenvif_rx_queue_purge(struct xenvif_queue *queue) | ||
214 | { | ||
215 | struct sk_buff *skb; | ||
216 | while ((skb = xenvif_rx_dequeue(queue)) != NULL) | ||
217 | kfree_skb(skb); | ||
218 | } | ||
219 | |||
220 | static void xenvif_rx_queue_drop_expired(struct xenvif_queue *queue) | ||
221 | { | ||
222 | struct sk_buff *skb; | ||
223 | |||
224 | for(;;) { | ||
225 | skb = skb_peek(&queue->rx_queue); | ||
226 | if (!skb) | ||
227 | break; | ||
228 | if (time_before(jiffies, XENVIF_RX_CB(skb)->expires)) | ||
229 | break; | ||
230 | xenvif_rx_dequeue(queue); | ||
231 | kfree_skb(skb); | ||
232 | } | ||
233 | } | ||
234 | |||
166 | /* | 235 | /* |
167 | * Returns true if we should start a new receive buffer instead of | 236 | * Returns true if we should start a new receive buffer instead of |
168 | * adding 'size' bytes to a buffer which currently contains 'offset' | 237 | * adding 'size' bytes to a buffer which currently contains 'offset' |
@@ -237,13 +306,6 @@ static struct xenvif_rx_meta *get_next_rx_buffer(struct xenvif_queue *queue, | |||
237 | return meta; | 306 | return meta; |
238 | } | 307 | } |
239 | 308 | ||
240 | struct xenvif_rx_cb { | ||
241 | int meta_slots_used; | ||
242 | bool full_coalesce; | ||
243 | }; | ||
244 | |||
245 | #define XENVIF_RX_CB(skb) ((struct xenvif_rx_cb *)(skb)->cb) | ||
246 | |||
247 | /* | 309 | /* |
248 | * Set up the grant operations for this fragment. If it's a flipping | 310 | * Set up the grant operations for this fragment. If it's a flipping |
249 | * interface, we also set up the unmap request from here. | 311 | * interface, we also set up the unmap request from here. |
@@ -587,12 +649,15 @@ static void xenvif_rx_action(struct xenvif_queue *queue) | |||
587 | 649 | ||
588 | skb_queue_head_init(&rxq); | 650 | skb_queue_head_init(&rxq); |
589 | 651 | ||
590 | while ((skb = skb_dequeue(&queue->rx_queue)) != NULL) { | 652 | while (xenvif_rx_ring_slots_available(queue, XEN_NETBK_RX_SLOTS_MAX) |
653 | && (skb = xenvif_rx_dequeue(queue)) != NULL) { | ||
591 | RING_IDX max_slots_needed; | 654 | RING_IDX max_slots_needed; |
592 | RING_IDX old_req_cons; | 655 | RING_IDX old_req_cons; |
593 | RING_IDX ring_slots_used; | 656 | RING_IDX ring_slots_used; |
594 | int i; | 657 | int i; |
595 | 658 | ||
659 | queue->last_rx_time = jiffies; | ||
660 | |||
596 | /* We need a cheap worse case estimate for the number of | 661 | /* We need a cheap worse case estimate for the number of |
597 | * slots we'll use. | 662 | * slots we'll use. |
598 | */ | 663 | */ |
@@ -634,15 +699,6 @@ static void xenvif_rx_action(struct xenvif_queue *queue) | |||
634 | skb_shinfo(skb)->gso_type & SKB_GSO_TCPV6)) | 699 | skb_shinfo(skb)->gso_type & SKB_GSO_TCPV6)) |
635 | max_slots_needed++; | 700 | max_slots_needed++; |
636 | 701 | ||
637 | /* If the skb may not fit then bail out now */ | ||
638 | if (!xenvif_rx_ring_slots_available(queue, max_slots_needed)) { | ||
639 | skb_queue_head(&queue->rx_queue, skb); | ||
640 | need_to_notify = true; | ||
641 | queue->rx_last_skb_slots = max_slots_needed; | ||
642 | break; | ||
643 | } else | ||
644 | queue->rx_last_skb_slots = 0; | ||
645 | |||
646 | old_req_cons = queue->rx.req_cons; | 702 | old_req_cons = queue->rx.req_cons; |
647 | XENVIF_RX_CB(skb)->meta_slots_used = xenvif_gop_skb(skb, &npo, queue); | 703 | XENVIF_RX_CB(skb)->meta_slots_used = xenvif_gop_skb(skb, &npo, queue); |
648 | ring_slots_used = queue->rx.req_cons - old_req_cons; | 704 | ring_slots_used = queue->rx.req_cons - old_req_cons; |
@@ -1869,12 +1925,6 @@ void xenvif_idx_unmap(struct xenvif_queue *queue, u16 pending_idx) | |||
1869 | } | 1925 | } |
1870 | } | 1926 | } |
1871 | 1927 | ||
1872 | static inline int rx_work_todo(struct xenvif_queue *queue) | ||
1873 | { | ||
1874 | return (!skb_queue_empty(&queue->rx_queue) && | ||
1875 | xenvif_rx_ring_slots_available(queue, queue->rx_last_skb_slots)); | ||
1876 | } | ||
1877 | |||
1878 | static inline int tx_work_todo(struct xenvif_queue *queue) | 1928 | static inline int tx_work_todo(struct xenvif_queue *queue) |
1879 | { | 1929 | { |
1880 | if (likely(RING_HAS_UNCONSUMED_REQUESTS(&queue->tx))) | 1930 | if (likely(RING_HAS_UNCONSUMED_REQUESTS(&queue->tx))) |
@@ -1931,92 +1981,121 @@ err: | |||
1931 | return err; | 1981 | return err; |
1932 | } | 1982 | } |
1933 | 1983 | ||
1934 | static void xenvif_start_queue(struct xenvif_queue *queue) | 1984 | static void xenvif_queue_carrier_off(struct xenvif_queue *queue) |
1935 | { | 1985 | { |
1936 | if (xenvif_schedulable(queue->vif)) | 1986 | struct xenvif *vif = queue->vif; |
1937 | xenvif_wake_queue(queue); | 1987 | |
1988 | queue->stalled = true; | ||
1989 | |||
1990 | /* At least one queue has stalled? Disable the carrier. */ | ||
1991 | spin_lock(&vif->lock); | ||
1992 | if (vif->stalled_queues++ == 0) { | ||
1993 | netdev_info(vif->dev, "Guest Rx stalled"); | ||
1994 | netif_carrier_off(vif->dev); | ||
1995 | } | ||
1996 | spin_unlock(&vif->lock); | ||
1938 | } | 1997 | } |
1939 | 1998 | ||
1940 | /* Only called from the queue's thread, it handles the situation when the guest | 1999 | static void xenvif_queue_carrier_on(struct xenvif_queue *queue) |
1941 | * doesn't post enough requests on the receiving ring. | ||
1942 | * First xenvif_start_xmit disables QDisc and start a timer, and then either the | ||
1943 | * timer fires, or the guest send an interrupt after posting new request. If it | ||
1944 | * is the timer, the carrier is turned off here. | ||
1945 | * */ | ||
1946 | static void xenvif_rx_purge_event(struct xenvif_queue *queue) | ||
1947 | { | 2000 | { |
1948 | /* Either the last unsuccesful skb or at least 1 slot should fit */ | 2001 | struct xenvif *vif = queue->vif; |
1949 | int needed = queue->rx_last_skb_slots ? | ||
1950 | queue->rx_last_skb_slots : 1; | ||
1951 | 2002 | ||
1952 | /* It is assumed that if the guest post new slots after this, the RX | 2003 | queue->last_rx_time = jiffies; /* Reset Rx stall detection. */ |
1953 | * interrupt will set the QUEUE_STATUS_RX_PURGE_EVENT bit and wake up | 2004 | queue->stalled = false; |
1954 | * the thread again | ||
1955 | */ | ||
1956 | set_bit(QUEUE_STATUS_RX_STALLED, &queue->status); | ||
1957 | if (!xenvif_rx_ring_slots_available(queue, needed)) { | ||
1958 | rtnl_lock(); | ||
1959 | if (netif_carrier_ok(queue->vif->dev)) { | ||
1960 | /* Timer fired and there are still no slots. Turn off | ||
1961 | * everything except the interrupts | ||
1962 | */ | ||
1963 | netif_carrier_off(queue->vif->dev); | ||
1964 | skb_queue_purge(&queue->rx_queue); | ||
1965 | queue->rx_last_skb_slots = 0; | ||
1966 | if (net_ratelimit()) | ||
1967 | netdev_err(queue->vif->dev, "Carrier off due to lack of guest response on queue %d\n", queue->id); | ||
1968 | } else { | ||
1969 | /* Probably an another queue already turned the carrier | ||
1970 | * off, make sure nothing is stucked in the internal | ||
1971 | * queue of this queue | ||
1972 | */ | ||
1973 | skb_queue_purge(&queue->rx_queue); | ||
1974 | queue->rx_last_skb_slots = 0; | ||
1975 | } | ||
1976 | rtnl_unlock(); | ||
1977 | } else if (!netif_carrier_ok(queue->vif->dev)) { | ||
1978 | unsigned int num_queues = queue->vif->num_queues; | ||
1979 | unsigned int i; | ||
1980 | /* The carrier was down, but an interrupt kicked | ||
1981 | * the thread again after new requests were | ||
1982 | * posted | ||
1983 | */ | ||
1984 | clear_bit(QUEUE_STATUS_RX_STALLED, | ||
1985 | &queue->status); | ||
1986 | rtnl_lock(); | ||
1987 | netif_carrier_on(queue->vif->dev); | ||
1988 | netif_tx_wake_all_queues(queue->vif->dev); | ||
1989 | rtnl_unlock(); | ||
1990 | 2005 | ||
1991 | for (i = 0; i < num_queues; i++) { | 2006 | /* All queues are ready? Enable the carrier. */ |
1992 | struct xenvif_queue *temp = &queue->vif->queues[i]; | 2007 | spin_lock(&vif->lock); |
2008 | if (--vif->stalled_queues == 0) { | ||
2009 | netdev_info(vif->dev, "Guest Rx ready"); | ||
2010 | netif_carrier_on(vif->dev); | ||
2011 | } | ||
2012 | spin_unlock(&vif->lock); | ||
2013 | } | ||
1993 | 2014 | ||
1994 | xenvif_napi_schedule_or_enable_events(temp); | 2015 | static bool xenvif_rx_queue_stalled(struct xenvif_queue *queue) |
1995 | } | 2016 | { |
1996 | if (net_ratelimit()) | 2017 | RING_IDX prod, cons; |
1997 | netdev_err(queue->vif->dev, "Carrier on again\n"); | 2018 | |
1998 | } else { | 2019 | prod = queue->rx.sring->req_prod; |
1999 | /* Queuing were stopped, but the guest posted | 2020 | cons = queue->rx.req_cons; |
2000 | * new requests and sent an interrupt | 2021 | |
2001 | */ | 2022 | return !queue->stalled |
2002 | clear_bit(QUEUE_STATUS_RX_STALLED, | 2023 | && prod - cons < XEN_NETBK_RX_SLOTS_MAX |
2003 | &queue->status); | 2024 | && time_after(jiffies, |
2004 | del_timer_sync(&queue->rx_stalled); | 2025 | queue->last_rx_time + rx_stall_timeout_jiffies); |
2005 | xenvif_start_queue(queue); | 2026 | } |
2027 | |||
2028 | static bool xenvif_rx_queue_ready(struct xenvif_queue *queue) | ||
2029 | { | ||
2030 | RING_IDX prod, cons; | ||
2031 | |||
2032 | prod = queue->rx.sring->req_prod; | ||
2033 | cons = queue->rx.req_cons; | ||
2034 | |||
2035 | return queue->stalled | ||
2036 | && prod - cons >= XEN_NETBK_RX_SLOTS_MAX; | ||
2037 | } | ||
2038 | |||
2039 | static bool xenvif_have_rx_work(struct xenvif_queue *queue) | ||
2040 | { | ||
2041 | return (!skb_queue_empty(&queue->rx_queue) | ||
2042 | && xenvif_rx_ring_slots_available(queue, XEN_NETBK_RX_SLOTS_MAX)) | ||
2043 | || xenvif_rx_queue_stalled(queue) | ||
2044 | || xenvif_rx_queue_ready(queue) | ||
2045 | || kthread_should_stop() | ||
2046 | || queue->vif->disabled; | ||
2047 | } | ||
2048 | |||
2049 | static long xenvif_rx_queue_timeout(struct xenvif_queue *queue) | ||
2050 | { | ||
2051 | struct sk_buff *skb; | ||
2052 | long timeout; | ||
2053 | |||
2054 | skb = skb_peek(&queue->rx_queue); | ||
2055 | if (!skb) | ||
2056 | return MAX_SCHEDULE_TIMEOUT; | ||
2057 | |||
2058 | timeout = XENVIF_RX_CB(skb)->expires - jiffies; | ||
2059 | return timeout < 0 ? 0 : timeout; | ||
2060 | } | ||
2061 | |||
2062 | /* Wait until the guest Rx thread has work. | ||
2063 | * | ||
2064 | * The timeout needs to be adjusted based on the current head of the | ||
2065 | * queue (and not just the head at the beginning). In particular, if | ||
2066 | * the queue is initially empty an infinite timeout is used and this | ||
2067 | * needs to be reduced when a skb is queued. | ||
2068 | * | ||
2069 | * This cannot be done with wait_event_timeout() because it only | ||
2070 | * calculates the timeout once. | ||
2071 | */ | ||
2072 | static void xenvif_wait_for_rx_work(struct xenvif_queue *queue) | ||
2073 | { | ||
2074 | DEFINE_WAIT(wait); | ||
2075 | |||
2076 | if (xenvif_have_rx_work(queue)) | ||
2077 | return; | ||
2078 | |||
2079 | for (;;) { | ||
2080 | long ret; | ||
2081 | |||
2082 | prepare_to_wait(&queue->wq, &wait, TASK_INTERRUPTIBLE); | ||
2083 | if (xenvif_have_rx_work(queue)) | ||
2084 | break; | ||
2085 | ret = schedule_timeout(xenvif_rx_queue_timeout(queue)); | ||
2086 | if (!ret) | ||
2087 | break; | ||
2006 | } | 2088 | } |
2089 | finish_wait(&queue->wq, &wait); | ||
2007 | } | 2090 | } |
2008 | 2091 | ||
2009 | int xenvif_kthread_guest_rx(void *data) | 2092 | int xenvif_kthread_guest_rx(void *data) |
2010 | { | 2093 | { |
2011 | struct xenvif_queue *queue = data; | 2094 | struct xenvif_queue *queue = data; |
2012 | struct sk_buff *skb; | 2095 | struct xenvif *vif = queue->vif; |
2013 | 2096 | ||
2014 | while (!kthread_should_stop()) { | 2097 | for (;;) { |
2015 | wait_event_interruptible(queue->wq, | 2098 | xenvif_wait_for_rx_work(queue); |
2016 | rx_work_todo(queue) || | ||
2017 | queue->vif->disabled || | ||
2018 | test_bit(QUEUE_STATUS_RX_PURGE_EVENT, &queue->status) || | ||
2019 | kthread_should_stop()); | ||
2020 | 2099 | ||
2021 | if (kthread_should_stop()) | 2100 | if (kthread_should_stop()) |
2022 | break; | 2101 | break; |
@@ -2028,35 +2107,38 @@ int xenvif_kthread_guest_rx(void *data) | |||
2028 | * context so we defer it here, if this thread is | 2107 | * context so we defer it here, if this thread is |
2029 | * associated with queue 0. | 2108 | * associated with queue 0. |
2030 | */ | 2109 | */ |
2031 | if (unlikely(queue->vif->disabled && queue->id == 0)) { | 2110 | if (unlikely(vif->disabled && queue->id == 0)) { |
2032 | xenvif_carrier_off(queue->vif); | 2111 | xenvif_carrier_off(vif); |
2033 | } else if (unlikely(queue->vif->disabled)) { | 2112 | xenvif_rx_queue_purge(queue); |
2034 | /* kthread_stop() would be called upon this thread soon, | 2113 | continue; |
2035 | * be a bit proactive | ||
2036 | */ | ||
2037 | skb_queue_purge(&queue->rx_queue); | ||
2038 | queue->rx_last_skb_slots = 0; | ||
2039 | } else if (unlikely(test_and_clear_bit(QUEUE_STATUS_RX_PURGE_EVENT, | ||
2040 | &queue->status))) { | ||
2041 | xenvif_rx_purge_event(queue); | ||
2042 | } else if (!netif_carrier_ok(queue->vif->dev)) { | ||
2043 | /* Another queue stalled and turned the carrier off, so | ||
2044 | * purge the internal queue of queues which were not | ||
2045 | * blocked | ||
2046 | */ | ||
2047 | skb_queue_purge(&queue->rx_queue); | ||
2048 | queue->rx_last_skb_slots = 0; | ||
2049 | } | 2114 | } |
2050 | 2115 | ||
2051 | if (!skb_queue_empty(&queue->rx_queue)) | 2116 | if (!skb_queue_empty(&queue->rx_queue)) |
2052 | xenvif_rx_action(queue); | 2117 | xenvif_rx_action(queue); |
2053 | 2118 | ||
2119 | /* If the guest hasn't provided any Rx slots for a | ||
2120 | * while it's probably not responsive, drop the | ||
2121 | * carrier so packets are dropped earlier. | ||
2122 | */ | ||
2123 | if (xenvif_rx_queue_stalled(queue)) | ||
2124 | xenvif_queue_carrier_off(queue); | ||
2125 | else if (xenvif_rx_queue_ready(queue)) | ||
2126 | xenvif_queue_carrier_on(queue); | ||
2127 | |||
2128 | /* Queued packets may have foreign pages from other | ||
2129 | * domains. These cannot be queued indefinitely as | ||
2130 | * this would starve guests of grant refs and transmit | ||
2131 | * slots. | ||
2132 | */ | ||
2133 | xenvif_rx_queue_drop_expired(queue); | ||
2134 | |||
2135 | xenvif_rx_queue_maybe_wake(queue); | ||
2136 | |||
2054 | cond_resched(); | 2137 | cond_resched(); |
2055 | } | 2138 | } |
2056 | 2139 | ||
2057 | /* Bin any remaining skbs */ | 2140 | /* Bin any remaining skbs */ |
2058 | while ((skb = skb_dequeue(&queue->rx_queue)) != NULL) | 2141 | xenvif_rx_queue_purge(queue); |
2059 | dev_kfree_skb(skb); | ||
2060 | 2142 | ||
2061 | return 0; | 2143 | return 0; |
2062 | } | 2144 | } |
@@ -2113,6 +2195,7 @@ static int __init netback_init(void) | |||
2113 | goto failed_init; | 2195 | goto failed_init; |
2114 | 2196 | ||
2115 | rx_drain_timeout_jiffies = msecs_to_jiffies(rx_drain_timeout_msecs); | 2197 | rx_drain_timeout_jiffies = msecs_to_jiffies(rx_drain_timeout_msecs); |
2198 | rx_stall_timeout_jiffies = msecs_to_jiffies(rx_stall_timeout_msecs); | ||
2116 | 2199 | ||
2117 | #ifdef CONFIG_DEBUG_FS | 2200 | #ifdef CONFIG_DEBUG_FS |
2118 | xen_netback_dbg_root = debugfs_create_dir("xen-netback", NULL); | 2201 | xen_netback_dbg_root = debugfs_create_dir("xen-netback", NULL); |
diff --git a/drivers/net/xen-netback/xenbus.c b/drivers/net/xen-netback/xenbus.c index 8079c31ac5e6..4e56a27f9689 100644 --- a/drivers/net/xen-netback/xenbus.c +++ b/drivers/net/xen-netback/xenbus.c | |||
@@ -52,6 +52,7 @@ static int xenvif_read_io_ring(struct seq_file *m, void *v) | |||
52 | struct xenvif_queue *queue = m->private; | 52 | struct xenvif_queue *queue = m->private; |
53 | struct xen_netif_tx_back_ring *tx_ring = &queue->tx; | 53 | struct xen_netif_tx_back_ring *tx_ring = &queue->tx; |
54 | struct xen_netif_rx_back_ring *rx_ring = &queue->rx; | 54 | struct xen_netif_rx_back_ring *rx_ring = &queue->rx; |
55 | struct netdev_queue *dev_queue; | ||
55 | 56 | ||
56 | if (tx_ring->sring) { | 57 | if (tx_ring->sring) { |
57 | struct xen_netif_tx_sring *sring = tx_ring->sring; | 58 | struct xen_netif_tx_sring *sring = tx_ring->sring; |
@@ -112,6 +113,13 @@ static int xenvif_read_io_ring(struct seq_file *m, void *v) | |||
112 | queue->credit_timeout.expires, | 113 | queue->credit_timeout.expires, |
113 | jiffies); | 114 | jiffies); |
114 | 115 | ||
116 | dev_queue = netdev_get_tx_queue(queue->vif->dev, queue->id); | ||
117 | |||
118 | seq_printf(m, "\nRx internal queue: len %u max %u pkts %u %s\n", | ||
119 | queue->rx_queue_len, queue->rx_queue_max, | ||
120 | skb_queue_len(&queue->rx_queue), | ||
121 | netif_tx_queue_stopped(dev_queue) ? "stopped" : "running"); | ||
122 | |||
115 | return 0; | 123 | return 0; |
116 | } | 124 | } |
117 | 125 | ||
@@ -703,6 +711,7 @@ static void connect(struct backend_info *be) | |||
703 | be->vif->queues = vzalloc(requested_num_queues * | 711 | be->vif->queues = vzalloc(requested_num_queues * |
704 | sizeof(struct xenvif_queue)); | 712 | sizeof(struct xenvif_queue)); |
705 | be->vif->num_queues = requested_num_queues; | 713 | be->vif->num_queues = requested_num_queues; |
714 | be->vif->stalled_queues = requested_num_queues; | ||
706 | 715 | ||
707 | for (queue_index = 0; queue_index < requested_num_queues; ++queue_index) { | 716 | for (queue_index = 0; queue_index < requested_num_queues; ++queue_index) { |
708 | queue = &be->vif->queues[queue_index]; | 717 | queue = &be->vif->queues[queue_index]; |
@@ -873,15 +882,10 @@ static int read_xenbus_vif_flags(struct backend_info *be) | |||
873 | if (!rx_copy) | 882 | if (!rx_copy) |
874 | return -EOPNOTSUPP; | 883 | return -EOPNOTSUPP; |
875 | 884 | ||
876 | if (vif->dev->tx_queue_len != 0) { | 885 | if (xenbus_scanf(XBT_NIL, dev->otherend, |
877 | if (xenbus_scanf(XBT_NIL, dev->otherend, | 886 | "feature-rx-notify", "%d", &val) < 0 || val == 0) { |
878 | "feature-rx-notify", "%d", &val) < 0) | 887 | xenbus_dev_fatal(dev, -EINVAL, "feature-rx-notify is mandatory"); |
879 | val = 0; | 888 | return -EINVAL; |
880 | if (val) | ||
881 | vif->can_queue = 1; | ||
882 | else | ||
883 | /* Must be non-zero for pfifo_fast to work. */ | ||
884 | vif->dev->tx_queue_len = 1; | ||
885 | } | 889 | } |
886 | 890 | ||
887 | if (xenbus_scanf(XBT_NIL, dev->otherend, "feature-sg", | 891 | if (xenbus_scanf(XBT_NIL, dev->otherend, "feature-sg", |
diff --git a/drivers/of/base.c b/drivers/of/base.c index 2305dc0382bc..3823edf2d012 100644 --- a/drivers/of/base.c +++ b/drivers/of/base.c | |||
@@ -1280,52 +1280,6 @@ int of_property_read_string(struct device_node *np, const char *propname, | |||
1280 | EXPORT_SYMBOL_GPL(of_property_read_string); | 1280 | EXPORT_SYMBOL_GPL(of_property_read_string); |
1281 | 1281 | ||
1282 | /** | 1282 | /** |
1283 | * of_property_read_string_index - Find and read a string from a multiple | ||
1284 | * strings property. | ||
1285 | * @np: device node from which the property value is to be read. | ||
1286 | * @propname: name of the property to be searched. | ||
1287 | * @index: index of the string in the list of strings | ||
1288 | * @out_string: pointer to null terminated return string, modified only if | ||
1289 | * return value is 0. | ||
1290 | * | ||
1291 | * Search for a property in a device tree node and retrieve a null | ||
1292 | * terminated string value (pointer to data, not a copy) in the list of strings | ||
1293 | * contained in that property. | ||
1294 | * Returns 0 on success, -EINVAL if the property does not exist, -ENODATA if | ||
1295 | * property does not have a value, and -EILSEQ if the string is not | ||
1296 | * null-terminated within the length of the property data. | ||
1297 | * | ||
1298 | * The out_string pointer is modified only if a valid string can be decoded. | ||
1299 | */ | ||
1300 | int of_property_read_string_index(struct device_node *np, const char *propname, | ||
1301 | int index, const char **output) | ||
1302 | { | ||
1303 | struct property *prop = of_find_property(np, propname, NULL); | ||
1304 | int i = 0; | ||
1305 | size_t l = 0, total = 0; | ||
1306 | const char *p; | ||
1307 | |||
1308 | if (!prop) | ||
1309 | return -EINVAL; | ||
1310 | if (!prop->value) | ||
1311 | return -ENODATA; | ||
1312 | if (strnlen(prop->value, prop->length) >= prop->length) | ||
1313 | return -EILSEQ; | ||
1314 | |||
1315 | p = prop->value; | ||
1316 | |||
1317 | for (i = 0; total < prop->length; total += l, p += l) { | ||
1318 | l = strlen(p) + 1; | ||
1319 | if (i++ == index) { | ||
1320 | *output = p; | ||
1321 | return 0; | ||
1322 | } | ||
1323 | } | ||
1324 | return -ENODATA; | ||
1325 | } | ||
1326 | EXPORT_SYMBOL_GPL(of_property_read_string_index); | ||
1327 | |||
1328 | /** | ||
1329 | * of_property_match_string() - Find string in a list and return index | 1283 | * of_property_match_string() - Find string in a list and return index |
1330 | * @np: pointer to node containing string list property | 1284 | * @np: pointer to node containing string list property |
1331 | * @propname: string list property name | 1285 | * @propname: string list property name |
@@ -1351,7 +1305,7 @@ int of_property_match_string(struct device_node *np, const char *propname, | |||
1351 | end = p + prop->length; | 1305 | end = p + prop->length; |
1352 | 1306 | ||
1353 | for (i = 0; p < end; i++, p += l) { | 1307 | for (i = 0; p < end; i++, p += l) { |
1354 | l = strlen(p) + 1; | 1308 | l = strnlen(p, end - p) + 1; |
1355 | if (p + l > end) | 1309 | if (p + l > end) |
1356 | return -EILSEQ; | 1310 | return -EILSEQ; |
1357 | pr_debug("comparing %s with %s\n", string, p); | 1311 | pr_debug("comparing %s with %s\n", string, p); |
@@ -1363,39 +1317,41 @@ int of_property_match_string(struct device_node *np, const char *propname, | |||
1363 | EXPORT_SYMBOL_GPL(of_property_match_string); | 1317 | EXPORT_SYMBOL_GPL(of_property_match_string); |
1364 | 1318 | ||
1365 | /** | 1319 | /** |
1366 | * of_property_count_strings - Find and return the number of strings from a | 1320 | * of_property_read_string_util() - Utility helper for parsing string properties |
1367 | * multiple strings property. | ||
1368 | * @np: device node from which the property value is to be read. | 1321 | * @np: device node from which the property value is to be read. |
1369 | * @propname: name of the property to be searched. | 1322 | * @propname: name of the property to be searched. |
1323 | * @out_strs: output array of string pointers. | ||
1324 | * @sz: number of array elements to read. | ||
1325 | * @skip: Number of strings to skip over at beginning of list. | ||
1370 | * | 1326 | * |
1371 | * Search for a property in a device tree node and retrieve the number of null | 1327 | * Don't call this function directly. It is a utility helper for the |
1372 | * terminated string contain in it. Returns the number of strings on | 1328 | * of_property_read_string*() family of functions. |
1373 | * success, -EINVAL if the property does not exist, -ENODATA if property | ||
1374 | * does not have a value, and -EILSEQ if the string is not null-terminated | ||
1375 | * within the length of the property data. | ||
1376 | */ | 1329 | */ |
1377 | int of_property_count_strings(struct device_node *np, const char *propname) | 1330 | int of_property_read_string_helper(struct device_node *np, const char *propname, |
1331 | const char **out_strs, size_t sz, int skip) | ||
1378 | { | 1332 | { |
1379 | struct property *prop = of_find_property(np, propname, NULL); | 1333 | struct property *prop = of_find_property(np, propname, NULL); |
1380 | int i = 0; | 1334 | int l = 0, i = 0; |
1381 | size_t l = 0, total = 0; | 1335 | const char *p, *end; |
1382 | const char *p; | ||
1383 | 1336 | ||
1384 | if (!prop) | 1337 | if (!prop) |
1385 | return -EINVAL; | 1338 | return -EINVAL; |
1386 | if (!prop->value) | 1339 | if (!prop->value) |
1387 | return -ENODATA; | 1340 | return -ENODATA; |
1388 | if (strnlen(prop->value, prop->length) >= prop->length) | ||
1389 | return -EILSEQ; | ||
1390 | |||
1391 | p = prop->value; | 1341 | p = prop->value; |
1342 | end = p + prop->length; | ||
1392 | 1343 | ||
1393 | for (i = 0; total < prop->length; total += l, p += l, i++) | 1344 | for (i = 0; p < end && (!out_strs || i < skip + sz); i++, p += l) { |
1394 | l = strlen(p) + 1; | 1345 | l = strnlen(p, end - p) + 1; |
1395 | 1346 | if (p + l > end) | |
1396 | return i; | 1347 | return -EILSEQ; |
1348 | if (out_strs && i >= skip) | ||
1349 | *out_strs++ = p; | ||
1350 | } | ||
1351 | i -= skip; | ||
1352 | return i <= 0 ? -ENODATA : i; | ||
1397 | } | 1353 | } |
1398 | EXPORT_SYMBOL_GPL(of_property_count_strings); | 1354 | EXPORT_SYMBOL_GPL(of_property_read_string_helper); |
1399 | 1355 | ||
1400 | void of_print_phandle_args(const char *msg, const struct of_phandle_args *args) | 1356 | void of_print_phandle_args(const char *msg, const struct of_phandle_args *args) |
1401 | { | 1357 | { |
diff --git a/drivers/of/of_reserved_mem.c b/drivers/of/of_reserved_mem.c index 59fb12e84e6b..dc566b38645f 100644 --- a/drivers/of/of_reserved_mem.c +++ b/drivers/of/of_reserved_mem.c | |||
@@ -243,23 +243,27 @@ static inline struct reserved_mem *__find_rmem(struct device_node *node) | |||
243 | * This function assign memory region pointed by "memory-region" device tree | 243 | * This function assign memory region pointed by "memory-region" device tree |
244 | * property to the given device. | 244 | * property to the given device. |
245 | */ | 245 | */ |
246 | void of_reserved_mem_device_init(struct device *dev) | 246 | int of_reserved_mem_device_init(struct device *dev) |
247 | { | 247 | { |
248 | struct reserved_mem *rmem; | 248 | struct reserved_mem *rmem; |
249 | struct device_node *np; | 249 | struct device_node *np; |
250 | int ret; | ||
250 | 251 | ||
251 | np = of_parse_phandle(dev->of_node, "memory-region", 0); | 252 | np = of_parse_phandle(dev->of_node, "memory-region", 0); |
252 | if (!np) | 253 | if (!np) |
253 | return; | 254 | return -ENODEV; |
254 | 255 | ||
255 | rmem = __find_rmem(np); | 256 | rmem = __find_rmem(np); |
256 | of_node_put(np); | 257 | of_node_put(np); |
257 | 258 | ||
258 | if (!rmem || !rmem->ops || !rmem->ops->device_init) | 259 | if (!rmem || !rmem->ops || !rmem->ops->device_init) |
259 | return; | 260 | return -EINVAL; |
261 | |||
262 | ret = rmem->ops->device_init(rmem, dev); | ||
263 | if (ret == 0) | ||
264 | dev_info(dev, "assigned reserved memory node %s\n", rmem->name); | ||
260 | 265 | ||
261 | rmem->ops->device_init(rmem, dev); | 266 | return ret; |
262 | dev_info(dev, "assigned reserved memory node %s\n", rmem->name); | ||
263 | } | 267 | } |
264 | 268 | ||
265 | /** | 269 | /** |
diff --git a/drivers/of/selftest.c b/drivers/of/selftest.c index 78001270a598..11b873c54a77 100644 --- a/drivers/of/selftest.c +++ b/drivers/of/selftest.c | |||
@@ -339,8 +339,9 @@ static void __init of_selftest_parse_phandle_with_args(void) | |||
339 | selftest(rc == -EINVAL, "expected:%i got:%i\n", -EINVAL, rc); | 339 | selftest(rc == -EINVAL, "expected:%i got:%i\n", -EINVAL, rc); |
340 | } | 340 | } |
341 | 341 | ||
342 | static void __init of_selftest_property_match_string(void) | 342 | static void __init of_selftest_property_string(void) |
343 | { | 343 | { |
344 | const char *strings[4]; | ||
344 | struct device_node *np; | 345 | struct device_node *np; |
345 | int rc; | 346 | int rc; |
346 | 347 | ||
@@ -357,13 +358,66 @@ static void __init of_selftest_property_match_string(void) | |||
357 | rc = of_property_match_string(np, "phandle-list-names", "third"); | 358 | rc = of_property_match_string(np, "phandle-list-names", "third"); |
358 | selftest(rc == 2, "third expected:0 got:%i\n", rc); | 359 | selftest(rc == 2, "third expected:0 got:%i\n", rc); |
359 | rc = of_property_match_string(np, "phandle-list-names", "fourth"); | 360 | rc = of_property_match_string(np, "phandle-list-names", "fourth"); |
360 | selftest(rc == -ENODATA, "unmatched string; rc=%i", rc); | 361 | selftest(rc == -ENODATA, "unmatched string; rc=%i\n", rc); |
361 | rc = of_property_match_string(np, "missing-property", "blah"); | 362 | rc = of_property_match_string(np, "missing-property", "blah"); |
362 | selftest(rc == -EINVAL, "missing property; rc=%i", rc); | 363 | selftest(rc == -EINVAL, "missing property; rc=%i\n", rc); |
363 | rc = of_property_match_string(np, "empty-property", "blah"); | 364 | rc = of_property_match_string(np, "empty-property", "blah"); |
364 | selftest(rc == -ENODATA, "empty property; rc=%i", rc); | 365 | selftest(rc == -ENODATA, "empty property; rc=%i\n", rc); |
365 | rc = of_property_match_string(np, "unterminated-string", "blah"); | 366 | rc = of_property_match_string(np, "unterminated-string", "blah"); |
366 | selftest(rc == -EILSEQ, "unterminated string; rc=%i", rc); | 367 | selftest(rc == -EILSEQ, "unterminated string; rc=%i\n", rc); |
368 | |||
369 | /* of_property_count_strings() tests */ | ||
370 | rc = of_property_count_strings(np, "string-property"); | ||
371 | selftest(rc == 1, "Incorrect string count; rc=%i\n", rc); | ||
372 | rc = of_property_count_strings(np, "phandle-list-names"); | ||
373 | selftest(rc == 3, "Incorrect string count; rc=%i\n", rc); | ||
374 | rc = of_property_count_strings(np, "unterminated-string"); | ||
375 | selftest(rc == -EILSEQ, "unterminated string; rc=%i\n", rc); | ||
376 | rc = of_property_count_strings(np, "unterminated-string-list"); | ||
377 | selftest(rc == -EILSEQ, "unterminated string array; rc=%i\n", rc); | ||
378 | |||
379 | /* of_property_read_string_index() tests */ | ||
380 | rc = of_property_read_string_index(np, "string-property", 0, strings); | ||
381 | selftest(rc == 0 && !strcmp(strings[0], "foobar"), "of_property_read_string_index() failure; rc=%i\n", rc); | ||
382 | strings[0] = NULL; | ||
383 | rc = of_property_read_string_index(np, "string-property", 1, strings); | ||
384 | selftest(rc == -ENODATA && strings[0] == NULL, "of_property_read_string_index() failure; rc=%i\n", rc); | ||
385 | rc = of_property_read_string_index(np, "phandle-list-names", 0, strings); | ||
386 | selftest(rc == 0 && !strcmp(strings[0], "first"), "of_property_read_string_index() failure; rc=%i\n", rc); | ||
387 | rc = of_property_read_string_index(np, "phandle-list-names", 1, strings); | ||
388 | selftest(rc == 0 && !strcmp(strings[0], "second"), "of_property_read_string_index() failure; rc=%i\n", rc); | ||
389 | rc = of_property_read_string_index(np, "phandle-list-names", 2, strings); | ||
390 | selftest(rc == 0 && !strcmp(strings[0], "third"), "of_property_read_string_index() failure; rc=%i\n", rc); | ||
391 | strings[0] = NULL; | ||
392 | rc = of_property_read_string_index(np, "phandle-list-names", 3, strings); | ||
393 | selftest(rc == -ENODATA && strings[0] == NULL, "of_property_read_string_index() failure; rc=%i\n", rc); | ||
394 | strings[0] = NULL; | ||
395 | rc = of_property_read_string_index(np, "unterminated-string", 0, strings); | ||
396 | selftest(rc == -EILSEQ && strings[0] == NULL, "of_property_read_string_index() failure; rc=%i\n", rc); | ||
397 | rc = of_property_read_string_index(np, "unterminated-string-list", 0, strings); | ||
398 | selftest(rc == 0 && !strcmp(strings[0], "first"), "of_property_read_string_index() failure; rc=%i\n", rc); | ||
399 | strings[0] = NULL; | ||
400 | rc = of_property_read_string_index(np, "unterminated-string-list", 2, strings); /* should fail */ | ||
401 | selftest(rc == -EILSEQ && strings[0] == NULL, "of_property_read_string_index() failure; rc=%i\n", rc); | ||
402 | strings[1] = NULL; | ||
403 | |||
404 | /* of_property_read_string_array() tests */ | ||
405 | rc = of_property_read_string_array(np, "string-property", strings, 4); | ||
406 | selftest(rc == 1, "Incorrect string count; rc=%i\n", rc); | ||
407 | rc = of_property_read_string_array(np, "phandle-list-names", strings, 4); | ||
408 | selftest(rc == 3, "Incorrect string count; rc=%i\n", rc); | ||
409 | rc = of_property_read_string_array(np, "unterminated-string", strings, 4); | ||
410 | selftest(rc == -EILSEQ, "unterminated string; rc=%i\n", rc); | ||
411 | /* -- An incorrectly formed string should cause a failure */ | ||
412 | rc = of_property_read_string_array(np, "unterminated-string-list", strings, 4); | ||
413 | selftest(rc == -EILSEQ, "unterminated string array; rc=%i\n", rc); | ||
414 | /* -- parsing the correctly formed strings should still work: */ | ||
415 | strings[2] = NULL; | ||
416 | rc = of_property_read_string_array(np, "unterminated-string-list", strings, 2); | ||
417 | selftest(rc == 2 && strings[2] == NULL, "of_property_read_string_array() failure; rc=%i\n", rc); | ||
418 | strings[1] = NULL; | ||
419 | rc = of_property_read_string_array(np, "phandle-list-names", strings, 1); | ||
420 | selftest(rc == 1 && strings[1] == NULL, "Overwrote end of string array; rc=%i, str='%s'\n", rc, strings[1]); | ||
367 | } | 421 | } |
368 | 422 | ||
369 | #define propcmp(p1, p2) (((p1)->length == (p2)->length) && \ | 423 | #define propcmp(p1, p2) (((p1)->length == (p2)->length) && \ |
@@ -881,7 +935,7 @@ static int __init of_selftest(void) | |||
881 | of_selftest_find_node_by_name(); | 935 | of_selftest_find_node_by_name(); |
882 | of_selftest_dynamic(); | 936 | of_selftest_dynamic(); |
883 | of_selftest_parse_phandle_with_args(); | 937 | of_selftest_parse_phandle_with_args(); |
884 | of_selftest_property_match_string(); | 938 | of_selftest_property_string(); |
885 | of_selftest_property_copy(); | 939 | of_selftest_property_copy(); |
886 | of_selftest_changeset(); | 940 | of_selftest_changeset(); |
887 | of_selftest_parse_interrupts(); | 941 | of_selftest_parse_interrupts(); |
diff --git a/drivers/of/testcase-data/tests-phandle.dtsi b/drivers/of/testcase-data/tests-phandle.dtsi index ce0fe083d406..5b1527e8a7fb 100644 --- a/drivers/of/testcase-data/tests-phandle.dtsi +++ b/drivers/of/testcase-data/tests-phandle.dtsi | |||
@@ -39,7 +39,9 @@ | |||
39 | phandle-list-bad-args = <&provider2 1 0>, | 39 | phandle-list-bad-args = <&provider2 1 0>, |
40 | <&provider3 0>; | 40 | <&provider3 0>; |
41 | empty-property; | 41 | empty-property; |
42 | string-property = "foobar"; | ||
42 | unterminated-string = [40 41 42 43]; | 43 | unterminated-string = [40 41 42 43]; |
44 | unterminated-string-list = "first", "second", [40 41 42 43]; | ||
43 | }; | 45 | }; |
44 | }; | 46 | }; |
45 | }; | 47 | }; |
diff --git a/drivers/pci/host/pci-imx6.c b/drivers/pci/host/pci-imx6.c index 233fe8a88264..69202d1eb8fb 100644 --- a/drivers/pci/host/pci-imx6.c +++ b/drivers/pci/host/pci-imx6.c | |||
@@ -275,15 +275,22 @@ static int imx6_pcie_deassert_core_reset(struct pcie_port *pp) | |||
275 | goto err_pcie; | 275 | goto err_pcie; |
276 | } | 276 | } |
277 | 277 | ||
278 | /* allow the clocks to stabilize */ | ||
279 | usleep_range(200, 500); | ||
280 | |||
281 | /* power up core phy and enable ref clock */ | 278 | /* power up core phy and enable ref clock */ |
282 | regmap_update_bits(imx6_pcie->iomuxc_gpr, IOMUXC_GPR1, | 279 | regmap_update_bits(imx6_pcie->iomuxc_gpr, IOMUXC_GPR1, |
283 | IMX6Q_GPR1_PCIE_TEST_PD, 0 << 18); | 280 | IMX6Q_GPR1_PCIE_TEST_PD, 0 << 18); |
281 | /* | ||
282 | * the async reset input need ref clock to sync internally, | ||
283 | * when the ref clock comes after reset, internal synced | ||
284 | * reset time is too short, cannot meet the requirement. | ||
285 | * add one ~10us delay here. | ||
286 | */ | ||
287 | udelay(10); | ||
284 | regmap_update_bits(imx6_pcie->iomuxc_gpr, IOMUXC_GPR1, | 288 | regmap_update_bits(imx6_pcie->iomuxc_gpr, IOMUXC_GPR1, |
285 | IMX6Q_GPR1_PCIE_REF_CLK_EN, 1 << 16); | 289 | IMX6Q_GPR1_PCIE_REF_CLK_EN, 1 << 16); |
286 | 290 | ||
291 | /* allow the clocks to stabilize */ | ||
292 | usleep_range(200, 500); | ||
293 | |||
287 | /* Some boards don't have PCIe reset GPIO. */ | 294 | /* Some boards don't have PCIe reset GPIO. */ |
288 | if (gpio_is_valid(imx6_pcie->reset_gpio)) { | 295 | if (gpio_is_valid(imx6_pcie->reset_gpio)) { |
289 | gpio_set_value(imx6_pcie->reset_gpio, 0); | 296 | gpio_set_value(imx6_pcie->reset_gpio, 0); |
diff --git a/drivers/pci/hotplug/pciehp_core.c b/drivers/pci/hotplug/pciehp_core.c index 3a5e7e28b874..07aa722bb12c 100644 --- a/drivers/pci/hotplug/pciehp_core.c +++ b/drivers/pci/hotplug/pciehp_core.c | |||
@@ -262,13 +262,6 @@ static int pciehp_probe(struct pcie_device *dev) | |||
262 | goto err_out_none; | 262 | goto err_out_none; |
263 | } | 263 | } |
264 | 264 | ||
265 | if (!dev->port->subordinate) { | ||
266 | /* Can happen if we run out of bus numbers during probe */ | ||
267 | dev_err(&dev->device, | ||
268 | "Hotplug bridge without secondary bus, ignoring\n"); | ||
269 | goto err_out_none; | ||
270 | } | ||
271 | |||
272 | ctrl = pcie_init(dev); | 265 | ctrl = pcie_init(dev); |
273 | if (!ctrl) { | 266 | if (!ctrl) { |
274 | dev_err(&dev->device, "Controller initialization failed\n"); | 267 | dev_err(&dev->device, "Controller initialization failed\n"); |
diff --git a/drivers/pci/pci-sysfs.c b/drivers/pci/pci-sysfs.c index 92b6d9ab00e4..2c6643fdc0cf 100644 --- a/drivers/pci/pci-sysfs.c +++ b/drivers/pci/pci-sysfs.c | |||
@@ -185,7 +185,7 @@ static ssize_t modalias_show(struct device *dev, struct device_attribute *attr, | |||
185 | } | 185 | } |
186 | static DEVICE_ATTR_RO(modalias); | 186 | static DEVICE_ATTR_RO(modalias); |
187 | 187 | ||
188 | static ssize_t enabled_store(struct device *dev, struct device_attribute *attr, | 188 | static ssize_t enable_store(struct device *dev, struct device_attribute *attr, |
189 | const char *buf, size_t count) | 189 | const char *buf, size_t count) |
190 | { | 190 | { |
191 | struct pci_dev *pdev = to_pci_dev(dev); | 191 | struct pci_dev *pdev = to_pci_dev(dev); |
@@ -210,7 +210,7 @@ static ssize_t enabled_store(struct device *dev, struct device_attribute *attr, | |||
210 | return result < 0 ? result : count; | 210 | return result < 0 ? result : count; |
211 | } | 211 | } |
212 | 212 | ||
213 | static ssize_t enabled_show(struct device *dev, struct device_attribute *attr, | 213 | static ssize_t enable_show(struct device *dev, struct device_attribute *attr, |
214 | char *buf) | 214 | char *buf) |
215 | { | 215 | { |
216 | struct pci_dev *pdev; | 216 | struct pci_dev *pdev; |
@@ -218,7 +218,7 @@ static ssize_t enabled_show(struct device *dev, struct device_attribute *attr, | |||
218 | pdev = to_pci_dev(dev); | 218 | pdev = to_pci_dev(dev); |
219 | return sprintf(buf, "%u\n", atomic_read(&pdev->enable_cnt)); | 219 | return sprintf(buf, "%u\n", atomic_read(&pdev->enable_cnt)); |
220 | } | 220 | } |
221 | static DEVICE_ATTR_RW(enabled); | 221 | static DEVICE_ATTR_RW(enable); |
222 | 222 | ||
223 | #ifdef CONFIG_NUMA | 223 | #ifdef CONFIG_NUMA |
224 | static ssize_t numa_node_show(struct device *dev, struct device_attribute *attr, | 224 | static ssize_t numa_node_show(struct device *dev, struct device_attribute *attr, |
@@ -563,7 +563,7 @@ static struct attribute *pci_dev_attrs[] = { | |||
563 | #endif | 563 | #endif |
564 | &dev_attr_dma_mask_bits.attr, | 564 | &dev_attr_dma_mask_bits.attr, |
565 | &dev_attr_consistent_dma_mask_bits.attr, | 565 | &dev_attr_consistent_dma_mask_bits.attr, |
566 | &dev_attr_enabled.attr, | 566 | &dev_attr_enable.attr, |
567 | &dev_attr_broken_parity_status.attr, | 567 | &dev_attr_broken_parity_status.attr, |
568 | &dev_attr_msi_bus.attr, | 568 | &dev_attr_msi_bus.attr, |
569 | #if defined(CONFIG_PM_RUNTIME) && defined(CONFIG_ACPI) | 569 | #if defined(CONFIG_PM_RUNTIME) && defined(CONFIG_ACPI) |
diff --git a/drivers/phy/phy-omap-usb2.c b/drivers/phy/phy-omap-usb2.c index 8c842980834a..f091576b6449 100644 --- a/drivers/phy/phy-omap-usb2.c +++ b/drivers/phy/phy-omap-usb2.c | |||
@@ -258,14 +258,16 @@ static int omap_usb2_probe(struct platform_device *pdev) | |||
258 | otg->phy = &phy->phy; | 258 | otg->phy = &phy->phy; |
259 | 259 | ||
260 | platform_set_drvdata(pdev, phy); | 260 | platform_set_drvdata(pdev, phy); |
261 | pm_runtime_enable(phy->dev); | ||
261 | 262 | ||
262 | generic_phy = devm_phy_create(phy->dev, NULL, &ops, NULL); | 263 | generic_phy = devm_phy_create(phy->dev, NULL, &ops, NULL); |
263 | if (IS_ERR(generic_phy)) | 264 | if (IS_ERR(generic_phy)) { |
265 | pm_runtime_disable(phy->dev); | ||
264 | return PTR_ERR(generic_phy); | 266 | return PTR_ERR(generic_phy); |
267 | } | ||
265 | 268 | ||
266 | phy_set_drvdata(generic_phy, phy); | 269 | phy_set_drvdata(generic_phy, phy); |
267 | 270 | ||
268 | pm_runtime_enable(phy->dev); | ||
269 | phy_provider = devm_of_phy_provider_register(phy->dev, | 271 | phy_provider = devm_of_phy_provider_register(phy->dev, |
270 | of_phy_simple_xlate); | 272 | of_phy_simple_xlate); |
271 | if (IS_ERR(phy_provider)) { | 273 | if (IS_ERR(phy_provider)) { |
diff --git a/drivers/pinctrl/pinctrl-baytrail.c b/drivers/pinctrl/pinctrl-baytrail.c index e12e5b07f6d7..9dc38140194b 100644 --- a/drivers/pinctrl/pinctrl-baytrail.c +++ b/drivers/pinctrl/pinctrl-baytrail.c | |||
@@ -227,10 +227,14 @@ static int byt_irq_type(struct irq_data *d, unsigned type) | |||
227 | spin_lock_irqsave(&vg->lock, flags); | 227 | spin_lock_irqsave(&vg->lock, flags); |
228 | value = readl(reg); | 228 | value = readl(reg); |
229 | 229 | ||
230 | WARN(value & BYT_DIRECT_IRQ_EN, | ||
231 | "Bad pad config for io mode, force direct_irq_en bit clearing"); | ||
232 | |||
230 | /* For level trigges the BYT_TRIG_POS and BYT_TRIG_NEG bits | 233 | /* For level trigges the BYT_TRIG_POS and BYT_TRIG_NEG bits |
231 | * are used to indicate high and low level triggering | 234 | * are used to indicate high and low level triggering |
232 | */ | 235 | */ |
233 | value &= ~(BYT_TRIG_POS | BYT_TRIG_NEG | BYT_TRIG_LVL); | 236 | value &= ~(BYT_DIRECT_IRQ_EN | BYT_TRIG_POS | BYT_TRIG_NEG | |
237 | BYT_TRIG_LVL); | ||
234 | 238 | ||
235 | switch (type) { | 239 | switch (type) { |
236 | case IRQ_TYPE_LEVEL_HIGH: | 240 | case IRQ_TYPE_LEVEL_HIGH: |
@@ -318,7 +322,7 @@ static int byt_gpio_direction_output(struct gpio_chip *chip, | |||
318 | "Potential Error: Setting GPIO with direct_irq_en to output"); | 322 | "Potential Error: Setting GPIO with direct_irq_en to output"); |
319 | 323 | ||
320 | reg_val = readl(reg) | BYT_DIR_MASK; | 324 | reg_val = readl(reg) | BYT_DIR_MASK; |
321 | reg_val &= ~BYT_OUTPUT_EN; | 325 | reg_val &= ~(BYT_OUTPUT_EN | BYT_INPUT_EN); |
322 | 326 | ||
323 | if (value) | 327 | if (value) |
324 | writel(reg_val | BYT_LEVEL, reg); | 328 | writel(reg_val | BYT_LEVEL, reg); |
diff --git a/drivers/platform/x86/acer-wmi.c b/drivers/platform/x86/acer-wmi.c index 96a0b75c52c9..26c4fd1394da 100644 --- a/drivers/platform/x86/acer-wmi.c +++ b/drivers/platform/x86/acer-wmi.c | |||
@@ -579,6 +579,17 @@ static const struct dmi_system_id video_vendor_dmi_table[] __initconst = { | |||
579 | DMI_MATCH(DMI_PRODUCT_NAME, "Aspire 5741"), | 579 | DMI_MATCH(DMI_PRODUCT_NAME, "Aspire 5741"), |
580 | }, | 580 | }, |
581 | }, | 581 | }, |
582 | { | ||
583 | /* | ||
584 | * Note no video_set_backlight_video_vendor, we must use the | ||
585 | * acer interface, as there is no native backlight interface. | ||
586 | */ | ||
587 | .ident = "Acer KAV80", | ||
588 | .matches = { | ||
589 | DMI_MATCH(DMI_SYS_VENDOR, "Acer"), | ||
590 | DMI_MATCH(DMI_PRODUCT_NAME, "KAV80"), | ||
591 | }, | ||
592 | }, | ||
582 | {} | 593 | {} |
583 | }; | 594 | }; |
584 | 595 | ||
diff --git a/drivers/platform/x86/asus-nb-wmi.c b/drivers/platform/x86/asus-nb-wmi.c index 3a4951f46065..c1a6cd66af42 100644 --- a/drivers/platform/x86/asus-nb-wmi.c +++ b/drivers/platform/x86/asus-nb-wmi.c | |||
@@ -182,6 +182,15 @@ static const struct dmi_system_id asus_quirks[] = { | |||
182 | }, | 182 | }, |
183 | { | 183 | { |
184 | .callback = dmi_matched, | 184 | .callback = dmi_matched, |
185 | .ident = "ASUSTeK COMPUTER INC. X550VB", | ||
186 | .matches = { | ||
187 | DMI_MATCH(DMI_SYS_VENDOR, "ASUSTeK COMPUTER INC."), | ||
188 | DMI_MATCH(DMI_PRODUCT_NAME, "X550VB"), | ||
189 | }, | ||
190 | .driver_data = &quirk_asus_wapf4, | ||
191 | }, | ||
192 | { | ||
193 | .callback = dmi_matched, | ||
185 | .ident = "ASUSTeK COMPUTER INC. X55A", | 194 | .ident = "ASUSTeK COMPUTER INC. X55A", |
186 | .matches = { | 195 | .matches = { |
187 | DMI_MATCH(DMI_SYS_VENDOR, "ASUSTeK COMPUTER INC."), | 196 | DMI_MATCH(DMI_SYS_VENDOR, "ASUSTeK COMPUTER INC."), |
diff --git a/drivers/platform/x86/ideapad-laptop.c b/drivers/platform/x86/ideapad-laptop.c index 02152de135b5..ed494f37c40f 100644 --- a/drivers/platform/x86/ideapad-laptop.c +++ b/drivers/platform/x86/ideapad-laptop.c | |||
@@ -837,6 +837,13 @@ static const struct dmi_system_id no_hw_rfkill_list[] = { | |||
837 | DMI_MATCH(DMI_PRODUCT_VERSION, "Lenovo Yoga 2"), | 837 | DMI_MATCH(DMI_PRODUCT_VERSION, "Lenovo Yoga 2"), |
838 | }, | 838 | }, |
839 | }, | 839 | }, |
840 | { | ||
841 | .ident = "Lenovo Yoga 3 Pro 1370", | ||
842 | .matches = { | ||
843 | DMI_MATCH(DMI_SYS_VENDOR, "LENOVO"), | ||
844 | DMI_MATCH(DMI_PRODUCT_VERSION, "Lenovo YOGA 3 Pro-1370"), | ||
845 | }, | ||
846 | }, | ||
840 | {} | 847 | {} |
841 | }; | 848 | }; |
842 | 849 | ||
diff --git a/drivers/platform/x86/samsung-laptop.c b/drivers/platform/x86/samsung-laptop.c index 5a5966512277..ff765d8e1a09 100644 --- a/drivers/platform/x86/samsung-laptop.c +++ b/drivers/platform/x86/samsung-laptop.c | |||
@@ -1561,6 +1561,16 @@ static struct dmi_system_id __initdata samsung_dmi_table[] = { | |||
1561 | }, | 1561 | }, |
1562 | { | 1562 | { |
1563 | .callback = samsung_dmi_matched, | 1563 | .callback = samsung_dmi_matched, |
1564 | .ident = "NC210", | ||
1565 | .matches = { | ||
1566 | DMI_MATCH(DMI_SYS_VENDOR, "SAMSUNG ELECTRONICS CO., LTD."), | ||
1567 | DMI_MATCH(DMI_PRODUCT_NAME, "NC210/NC110"), | ||
1568 | DMI_MATCH(DMI_BOARD_NAME, "NC210/NC110"), | ||
1569 | }, | ||
1570 | .driver_data = &samsung_broken_acpi_video, | ||
1571 | }, | ||
1572 | { | ||
1573 | .callback = samsung_dmi_matched, | ||
1564 | .ident = "730U3E/740U3E", | 1574 | .ident = "730U3E/740U3E", |
1565 | .matches = { | 1575 | .matches = { |
1566 | DMI_MATCH(DMI_SYS_VENDOR, "SAMSUNG ELECTRONICS CO., LTD."), | 1576 | DMI_MATCH(DMI_SYS_VENDOR, "SAMSUNG ELECTRONICS CO., LTD."), |
diff --git a/drivers/platform/x86/toshiba_acpi.c b/drivers/platform/x86/toshiba_acpi.c index ef3a1904e92f..ab6151f05420 100644 --- a/drivers/platform/x86/toshiba_acpi.c +++ b/drivers/platform/x86/toshiba_acpi.c | |||
@@ -240,6 +240,12 @@ static const struct dmi_system_id toshiba_alt_keymap_dmi[] = { | |||
240 | DMI_MATCH(DMI_PRODUCT_NAME, "Qosmio X75-A"), | 240 | DMI_MATCH(DMI_PRODUCT_NAME, "Qosmio X75-A"), |
241 | }, | 241 | }, |
242 | }, | 242 | }, |
243 | { | ||
244 | .matches = { | ||
245 | DMI_MATCH(DMI_SYS_VENDOR, "TOSHIBA"), | ||
246 | DMI_MATCH(DMI_PRODUCT_NAME, "TECRA A50-A"), | ||
247 | }, | ||
248 | }, | ||
243 | {} | 249 | {} |
244 | }; | 250 | }; |
245 | 251 | ||
diff --git a/drivers/regulator/max1586.c b/drivers/regulator/max1586.c index 86db310d5304..d2a8c64cae42 100644 --- a/drivers/regulator/max1586.c +++ b/drivers/regulator/max1586.c | |||
@@ -163,7 +163,7 @@ static int of_get_max1586_platform_data(struct device *dev, | |||
163 | struct max1586_platform_data *pdata) | 163 | struct max1586_platform_data *pdata) |
164 | { | 164 | { |
165 | struct max1586_subdev_data *sub; | 165 | struct max1586_subdev_data *sub; |
166 | struct of_regulator_match rmatch[ARRAY_SIZE(max1586_reg)]; | 166 | struct of_regulator_match rmatch[ARRAY_SIZE(max1586_reg)] = { }; |
167 | struct device_node *np = dev->of_node; | 167 | struct device_node *np = dev->of_node; |
168 | int i, matched; | 168 | int i, matched; |
169 | 169 | ||
diff --git a/drivers/regulator/max77686.c b/drivers/regulator/max77686.c index ef1af2debbd2..f69320e1738f 100644 --- a/drivers/regulator/max77686.c +++ b/drivers/regulator/max77686.c | |||
@@ -395,7 +395,7 @@ static int max77686_pmic_dt_parse_pdata(struct platform_device *pdev, | |||
395 | struct max77686_dev *iodev = dev_get_drvdata(pdev->dev.parent); | 395 | struct max77686_dev *iodev = dev_get_drvdata(pdev->dev.parent); |
396 | struct device_node *pmic_np, *regulators_np; | 396 | struct device_node *pmic_np, *regulators_np; |
397 | struct max77686_regulator_data *rdata; | 397 | struct max77686_regulator_data *rdata; |
398 | struct of_regulator_match rmatch; | 398 | struct of_regulator_match rmatch = { }; |
399 | unsigned int i; | 399 | unsigned int i; |
400 | 400 | ||
401 | pmic_np = iodev->dev->of_node; | 401 | pmic_np = iodev->dev->of_node; |
diff --git a/drivers/regulator/max77693.c b/drivers/regulator/max77693.c index c67ff05fc1dd..d158f71fa128 100644 --- a/drivers/regulator/max77693.c +++ b/drivers/regulator/max77693.c | |||
@@ -227,7 +227,7 @@ static int max77693_pmic_probe(struct platform_device *pdev) | |||
227 | struct max77693_dev *iodev = dev_get_drvdata(pdev->dev.parent); | 227 | struct max77693_dev *iodev = dev_get_drvdata(pdev->dev.parent); |
228 | struct max77693_regulator_data *rdata = NULL; | 228 | struct max77693_regulator_data *rdata = NULL; |
229 | int num_rdata, i; | 229 | int num_rdata, i; |
230 | struct regulator_config config; | 230 | struct regulator_config config = { }; |
231 | 231 | ||
232 | num_rdata = max77693_pmic_init_rdata(&pdev->dev, &rdata); | 232 | num_rdata = max77693_pmic_init_rdata(&pdev->dev, &rdata); |
233 | if (!rdata || num_rdata <= 0) { | 233 | if (!rdata || num_rdata <= 0) { |
diff --git a/drivers/regulator/max77802.c b/drivers/regulator/max77802.c index d89792b084e9..45fa240fe243 100644 --- a/drivers/regulator/max77802.c +++ b/drivers/regulator/max77802.c | |||
@@ -454,7 +454,7 @@ static int max77802_pmic_dt_parse_pdata(struct platform_device *pdev, | |||
454 | struct max77686_dev *iodev = dev_get_drvdata(pdev->dev.parent); | 454 | struct max77686_dev *iodev = dev_get_drvdata(pdev->dev.parent); |
455 | struct device_node *pmic_np, *regulators_np; | 455 | struct device_node *pmic_np, *regulators_np; |
456 | struct max77686_regulator_data *rdata; | 456 | struct max77686_regulator_data *rdata; |
457 | struct of_regulator_match rmatch; | 457 | struct of_regulator_match rmatch = { }; |
458 | unsigned int i; | 458 | unsigned int i; |
459 | 459 | ||
460 | pmic_np = iodev->dev->of_node; | 460 | pmic_np = iodev->dev->of_node; |
diff --git a/drivers/regulator/max8660.c b/drivers/regulator/max8660.c index 2fc411188794..7eee2ca18541 100644 --- a/drivers/regulator/max8660.c +++ b/drivers/regulator/max8660.c | |||
@@ -335,7 +335,7 @@ static int max8660_pdata_from_dt(struct device *dev, | |||
335 | int matched, i; | 335 | int matched, i; |
336 | struct device_node *np; | 336 | struct device_node *np; |
337 | struct max8660_subdev_data *sub; | 337 | struct max8660_subdev_data *sub; |
338 | struct of_regulator_match rmatch[ARRAY_SIZE(max8660_reg)]; | 338 | struct of_regulator_match rmatch[ARRAY_SIZE(max8660_reg)] = { }; |
339 | 339 | ||
340 | np = of_get_child_by_name(dev->of_node, "regulators"); | 340 | np = of_get_child_by_name(dev->of_node, "regulators"); |
341 | if (!np) { | 341 | if (!np) { |
diff --git a/drivers/regulator/of_regulator.c b/drivers/regulator/of_regulator.c index 7a51814abdc5..5a1d4afa4776 100644 --- a/drivers/regulator/of_regulator.c +++ b/drivers/regulator/of_regulator.c | |||
@@ -211,7 +211,8 @@ struct regulator_init_data *regulator_of_get_init_data(struct device *dev, | |||
211 | search = dev->of_node; | 211 | search = dev->of_node; |
212 | 212 | ||
213 | if (!search) { | 213 | if (!search) { |
214 | dev_err(dev, "Failed to find regulator container node\n"); | 214 | dev_dbg(dev, "Failed to find regulator container node '%s'\n", |
215 | desc->regulators_node); | ||
215 | return NULL; | 216 | return NULL; |
216 | } | 217 | } |
217 | 218 | ||
diff --git a/drivers/regulator/rk808-regulator.c b/drivers/regulator/rk808-regulator.c index e305416d7697..196a5c8838c4 100644 --- a/drivers/regulator/rk808-regulator.c +++ b/drivers/regulator/rk808-regulator.c | |||
@@ -44,7 +44,7 @@ static const int rk808_buck_config_regs[] = { | |||
44 | }; | 44 | }; |
45 | 45 | ||
46 | static const struct regulator_linear_range rk808_buck_voltage_ranges[] = { | 46 | static const struct regulator_linear_range rk808_buck_voltage_ranges[] = { |
47 | REGULATOR_LINEAR_RANGE(700000, 0, 63, 12500), | 47 | REGULATOR_LINEAR_RANGE(712500, 0, 63, 12500), |
48 | }; | 48 | }; |
49 | 49 | ||
50 | static const struct regulator_linear_range rk808_buck4_voltage_ranges[] = { | 50 | static const struct regulator_linear_range rk808_buck4_voltage_ranges[] = { |
diff --git a/drivers/regulator/s2mpa01.c b/drivers/regulator/s2mpa01.c index 4acefa6b462e..7633b9bfbe6e 100644 --- a/drivers/regulator/s2mpa01.c +++ b/drivers/regulator/s2mpa01.c | |||
@@ -341,7 +341,7 @@ static int s2mpa01_pmic_probe(struct platform_device *pdev) | |||
341 | { | 341 | { |
342 | struct sec_pmic_dev *iodev = dev_get_drvdata(pdev->dev.parent); | 342 | struct sec_pmic_dev *iodev = dev_get_drvdata(pdev->dev.parent); |
343 | struct sec_platform_data *pdata = dev_get_platdata(iodev->dev); | 343 | struct sec_platform_data *pdata = dev_get_platdata(iodev->dev); |
344 | struct of_regulator_match rdata[S2MPA01_REGULATOR_MAX]; | 344 | struct of_regulator_match rdata[S2MPA01_REGULATOR_MAX] = { }; |
345 | struct device_node *reg_np = NULL; | 345 | struct device_node *reg_np = NULL; |
346 | struct regulator_config config = { }; | 346 | struct regulator_config config = { }; |
347 | struct s2mpa01_info *s2mpa01; | 347 | struct s2mpa01_info *s2mpa01; |
diff --git a/drivers/rtc/Kconfig b/drivers/rtc/Kconfig index 94ae1798d48a..6dd12ddbabc6 100644 --- a/drivers/rtc/Kconfig +++ b/drivers/rtc/Kconfig | |||
@@ -1320,7 +1320,7 @@ config RTC_DRV_LPC32XX | |||
1320 | 1320 | ||
1321 | config RTC_DRV_PM8XXX | 1321 | config RTC_DRV_PM8XXX |
1322 | tristate "Qualcomm PMIC8XXX RTC" | 1322 | tristate "Qualcomm PMIC8XXX RTC" |
1323 | depends on MFD_PM8XXX | 1323 | depends on MFD_PM8XXX || MFD_SPMI_PMIC |
1324 | help | 1324 | help |
1325 | If you say yes here you get support for the | 1325 | If you say yes here you get support for the |
1326 | Qualcomm PMIC8XXX RTC. | 1326 | Qualcomm PMIC8XXX RTC. |
diff --git a/drivers/rtc/rtc-bq32k.c b/drivers/rtc/rtc-bq32k.c index 314129e66d6e..92679df6d6e2 100644 --- a/drivers/rtc/rtc-bq32k.c +++ b/drivers/rtc/rtc-bq32k.c | |||
@@ -160,7 +160,7 @@ static int trickle_charger_of_init(struct device *dev, struct device_node *node) | |||
160 | dev_err(dev, "bq32k: diode and resistor mismatch\n"); | 160 | dev_err(dev, "bq32k: diode and resistor mismatch\n"); |
161 | return -EINVAL; | 161 | return -EINVAL; |
162 | } | 162 | } |
163 | reg = 0x25; | 163 | reg = 0x45; |
164 | break; | 164 | break; |
165 | 165 | ||
166 | default: | 166 | default: |
diff --git a/drivers/rtc/rtc-pm8xxx.c b/drivers/rtc/rtc-pm8xxx.c index 197699f358c7..5adcf111fc14 100644 --- a/drivers/rtc/rtc-pm8xxx.c +++ b/drivers/rtc/rtc-pm8xxx.c | |||
@@ -27,21 +27,36 @@ | |||
27 | 27 | ||
28 | /* RTC_CTRL register bit fields */ | 28 | /* RTC_CTRL register bit fields */ |
29 | #define PM8xxx_RTC_ENABLE BIT(7) | 29 | #define PM8xxx_RTC_ENABLE BIT(7) |
30 | #define PM8xxx_RTC_ALARM_ENABLE BIT(1) | ||
31 | #define PM8xxx_RTC_ALARM_CLEAR BIT(0) | 30 | #define PM8xxx_RTC_ALARM_CLEAR BIT(0) |
32 | 31 | ||
33 | #define NUM_8_BIT_RTC_REGS 0x4 | 32 | #define NUM_8_BIT_RTC_REGS 0x4 |
34 | 33 | ||
35 | /** | 34 | /** |
35 | * struct pm8xxx_rtc_regs - describe RTC registers per PMIC versions | ||
36 | * @ctrl: base address of control register | ||
37 | * @write: base address of write register | ||
38 | * @read: base address of read register | ||
39 | * @alarm_ctrl: base address of alarm control register | ||
40 | * @alarm_ctrl2: base address of alarm control2 register | ||
41 | * @alarm_rw: base address of alarm read-write register | ||
42 | * @alarm_en: alarm enable mask | ||
43 | */ | ||
44 | struct pm8xxx_rtc_regs { | ||
45 | unsigned int ctrl; | ||
46 | unsigned int write; | ||
47 | unsigned int read; | ||
48 | unsigned int alarm_ctrl; | ||
49 | unsigned int alarm_ctrl2; | ||
50 | unsigned int alarm_rw; | ||
51 | unsigned int alarm_en; | ||
52 | }; | ||
53 | |||
54 | /** | ||
36 | * struct pm8xxx_rtc - rtc driver internal structure | 55 | * struct pm8xxx_rtc - rtc driver internal structure |
37 | * @rtc: rtc device for this driver. | 56 | * @rtc: rtc device for this driver. |
38 | * @regmap: regmap used to access RTC registers | 57 | * @regmap: regmap used to access RTC registers |
39 | * @allow_set_time: indicates whether writing to the RTC is allowed | 58 | * @allow_set_time: indicates whether writing to the RTC is allowed |
40 | * @rtc_alarm_irq: rtc alarm irq number. | 59 | * @rtc_alarm_irq: rtc alarm irq number. |
41 | * @rtc_base: address of rtc control register. | ||
42 | * @rtc_read_base: base address of read registers. | ||
43 | * @rtc_write_base: base address of write registers. | ||
44 | * @alarm_rw_base: base address of alarm registers. | ||
45 | * @ctrl_reg: rtc control register. | 60 | * @ctrl_reg: rtc control register. |
46 | * @rtc_dev: device structure. | 61 | * @rtc_dev: device structure. |
47 | * @ctrl_reg_lock: spinlock protecting access to ctrl_reg. | 62 | * @ctrl_reg_lock: spinlock protecting access to ctrl_reg. |
@@ -51,11 +66,7 @@ struct pm8xxx_rtc { | |||
51 | struct regmap *regmap; | 66 | struct regmap *regmap; |
52 | bool allow_set_time; | 67 | bool allow_set_time; |
53 | int rtc_alarm_irq; | 68 | int rtc_alarm_irq; |
54 | int rtc_base; | 69 | const struct pm8xxx_rtc_regs *regs; |
55 | int rtc_read_base; | ||
56 | int rtc_write_base; | ||
57 | int alarm_rw_base; | ||
58 | u8 ctrl_reg; | ||
59 | struct device *rtc_dev; | 70 | struct device *rtc_dev; |
60 | spinlock_t ctrl_reg_lock; | 71 | spinlock_t ctrl_reg_lock; |
61 | }; | 72 | }; |
@@ -71,8 +82,10 @@ static int pm8xxx_rtc_set_time(struct device *dev, struct rtc_time *tm) | |||
71 | { | 82 | { |
72 | int rc, i; | 83 | int rc, i; |
73 | unsigned long secs, irq_flags; | 84 | unsigned long secs, irq_flags; |
74 | u8 value[NUM_8_BIT_RTC_REGS], alarm_enabled = 0, ctrl_reg; | 85 | u8 value[NUM_8_BIT_RTC_REGS], alarm_enabled = 0; |
86 | unsigned int ctrl_reg; | ||
75 | struct pm8xxx_rtc *rtc_dd = dev_get_drvdata(dev); | 87 | struct pm8xxx_rtc *rtc_dd = dev_get_drvdata(dev); |
88 | const struct pm8xxx_rtc_regs *regs = rtc_dd->regs; | ||
76 | 89 | ||
77 | if (!rtc_dd->allow_set_time) | 90 | if (!rtc_dd->allow_set_time) |
78 | return -EACCES; | 91 | return -EACCES; |
@@ -87,30 +100,30 @@ static int pm8xxx_rtc_set_time(struct device *dev, struct rtc_time *tm) | |||
87 | dev_dbg(dev, "Seconds value to be written to RTC = %lu\n", secs); | 100 | dev_dbg(dev, "Seconds value to be written to RTC = %lu\n", secs); |
88 | 101 | ||
89 | spin_lock_irqsave(&rtc_dd->ctrl_reg_lock, irq_flags); | 102 | spin_lock_irqsave(&rtc_dd->ctrl_reg_lock, irq_flags); |
90 | ctrl_reg = rtc_dd->ctrl_reg; | ||
91 | 103 | ||
92 | if (ctrl_reg & PM8xxx_RTC_ALARM_ENABLE) { | 104 | rc = regmap_read(rtc_dd->regmap, regs->ctrl, &ctrl_reg); |
105 | if (rc) | ||
106 | goto rtc_rw_fail; | ||
107 | |||
108 | if (ctrl_reg & regs->alarm_en) { | ||
93 | alarm_enabled = 1; | 109 | alarm_enabled = 1; |
94 | ctrl_reg &= ~PM8xxx_RTC_ALARM_ENABLE; | 110 | ctrl_reg &= ~regs->alarm_en; |
95 | rc = regmap_write(rtc_dd->regmap, rtc_dd->rtc_base, ctrl_reg); | 111 | rc = regmap_write(rtc_dd->regmap, regs->ctrl, ctrl_reg); |
96 | if (rc) { | 112 | if (rc) { |
97 | dev_err(dev, "Write to RTC control register failed\n"); | 113 | dev_err(dev, "Write to RTC control register failed\n"); |
98 | goto rtc_rw_fail; | 114 | goto rtc_rw_fail; |
99 | } | 115 | } |
100 | rtc_dd->ctrl_reg = ctrl_reg; | ||
101 | } else { | ||
102 | spin_unlock_irqrestore(&rtc_dd->ctrl_reg_lock, irq_flags); | ||
103 | } | 116 | } |
104 | 117 | ||
105 | /* Write 0 to Byte[0] */ | 118 | /* Write 0 to Byte[0] */ |
106 | rc = regmap_write(rtc_dd->regmap, rtc_dd->rtc_write_base, 0); | 119 | rc = regmap_write(rtc_dd->regmap, regs->write, 0); |
107 | if (rc) { | 120 | if (rc) { |
108 | dev_err(dev, "Write to RTC write data register failed\n"); | 121 | dev_err(dev, "Write to RTC write data register failed\n"); |
109 | goto rtc_rw_fail; | 122 | goto rtc_rw_fail; |
110 | } | 123 | } |
111 | 124 | ||
112 | /* Write Byte[1], Byte[2], Byte[3] */ | 125 | /* Write Byte[1], Byte[2], Byte[3] */ |
113 | rc = regmap_bulk_write(rtc_dd->regmap, rtc_dd->rtc_write_base + 1, | 126 | rc = regmap_bulk_write(rtc_dd->regmap, regs->write + 1, |
114 | &value[1], sizeof(value) - 1); | 127 | &value[1], sizeof(value) - 1); |
115 | if (rc) { | 128 | if (rc) { |
116 | dev_err(dev, "Write to RTC write data register failed\n"); | 129 | dev_err(dev, "Write to RTC write data register failed\n"); |
@@ -118,25 +131,23 @@ static int pm8xxx_rtc_set_time(struct device *dev, struct rtc_time *tm) | |||
118 | } | 131 | } |
119 | 132 | ||
120 | /* Write Byte[0] */ | 133 | /* Write Byte[0] */ |
121 | rc = regmap_write(rtc_dd->regmap, rtc_dd->rtc_write_base, value[0]); | 134 | rc = regmap_write(rtc_dd->regmap, regs->write, value[0]); |
122 | if (rc) { | 135 | if (rc) { |
123 | dev_err(dev, "Write to RTC write data register failed\n"); | 136 | dev_err(dev, "Write to RTC write data register failed\n"); |
124 | goto rtc_rw_fail; | 137 | goto rtc_rw_fail; |
125 | } | 138 | } |
126 | 139 | ||
127 | if (alarm_enabled) { | 140 | if (alarm_enabled) { |
128 | ctrl_reg |= PM8xxx_RTC_ALARM_ENABLE; | 141 | ctrl_reg |= regs->alarm_en; |
129 | rc = regmap_write(rtc_dd->regmap, rtc_dd->rtc_base, ctrl_reg); | 142 | rc = regmap_write(rtc_dd->regmap, regs->ctrl, ctrl_reg); |
130 | if (rc) { | 143 | if (rc) { |
131 | dev_err(dev, "Write to RTC control register failed\n"); | 144 | dev_err(dev, "Write to RTC control register failed\n"); |
132 | goto rtc_rw_fail; | 145 | goto rtc_rw_fail; |
133 | } | 146 | } |
134 | rtc_dd->ctrl_reg = ctrl_reg; | ||
135 | } | 147 | } |
136 | 148 | ||
137 | rtc_rw_fail: | 149 | rtc_rw_fail: |
138 | if (alarm_enabled) | 150 | spin_unlock_irqrestore(&rtc_dd->ctrl_reg_lock, irq_flags); |
139 | spin_unlock_irqrestore(&rtc_dd->ctrl_reg_lock, irq_flags); | ||
140 | 151 | ||
141 | return rc; | 152 | return rc; |
142 | } | 153 | } |
@@ -148,9 +159,9 @@ static int pm8xxx_rtc_read_time(struct device *dev, struct rtc_time *tm) | |||
148 | unsigned long secs; | 159 | unsigned long secs; |
149 | unsigned int reg; | 160 | unsigned int reg; |
150 | struct pm8xxx_rtc *rtc_dd = dev_get_drvdata(dev); | 161 | struct pm8xxx_rtc *rtc_dd = dev_get_drvdata(dev); |
162 | const struct pm8xxx_rtc_regs *regs = rtc_dd->regs; | ||
151 | 163 | ||
152 | rc = regmap_bulk_read(rtc_dd->regmap, rtc_dd->rtc_read_base, | 164 | rc = regmap_bulk_read(rtc_dd->regmap, regs->read, value, sizeof(value)); |
153 | value, sizeof(value)); | ||
154 | if (rc) { | 165 | if (rc) { |
155 | dev_err(dev, "RTC read data register failed\n"); | 166 | dev_err(dev, "RTC read data register failed\n"); |
156 | return rc; | 167 | return rc; |
@@ -160,14 +171,14 @@ static int pm8xxx_rtc_read_time(struct device *dev, struct rtc_time *tm) | |||
160 | * Read the LSB again and check if there has been a carry over. | 171 | * Read the LSB again and check if there has been a carry over. |
161 | * If there is, redo the read operation. | 172 | * If there is, redo the read operation. |
162 | */ | 173 | */ |
163 | rc = regmap_read(rtc_dd->regmap, rtc_dd->rtc_read_base, ®); | 174 | rc = regmap_read(rtc_dd->regmap, regs->read, ®); |
164 | if (rc < 0) { | 175 | if (rc < 0) { |
165 | dev_err(dev, "RTC read data register failed\n"); | 176 | dev_err(dev, "RTC read data register failed\n"); |
166 | return rc; | 177 | return rc; |
167 | } | 178 | } |
168 | 179 | ||
169 | if (unlikely(reg < value[0])) { | 180 | if (unlikely(reg < value[0])) { |
170 | rc = regmap_bulk_read(rtc_dd->regmap, rtc_dd->rtc_read_base, | 181 | rc = regmap_bulk_read(rtc_dd->regmap, regs->read, |
171 | value, sizeof(value)); | 182 | value, sizeof(value)); |
172 | if (rc) { | 183 | if (rc) { |
173 | dev_err(dev, "RTC read data register failed\n"); | 184 | dev_err(dev, "RTC read data register failed\n"); |
@@ -195,9 +206,11 @@ static int pm8xxx_rtc_read_time(struct device *dev, struct rtc_time *tm) | |||
195 | static int pm8xxx_rtc_set_alarm(struct device *dev, struct rtc_wkalrm *alarm) | 206 | static int pm8xxx_rtc_set_alarm(struct device *dev, struct rtc_wkalrm *alarm) |
196 | { | 207 | { |
197 | int rc, i; | 208 | int rc, i; |
198 | u8 value[NUM_8_BIT_RTC_REGS], ctrl_reg; | 209 | u8 value[NUM_8_BIT_RTC_REGS]; |
210 | unsigned int ctrl_reg; | ||
199 | unsigned long secs, irq_flags; | 211 | unsigned long secs, irq_flags; |
200 | struct pm8xxx_rtc *rtc_dd = dev_get_drvdata(dev); | 212 | struct pm8xxx_rtc *rtc_dd = dev_get_drvdata(dev); |
213 | const struct pm8xxx_rtc_regs *regs = rtc_dd->regs; | ||
201 | 214 | ||
202 | rtc_tm_to_time(&alarm->time, &secs); | 215 | rtc_tm_to_time(&alarm->time, &secs); |
203 | 216 | ||
@@ -208,28 +221,28 @@ static int pm8xxx_rtc_set_alarm(struct device *dev, struct rtc_wkalrm *alarm) | |||
208 | 221 | ||
209 | spin_lock_irqsave(&rtc_dd->ctrl_reg_lock, irq_flags); | 222 | spin_lock_irqsave(&rtc_dd->ctrl_reg_lock, irq_flags); |
210 | 223 | ||
211 | rc = regmap_bulk_write(rtc_dd->regmap, rtc_dd->alarm_rw_base, value, | 224 | rc = regmap_bulk_write(rtc_dd->regmap, regs->alarm_rw, value, |
212 | sizeof(value)); | 225 | sizeof(value)); |
213 | if (rc) { | 226 | if (rc) { |
214 | dev_err(dev, "Write to RTC ALARM register failed\n"); | 227 | dev_err(dev, "Write to RTC ALARM register failed\n"); |
215 | goto rtc_rw_fail; | 228 | goto rtc_rw_fail; |
216 | } | 229 | } |
217 | 230 | ||
218 | ctrl_reg = rtc_dd->ctrl_reg; | 231 | rc = regmap_read(rtc_dd->regmap, regs->alarm_ctrl, &ctrl_reg); |
232 | if (rc) | ||
233 | goto rtc_rw_fail; | ||
219 | 234 | ||
220 | if (alarm->enabled) | 235 | if (alarm->enabled) |
221 | ctrl_reg |= PM8xxx_RTC_ALARM_ENABLE; | 236 | ctrl_reg |= regs->alarm_en; |
222 | else | 237 | else |
223 | ctrl_reg &= ~PM8xxx_RTC_ALARM_ENABLE; | 238 | ctrl_reg &= ~regs->alarm_en; |
224 | 239 | ||
225 | rc = regmap_write(rtc_dd->regmap, rtc_dd->rtc_base, ctrl_reg); | 240 | rc = regmap_write(rtc_dd->regmap, regs->alarm_ctrl, ctrl_reg); |
226 | if (rc) { | 241 | if (rc) { |
227 | dev_err(dev, "Write to RTC control register failed\n"); | 242 | dev_err(dev, "Write to RTC alarm control register failed\n"); |
228 | goto rtc_rw_fail; | 243 | goto rtc_rw_fail; |
229 | } | 244 | } |
230 | 245 | ||
231 | rtc_dd->ctrl_reg = ctrl_reg; | ||
232 | |||
233 | dev_dbg(dev, "Alarm Set for h:r:s=%d:%d:%d, d/m/y=%d/%d/%d\n", | 246 | dev_dbg(dev, "Alarm Set for h:r:s=%d:%d:%d, d/m/y=%d/%d/%d\n", |
234 | alarm->time.tm_hour, alarm->time.tm_min, | 247 | alarm->time.tm_hour, alarm->time.tm_min, |
235 | alarm->time.tm_sec, alarm->time.tm_mday, | 248 | alarm->time.tm_sec, alarm->time.tm_mday, |
@@ -245,8 +258,9 @@ static int pm8xxx_rtc_read_alarm(struct device *dev, struct rtc_wkalrm *alarm) | |||
245 | u8 value[NUM_8_BIT_RTC_REGS]; | 258 | u8 value[NUM_8_BIT_RTC_REGS]; |
246 | unsigned long secs; | 259 | unsigned long secs; |
247 | struct pm8xxx_rtc *rtc_dd = dev_get_drvdata(dev); | 260 | struct pm8xxx_rtc *rtc_dd = dev_get_drvdata(dev); |
261 | const struct pm8xxx_rtc_regs *regs = rtc_dd->regs; | ||
248 | 262 | ||
249 | rc = regmap_bulk_read(rtc_dd->regmap, rtc_dd->alarm_rw_base, value, | 263 | rc = regmap_bulk_read(rtc_dd->regmap, regs->alarm_rw, value, |
250 | sizeof(value)); | 264 | sizeof(value)); |
251 | if (rc) { | 265 | if (rc) { |
252 | dev_err(dev, "RTC alarm time read failed\n"); | 266 | dev_err(dev, "RTC alarm time read failed\n"); |
@@ -276,25 +290,26 @@ static int pm8xxx_rtc_alarm_irq_enable(struct device *dev, unsigned int enable) | |||
276 | int rc; | 290 | int rc; |
277 | unsigned long irq_flags; | 291 | unsigned long irq_flags; |
278 | struct pm8xxx_rtc *rtc_dd = dev_get_drvdata(dev); | 292 | struct pm8xxx_rtc *rtc_dd = dev_get_drvdata(dev); |
279 | u8 ctrl_reg; | 293 | const struct pm8xxx_rtc_regs *regs = rtc_dd->regs; |
294 | unsigned int ctrl_reg; | ||
280 | 295 | ||
281 | spin_lock_irqsave(&rtc_dd->ctrl_reg_lock, irq_flags); | 296 | spin_lock_irqsave(&rtc_dd->ctrl_reg_lock, irq_flags); |
282 | 297 | ||
283 | ctrl_reg = rtc_dd->ctrl_reg; | 298 | rc = regmap_read(rtc_dd->regmap, regs->alarm_ctrl, &ctrl_reg); |
299 | if (rc) | ||
300 | goto rtc_rw_fail; | ||
284 | 301 | ||
285 | if (enable) | 302 | if (enable) |
286 | ctrl_reg |= PM8xxx_RTC_ALARM_ENABLE; | 303 | ctrl_reg |= regs->alarm_en; |
287 | else | 304 | else |
288 | ctrl_reg &= ~PM8xxx_RTC_ALARM_ENABLE; | 305 | ctrl_reg &= ~regs->alarm_en; |
289 | 306 | ||
290 | rc = regmap_write(rtc_dd->regmap, rtc_dd->rtc_base, ctrl_reg); | 307 | rc = regmap_write(rtc_dd->regmap, regs->alarm_ctrl, ctrl_reg); |
291 | if (rc) { | 308 | if (rc) { |
292 | dev_err(dev, "Write to RTC control register failed\n"); | 309 | dev_err(dev, "Write to RTC control register failed\n"); |
293 | goto rtc_rw_fail; | 310 | goto rtc_rw_fail; |
294 | } | 311 | } |
295 | 312 | ||
296 | rtc_dd->ctrl_reg = ctrl_reg; | ||
297 | |||
298 | rtc_rw_fail: | 313 | rtc_rw_fail: |
299 | spin_unlock_irqrestore(&rtc_dd->ctrl_reg_lock, irq_flags); | 314 | spin_unlock_irqrestore(&rtc_dd->ctrl_reg_lock, irq_flags); |
300 | return rc; | 315 | return rc; |
@@ -311,6 +326,7 @@ static const struct rtc_class_ops pm8xxx_rtc_ops = { | |||
311 | static irqreturn_t pm8xxx_alarm_trigger(int irq, void *dev_id) | 326 | static irqreturn_t pm8xxx_alarm_trigger(int irq, void *dev_id) |
312 | { | 327 | { |
313 | struct pm8xxx_rtc *rtc_dd = dev_id; | 328 | struct pm8xxx_rtc *rtc_dd = dev_id; |
329 | const struct pm8xxx_rtc_regs *regs = rtc_dd->regs; | ||
314 | unsigned int ctrl_reg; | 330 | unsigned int ctrl_reg; |
315 | int rc; | 331 | int rc; |
316 | unsigned long irq_flags; | 332 | unsigned long irq_flags; |
@@ -320,48 +336,100 @@ static irqreturn_t pm8xxx_alarm_trigger(int irq, void *dev_id) | |||
320 | spin_lock_irqsave(&rtc_dd->ctrl_reg_lock, irq_flags); | 336 | spin_lock_irqsave(&rtc_dd->ctrl_reg_lock, irq_flags); |
321 | 337 | ||
322 | /* Clear the alarm enable bit */ | 338 | /* Clear the alarm enable bit */ |
323 | ctrl_reg = rtc_dd->ctrl_reg; | 339 | rc = regmap_read(rtc_dd->regmap, regs->alarm_ctrl, &ctrl_reg); |
324 | ctrl_reg &= ~PM8xxx_RTC_ALARM_ENABLE; | 340 | if (rc) { |
341 | spin_unlock_irqrestore(&rtc_dd->ctrl_reg_lock, irq_flags); | ||
342 | goto rtc_alarm_handled; | ||
343 | } | ||
344 | |||
345 | ctrl_reg &= ~regs->alarm_en; | ||
325 | 346 | ||
326 | rc = regmap_write(rtc_dd->regmap, rtc_dd->rtc_base, ctrl_reg); | 347 | rc = regmap_write(rtc_dd->regmap, regs->alarm_ctrl, ctrl_reg); |
327 | if (rc) { | 348 | if (rc) { |
328 | spin_unlock_irqrestore(&rtc_dd->ctrl_reg_lock, irq_flags); | 349 | spin_unlock_irqrestore(&rtc_dd->ctrl_reg_lock, irq_flags); |
329 | dev_err(rtc_dd->rtc_dev, | 350 | dev_err(rtc_dd->rtc_dev, |
330 | "Write to RTC control register failed\n"); | 351 | "Write to alarm control register failed\n"); |
331 | goto rtc_alarm_handled; | 352 | goto rtc_alarm_handled; |
332 | } | 353 | } |
333 | 354 | ||
334 | rtc_dd->ctrl_reg = ctrl_reg; | ||
335 | spin_unlock_irqrestore(&rtc_dd->ctrl_reg_lock, irq_flags); | 355 | spin_unlock_irqrestore(&rtc_dd->ctrl_reg_lock, irq_flags); |
336 | 356 | ||
337 | /* Clear RTC alarm register */ | 357 | /* Clear RTC alarm register */ |
338 | rc = regmap_read(rtc_dd->regmap, | 358 | rc = regmap_read(rtc_dd->regmap, regs->alarm_ctrl2, &ctrl_reg); |
339 | rtc_dd->rtc_base + PM8XXX_ALARM_CTRL_OFFSET, | ||
340 | &ctrl_reg); | ||
341 | if (rc) { | 359 | if (rc) { |
342 | dev_err(rtc_dd->rtc_dev, | 360 | dev_err(rtc_dd->rtc_dev, |
343 | "RTC Alarm control register read failed\n"); | 361 | "RTC Alarm control2 register read failed\n"); |
344 | goto rtc_alarm_handled; | 362 | goto rtc_alarm_handled; |
345 | } | 363 | } |
346 | 364 | ||
347 | ctrl_reg &= ~PM8xxx_RTC_ALARM_CLEAR; | 365 | ctrl_reg |= PM8xxx_RTC_ALARM_CLEAR; |
348 | rc = regmap_write(rtc_dd->regmap, | 366 | rc = regmap_write(rtc_dd->regmap, regs->alarm_ctrl2, ctrl_reg); |
349 | rtc_dd->rtc_base + PM8XXX_ALARM_CTRL_OFFSET, | ||
350 | ctrl_reg); | ||
351 | if (rc) | 367 | if (rc) |
352 | dev_err(rtc_dd->rtc_dev, | 368 | dev_err(rtc_dd->rtc_dev, |
353 | "Write to RTC Alarm control register failed\n"); | 369 | "Write to RTC Alarm control2 register failed\n"); |
354 | 370 | ||
355 | rtc_alarm_handled: | 371 | rtc_alarm_handled: |
356 | return IRQ_HANDLED; | 372 | return IRQ_HANDLED; |
357 | } | 373 | } |
358 | 374 | ||
375 | static int pm8xxx_rtc_enable(struct pm8xxx_rtc *rtc_dd) | ||
376 | { | ||
377 | const struct pm8xxx_rtc_regs *regs = rtc_dd->regs; | ||
378 | unsigned int ctrl_reg; | ||
379 | int rc; | ||
380 | |||
381 | /* Check if the RTC is on, else turn it on */ | ||
382 | rc = regmap_read(rtc_dd->regmap, regs->ctrl, &ctrl_reg); | ||
383 | if (rc) | ||
384 | return rc; | ||
385 | |||
386 | if (!(ctrl_reg & PM8xxx_RTC_ENABLE)) { | ||
387 | ctrl_reg |= PM8xxx_RTC_ENABLE; | ||
388 | rc = regmap_write(rtc_dd->regmap, regs->ctrl, ctrl_reg); | ||
389 | if (rc) | ||
390 | return rc; | ||
391 | } | ||
392 | |||
393 | return 0; | ||
394 | } | ||
395 | |||
396 | static const struct pm8xxx_rtc_regs pm8921_regs = { | ||
397 | .ctrl = 0x11d, | ||
398 | .write = 0x11f, | ||
399 | .read = 0x123, | ||
400 | .alarm_rw = 0x127, | ||
401 | .alarm_ctrl = 0x11d, | ||
402 | .alarm_ctrl2 = 0x11e, | ||
403 | .alarm_en = BIT(1), | ||
404 | }; | ||
405 | |||
406 | static const struct pm8xxx_rtc_regs pm8058_regs = { | ||
407 | .ctrl = 0x1e8, | ||
408 | .write = 0x1ea, | ||
409 | .read = 0x1ee, | ||
410 | .alarm_rw = 0x1f2, | ||
411 | .alarm_ctrl = 0x1e8, | ||
412 | .alarm_ctrl2 = 0x1e9, | ||
413 | .alarm_en = BIT(1), | ||
414 | }; | ||
415 | |||
416 | static const struct pm8xxx_rtc_regs pm8941_regs = { | ||
417 | .ctrl = 0x6046, | ||
418 | .write = 0x6040, | ||
419 | .read = 0x6048, | ||
420 | .alarm_rw = 0x6140, | ||
421 | .alarm_ctrl = 0x6146, | ||
422 | .alarm_ctrl2 = 0x6148, | ||
423 | .alarm_en = BIT(7), | ||
424 | }; | ||
425 | |||
359 | /* | 426 | /* |
360 | * Hardcoded RTC bases until IORESOURCE_REG mapping is figured out | 427 | * Hardcoded RTC bases until IORESOURCE_REG mapping is figured out |
361 | */ | 428 | */ |
362 | static const struct of_device_id pm8xxx_id_table[] = { | 429 | static const struct of_device_id pm8xxx_id_table[] = { |
363 | { .compatible = "qcom,pm8921-rtc", .data = (void *) 0x11D }, | 430 | { .compatible = "qcom,pm8921-rtc", .data = &pm8921_regs }, |
364 | { .compatible = "qcom,pm8058-rtc", .data = (void *) 0x1E8 }, | 431 | { .compatible = "qcom,pm8058-rtc", .data = &pm8058_regs }, |
432 | { .compatible = "qcom,pm8941-rtc", .data = &pm8941_regs }, | ||
365 | { }, | 433 | { }, |
366 | }; | 434 | }; |
367 | MODULE_DEVICE_TABLE(of, pm8xxx_id_table); | 435 | MODULE_DEVICE_TABLE(of, pm8xxx_id_table); |
@@ -369,7 +437,6 @@ MODULE_DEVICE_TABLE(of, pm8xxx_id_table); | |||
369 | static int pm8xxx_rtc_probe(struct platform_device *pdev) | 437 | static int pm8xxx_rtc_probe(struct platform_device *pdev) |
370 | { | 438 | { |
371 | int rc; | 439 | int rc; |
372 | unsigned int ctrl_reg; | ||
373 | struct pm8xxx_rtc *rtc_dd; | 440 | struct pm8xxx_rtc *rtc_dd; |
374 | const struct of_device_id *match; | 441 | const struct of_device_id *match; |
375 | 442 | ||
@@ -399,33 +466,12 @@ static int pm8xxx_rtc_probe(struct platform_device *pdev) | |||
399 | rtc_dd->allow_set_time = of_property_read_bool(pdev->dev.of_node, | 466 | rtc_dd->allow_set_time = of_property_read_bool(pdev->dev.of_node, |
400 | "allow-set-time"); | 467 | "allow-set-time"); |
401 | 468 | ||
402 | rtc_dd->rtc_base = (long) match->data; | 469 | rtc_dd->regs = match->data; |
403 | |||
404 | /* Setup RTC register addresses */ | ||
405 | rtc_dd->rtc_write_base = rtc_dd->rtc_base + PM8XXX_RTC_WRITE_OFFSET; | ||
406 | rtc_dd->rtc_read_base = rtc_dd->rtc_base + PM8XXX_RTC_READ_OFFSET; | ||
407 | rtc_dd->alarm_rw_base = rtc_dd->rtc_base + PM8XXX_ALARM_RW_OFFSET; | ||
408 | |||
409 | rtc_dd->rtc_dev = &pdev->dev; | 470 | rtc_dd->rtc_dev = &pdev->dev; |
410 | 471 | ||
411 | /* Check if the RTC is on, else turn it on */ | 472 | rc = pm8xxx_rtc_enable(rtc_dd); |
412 | rc = regmap_read(rtc_dd->regmap, rtc_dd->rtc_base, &ctrl_reg); | 473 | if (rc) |
413 | if (rc) { | ||
414 | dev_err(&pdev->dev, "RTC control register read failed!\n"); | ||
415 | return rc; | 474 | return rc; |
416 | } | ||
417 | |||
418 | if (!(ctrl_reg & PM8xxx_RTC_ENABLE)) { | ||
419 | ctrl_reg |= PM8xxx_RTC_ENABLE; | ||
420 | rc = regmap_write(rtc_dd->regmap, rtc_dd->rtc_base, ctrl_reg); | ||
421 | if (rc) { | ||
422 | dev_err(&pdev->dev, | ||
423 | "Write to RTC control register failed\n"); | ||
424 | return rc; | ||
425 | } | ||
426 | } | ||
427 | |||
428 | rtc_dd->ctrl_reg = ctrl_reg; | ||
429 | 475 | ||
430 | platform_set_drvdata(pdev, rtc_dd); | 476 | platform_set_drvdata(pdev, rtc_dd); |
431 | 477 | ||
diff --git a/drivers/rtc/rtc-s3c.c b/drivers/rtc/rtc-s3c.c index a6b1252c9941..806072238c00 100644 --- a/drivers/rtc/rtc-s3c.c +++ b/drivers/rtc/rtc-s3c.c | |||
@@ -535,13 +535,15 @@ static int s3c_rtc_probe(struct platform_device *pdev) | |||
535 | } | 535 | } |
536 | clk_prepare_enable(info->rtc_clk); | 536 | clk_prepare_enable(info->rtc_clk); |
537 | 537 | ||
538 | info->rtc_src_clk = devm_clk_get(&pdev->dev, "rtc_src"); | 538 | if (info->data->needs_src_clk) { |
539 | if (IS_ERR(info->rtc_src_clk)) { | 539 | info->rtc_src_clk = devm_clk_get(&pdev->dev, "rtc_src"); |
540 | dev_err(&pdev->dev, "failed to find rtc source clock\n"); | 540 | if (IS_ERR(info->rtc_src_clk)) { |
541 | return PTR_ERR(info->rtc_src_clk); | 541 | dev_err(&pdev->dev, |
542 | "failed to find rtc source clock\n"); | ||
543 | return PTR_ERR(info->rtc_src_clk); | ||
544 | } | ||
545 | clk_prepare_enable(info->rtc_src_clk); | ||
542 | } | 546 | } |
543 | clk_prepare_enable(info->rtc_src_clk); | ||
544 | |||
545 | 547 | ||
546 | /* check to see if everything is setup correctly */ | 548 | /* check to see if everything is setup correctly */ |
547 | if (info->data->enable) | 549 | if (info->data->enable) |
diff --git a/drivers/scsi/cxgbi/libcxgbi.c b/drivers/scsi/cxgbi/libcxgbi.c index 54fa6e0bc1bb..674d498b46ab 100644 --- a/drivers/scsi/cxgbi/libcxgbi.c +++ b/drivers/scsi/cxgbi/libcxgbi.c | |||
@@ -399,6 +399,35 @@ EXPORT_SYMBOL_GPL(cxgbi_hbas_add); | |||
399 | * If the source port is outside our allocation range, the caller is | 399 | * If the source port is outside our allocation range, the caller is |
400 | * responsible for keeping track of their port usage. | 400 | * responsible for keeping track of their port usage. |
401 | */ | 401 | */ |
402 | |||
403 | static struct cxgbi_sock *find_sock_on_port(struct cxgbi_device *cdev, | ||
404 | unsigned char port_id) | ||
405 | { | ||
406 | struct cxgbi_ports_map *pmap = &cdev->pmap; | ||
407 | unsigned int i; | ||
408 | unsigned int used; | ||
409 | |||
410 | if (!pmap->max_connect || !pmap->used) | ||
411 | return NULL; | ||
412 | |||
413 | spin_lock_bh(&pmap->lock); | ||
414 | used = pmap->used; | ||
415 | for (i = 0; used && i < pmap->max_connect; i++) { | ||
416 | struct cxgbi_sock *csk = pmap->port_csk[i]; | ||
417 | |||
418 | if (csk) { | ||
419 | if (csk->port_id == port_id) { | ||
420 | spin_unlock_bh(&pmap->lock); | ||
421 | return csk; | ||
422 | } | ||
423 | used--; | ||
424 | } | ||
425 | } | ||
426 | spin_unlock_bh(&pmap->lock); | ||
427 | |||
428 | return NULL; | ||
429 | } | ||
430 | |||
402 | static int sock_get_port(struct cxgbi_sock *csk) | 431 | static int sock_get_port(struct cxgbi_sock *csk) |
403 | { | 432 | { |
404 | struct cxgbi_device *cdev = csk->cdev; | 433 | struct cxgbi_device *cdev = csk->cdev; |
@@ -749,6 +778,7 @@ static struct cxgbi_sock *cxgbi_check_route6(struct sockaddr *dst_addr) | |||
749 | csk->daddr6.sin6_addr = daddr6->sin6_addr; | 778 | csk->daddr6.sin6_addr = daddr6->sin6_addr; |
750 | csk->daddr6.sin6_port = daddr6->sin6_port; | 779 | csk->daddr6.sin6_port = daddr6->sin6_port; |
751 | csk->daddr6.sin6_family = daddr6->sin6_family; | 780 | csk->daddr6.sin6_family = daddr6->sin6_family; |
781 | csk->saddr6.sin6_family = daddr6->sin6_family; | ||
752 | csk->saddr6.sin6_addr = pref_saddr; | 782 | csk->saddr6.sin6_addr = pref_saddr; |
753 | 783 | ||
754 | neigh_release(n); | 784 | neigh_release(n); |
@@ -2647,12 +2677,14 @@ int cxgbi_get_host_param(struct Scsi_Host *shost, enum iscsi_host_param param, | |||
2647 | break; | 2677 | break; |
2648 | case ISCSI_HOST_PARAM_IPADDRESS: | 2678 | case ISCSI_HOST_PARAM_IPADDRESS: |
2649 | { | 2679 | { |
2650 | __be32 addr; | 2680 | struct cxgbi_sock *csk = find_sock_on_port(chba->cdev, |
2651 | 2681 | chba->port_id); | |
2652 | addr = cxgbi_get_iscsi_ipv4(chba); | 2682 | if (csk) { |
2653 | len = sprintf(buf, "%pI4", &addr); | 2683 | len = sprintf(buf, "%pIS", |
2684 | (struct sockaddr *)&csk->saddr); | ||
2685 | } | ||
2654 | log_debug(1 << CXGBI_DBG_ISCSI, | 2686 | log_debug(1 << CXGBI_DBG_ISCSI, |
2655 | "hba %s, ipv4 %pI4.\n", chba->ndev->name, &addr); | 2687 | "hba %s, addr %s.\n", chba->ndev->name, buf); |
2656 | break; | 2688 | break; |
2657 | } | 2689 | } |
2658 | default: | 2690 | default: |
diff --git a/drivers/scsi/cxgbi/libcxgbi.h b/drivers/scsi/cxgbi/libcxgbi.h index 1d98fad6a0ab..2c7cb1c0c453 100644 --- a/drivers/scsi/cxgbi/libcxgbi.h +++ b/drivers/scsi/cxgbi/libcxgbi.h | |||
@@ -700,11 +700,6 @@ static inline void cxgbi_set_iscsi_ipv4(struct cxgbi_hba *chba, __be32 ipaddr) | |||
700 | chba->ndev->name); | 700 | chba->ndev->name); |
701 | } | 701 | } |
702 | 702 | ||
703 | static inline __be32 cxgbi_get_iscsi_ipv4(struct cxgbi_hba *chba) | ||
704 | { | ||
705 | return chba->ipv4addr; | ||
706 | } | ||
707 | |||
708 | struct cxgbi_device *cxgbi_device_register(unsigned int, unsigned int); | 703 | struct cxgbi_device *cxgbi_device_register(unsigned int, unsigned int); |
709 | void cxgbi_device_unregister(struct cxgbi_device *); | 704 | void cxgbi_device_unregister(struct cxgbi_device *); |
710 | void cxgbi_device_unregister_all(unsigned int flag); | 705 | void cxgbi_device_unregister_all(unsigned int flag); |
diff --git a/drivers/scsi/scsi_lib.c b/drivers/scsi/scsi_lib.c index 9eff8a375132..50a6e1ac8d9c 100644 --- a/drivers/scsi/scsi_lib.c +++ b/drivers/scsi/scsi_lib.c | |||
@@ -1893,6 +1893,11 @@ static int scsi_queue_rq(struct blk_mq_hw_ctx *hctx, struct request *req, | |||
1893 | blk_mq_start_request(req); | 1893 | blk_mq_start_request(req); |
1894 | } | 1894 | } |
1895 | 1895 | ||
1896 | if (blk_queue_tagged(q)) | ||
1897 | req->cmd_flags |= REQ_QUEUED; | ||
1898 | else | ||
1899 | req->cmd_flags &= ~REQ_QUEUED; | ||
1900 | |||
1896 | scsi_init_cmd_errh(cmd); | 1901 | scsi_init_cmd_errh(cmd); |
1897 | cmd->scsi_done = scsi_mq_done; | 1902 | cmd->scsi_done = scsi_mq_done; |
1898 | 1903 | ||
diff --git a/drivers/soc/versatile/soc-realview.c b/drivers/soc/versatile/soc-realview.c index cea8ea3491d2..1a07bf540fec 100644 --- a/drivers/soc/versatile/soc-realview.c +++ b/drivers/soc/versatile/soc-realview.c | |||
@@ -26,6 +26,7 @@ static const struct of_device_id realview_soc_of_match[] = { | |||
26 | { .compatible = "arm,realview-pb11mp-soc", }, | 26 | { .compatible = "arm,realview-pb11mp-soc", }, |
27 | { .compatible = "arm,realview-pba8-soc", }, | 27 | { .compatible = "arm,realview-pba8-soc", }, |
28 | { .compatible = "arm,realview-pbx-soc", }, | 28 | { .compatible = "arm,realview-pbx-soc", }, |
29 | { } | ||
29 | }; | 30 | }; |
30 | 31 | ||
31 | static u32 realview_coreid; | 32 | static u32 realview_coreid; |
diff --git a/drivers/spi/spi-dw.c b/drivers/spi/spi-dw.c index 729215885250..72e12bad14b9 100644 --- a/drivers/spi/spi-dw.c +++ b/drivers/spi/spi-dw.c | |||
@@ -669,6 +669,7 @@ int dw_spi_add_host(struct device *dev, struct dw_spi *dws) | |||
669 | master->cleanup = dw_spi_cleanup; | 669 | master->cleanup = dw_spi_cleanup; |
670 | master->transfer_one_message = dw_spi_transfer_one_message; | 670 | master->transfer_one_message = dw_spi_transfer_one_message; |
671 | master->max_speed_hz = dws->max_freq; | 671 | master->max_speed_hz = dws->max_freq; |
672 | master->dev.of_node = dev->of_node; | ||
672 | 673 | ||
673 | /* Basic HW init */ | 674 | /* Basic HW init */ |
674 | spi_hw_init(dws); | 675 | spi_hw_init(dws); |
diff --git a/drivers/spi/spi-fsl-dspi.c b/drivers/spi/spi-fsl-dspi.c index 448216025ce8..831ceb4a91f6 100644 --- a/drivers/spi/spi-fsl-dspi.c +++ b/drivers/spi/spi-fsl-dspi.c | |||
@@ -46,7 +46,7 @@ | |||
46 | 46 | ||
47 | #define SPI_TCR 0x08 | 47 | #define SPI_TCR 0x08 |
48 | 48 | ||
49 | #define SPI_CTAR(x) (0x0c + (x * 4)) | 49 | #define SPI_CTAR(x) (0x0c + (((x) & 0x3) * 4)) |
50 | #define SPI_CTAR_FMSZ(x) (((x) & 0x0000000f) << 27) | 50 | #define SPI_CTAR_FMSZ(x) (((x) & 0x0000000f) << 27) |
51 | #define SPI_CTAR_CPOL(x) ((x) << 26) | 51 | #define SPI_CTAR_CPOL(x) ((x) << 26) |
52 | #define SPI_CTAR_CPHA(x) ((x) << 25) | 52 | #define SPI_CTAR_CPHA(x) ((x) << 25) |
@@ -70,7 +70,7 @@ | |||
70 | 70 | ||
71 | #define SPI_PUSHR 0x34 | 71 | #define SPI_PUSHR 0x34 |
72 | #define SPI_PUSHR_CONT (1 << 31) | 72 | #define SPI_PUSHR_CONT (1 << 31) |
73 | #define SPI_PUSHR_CTAS(x) (((x) & 0x00000007) << 28) | 73 | #define SPI_PUSHR_CTAS(x) (((x) & 0x00000003) << 28) |
74 | #define SPI_PUSHR_EOQ (1 << 27) | 74 | #define SPI_PUSHR_EOQ (1 << 27) |
75 | #define SPI_PUSHR_CTCNT (1 << 26) | 75 | #define SPI_PUSHR_CTCNT (1 << 26) |
76 | #define SPI_PUSHR_PCS(x) (((1 << x) & 0x0000003f) << 16) | 76 | #define SPI_PUSHR_PCS(x) (((1 << x) & 0x0000003f) << 16) |
diff --git a/drivers/spi/spi-orion.c b/drivers/spi/spi-orion.c index 835cdda6f4f5..c76b7d7879df 100644 --- a/drivers/spi/spi-orion.c +++ b/drivers/spi/spi-orion.c | |||
@@ -454,7 +454,7 @@ static int orion_spi_probe(struct platform_device *pdev) | |||
454 | spi->master = master; | 454 | spi->master = master; |
455 | 455 | ||
456 | of_id = of_match_device(orion_spi_of_match_table, &pdev->dev); | 456 | of_id = of_match_device(orion_spi_of_match_table, &pdev->dev); |
457 | devdata = of_id->data; | 457 | devdata = (of_id) ? of_id->data : &orion_spi_dev_data; |
458 | spi->devdata = devdata; | 458 | spi->devdata = devdata; |
459 | 459 | ||
460 | spi->clk = devm_clk_get(&pdev->dev, NULL); | 460 | spi->clk = devm_clk_get(&pdev->dev, NULL); |
diff --git a/drivers/spi/spi-pl022.c b/drivers/spi/spi-pl022.c index f35f723816ea..fc2dd8441608 100644 --- a/drivers/spi/spi-pl022.c +++ b/drivers/spi/spi-pl022.c | |||
@@ -1106,7 +1106,7 @@ err_rxdesc: | |||
1106 | pl022->sgt_tx.nents, DMA_TO_DEVICE); | 1106 | pl022->sgt_tx.nents, DMA_TO_DEVICE); |
1107 | err_tx_sgmap: | 1107 | err_tx_sgmap: |
1108 | dma_unmap_sg(rxchan->device->dev, pl022->sgt_rx.sgl, | 1108 | dma_unmap_sg(rxchan->device->dev, pl022->sgt_rx.sgl, |
1109 | pl022->sgt_tx.nents, DMA_FROM_DEVICE); | 1109 | pl022->sgt_rx.nents, DMA_FROM_DEVICE); |
1110 | err_rx_sgmap: | 1110 | err_rx_sgmap: |
1111 | sg_free_table(&pl022->sgt_tx); | 1111 | sg_free_table(&pl022->sgt_tx); |
1112 | err_alloc_tx_sg: | 1112 | err_alloc_tx_sg: |
diff --git a/drivers/spi/spi-pxa2xx.c b/drivers/spi/spi-pxa2xx.c index d8a105f76837..9e9e0f971e6c 100644 --- a/drivers/spi/spi-pxa2xx.c +++ b/drivers/spi/spi-pxa2xx.c | |||
@@ -1274,7 +1274,9 @@ static int pxa2xx_spi_suspend(struct device *dev) | |||
1274 | if (status != 0) | 1274 | if (status != 0) |
1275 | return status; | 1275 | return status; |
1276 | write_SSCR0(0, drv_data->ioaddr); | 1276 | write_SSCR0(0, drv_data->ioaddr); |
1277 | clk_disable_unprepare(ssp->clk); | 1277 | |
1278 | if (!pm_runtime_suspended(dev)) | ||
1279 | clk_disable_unprepare(ssp->clk); | ||
1278 | 1280 | ||
1279 | return 0; | 1281 | return 0; |
1280 | } | 1282 | } |
@@ -1288,7 +1290,8 @@ static int pxa2xx_spi_resume(struct device *dev) | |||
1288 | pxa2xx_spi_dma_resume(drv_data); | 1290 | pxa2xx_spi_dma_resume(drv_data); |
1289 | 1291 | ||
1290 | /* Enable the SSP clock */ | 1292 | /* Enable the SSP clock */ |
1291 | clk_prepare_enable(ssp->clk); | 1293 | if (!pm_runtime_suspended(dev)) |
1294 | clk_prepare_enable(ssp->clk); | ||
1292 | 1295 | ||
1293 | /* Restore LPSS private register bits */ | 1296 | /* Restore LPSS private register bits */ |
1294 | lpss_ssp_setup(drv_data); | 1297 | lpss_ssp_setup(drv_data); |
diff --git a/drivers/spi/spi-rockchip.c b/drivers/spi/spi-rockchip.c index f96ea8a38d64..87bc16f491f0 100644 --- a/drivers/spi/spi-rockchip.c +++ b/drivers/spi/spi-rockchip.c | |||
@@ -145,6 +145,9 @@ | |||
145 | #define RXBUSY (1 << 0) | 145 | #define RXBUSY (1 << 0) |
146 | #define TXBUSY (1 << 1) | 146 | #define TXBUSY (1 << 1) |
147 | 147 | ||
148 | /* sclk_out: spi master internal logic in rk3x can support 50Mhz */ | ||
149 | #define MAX_SCLK_OUT 50000000 | ||
150 | |||
148 | enum rockchip_ssi_type { | 151 | enum rockchip_ssi_type { |
149 | SSI_MOTO_SPI = 0, | 152 | SSI_MOTO_SPI = 0, |
150 | SSI_TI_SSP, | 153 | SSI_TI_SSP, |
@@ -325,6 +328,8 @@ static int rockchip_spi_unprepare_message(struct spi_master *master, | |||
325 | 328 | ||
326 | spin_unlock_irqrestore(&rs->lock, flags); | 329 | spin_unlock_irqrestore(&rs->lock, flags); |
327 | 330 | ||
331 | spi_enable_chip(rs, 0); | ||
332 | |||
328 | return 0; | 333 | return 0; |
329 | } | 334 | } |
330 | 335 | ||
@@ -381,6 +386,8 @@ static int rockchip_spi_pio_transfer(struct rockchip_spi *rs) | |||
381 | if (rs->tx) | 386 | if (rs->tx) |
382 | wait_for_idle(rs); | 387 | wait_for_idle(rs); |
383 | 388 | ||
389 | spi_enable_chip(rs, 0); | ||
390 | |||
384 | return 0; | 391 | return 0; |
385 | } | 392 | } |
386 | 393 | ||
@@ -392,8 +399,10 @@ static void rockchip_spi_dma_rxcb(void *data) | |||
392 | spin_lock_irqsave(&rs->lock, flags); | 399 | spin_lock_irqsave(&rs->lock, flags); |
393 | 400 | ||
394 | rs->state &= ~RXBUSY; | 401 | rs->state &= ~RXBUSY; |
395 | if (!(rs->state & TXBUSY)) | 402 | if (!(rs->state & TXBUSY)) { |
403 | spi_enable_chip(rs, 0); | ||
396 | spi_finalize_current_transfer(rs->master); | 404 | spi_finalize_current_transfer(rs->master); |
405 | } | ||
397 | 406 | ||
398 | spin_unlock_irqrestore(&rs->lock, flags); | 407 | spin_unlock_irqrestore(&rs->lock, flags); |
399 | } | 408 | } |
@@ -409,8 +418,10 @@ static void rockchip_spi_dma_txcb(void *data) | |||
409 | spin_lock_irqsave(&rs->lock, flags); | 418 | spin_lock_irqsave(&rs->lock, flags); |
410 | 419 | ||
411 | rs->state &= ~TXBUSY; | 420 | rs->state &= ~TXBUSY; |
412 | if (!(rs->state & RXBUSY)) | 421 | if (!(rs->state & RXBUSY)) { |
422 | spi_enable_chip(rs, 0); | ||
413 | spi_finalize_current_transfer(rs->master); | 423 | spi_finalize_current_transfer(rs->master); |
424 | } | ||
414 | 425 | ||
415 | spin_unlock_irqrestore(&rs->lock, flags); | 426 | spin_unlock_irqrestore(&rs->lock, flags); |
416 | } | 427 | } |
@@ -496,12 +507,19 @@ static void rockchip_spi_config(struct rockchip_spi *rs) | |||
496 | dmacr |= RF_DMA_EN; | 507 | dmacr |= RF_DMA_EN; |
497 | } | 508 | } |
498 | 509 | ||
510 | if (WARN_ON(rs->speed > MAX_SCLK_OUT)) | ||
511 | rs->speed = MAX_SCLK_OUT; | ||
512 | |||
513 | /* the minimum divsor is 2 */ | ||
514 | if (rs->max_freq < 2 * rs->speed) { | ||
515 | clk_set_rate(rs->spiclk, 2 * rs->speed); | ||
516 | rs->max_freq = clk_get_rate(rs->spiclk); | ||
517 | } | ||
518 | |||
499 | /* div doesn't support odd number */ | 519 | /* div doesn't support odd number */ |
500 | div = max_t(u32, rs->max_freq / rs->speed, 1); | 520 | div = max_t(u32, rs->max_freq / rs->speed, 1); |
501 | div = (div + 1) & 0xfffe; | 521 | div = (div + 1) & 0xfffe; |
502 | 522 | ||
503 | spi_enable_chip(rs, 0); | ||
504 | |||
505 | writel_relaxed(cr0, rs->regs + ROCKCHIP_SPI_CTRLR0); | 523 | writel_relaxed(cr0, rs->regs + ROCKCHIP_SPI_CTRLR0); |
506 | 524 | ||
507 | writel_relaxed(rs->len - 1, rs->regs + ROCKCHIP_SPI_CTRLR1); | 525 | writel_relaxed(rs->len - 1, rs->regs + ROCKCHIP_SPI_CTRLR1); |
@@ -515,8 +533,6 @@ static void rockchip_spi_config(struct rockchip_spi *rs) | |||
515 | spi_set_clk(rs, div); | 533 | spi_set_clk(rs, div); |
516 | 534 | ||
517 | dev_dbg(rs->dev, "cr0 0x%x, div %d\n", cr0, div); | 535 | dev_dbg(rs->dev, "cr0 0x%x, div %d\n", cr0, div); |
518 | |||
519 | spi_enable_chip(rs, 1); | ||
520 | } | 536 | } |
521 | 537 | ||
522 | static int rockchip_spi_transfer_one( | 538 | static int rockchip_spi_transfer_one( |
@@ -524,7 +540,7 @@ static int rockchip_spi_transfer_one( | |||
524 | struct spi_device *spi, | 540 | struct spi_device *spi, |
525 | struct spi_transfer *xfer) | 541 | struct spi_transfer *xfer) |
526 | { | 542 | { |
527 | int ret = 0; | 543 | int ret = 1; |
528 | struct rockchip_spi *rs = spi_master_get_devdata(master); | 544 | struct rockchip_spi *rs = spi_master_get_devdata(master); |
529 | 545 | ||
530 | WARN_ON(readl_relaxed(rs->regs + ROCKCHIP_SPI_SSIENR) && | 546 | WARN_ON(readl_relaxed(rs->regs + ROCKCHIP_SPI_SSIENR) && |
@@ -556,17 +572,27 @@ static int rockchip_spi_transfer_one( | |||
556 | rs->tmode = CR0_XFM_RO; | 572 | rs->tmode = CR0_XFM_RO; |
557 | 573 | ||
558 | /* we need prepare dma before spi was enabled */ | 574 | /* we need prepare dma before spi was enabled */ |
559 | if (master->can_dma && master->can_dma(master, spi, xfer)) { | 575 | if (master->can_dma && master->can_dma(master, spi, xfer)) |
560 | rs->use_dma = 1; | 576 | rs->use_dma = 1; |
561 | rockchip_spi_prepare_dma(rs); | 577 | else |
562 | } else { | ||
563 | rs->use_dma = 0; | 578 | rs->use_dma = 0; |
564 | } | ||
565 | 579 | ||
566 | rockchip_spi_config(rs); | 580 | rockchip_spi_config(rs); |
567 | 581 | ||
568 | if (!rs->use_dma) | 582 | if (rs->use_dma) { |
583 | if (rs->tmode == CR0_XFM_RO) { | ||
584 | /* rx: dma must be prepared first */ | ||
585 | rockchip_spi_prepare_dma(rs); | ||
586 | spi_enable_chip(rs, 1); | ||
587 | } else { | ||
588 | /* tx or tr: spi must be enabled first */ | ||
589 | spi_enable_chip(rs, 1); | ||
590 | rockchip_spi_prepare_dma(rs); | ||
591 | } | ||
592 | } else { | ||
593 | spi_enable_chip(rs, 1); | ||
569 | ret = rockchip_spi_pio_transfer(rs); | 594 | ret = rockchip_spi_pio_transfer(rs); |
595 | } | ||
570 | 596 | ||
571 | return ret; | 597 | return ret; |
572 | } | 598 | } |
diff --git a/drivers/spi/spidev.c b/drivers/spi/spidev.c index e3bc23bb5883..e50039fb1474 100644 --- a/drivers/spi/spidev.c +++ b/drivers/spi/spidev.c | |||
@@ -82,10 +82,11 @@ struct spidev_data { | |||
82 | struct spi_device *spi; | 82 | struct spi_device *spi; |
83 | struct list_head device_entry; | 83 | struct list_head device_entry; |
84 | 84 | ||
85 | /* buffer is NULL unless this device is open (users > 0) */ | 85 | /* TX/RX buffers are NULL unless this device is open (users > 0) */ |
86 | struct mutex buf_lock; | 86 | struct mutex buf_lock; |
87 | unsigned users; | 87 | unsigned users; |
88 | u8 *buffer; | 88 | u8 *tx_buffer; |
89 | u8 *rx_buffer; | ||
89 | }; | 90 | }; |
90 | 91 | ||
91 | static LIST_HEAD(device_list); | 92 | static LIST_HEAD(device_list); |
@@ -135,7 +136,7 @@ static inline ssize_t | |||
135 | spidev_sync_write(struct spidev_data *spidev, size_t len) | 136 | spidev_sync_write(struct spidev_data *spidev, size_t len) |
136 | { | 137 | { |
137 | struct spi_transfer t = { | 138 | struct spi_transfer t = { |
138 | .tx_buf = spidev->buffer, | 139 | .tx_buf = spidev->tx_buffer, |
139 | .len = len, | 140 | .len = len, |
140 | }; | 141 | }; |
141 | struct spi_message m; | 142 | struct spi_message m; |
@@ -149,7 +150,7 @@ static inline ssize_t | |||
149 | spidev_sync_read(struct spidev_data *spidev, size_t len) | 150 | spidev_sync_read(struct spidev_data *spidev, size_t len) |
150 | { | 151 | { |
151 | struct spi_transfer t = { | 152 | struct spi_transfer t = { |
152 | .rx_buf = spidev->buffer, | 153 | .rx_buf = spidev->rx_buffer, |
153 | .len = len, | 154 | .len = len, |
154 | }; | 155 | }; |
155 | struct spi_message m; | 156 | struct spi_message m; |
@@ -179,7 +180,7 @@ spidev_read(struct file *filp, char __user *buf, size_t count, loff_t *f_pos) | |||
179 | if (status > 0) { | 180 | if (status > 0) { |
180 | unsigned long missing; | 181 | unsigned long missing; |
181 | 182 | ||
182 | missing = copy_to_user(buf, spidev->buffer, status); | 183 | missing = copy_to_user(buf, spidev->rx_buffer, status); |
183 | if (missing == status) | 184 | if (missing == status) |
184 | status = -EFAULT; | 185 | status = -EFAULT; |
185 | else | 186 | else |
@@ -206,7 +207,7 @@ spidev_write(struct file *filp, const char __user *buf, | |||
206 | spidev = filp->private_data; | 207 | spidev = filp->private_data; |
207 | 208 | ||
208 | mutex_lock(&spidev->buf_lock); | 209 | mutex_lock(&spidev->buf_lock); |
209 | missing = copy_from_user(spidev->buffer, buf, count); | 210 | missing = copy_from_user(spidev->tx_buffer, buf, count); |
210 | if (missing == 0) | 211 | if (missing == 0) |
211 | status = spidev_sync_write(spidev, count); | 212 | status = spidev_sync_write(spidev, count); |
212 | else | 213 | else |
@@ -224,7 +225,7 @@ static int spidev_message(struct spidev_data *spidev, | |||
224 | struct spi_transfer *k_tmp; | 225 | struct spi_transfer *k_tmp; |
225 | struct spi_ioc_transfer *u_tmp; | 226 | struct spi_ioc_transfer *u_tmp; |
226 | unsigned n, total; | 227 | unsigned n, total; |
227 | u8 *buf; | 228 | u8 *tx_buf, *rx_buf; |
228 | int status = -EFAULT; | 229 | int status = -EFAULT; |
229 | 230 | ||
230 | spi_message_init(&msg); | 231 | spi_message_init(&msg); |
@@ -236,7 +237,8 @@ static int spidev_message(struct spidev_data *spidev, | |||
236 | * We walk the array of user-provided transfers, using each one | 237 | * We walk the array of user-provided transfers, using each one |
237 | * to initialize a kernel version of the same transfer. | 238 | * to initialize a kernel version of the same transfer. |
238 | */ | 239 | */ |
239 | buf = spidev->buffer; | 240 | tx_buf = spidev->tx_buffer; |
241 | rx_buf = spidev->rx_buffer; | ||
240 | total = 0; | 242 | total = 0; |
241 | for (n = n_xfers, k_tmp = k_xfers, u_tmp = u_xfers; | 243 | for (n = n_xfers, k_tmp = k_xfers, u_tmp = u_xfers; |
242 | n; | 244 | n; |
@@ -250,20 +252,21 @@ static int spidev_message(struct spidev_data *spidev, | |||
250 | } | 252 | } |
251 | 253 | ||
252 | if (u_tmp->rx_buf) { | 254 | if (u_tmp->rx_buf) { |
253 | k_tmp->rx_buf = buf; | 255 | k_tmp->rx_buf = rx_buf; |
254 | if (!access_ok(VERIFY_WRITE, (u8 __user *) | 256 | if (!access_ok(VERIFY_WRITE, (u8 __user *) |
255 | (uintptr_t) u_tmp->rx_buf, | 257 | (uintptr_t) u_tmp->rx_buf, |
256 | u_tmp->len)) | 258 | u_tmp->len)) |
257 | goto done; | 259 | goto done; |
258 | } | 260 | } |
259 | if (u_tmp->tx_buf) { | 261 | if (u_tmp->tx_buf) { |
260 | k_tmp->tx_buf = buf; | 262 | k_tmp->tx_buf = tx_buf; |
261 | if (copy_from_user(buf, (const u8 __user *) | 263 | if (copy_from_user(tx_buf, (const u8 __user *) |
262 | (uintptr_t) u_tmp->tx_buf, | 264 | (uintptr_t) u_tmp->tx_buf, |
263 | u_tmp->len)) | 265 | u_tmp->len)) |
264 | goto done; | 266 | goto done; |
265 | } | 267 | } |
266 | buf += k_tmp->len; | 268 | tx_buf += k_tmp->len; |
269 | rx_buf += k_tmp->len; | ||
267 | 270 | ||
268 | k_tmp->cs_change = !!u_tmp->cs_change; | 271 | k_tmp->cs_change = !!u_tmp->cs_change; |
269 | k_tmp->tx_nbits = u_tmp->tx_nbits; | 272 | k_tmp->tx_nbits = u_tmp->tx_nbits; |
@@ -290,17 +293,17 @@ static int spidev_message(struct spidev_data *spidev, | |||
290 | goto done; | 293 | goto done; |
291 | 294 | ||
292 | /* copy any rx data out of bounce buffer */ | 295 | /* copy any rx data out of bounce buffer */ |
293 | buf = spidev->buffer; | 296 | rx_buf = spidev->rx_buffer; |
294 | for (n = n_xfers, u_tmp = u_xfers; n; n--, u_tmp++) { | 297 | for (n = n_xfers, u_tmp = u_xfers; n; n--, u_tmp++) { |
295 | if (u_tmp->rx_buf) { | 298 | if (u_tmp->rx_buf) { |
296 | if (__copy_to_user((u8 __user *) | 299 | if (__copy_to_user((u8 __user *) |
297 | (uintptr_t) u_tmp->rx_buf, buf, | 300 | (uintptr_t) u_tmp->rx_buf, rx_buf, |
298 | u_tmp->len)) { | 301 | u_tmp->len)) { |
299 | status = -EFAULT; | 302 | status = -EFAULT; |
300 | goto done; | 303 | goto done; |
301 | } | 304 | } |
302 | } | 305 | } |
303 | buf += u_tmp->len; | 306 | rx_buf += u_tmp->len; |
304 | } | 307 | } |
305 | status = total; | 308 | status = total; |
306 | 309 | ||
@@ -508,22 +511,41 @@ static int spidev_open(struct inode *inode, struct file *filp) | |||
508 | break; | 511 | break; |
509 | } | 512 | } |
510 | } | 513 | } |
511 | if (status == 0) { | 514 | |
512 | if (!spidev->buffer) { | 515 | if (status) { |
513 | spidev->buffer = kmalloc(bufsiz, GFP_KERNEL); | 516 | pr_debug("spidev: nothing for minor %d\n", iminor(inode)); |
514 | if (!spidev->buffer) { | 517 | goto err_find_dev; |
518 | } | ||
519 | |||
520 | if (!spidev->tx_buffer) { | ||
521 | spidev->tx_buffer = kmalloc(bufsiz, GFP_KERNEL); | ||
522 | if (!spidev->tx_buffer) { | ||
515 | dev_dbg(&spidev->spi->dev, "open/ENOMEM\n"); | 523 | dev_dbg(&spidev->spi->dev, "open/ENOMEM\n"); |
516 | status = -ENOMEM; | 524 | status = -ENOMEM; |
525 | goto err_find_dev; | ||
517 | } | 526 | } |
518 | } | 527 | } |
519 | if (status == 0) { | 528 | |
520 | spidev->users++; | 529 | if (!spidev->rx_buffer) { |
521 | filp->private_data = spidev; | 530 | spidev->rx_buffer = kmalloc(bufsiz, GFP_KERNEL); |
522 | nonseekable_open(inode, filp); | 531 | if (!spidev->rx_buffer) { |
532 | dev_dbg(&spidev->spi->dev, "open/ENOMEM\n"); | ||
533 | status = -ENOMEM; | ||
534 | goto err_alloc_rx_buf; | ||
523 | } | 535 | } |
524 | } else | 536 | } |
525 | pr_debug("spidev: nothing for minor %d\n", iminor(inode)); | 537 | |
538 | spidev->users++; | ||
539 | filp->private_data = spidev; | ||
540 | nonseekable_open(inode, filp); | ||
541 | |||
542 | mutex_unlock(&device_list_lock); | ||
543 | return 0; | ||
526 | 544 | ||
545 | err_alloc_rx_buf: | ||
546 | kfree(spidev->tx_buffer); | ||
547 | spidev->tx_buffer = NULL; | ||
548 | err_find_dev: | ||
527 | mutex_unlock(&device_list_lock); | 549 | mutex_unlock(&device_list_lock); |
528 | return status; | 550 | return status; |
529 | } | 551 | } |
@@ -542,8 +564,11 @@ static int spidev_release(struct inode *inode, struct file *filp) | |||
542 | if (!spidev->users) { | 564 | if (!spidev->users) { |
543 | int dofree; | 565 | int dofree; |
544 | 566 | ||
545 | kfree(spidev->buffer); | 567 | kfree(spidev->tx_buffer); |
546 | spidev->buffer = NULL; | 568 | spidev->tx_buffer = NULL; |
569 | |||
570 | kfree(spidev->rx_buffer); | ||
571 | spidev->rx_buffer = NULL; | ||
547 | 572 | ||
548 | /* ... after we unbound from the underlying device? */ | 573 | /* ... after we unbound from the underlying device? */ |
549 | spin_lock_irq(&spidev->spi_lock); | 574 | spin_lock_irq(&spidev->spi_lock); |
diff --git a/drivers/staging/android/logger.c b/drivers/staging/android/logger.c index 28b93d39a94e..a673ffa34aa3 100644 --- a/drivers/staging/android/logger.c +++ b/drivers/staging/android/logger.c | |||
@@ -420,7 +420,7 @@ static ssize_t logger_write_iter(struct kiocb *iocb, struct iov_iter *from) | |||
420 | struct logger_log *log = file_get_log(iocb->ki_filp); | 420 | struct logger_log *log = file_get_log(iocb->ki_filp); |
421 | struct logger_entry header; | 421 | struct logger_entry header; |
422 | struct timespec now; | 422 | struct timespec now; |
423 | size_t len, count; | 423 | size_t len, count, w_off; |
424 | 424 | ||
425 | count = min_t(size_t, iocb->ki_nbytes, LOGGER_ENTRY_MAX_PAYLOAD); | 425 | count = min_t(size_t, iocb->ki_nbytes, LOGGER_ENTRY_MAX_PAYLOAD); |
426 | 426 | ||
@@ -452,11 +452,14 @@ static ssize_t logger_write_iter(struct kiocb *iocb, struct iov_iter *from) | |||
452 | memcpy(log->buffer + log->w_off, &header, len); | 452 | memcpy(log->buffer + log->w_off, &header, len); |
453 | memcpy(log->buffer, (char *)&header + len, sizeof(header) - len); | 453 | memcpy(log->buffer, (char *)&header + len, sizeof(header) - len); |
454 | 454 | ||
455 | len = min(count, log->size - log->w_off); | 455 | /* Work with a copy until we are ready to commit the whole entry */ |
456 | w_off = logger_offset(log, log->w_off + sizeof(struct logger_entry)); | ||
456 | 457 | ||
457 | if (copy_from_iter(log->buffer + log->w_off, len, from) != len) { | 458 | len = min(count, log->size - w_off); |
459 | |||
460 | if (copy_from_iter(log->buffer + w_off, len, from) != len) { | ||
458 | /* | 461 | /* |
459 | * Note that by not updating w_off, this abandons the | 462 | * Note that by not updating log->w_off, this abandons the |
460 | * portion of the new entry that *was* successfully | 463 | * portion of the new entry that *was* successfully |
461 | * copied, just above. This is intentional to avoid | 464 | * copied, just above. This is intentional to avoid |
462 | * message corruption from missing fragments. | 465 | * message corruption from missing fragments. |
@@ -470,7 +473,7 @@ static ssize_t logger_write_iter(struct kiocb *iocb, struct iov_iter *from) | |||
470 | return -EFAULT; | 473 | return -EFAULT; |
471 | } | 474 | } |
472 | 475 | ||
473 | log->w_off = logger_offset(log, log->w_off + count); | 476 | log->w_off = logger_offset(log, w_off + count); |
474 | mutex_unlock(&log->mutex); | 477 | mutex_unlock(&log->mutex); |
475 | 478 | ||
476 | /* wake up any blocked readers */ | 479 | /* wake up any blocked readers */ |
diff --git a/drivers/staging/comedi/Kconfig b/drivers/staging/comedi/Kconfig index a8bc2b567789..152f4c12ea43 100644 --- a/drivers/staging/comedi/Kconfig +++ b/drivers/staging/comedi/Kconfig | |||
@@ -426,6 +426,7 @@ config COMEDI_AIO_IIRO_16 | |||
426 | 426 | ||
427 | config COMEDI_II_PCI20KC | 427 | config COMEDI_II_PCI20KC |
428 | tristate "Intelligent Instruments PCI-20001C carrier support" | 428 | tristate "Intelligent Instruments PCI-20001C carrier support" |
429 | depends on HAS_IOMEM | ||
429 | ---help--- | 430 | ---help--- |
430 | Enable support for Intelligent Instruments PCI-20001C carrier | 431 | Enable support for Intelligent Instruments PCI-20001C carrier |
431 | PCI-20001, PCI-20006 and PCI-20341 | 432 | PCI-20001, PCI-20006 and PCI-20341 |
@@ -667,7 +668,6 @@ config COMEDI_ADDI_APCI_2200 | |||
667 | config COMEDI_ADDI_APCI_3120 | 668 | config COMEDI_ADDI_APCI_3120 |
668 | tristate "ADDI-DATA APCI_3120/3001 support" | 669 | tristate "ADDI-DATA APCI_3120/3001 support" |
669 | depends on HAS_DMA | 670 | depends on HAS_DMA |
670 | depends on VIRT_TO_BUS | ||
671 | ---help--- | 671 | ---help--- |
672 | Enable support for ADDI-DATA APCI_3120/3001 cards | 672 | Enable support for ADDI-DATA APCI_3120/3001 cards |
673 | 673 | ||
diff --git a/drivers/staging/comedi/comedi_fops.c b/drivers/staging/comedi/comedi_fops.c index 495969f46e76..9c32f0276009 100644 --- a/drivers/staging/comedi/comedi_fops.c +++ b/drivers/staging/comedi/comedi_fops.c | |||
@@ -1462,10 +1462,7 @@ static int __comedi_get_user_chanlist(struct comedi_device *dev, | |||
1462 | unsigned int *chanlist; | 1462 | unsigned int *chanlist; |
1463 | int ret; | 1463 | int ret; |
1464 | 1464 | ||
1465 | /* user_chanlist could be NULL for do_cmdtest ioctls */ | 1465 | cmd->chanlist = NULL; |
1466 | if (!user_chanlist) | ||
1467 | return 0; | ||
1468 | |||
1469 | chanlist = memdup_user(user_chanlist, | 1466 | chanlist = memdup_user(user_chanlist, |
1470 | cmd->chanlist_len * sizeof(unsigned int)); | 1467 | cmd->chanlist_len * sizeof(unsigned int)); |
1471 | if (IS_ERR(chanlist)) | 1468 | if (IS_ERR(chanlist)) |
@@ -1609,13 +1606,18 @@ static int do_cmdtest_ioctl(struct comedi_device *dev, | |||
1609 | 1606 | ||
1610 | s = &dev->subdevices[cmd.subdev]; | 1607 | s = &dev->subdevices[cmd.subdev]; |
1611 | 1608 | ||
1612 | /* load channel/gain list */ | 1609 | /* user_chanlist can be NULL for COMEDI_CMDTEST ioctl */ |
1613 | ret = __comedi_get_user_chanlist(dev, s, user_chanlist, &cmd); | 1610 | if (user_chanlist) { |
1614 | if (ret) | 1611 | /* load channel/gain list */ |
1615 | return ret; | 1612 | ret = __comedi_get_user_chanlist(dev, s, user_chanlist, &cmd); |
1613 | if (ret) | ||
1614 | return ret; | ||
1615 | } | ||
1616 | 1616 | ||
1617 | ret = s->do_cmdtest(dev, s, &cmd); | 1617 | ret = s->do_cmdtest(dev, s, &cmd); |
1618 | 1618 | ||
1619 | kfree(cmd.chanlist); /* free kernel copy of user chanlist */ | ||
1620 | |||
1619 | /* restore chanlist pointer before copying back */ | 1621 | /* restore chanlist pointer before copying back */ |
1620 | cmd.chanlist = (unsigned int __force *)user_chanlist; | 1622 | cmd.chanlist = (unsigned int __force *)user_chanlist; |
1621 | 1623 | ||
@@ -1642,7 +1644,7 @@ static int do_cmdtest_ioctl(struct comedi_device *dev, | |||
1642 | 1644 | ||
1643 | */ | 1645 | */ |
1644 | 1646 | ||
1645 | static int do_lock_ioctl(struct comedi_device *dev, unsigned int arg, | 1647 | static int do_lock_ioctl(struct comedi_device *dev, unsigned long arg, |
1646 | void *file) | 1648 | void *file) |
1647 | { | 1649 | { |
1648 | int ret = 0; | 1650 | int ret = 0; |
@@ -1679,7 +1681,7 @@ static int do_lock_ioctl(struct comedi_device *dev, unsigned int arg, | |||
1679 | This function isn't protected by the semaphore, since | 1681 | This function isn't protected by the semaphore, since |
1680 | we already own the lock. | 1682 | we already own the lock. |
1681 | */ | 1683 | */ |
1682 | static int do_unlock_ioctl(struct comedi_device *dev, unsigned int arg, | 1684 | static int do_unlock_ioctl(struct comedi_device *dev, unsigned long arg, |
1683 | void *file) | 1685 | void *file) |
1684 | { | 1686 | { |
1685 | struct comedi_subdevice *s; | 1687 | struct comedi_subdevice *s; |
@@ -1714,7 +1716,7 @@ static int do_unlock_ioctl(struct comedi_device *dev, unsigned int arg, | |||
1714 | nothing | 1716 | nothing |
1715 | 1717 | ||
1716 | */ | 1718 | */ |
1717 | static int do_cancel_ioctl(struct comedi_device *dev, unsigned int arg, | 1719 | static int do_cancel_ioctl(struct comedi_device *dev, unsigned long arg, |
1718 | void *file) | 1720 | void *file) |
1719 | { | 1721 | { |
1720 | struct comedi_subdevice *s; | 1722 | struct comedi_subdevice *s; |
@@ -1751,7 +1753,7 @@ static int do_cancel_ioctl(struct comedi_device *dev, unsigned int arg, | |||
1751 | nothing | 1753 | nothing |
1752 | 1754 | ||
1753 | */ | 1755 | */ |
1754 | static int do_poll_ioctl(struct comedi_device *dev, unsigned int arg, | 1756 | static int do_poll_ioctl(struct comedi_device *dev, unsigned long arg, |
1755 | void *file) | 1757 | void *file) |
1756 | { | 1758 | { |
1757 | struct comedi_subdevice *s; | 1759 | struct comedi_subdevice *s; |
diff --git a/drivers/staging/iio/adc/mxs-lradc.c b/drivers/staging/iio/adc/mxs-lradc.c index 32a19264a170..2a29b9baec0d 100644 --- a/drivers/staging/iio/adc/mxs-lradc.c +++ b/drivers/staging/iio/adc/mxs-lradc.c | |||
@@ -1559,14 +1559,16 @@ static int mxs_lradc_probe(struct platform_device *pdev) | |||
1559 | /* Grab all IRQ sources */ | 1559 | /* Grab all IRQ sources */ |
1560 | for (i = 0; i < of_cfg->irq_count; i++) { | 1560 | for (i = 0; i < of_cfg->irq_count; i++) { |
1561 | lradc->irq[i] = platform_get_irq(pdev, i); | 1561 | lradc->irq[i] = platform_get_irq(pdev, i); |
1562 | if (lradc->irq[i] < 0) | 1562 | if (lradc->irq[i] < 0) { |
1563 | return lradc->irq[i]; | 1563 | ret = lradc->irq[i]; |
1564 | goto err_clk; | ||
1565 | } | ||
1564 | 1566 | ||
1565 | ret = devm_request_irq(dev, lradc->irq[i], | 1567 | ret = devm_request_irq(dev, lradc->irq[i], |
1566 | mxs_lradc_handle_irq, 0, | 1568 | mxs_lradc_handle_irq, 0, |
1567 | of_cfg->irq_name[i], iio); | 1569 | of_cfg->irq_name[i], iio); |
1568 | if (ret) | 1570 | if (ret) |
1569 | return ret; | 1571 | goto err_clk; |
1570 | } | 1572 | } |
1571 | 1573 | ||
1572 | lradc->vref_mv = of_cfg->vref_mv; | 1574 | lradc->vref_mv = of_cfg->vref_mv; |
@@ -1588,7 +1590,7 @@ static int mxs_lradc_probe(struct platform_device *pdev) | |||
1588 | &mxs_lradc_trigger_handler, | 1590 | &mxs_lradc_trigger_handler, |
1589 | &mxs_lradc_buffer_ops); | 1591 | &mxs_lradc_buffer_ops); |
1590 | if (ret) | 1592 | if (ret) |
1591 | return ret; | 1593 | goto err_clk; |
1592 | 1594 | ||
1593 | ret = mxs_lradc_trigger_init(iio); | 1595 | ret = mxs_lradc_trigger_init(iio); |
1594 | if (ret) | 1596 | if (ret) |
@@ -1643,6 +1645,8 @@ err_dev: | |||
1643 | mxs_lradc_trigger_remove(iio); | 1645 | mxs_lradc_trigger_remove(iio); |
1644 | err_trig: | 1646 | err_trig: |
1645 | iio_triggered_buffer_cleanup(iio); | 1647 | iio_triggered_buffer_cleanup(iio); |
1648 | err_clk: | ||
1649 | clk_disable_unprepare(lradc->clk); | ||
1646 | return ret; | 1650 | return ret; |
1647 | } | 1651 | } |
1648 | 1652 | ||
diff --git a/drivers/staging/iio/impedance-analyzer/ad5933.c b/drivers/staging/iio/impedance-analyzer/ad5933.c index d0c89d0457de..b6bd609c3655 100644 --- a/drivers/staging/iio/impedance-analyzer/ad5933.c +++ b/drivers/staging/iio/impedance-analyzer/ad5933.c | |||
@@ -115,6 +115,7 @@ static const struct iio_chan_spec ad5933_channels[] = { | |||
115 | .channel = 0, | 115 | .channel = 0, |
116 | .info_mask_separate = BIT(IIO_CHAN_INFO_PROCESSED), | 116 | .info_mask_separate = BIT(IIO_CHAN_INFO_PROCESSED), |
117 | .address = AD5933_REG_TEMP_DATA, | 117 | .address = AD5933_REG_TEMP_DATA, |
118 | .scan_index = -1, | ||
118 | .scan_type = { | 119 | .scan_type = { |
119 | .sign = 's', | 120 | .sign = 's', |
120 | .realbits = 14, | 121 | .realbits = 14, |
@@ -124,9 +125,7 @@ static const struct iio_chan_spec ad5933_channels[] = { | |||
124 | .type = IIO_VOLTAGE, | 125 | .type = IIO_VOLTAGE, |
125 | .indexed = 1, | 126 | .indexed = 1, |
126 | .channel = 0, | 127 | .channel = 0, |
127 | .extend_name = "real_raw", | 128 | .extend_name = "real", |
128 | .info_mask_separate = BIT(IIO_CHAN_INFO_RAW) | | ||
129 | BIT(IIO_CHAN_INFO_SCALE), | ||
130 | .address = AD5933_REG_REAL_DATA, | 129 | .address = AD5933_REG_REAL_DATA, |
131 | .scan_index = 0, | 130 | .scan_index = 0, |
132 | .scan_type = { | 131 | .scan_type = { |
@@ -138,9 +137,7 @@ static const struct iio_chan_spec ad5933_channels[] = { | |||
138 | .type = IIO_VOLTAGE, | 137 | .type = IIO_VOLTAGE, |
139 | .indexed = 1, | 138 | .indexed = 1, |
140 | .channel = 0, | 139 | .channel = 0, |
141 | .extend_name = "imag_raw", | 140 | .extend_name = "imag", |
142 | .info_mask_separate = BIT(IIO_CHAN_INFO_RAW) | | ||
143 | BIT(IIO_CHAN_INFO_SCALE), | ||
144 | .address = AD5933_REG_IMAG_DATA, | 141 | .address = AD5933_REG_IMAG_DATA, |
145 | .scan_index = 1, | 142 | .scan_index = 1, |
146 | .scan_type = { | 143 | .scan_type = { |
@@ -749,14 +746,14 @@ static int ad5933_probe(struct i2c_client *client, | |||
749 | indio_dev->name = id->name; | 746 | indio_dev->name = id->name; |
750 | indio_dev->modes = INDIO_DIRECT_MODE; | 747 | indio_dev->modes = INDIO_DIRECT_MODE; |
751 | indio_dev->channels = ad5933_channels; | 748 | indio_dev->channels = ad5933_channels; |
752 | indio_dev->num_channels = 1; /* only register temp0_input */ | 749 | indio_dev->num_channels = ARRAY_SIZE(ad5933_channels); |
753 | 750 | ||
754 | ret = ad5933_register_ring_funcs_and_init(indio_dev); | 751 | ret = ad5933_register_ring_funcs_and_init(indio_dev); |
755 | if (ret) | 752 | if (ret) |
756 | goto error_disable_reg; | 753 | goto error_disable_reg; |
757 | 754 | ||
758 | /* skip temp0_input, register in0_(real|imag)_raw */ | 755 | ret = iio_buffer_register(indio_dev, ad5933_channels, |
759 | ret = iio_buffer_register(indio_dev, &ad5933_channels[1], 2); | 756 | ARRAY_SIZE(ad5933_channels)); |
760 | if (ret) | 757 | if (ret) |
761 | goto error_unreg_ring; | 758 | goto error_unreg_ring; |
762 | 759 | ||
diff --git a/drivers/staging/iio/meter/ade7758.h b/drivers/staging/iio/meter/ade7758.h index 07318203a836..e8c98cf57070 100644 --- a/drivers/staging/iio/meter/ade7758.h +++ b/drivers/staging/iio/meter/ade7758.h | |||
@@ -119,7 +119,6 @@ struct ade7758_state { | |||
119 | u8 *tx; | 119 | u8 *tx; |
120 | u8 *rx; | 120 | u8 *rx; |
121 | struct mutex buf_lock; | 121 | struct mutex buf_lock; |
122 | const struct iio_chan_spec *ade7758_ring_channels; | ||
123 | struct spi_transfer ring_xfer[4]; | 122 | struct spi_transfer ring_xfer[4]; |
124 | struct spi_message ring_msg; | 123 | struct spi_message ring_msg; |
125 | /* | 124 | /* |
diff --git a/drivers/staging/iio/meter/ade7758_core.c b/drivers/staging/iio/meter/ade7758_core.c index abc60067cd72..fb373b89dcc2 100644 --- a/drivers/staging/iio/meter/ade7758_core.c +++ b/drivers/staging/iio/meter/ade7758_core.c | |||
@@ -634,9 +634,6 @@ static const struct iio_chan_spec ade7758_channels[] = { | |||
634 | .type = IIO_VOLTAGE, | 634 | .type = IIO_VOLTAGE, |
635 | .indexed = 1, | 635 | .indexed = 1, |
636 | .channel = 0, | 636 | .channel = 0, |
637 | .extend_name = "raw", | ||
638 | .info_mask_separate = BIT(IIO_CHAN_INFO_RAW), | ||
639 | .info_mask_shared_by_type = BIT(IIO_CHAN_INFO_SCALE), | ||
640 | .address = AD7758_WT(AD7758_PHASE_A, AD7758_VOLTAGE), | 637 | .address = AD7758_WT(AD7758_PHASE_A, AD7758_VOLTAGE), |
641 | .scan_index = 0, | 638 | .scan_index = 0, |
642 | .scan_type = { | 639 | .scan_type = { |
@@ -648,9 +645,6 @@ static const struct iio_chan_spec ade7758_channels[] = { | |||
648 | .type = IIO_CURRENT, | 645 | .type = IIO_CURRENT, |
649 | .indexed = 1, | 646 | .indexed = 1, |
650 | .channel = 0, | 647 | .channel = 0, |
651 | .extend_name = "raw", | ||
652 | .info_mask_separate = BIT(IIO_CHAN_INFO_RAW), | ||
653 | .info_mask_shared_by_type = BIT(IIO_CHAN_INFO_SCALE), | ||
654 | .address = AD7758_WT(AD7758_PHASE_A, AD7758_CURRENT), | 648 | .address = AD7758_WT(AD7758_PHASE_A, AD7758_CURRENT), |
655 | .scan_index = 1, | 649 | .scan_index = 1, |
656 | .scan_type = { | 650 | .scan_type = { |
@@ -662,9 +656,7 @@ static const struct iio_chan_spec ade7758_channels[] = { | |||
662 | .type = IIO_POWER, | 656 | .type = IIO_POWER, |
663 | .indexed = 1, | 657 | .indexed = 1, |
664 | .channel = 0, | 658 | .channel = 0, |
665 | .extend_name = "apparent_raw", | 659 | .extend_name = "apparent", |
666 | .info_mask_separate = BIT(IIO_CHAN_INFO_RAW), | ||
667 | .info_mask_shared_by_type = BIT(IIO_CHAN_INFO_SCALE), | ||
668 | .address = AD7758_WT(AD7758_PHASE_A, AD7758_APP_PWR), | 660 | .address = AD7758_WT(AD7758_PHASE_A, AD7758_APP_PWR), |
669 | .scan_index = 2, | 661 | .scan_index = 2, |
670 | .scan_type = { | 662 | .scan_type = { |
@@ -676,9 +668,7 @@ static const struct iio_chan_spec ade7758_channels[] = { | |||
676 | .type = IIO_POWER, | 668 | .type = IIO_POWER, |
677 | .indexed = 1, | 669 | .indexed = 1, |
678 | .channel = 0, | 670 | .channel = 0, |
679 | .extend_name = "active_raw", | 671 | .extend_name = "active", |
680 | .info_mask_separate = BIT(IIO_CHAN_INFO_RAW), | ||
681 | .info_mask_shared_by_type = BIT(IIO_CHAN_INFO_SCALE), | ||
682 | .address = AD7758_WT(AD7758_PHASE_A, AD7758_ACT_PWR), | 672 | .address = AD7758_WT(AD7758_PHASE_A, AD7758_ACT_PWR), |
683 | .scan_index = 3, | 673 | .scan_index = 3, |
684 | .scan_type = { | 674 | .scan_type = { |
@@ -690,9 +680,7 @@ static const struct iio_chan_spec ade7758_channels[] = { | |||
690 | .type = IIO_POWER, | 680 | .type = IIO_POWER, |
691 | .indexed = 1, | 681 | .indexed = 1, |
692 | .channel = 0, | 682 | .channel = 0, |
693 | .extend_name = "reactive_raw", | 683 | .extend_name = "reactive", |
694 | .info_mask_separate = BIT(IIO_CHAN_INFO_RAW), | ||
695 | .info_mask_shared_by_type = BIT(IIO_CHAN_INFO_SCALE), | ||
696 | .address = AD7758_WT(AD7758_PHASE_A, AD7758_REACT_PWR), | 684 | .address = AD7758_WT(AD7758_PHASE_A, AD7758_REACT_PWR), |
697 | .scan_index = 4, | 685 | .scan_index = 4, |
698 | .scan_type = { | 686 | .scan_type = { |
@@ -704,9 +692,6 @@ static const struct iio_chan_spec ade7758_channels[] = { | |||
704 | .type = IIO_VOLTAGE, | 692 | .type = IIO_VOLTAGE, |
705 | .indexed = 1, | 693 | .indexed = 1, |
706 | .channel = 1, | 694 | .channel = 1, |
707 | .extend_name = "raw", | ||
708 | .info_mask_separate = BIT(IIO_CHAN_INFO_RAW), | ||
709 | .info_mask_shared_by_type = BIT(IIO_CHAN_INFO_SCALE), | ||
710 | .address = AD7758_WT(AD7758_PHASE_B, AD7758_VOLTAGE), | 695 | .address = AD7758_WT(AD7758_PHASE_B, AD7758_VOLTAGE), |
711 | .scan_index = 5, | 696 | .scan_index = 5, |
712 | .scan_type = { | 697 | .scan_type = { |
@@ -718,9 +703,6 @@ static const struct iio_chan_spec ade7758_channels[] = { | |||
718 | .type = IIO_CURRENT, | 703 | .type = IIO_CURRENT, |
719 | .indexed = 1, | 704 | .indexed = 1, |
720 | .channel = 1, | 705 | .channel = 1, |
721 | .extend_name = "raw", | ||
722 | .info_mask_separate = BIT(IIO_CHAN_INFO_RAW), | ||
723 | .info_mask_shared_by_type = BIT(IIO_CHAN_INFO_SCALE), | ||
724 | .address = AD7758_WT(AD7758_PHASE_B, AD7758_CURRENT), | 706 | .address = AD7758_WT(AD7758_PHASE_B, AD7758_CURRENT), |
725 | .scan_index = 6, | 707 | .scan_index = 6, |
726 | .scan_type = { | 708 | .scan_type = { |
@@ -732,9 +714,7 @@ static const struct iio_chan_spec ade7758_channels[] = { | |||
732 | .type = IIO_POWER, | 714 | .type = IIO_POWER, |
733 | .indexed = 1, | 715 | .indexed = 1, |
734 | .channel = 1, | 716 | .channel = 1, |
735 | .extend_name = "apparent_raw", | 717 | .extend_name = "apparent", |
736 | .info_mask_separate = BIT(IIO_CHAN_INFO_RAW), | ||
737 | .info_mask_shared_by_type = BIT(IIO_CHAN_INFO_SCALE), | ||
738 | .address = AD7758_WT(AD7758_PHASE_B, AD7758_APP_PWR), | 718 | .address = AD7758_WT(AD7758_PHASE_B, AD7758_APP_PWR), |
739 | .scan_index = 7, | 719 | .scan_index = 7, |
740 | .scan_type = { | 720 | .scan_type = { |
@@ -746,9 +726,7 @@ static const struct iio_chan_spec ade7758_channels[] = { | |||
746 | .type = IIO_POWER, | 726 | .type = IIO_POWER, |
747 | .indexed = 1, | 727 | .indexed = 1, |
748 | .channel = 1, | 728 | .channel = 1, |
749 | .extend_name = "active_raw", | 729 | .extend_name = "active", |
750 | .info_mask_separate = BIT(IIO_CHAN_INFO_RAW), | ||
751 | .info_mask_shared_by_type = BIT(IIO_CHAN_INFO_SCALE), | ||
752 | .address = AD7758_WT(AD7758_PHASE_B, AD7758_ACT_PWR), | 730 | .address = AD7758_WT(AD7758_PHASE_B, AD7758_ACT_PWR), |
753 | .scan_index = 8, | 731 | .scan_index = 8, |
754 | .scan_type = { | 732 | .scan_type = { |
@@ -760,9 +738,7 @@ static const struct iio_chan_spec ade7758_channels[] = { | |||
760 | .type = IIO_POWER, | 738 | .type = IIO_POWER, |
761 | .indexed = 1, | 739 | .indexed = 1, |
762 | .channel = 1, | 740 | .channel = 1, |
763 | .extend_name = "reactive_raw", | 741 | .extend_name = "reactive", |
764 | .info_mask_separate = BIT(IIO_CHAN_INFO_RAW), | ||
765 | .info_mask_shared_by_type = BIT(IIO_CHAN_INFO_SCALE), | ||
766 | .address = AD7758_WT(AD7758_PHASE_B, AD7758_REACT_PWR), | 742 | .address = AD7758_WT(AD7758_PHASE_B, AD7758_REACT_PWR), |
767 | .scan_index = 9, | 743 | .scan_index = 9, |
768 | .scan_type = { | 744 | .scan_type = { |
@@ -774,9 +750,6 @@ static const struct iio_chan_spec ade7758_channels[] = { | |||
774 | .type = IIO_VOLTAGE, | 750 | .type = IIO_VOLTAGE, |
775 | .indexed = 1, | 751 | .indexed = 1, |
776 | .channel = 2, | 752 | .channel = 2, |
777 | .extend_name = "raw", | ||
778 | .info_mask_separate = BIT(IIO_CHAN_INFO_RAW), | ||
779 | .info_mask_shared_by_type = BIT(IIO_CHAN_INFO_SCALE), | ||
780 | .address = AD7758_WT(AD7758_PHASE_C, AD7758_VOLTAGE), | 753 | .address = AD7758_WT(AD7758_PHASE_C, AD7758_VOLTAGE), |
781 | .scan_index = 10, | 754 | .scan_index = 10, |
782 | .scan_type = { | 755 | .scan_type = { |
@@ -788,9 +761,6 @@ static const struct iio_chan_spec ade7758_channels[] = { | |||
788 | .type = IIO_CURRENT, | 761 | .type = IIO_CURRENT, |
789 | .indexed = 1, | 762 | .indexed = 1, |
790 | .channel = 2, | 763 | .channel = 2, |
791 | .extend_name = "raw", | ||
792 | .info_mask_separate = BIT(IIO_CHAN_INFO_RAW), | ||
793 | .info_mask_shared_by_type = BIT(IIO_CHAN_INFO_SCALE), | ||
794 | .address = AD7758_WT(AD7758_PHASE_C, AD7758_CURRENT), | 764 | .address = AD7758_WT(AD7758_PHASE_C, AD7758_CURRENT), |
795 | .scan_index = 11, | 765 | .scan_index = 11, |
796 | .scan_type = { | 766 | .scan_type = { |
@@ -802,9 +772,7 @@ static const struct iio_chan_spec ade7758_channels[] = { | |||
802 | .type = IIO_POWER, | 772 | .type = IIO_POWER, |
803 | .indexed = 1, | 773 | .indexed = 1, |
804 | .channel = 2, | 774 | .channel = 2, |
805 | .extend_name = "apparent_raw", | 775 | .extend_name = "apparent", |
806 | .info_mask_separate = BIT(IIO_CHAN_INFO_RAW), | ||
807 | .info_mask_shared_by_type = BIT(IIO_CHAN_INFO_SCALE), | ||
808 | .address = AD7758_WT(AD7758_PHASE_C, AD7758_APP_PWR), | 776 | .address = AD7758_WT(AD7758_PHASE_C, AD7758_APP_PWR), |
809 | .scan_index = 12, | 777 | .scan_index = 12, |
810 | .scan_type = { | 778 | .scan_type = { |
@@ -816,9 +784,7 @@ static const struct iio_chan_spec ade7758_channels[] = { | |||
816 | .type = IIO_POWER, | 784 | .type = IIO_POWER, |
817 | .indexed = 1, | 785 | .indexed = 1, |
818 | .channel = 2, | 786 | .channel = 2, |
819 | .extend_name = "active_raw", | 787 | .extend_name = "active", |
820 | .info_mask_separate = BIT(IIO_CHAN_INFO_RAW), | ||
821 | .info_mask_shared_by_type = BIT(IIO_CHAN_INFO_SCALE), | ||
822 | .address = AD7758_WT(AD7758_PHASE_C, AD7758_ACT_PWR), | 788 | .address = AD7758_WT(AD7758_PHASE_C, AD7758_ACT_PWR), |
823 | .scan_index = 13, | 789 | .scan_index = 13, |
824 | .scan_type = { | 790 | .scan_type = { |
@@ -830,9 +796,7 @@ static const struct iio_chan_spec ade7758_channels[] = { | |||
830 | .type = IIO_POWER, | 796 | .type = IIO_POWER, |
831 | .indexed = 1, | 797 | .indexed = 1, |
832 | .channel = 2, | 798 | .channel = 2, |
833 | .extend_name = "reactive_raw", | 799 | .extend_name = "reactive", |
834 | .info_mask_separate = BIT(IIO_CHAN_INFO_RAW), | ||
835 | .info_mask_shared_by_type = BIT(IIO_CHAN_INFO_SCALE), | ||
836 | .address = AD7758_WT(AD7758_PHASE_C, AD7758_REACT_PWR), | 800 | .address = AD7758_WT(AD7758_PHASE_C, AD7758_REACT_PWR), |
837 | .scan_index = 14, | 801 | .scan_index = 14, |
838 | .scan_type = { | 802 | .scan_type = { |
@@ -873,13 +837,14 @@ static int ade7758_probe(struct spi_device *spi) | |||
873 | goto error_free_rx; | 837 | goto error_free_rx; |
874 | } | 838 | } |
875 | st->us = spi; | 839 | st->us = spi; |
876 | st->ade7758_ring_channels = &ade7758_channels[0]; | ||
877 | mutex_init(&st->buf_lock); | 840 | mutex_init(&st->buf_lock); |
878 | 841 | ||
879 | indio_dev->name = spi->dev.driver->name; | 842 | indio_dev->name = spi->dev.driver->name; |
880 | indio_dev->dev.parent = &spi->dev; | 843 | indio_dev->dev.parent = &spi->dev; |
881 | indio_dev->info = &ade7758_info; | 844 | indio_dev->info = &ade7758_info; |
882 | indio_dev->modes = INDIO_DIRECT_MODE; | 845 | indio_dev->modes = INDIO_DIRECT_MODE; |
846 | indio_dev->channels = ade7758_channels; | ||
847 | indio_dev->num_channels = ARRAY_SIZE(ade7758_channels); | ||
883 | 848 | ||
884 | ret = ade7758_configure_ring(indio_dev); | 849 | ret = ade7758_configure_ring(indio_dev); |
885 | if (ret) | 850 | if (ret) |
diff --git a/drivers/staging/iio/meter/ade7758_ring.c b/drivers/staging/iio/meter/ade7758_ring.c index c0accf8cce93..6e9006490742 100644 --- a/drivers/staging/iio/meter/ade7758_ring.c +++ b/drivers/staging/iio/meter/ade7758_ring.c | |||
@@ -85,17 +85,16 @@ static irqreturn_t ade7758_trigger_handler(int irq, void *p) | |||
85 | **/ | 85 | **/ |
86 | static int ade7758_ring_preenable(struct iio_dev *indio_dev) | 86 | static int ade7758_ring_preenable(struct iio_dev *indio_dev) |
87 | { | 87 | { |
88 | struct ade7758_state *st = iio_priv(indio_dev); | ||
89 | unsigned channel; | 88 | unsigned channel; |
90 | 89 | ||
91 | if (!bitmap_empty(indio_dev->active_scan_mask, indio_dev->masklength)) | 90 | if (bitmap_empty(indio_dev->active_scan_mask, indio_dev->masklength)) |
92 | return -EINVAL; | 91 | return -EINVAL; |
93 | 92 | ||
94 | channel = find_first_bit(indio_dev->active_scan_mask, | 93 | channel = find_first_bit(indio_dev->active_scan_mask, |
95 | indio_dev->masklength); | 94 | indio_dev->masklength); |
96 | 95 | ||
97 | ade7758_write_waveform_type(&indio_dev->dev, | 96 | ade7758_write_waveform_type(&indio_dev->dev, |
98 | st->ade7758_ring_channels[channel].address); | 97 | indio_dev->channels[channel].address); |
99 | 98 | ||
100 | return 0; | 99 | return 0; |
101 | } | 100 | } |
diff --git a/drivers/staging/rtl8723au/include/rtw_eeprom.h b/drivers/staging/rtl8723au/include/rtw_eeprom.h index e5121a2a64b4..a86f36e49dd1 100644 --- a/drivers/staging/rtl8723au/include/rtw_eeprom.h +++ b/drivers/staging/rtl8723au/include/rtw_eeprom.h | |||
@@ -107,12 +107,12 @@ enum rt_customer_id | |||
107 | }; | 107 | }; |
108 | 108 | ||
109 | struct eeprom_priv { | 109 | struct eeprom_priv { |
110 | u8 mac_addr[6]; /* PermanentAddress */ | ||
110 | u8 bautoload_fail_flag; | 111 | u8 bautoload_fail_flag; |
111 | u8 bloadfile_fail_flag; | 112 | u8 bloadfile_fail_flag; |
112 | u8 bloadmac_fail_flag; | 113 | u8 bloadmac_fail_flag; |
113 | /* u8 bempty; */ | 114 | /* u8 bempty; */ |
114 | /* u8 sys_config; */ | 115 | /* u8 sys_config; */ |
115 | u8 mac_addr[6]; /* PermanentAddress */ | ||
116 | /* u8 config0; */ | 116 | /* u8 config0; */ |
117 | u16 channel_plan; | 117 | u16 channel_plan; |
118 | /* u8 country_string[3]; */ | 118 | /* u8 country_string[3]; */ |
diff --git a/drivers/thermal/of-thermal.c b/drivers/thermal/of-thermal.c index f8eb625b8400..62143ba31001 100644 --- a/drivers/thermal/of-thermal.c +++ b/drivers/thermal/of-thermal.c | |||
@@ -387,15 +387,18 @@ thermal_zone_of_sensor_register(struct device *dev, int sensor_id, | |||
387 | int (*get_trend)(void *, long *)) | 387 | int (*get_trend)(void *, long *)) |
388 | { | 388 | { |
389 | struct device_node *np, *child, *sensor_np; | 389 | struct device_node *np, *child, *sensor_np; |
390 | struct thermal_zone_device *tzd = ERR_PTR(-ENODEV); | ||
390 | 391 | ||
391 | np = of_find_node_by_name(NULL, "thermal-zones"); | 392 | np = of_find_node_by_name(NULL, "thermal-zones"); |
392 | if (!np) | 393 | if (!np) |
393 | return ERR_PTR(-ENODEV); | 394 | return ERR_PTR(-ENODEV); |
394 | 395 | ||
395 | if (!dev || !dev->of_node) | 396 | if (!dev || !dev->of_node) { |
397 | of_node_put(np); | ||
396 | return ERR_PTR(-EINVAL); | 398 | return ERR_PTR(-EINVAL); |
399 | } | ||
397 | 400 | ||
398 | sensor_np = dev->of_node; | 401 | sensor_np = of_node_get(dev->of_node); |
399 | 402 | ||
400 | for_each_child_of_node(np, child) { | 403 | for_each_child_of_node(np, child) { |
401 | struct of_phandle_args sensor_specs; | 404 | struct of_phandle_args sensor_specs; |
@@ -422,16 +425,21 @@ thermal_zone_of_sensor_register(struct device *dev, int sensor_id, | |||
422 | } | 425 | } |
423 | 426 | ||
424 | if (sensor_specs.np == sensor_np && id == sensor_id) { | 427 | if (sensor_specs.np == sensor_np && id == sensor_id) { |
425 | of_node_put(np); | 428 | tzd = thermal_zone_of_add_sensor(child, sensor_np, |
426 | return thermal_zone_of_add_sensor(child, sensor_np, | 429 | data, |
427 | data, | 430 | get_temp, |
428 | get_temp, | 431 | get_trend); |
429 | get_trend); | 432 | of_node_put(sensor_specs.np); |
433 | of_node_put(child); | ||
434 | goto exit; | ||
430 | } | 435 | } |
436 | of_node_put(sensor_specs.np); | ||
431 | } | 437 | } |
438 | exit: | ||
439 | of_node_put(sensor_np); | ||
432 | of_node_put(np); | 440 | of_node_put(np); |
433 | 441 | ||
434 | return ERR_PTR(-ENODEV); | 442 | return tzd; |
435 | } | 443 | } |
436 | EXPORT_SYMBOL_GPL(thermal_zone_of_sensor_register); | 444 | EXPORT_SYMBOL_GPL(thermal_zone_of_sensor_register); |
437 | 445 | ||
@@ -623,6 +631,7 @@ static int thermal_of_populate_trip(struct device_node *np, | |||
623 | 631 | ||
624 | /* Required for cooling map matching */ | 632 | /* Required for cooling map matching */ |
625 | trip->np = np; | 633 | trip->np = np; |
634 | of_node_get(np); | ||
626 | 635 | ||
627 | return 0; | 636 | return 0; |
628 | } | 637 | } |
@@ -730,9 +739,14 @@ finish: | |||
730 | return tz; | 739 | return tz; |
731 | 740 | ||
732 | free_tbps: | 741 | free_tbps: |
742 | for (i = 0; i < tz->num_tbps; i++) | ||
743 | of_node_put(tz->tbps[i].cooling_device); | ||
733 | kfree(tz->tbps); | 744 | kfree(tz->tbps); |
734 | free_trips: | 745 | free_trips: |
746 | for (i = 0; i < tz->ntrips; i++) | ||
747 | of_node_put(tz->trips[i].np); | ||
735 | kfree(tz->trips); | 748 | kfree(tz->trips); |
749 | of_node_put(gchild); | ||
736 | free_tz: | 750 | free_tz: |
737 | kfree(tz); | 751 | kfree(tz); |
738 | of_node_put(child); | 752 | of_node_put(child); |
@@ -742,7 +756,13 @@ free_tz: | |||
742 | 756 | ||
743 | static inline void of_thermal_free_zone(struct __thermal_zone *tz) | 757 | static inline void of_thermal_free_zone(struct __thermal_zone *tz) |
744 | { | 758 | { |
759 | int i; | ||
760 | |||
761 | for (i = 0; i < tz->num_tbps; i++) | ||
762 | of_node_put(tz->tbps[i].cooling_device); | ||
745 | kfree(tz->tbps); | 763 | kfree(tz->tbps); |
764 | for (i = 0; i < tz->ntrips; i++) | ||
765 | of_node_put(tz->trips[i].np); | ||
746 | kfree(tz->trips); | 766 | kfree(tz->trips); |
747 | kfree(tz); | 767 | kfree(tz); |
748 | } | 768 | } |
@@ -814,10 +834,13 @@ int __init of_parse_thermal_zones(void) | |||
814 | /* attempting to build remaining zones still */ | 834 | /* attempting to build remaining zones still */ |
815 | } | 835 | } |
816 | } | 836 | } |
837 | of_node_put(np); | ||
817 | 838 | ||
818 | return 0; | 839 | return 0; |
819 | 840 | ||
820 | exit_free: | 841 | exit_free: |
842 | of_node_put(child); | ||
843 | of_node_put(np); | ||
821 | of_thermal_free_zone(tz); | 844 | of_thermal_free_zone(tz); |
822 | 845 | ||
823 | /* no memory available, so free what we have built */ | 846 | /* no memory available, so free what we have built */ |
@@ -859,4 +882,5 @@ void of_thermal_destroy_zones(void) | |||
859 | kfree(zone->ops); | 882 | kfree(zone->ops); |
860 | of_thermal_free_zone(zone->devdata); | 883 | of_thermal_free_zone(zone->devdata); |
861 | } | 884 | } |
885 | of_node_put(np); | ||
862 | } | 886 | } |
diff --git a/drivers/thermal/samsung/exynos_thermal_common.h b/drivers/thermal/samsung/exynos_thermal_common.h index 3eb2ed9ea3a4..158f5aa8dc5d 100644 --- a/drivers/thermal/samsung/exynos_thermal_common.h +++ b/drivers/thermal/samsung/exynos_thermal_common.h | |||
@@ -27,7 +27,7 @@ | |||
27 | #define SENSOR_NAME_LEN 16 | 27 | #define SENSOR_NAME_LEN 16 |
28 | #define MAX_TRIP_COUNT 8 | 28 | #define MAX_TRIP_COUNT 8 |
29 | #define MAX_COOLING_DEVICE 4 | 29 | #define MAX_COOLING_DEVICE 4 |
30 | #define MAX_THRESHOLD_LEVS 5 | 30 | #define MAX_TRIMINFO_CTRL_REG 2 |
31 | 31 | ||
32 | #define ACTIVE_INTERVAL 500 | 32 | #define ACTIVE_INTERVAL 500 |
33 | #define IDLE_INTERVAL 10000 | 33 | #define IDLE_INTERVAL 10000 |
diff --git a/drivers/thermal/samsung/exynos_tmu.c b/drivers/thermal/samsung/exynos_tmu.c index acbff14da3a4..49c09243fd38 100644 --- a/drivers/thermal/samsung/exynos_tmu.c +++ b/drivers/thermal/samsung/exynos_tmu.c | |||
@@ -77,16 +77,6 @@ static int temp_to_code(struct exynos_tmu_data *data, u8 temp) | |||
77 | struct exynos_tmu_platform_data *pdata = data->pdata; | 77 | struct exynos_tmu_platform_data *pdata = data->pdata; |
78 | int temp_code; | 78 | int temp_code; |
79 | 79 | ||
80 | if (pdata->cal_mode == HW_MODE) | ||
81 | return temp; | ||
82 | |||
83 | if (data->soc == SOC_ARCH_EXYNOS4210) | ||
84 | /* temp should range between 25 and 125 */ | ||
85 | if (temp < 25 || temp > 125) { | ||
86 | temp_code = -EINVAL; | ||
87 | goto out; | ||
88 | } | ||
89 | |||
90 | switch (pdata->cal_type) { | 80 | switch (pdata->cal_type) { |
91 | case TYPE_TWO_POINT_TRIMMING: | 81 | case TYPE_TWO_POINT_TRIMMING: |
92 | temp_code = (temp - pdata->first_point_trim) * | 82 | temp_code = (temp - pdata->first_point_trim) * |
@@ -101,7 +91,7 @@ static int temp_to_code(struct exynos_tmu_data *data, u8 temp) | |||
101 | temp_code = temp + pdata->default_temp_offset; | 91 | temp_code = temp + pdata->default_temp_offset; |
102 | break; | 92 | break; |
103 | } | 93 | } |
104 | out: | 94 | |
105 | return temp_code; | 95 | return temp_code; |
106 | } | 96 | } |
107 | 97 | ||
@@ -114,16 +104,6 @@ static int code_to_temp(struct exynos_tmu_data *data, u8 temp_code) | |||
114 | struct exynos_tmu_platform_data *pdata = data->pdata; | 104 | struct exynos_tmu_platform_data *pdata = data->pdata; |
115 | int temp; | 105 | int temp; |
116 | 106 | ||
117 | if (pdata->cal_mode == HW_MODE) | ||
118 | return temp_code; | ||
119 | |||
120 | if (data->soc == SOC_ARCH_EXYNOS4210) | ||
121 | /* temp_code should range between 75 and 175 */ | ||
122 | if (temp_code < 75 || temp_code > 175) { | ||
123 | temp = -ENODATA; | ||
124 | goto out; | ||
125 | } | ||
126 | |||
127 | switch (pdata->cal_type) { | 107 | switch (pdata->cal_type) { |
128 | case TYPE_TWO_POINT_TRIMMING: | 108 | case TYPE_TWO_POINT_TRIMMING: |
129 | temp = (temp_code - data->temp_error1) * | 109 | temp = (temp_code - data->temp_error1) * |
@@ -138,18 +118,35 @@ static int code_to_temp(struct exynos_tmu_data *data, u8 temp_code) | |||
138 | temp = temp_code - pdata->default_temp_offset; | 118 | temp = temp_code - pdata->default_temp_offset; |
139 | break; | 119 | break; |
140 | } | 120 | } |
141 | out: | 121 | |
142 | return temp; | 122 | return temp; |
143 | } | 123 | } |
144 | 124 | ||
125 | static void exynos_tmu_clear_irqs(struct exynos_tmu_data *data) | ||
126 | { | ||
127 | const struct exynos_tmu_registers *reg = data->pdata->registers; | ||
128 | unsigned int val_irq; | ||
129 | |||
130 | val_irq = readl(data->base + reg->tmu_intstat); | ||
131 | /* | ||
132 | * Clear the interrupts. Please note that the documentation for | ||
133 | * Exynos3250, Exynos4412, Exynos5250 and Exynos5260 incorrectly | ||
134 | * states that INTCLEAR register has a different placing of bits | ||
135 | * responsible for FALL IRQs than INTSTAT register. Exynos5420 | ||
136 | * and Exynos5440 documentation is correct (Exynos4210 doesn't | ||
137 | * support FALL IRQs at all). | ||
138 | */ | ||
139 | writel(val_irq, data->base + reg->tmu_intclear); | ||
140 | } | ||
141 | |||
145 | static int exynos_tmu_initialize(struct platform_device *pdev) | 142 | static int exynos_tmu_initialize(struct platform_device *pdev) |
146 | { | 143 | { |
147 | struct exynos_tmu_data *data = platform_get_drvdata(pdev); | 144 | struct exynos_tmu_data *data = platform_get_drvdata(pdev); |
148 | struct exynos_tmu_platform_data *pdata = data->pdata; | 145 | struct exynos_tmu_platform_data *pdata = data->pdata; |
149 | const struct exynos_tmu_registers *reg = pdata->registers; | 146 | const struct exynos_tmu_registers *reg = pdata->registers; |
150 | unsigned int status, trim_info = 0, con; | 147 | unsigned int status, trim_info = 0, con, ctrl; |
151 | unsigned int rising_threshold = 0, falling_threshold = 0; | 148 | unsigned int rising_threshold = 0, falling_threshold = 0; |
152 | int ret = 0, threshold_code, i, trigger_levs = 0; | 149 | int ret = 0, threshold_code, i; |
153 | 150 | ||
154 | mutex_lock(&data->lock); | 151 | mutex_lock(&data->lock); |
155 | clk_enable(data->clk); | 152 | clk_enable(data->clk); |
@@ -164,11 +161,17 @@ static int exynos_tmu_initialize(struct platform_device *pdev) | |||
164 | } | 161 | } |
165 | } | 162 | } |
166 | 163 | ||
167 | if (TMU_SUPPORTS(pdata, TRIM_RELOAD)) | 164 | if (TMU_SUPPORTS(pdata, TRIM_RELOAD)) { |
168 | __raw_writel(1, data->base + reg->triminfo_ctrl); | 165 | for (i = 0; i < reg->triminfo_ctrl_count; i++) { |
169 | 166 | if (pdata->triminfo_reload[i]) { | |
170 | if (pdata->cal_mode == HW_MODE) | 167 | ctrl = readl(data->base + |
171 | goto skip_calib_data; | 168 | reg->triminfo_ctrl[i]); |
169 | ctrl |= pdata->triminfo_reload[i]; | ||
170 | writel(ctrl, data->base + | ||
171 | reg->triminfo_ctrl[i]); | ||
172 | } | ||
173 | } | ||
174 | } | ||
172 | 175 | ||
173 | /* Save trimming info in order to perform calibration */ | 176 | /* Save trimming info in order to perform calibration */ |
174 | if (data->soc == SOC_ARCH_EXYNOS5440) { | 177 | if (data->soc == SOC_ARCH_EXYNOS5440) { |
@@ -197,7 +200,7 @@ static int exynos_tmu_initialize(struct platform_device *pdev) | |||
197 | trim_info = readl(data->base + reg->triminfo_data); | 200 | trim_info = readl(data->base + reg->triminfo_data); |
198 | } | 201 | } |
199 | data->temp_error1 = trim_info & EXYNOS_TMU_TEMP_MASK; | 202 | data->temp_error1 = trim_info & EXYNOS_TMU_TEMP_MASK; |
200 | data->temp_error2 = ((trim_info >> reg->triminfo_85_shift) & | 203 | data->temp_error2 = ((trim_info >> EXYNOS_TRIMINFO_85_SHIFT) & |
201 | EXYNOS_TMU_TEMP_MASK); | 204 | EXYNOS_TMU_TEMP_MASK); |
202 | 205 | ||
203 | if (!data->temp_error1 || | 206 | if (!data->temp_error1 || |
@@ -207,67 +210,33 @@ static int exynos_tmu_initialize(struct platform_device *pdev) | |||
207 | 210 | ||
208 | if (!data->temp_error2) | 211 | if (!data->temp_error2) |
209 | data->temp_error2 = | 212 | data->temp_error2 = |
210 | (pdata->efuse_value >> reg->triminfo_85_shift) & | 213 | (pdata->efuse_value >> EXYNOS_TRIMINFO_85_SHIFT) & |
211 | EXYNOS_TMU_TEMP_MASK; | 214 | EXYNOS_TMU_TEMP_MASK; |
212 | 215 | ||
213 | skip_calib_data: | ||
214 | if (pdata->max_trigger_level > MAX_THRESHOLD_LEVS) { | ||
215 | dev_err(&pdev->dev, "Invalid max trigger level\n"); | ||
216 | ret = -EINVAL; | ||
217 | goto out; | ||
218 | } | ||
219 | |||
220 | for (i = 0; i < pdata->max_trigger_level; i++) { | ||
221 | if (!pdata->trigger_levels[i]) | ||
222 | continue; | ||
223 | |||
224 | if ((pdata->trigger_type[i] == HW_TRIP) && | ||
225 | (!pdata->trigger_levels[pdata->max_trigger_level - 1])) { | ||
226 | dev_err(&pdev->dev, "Invalid hw trigger level\n"); | ||
227 | ret = -EINVAL; | ||
228 | goto out; | ||
229 | } | ||
230 | |||
231 | /* Count trigger levels except the HW trip*/ | ||
232 | if (!(pdata->trigger_type[i] == HW_TRIP)) | ||
233 | trigger_levs++; | ||
234 | } | ||
235 | |||
236 | rising_threshold = readl(data->base + reg->threshold_th0); | 216 | rising_threshold = readl(data->base + reg->threshold_th0); |
237 | 217 | ||
238 | if (data->soc == SOC_ARCH_EXYNOS4210) { | 218 | if (data->soc == SOC_ARCH_EXYNOS4210) { |
239 | /* Write temperature code for threshold */ | 219 | /* Write temperature code for threshold */ |
240 | threshold_code = temp_to_code(data, pdata->threshold); | 220 | threshold_code = temp_to_code(data, pdata->threshold); |
241 | if (threshold_code < 0) { | ||
242 | ret = threshold_code; | ||
243 | goto out; | ||
244 | } | ||
245 | writeb(threshold_code, | 221 | writeb(threshold_code, |
246 | data->base + reg->threshold_temp); | 222 | data->base + reg->threshold_temp); |
247 | for (i = 0; i < trigger_levs; i++) | 223 | for (i = 0; i < pdata->non_hw_trigger_levels; i++) |
248 | writeb(pdata->trigger_levels[i], data->base + | 224 | writeb(pdata->trigger_levels[i], data->base + |
249 | reg->threshold_th0 + i * sizeof(reg->threshold_th0)); | 225 | reg->threshold_th0 + i * sizeof(reg->threshold_th0)); |
250 | 226 | ||
251 | writel(reg->intclr_rise_mask, data->base + reg->tmu_intclear); | 227 | exynos_tmu_clear_irqs(data); |
252 | } else { | 228 | } else { |
253 | /* Write temperature code for rising and falling threshold */ | 229 | /* Write temperature code for rising and falling threshold */ |
254 | for (i = 0; | 230 | for (i = 0; i < pdata->non_hw_trigger_levels; i++) { |
255 | i < trigger_levs && i < EXYNOS_MAX_TRIGGER_PER_REG; i++) { | ||
256 | threshold_code = temp_to_code(data, | 231 | threshold_code = temp_to_code(data, |
257 | pdata->trigger_levels[i]); | 232 | pdata->trigger_levels[i]); |
258 | if (threshold_code < 0) { | ||
259 | ret = threshold_code; | ||
260 | goto out; | ||
261 | } | ||
262 | rising_threshold &= ~(0xff << 8 * i); | 233 | rising_threshold &= ~(0xff << 8 * i); |
263 | rising_threshold |= threshold_code << 8 * i; | 234 | rising_threshold |= threshold_code << 8 * i; |
264 | if (pdata->threshold_falling) { | 235 | if (pdata->threshold_falling) { |
265 | threshold_code = temp_to_code(data, | 236 | threshold_code = temp_to_code(data, |
266 | pdata->trigger_levels[i] - | 237 | pdata->trigger_levels[i] - |
267 | pdata->threshold_falling); | 238 | pdata->threshold_falling); |
268 | if (threshold_code > 0) | 239 | falling_threshold |= threshold_code << 8 * i; |
269 | falling_threshold |= | ||
270 | threshold_code << 8 * i; | ||
271 | } | 240 | } |
272 | } | 241 | } |
273 | 242 | ||
@@ -276,9 +245,7 @@ skip_calib_data: | |||
276 | writel(falling_threshold, | 245 | writel(falling_threshold, |
277 | data->base + reg->threshold_th1); | 246 | data->base + reg->threshold_th1); |
278 | 247 | ||
279 | writel((reg->intclr_rise_mask << reg->intclr_rise_shift) | | 248 | exynos_tmu_clear_irqs(data); |
280 | (reg->intclr_fall_mask << reg->intclr_fall_shift), | ||
281 | data->base + reg->tmu_intclear); | ||
282 | 249 | ||
283 | /* if last threshold limit is also present */ | 250 | /* if last threshold limit is also present */ |
284 | i = pdata->max_trigger_level - 1; | 251 | i = pdata->max_trigger_level - 1; |
@@ -286,10 +253,6 @@ skip_calib_data: | |||
286 | (pdata->trigger_type[i] == HW_TRIP)) { | 253 | (pdata->trigger_type[i] == HW_TRIP)) { |
287 | threshold_code = temp_to_code(data, | 254 | threshold_code = temp_to_code(data, |
288 | pdata->trigger_levels[i]); | 255 | pdata->trigger_levels[i]); |
289 | if (threshold_code < 0) { | ||
290 | ret = threshold_code; | ||
291 | goto out; | ||
292 | } | ||
293 | if (i == EXYNOS_MAX_TRIGGER_PER_REG - 1) { | 256 | if (i == EXYNOS_MAX_TRIGGER_PER_REG - 1) { |
294 | /* 1-4 level to be assigned in th0 reg */ | 257 | /* 1-4 level to be assigned in th0 reg */ |
295 | rising_threshold &= ~(0xff << 8 * i); | 258 | rising_threshold &= ~(0xff << 8 * i); |
@@ -325,7 +288,7 @@ static void exynos_tmu_control(struct platform_device *pdev, bool on) | |||
325 | struct exynos_tmu_data *data = platform_get_drvdata(pdev); | 288 | struct exynos_tmu_data *data = platform_get_drvdata(pdev); |
326 | struct exynos_tmu_platform_data *pdata = data->pdata; | 289 | struct exynos_tmu_platform_data *pdata = data->pdata; |
327 | const struct exynos_tmu_registers *reg = pdata->registers; | 290 | const struct exynos_tmu_registers *reg = pdata->registers; |
328 | unsigned int con, interrupt_en, cal_val; | 291 | unsigned int con, interrupt_en; |
329 | 292 | ||
330 | mutex_lock(&data->lock); | 293 | mutex_lock(&data->lock); |
331 | clk_enable(data->clk); | 294 | clk_enable(data->clk); |
@@ -335,15 +298,11 @@ static void exynos_tmu_control(struct platform_device *pdev, bool on) | |||
335 | if (pdata->test_mux) | 298 | if (pdata->test_mux) |
336 | con |= (pdata->test_mux << reg->test_mux_addr_shift); | 299 | con |= (pdata->test_mux << reg->test_mux_addr_shift); |
337 | 300 | ||
338 | if (pdata->reference_voltage) { | 301 | con &= ~(EXYNOS_TMU_REF_VOLTAGE_MASK << EXYNOS_TMU_REF_VOLTAGE_SHIFT); |
339 | con &= ~(reg->buf_vref_sel_mask << reg->buf_vref_sel_shift); | 302 | con |= pdata->reference_voltage << EXYNOS_TMU_REF_VOLTAGE_SHIFT; |
340 | con |= pdata->reference_voltage << reg->buf_vref_sel_shift; | ||
341 | } | ||
342 | 303 | ||
343 | if (pdata->gain) { | 304 | con &= ~(EXYNOS_TMU_BUF_SLOPE_SEL_MASK << EXYNOS_TMU_BUF_SLOPE_SEL_SHIFT); |
344 | con &= ~(reg->buf_slope_sel_mask << reg->buf_slope_sel_shift); | 305 | con |= (pdata->gain << EXYNOS_TMU_BUF_SLOPE_SEL_SHIFT); |
345 | con |= (pdata->gain << reg->buf_slope_sel_shift); | ||
346 | } | ||
347 | 306 | ||
348 | if (pdata->noise_cancel_mode) { | 307 | if (pdata->noise_cancel_mode) { |
349 | con &= ~(reg->therm_trip_mode_mask << | 308 | con &= ~(reg->therm_trip_mode_mask << |
@@ -351,29 +310,8 @@ static void exynos_tmu_control(struct platform_device *pdev, bool on) | |||
351 | con |= (pdata->noise_cancel_mode << reg->therm_trip_mode_shift); | 310 | con |= (pdata->noise_cancel_mode << reg->therm_trip_mode_shift); |
352 | } | 311 | } |
353 | 312 | ||
354 | if (pdata->cal_mode == HW_MODE) { | ||
355 | con &= ~(reg->calib_mode_mask << reg->calib_mode_shift); | ||
356 | cal_val = 0; | ||
357 | switch (pdata->cal_type) { | ||
358 | case TYPE_TWO_POINT_TRIMMING: | ||
359 | cal_val = 3; | ||
360 | break; | ||
361 | case TYPE_ONE_POINT_TRIMMING_85: | ||
362 | cal_val = 2; | ||
363 | break; | ||
364 | case TYPE_ONE_POINT_TRIMMING_25: | ||
365 | cal_val = 1; | ||
366 | break; | ||
367 | case TYPE_NONE: | ||
368 | break; | ||
369 | default: | ||
370 | dev_err(&pdev->dev, "Invalid calibration type, using none\n"); | ||
371 | } | ||
372 | con |= cal_val << reg->calib_mode_shift; | ||
373 | } | ||
374 | |||
375 | if (on) { | 313 | if (on) { |
376 | con |= (1 << reg->core_en_shift); | 314 | con |= (1 << EXYNOS_TMU_CORE_EN_SHIFT); |
377 | interrupt_en = | 315 | interrupt_en = |
378 | pdata->trigger_enable[3] << reg->inten_rise3_shift | | 316 | pdata->trigger_enable[3] << reg->inten_rise3_shift | |
379 | pdata->trigger_enable[2] << reg->inten_rise2_shift | | 317 | pdata->trigger_enable[2] << reg->inten_rise2_shift | |
@@ -383,7 +321,7 @@ static void exynos_tmu_control(struct platform_device *pdev, bool on) | |||
383 | interrupt_en |= | 321 | interrupt_en |= |
384 | interrupt_en << reg->inten_fall0_shift; | 322 | interrupt_en << reg->inten_fall0_shift; |
385 | } else { | 323 | } else { |
386 | con &= ~(1 << reg->core_en_shift); | 324 | con &= ~(1 << EXYNOS_TMU_CORE_EN_SHIFT); |
387 | interrupt_en = 0; /* Disable all interrupts */ | 325 | interrupt_en = 0; /* Disable all interrupts */ |
388 | } | 326 | } |
389 | writel(interrupt_en, data->base + reg->tmu_inten); | 327 | writel(interrupt_en, data->base + reg->tmu_inten); |
@@ -404,8 +342,16 @@ static int exynos_tmu_read(struct exynos_tmu_data *data) | |||
404 | clk_enable(data->clk); | 342 | clk_enable(data->clk); |
405 | 343 | ||
406 | temp_code = readb(data->base + reg->tmu_cur_temp); | 344 | temp_code = readb(data->base + reg->tmu_cur_temp); |
407 | temp = code_to_temp(data, temp_code); | ||
408 | 345 | ||
346 | if (data->soc == SOC_ARCH_EXYNOS4210) | ||
347 | /* temp_code should range between 75 and 175 */ | ||
348 | if (temp_code < 75 || temp_code > 175) { | ||
349 | temp = -ENODATA; | ||
350 | goto out; | ||
351 | } | ||
352 | |||
353 | temp = code_to_temp(data, temp_code); | ||
354 | out: | ||
409 | clk_disable(data->clk); | 355 | clk_disable(data->clk); |
410 | mutex_unlock(&data->lock); | 356 | mutex_unlock(&data->lock); |
411 | 357 | ||
@@ -465,7 +411,7 @@ static void exynos_tmu_work(struct work_struct *work) | |||
465 | struct exynos_tmu_data, irq_work); | 411 | struct exynos_tmu_data, irq_work); |
466 | struct exynos_tmu_platform_data *pdata = data->pdata; | 412 | struct exynos_tmu_platform_data *pdata = data->pdata; |
467 | const struct exynos_tmu_registers *reg = pdata->registers; | 413 | const struct exynos_tmu_registers *reg = pdata->registers; |
468 | unsigned int val_irq, val_type; | 414 | unsigned int val_type; |
469 | 415 | ||
470 | if (!IS_ERR(data->clk_sec)) | 416 | if (!IS_ERR(data->clk_sec)) |
471 | clk_enable(data->clk_sec); | 417 | clk_enable(data->clk_sec); |
@@ -483,9 +429,7 @@ static void exynos_tmu_work(struct work_struct *work) | |||
483 | clk_enable(data->clk); | 429 | clk_enable(data->clk); |
484 | 430 | ||
485 | /* TODO: take action based on particular interrupt */ | 431 | /* TODO: take action based on particular interrupt */ |
486 | val_irq = readl(data->base + reg->tmu_intstat); | 432 | exynos_tmu_clear_irqs(data); |
487 | /* clear the interrupts */ | ||
488 | writel(val_irq, data->base + reg->tmu_intclear); | ||
489 | 433 | ||
490 | clk_disable(data->clk); | 434 | clk_disable(data->clk); |
491 | mutex_unlock(&data->lock); | 435 | mutex_unlock(&data->lock); |
diff --git a/drivers/thermal/samsung/exynos_tmu.h b/drivers/thermal/samsung/exynos_tmu.h index 1b4a6444ea61..c58c7663a3fe 100644 --- a/drivers/thermal/samsung/exynos_tmu.h +++ b/drivers/thermal/samsung/exynos_tmu.h | |||
@@ -34,11 +34,6 @@ enum calibration_type { | |||
34 | TYPE_NONE, | 34 | TYPE_NONE, |
35 | }; | 35 | }; |
36 | 36 | ||
37 | enum calibration_mode { | ||
38 | SW_MODE, | ||
39 | HW_MODE, | ||
40 | }; | ||
41 | |||
42 | enum soc_type { | 37 | enum soc_type { |
43 | SOC_ARCH_EXYNOS3250 = 1, | 38 | SOC_ARCH_EXYNOS3250 = 1, |
44 | SOC_ARCH_EXYNOS4210, | 39 | SOC_ARCH_EXYNOS4210, |
@@ -82,46 +77,19 @@ enum soc_type { | |||
82 | * bitfields. The register validity, offsets and bitfield values may vary | 77 | * bitfields. The register validity, offsets and bitfield values may vary |
83 | * slightly across different exynos SOC's. | 78 | * slightly across different exynos SOC's. |
84 | * @triminfo_data: register containing 2 pont trimming data | 79 | * @triminfo_data: register containing 2 pont trimming data |
85 | * @triminfo_25_shift: shift bit of the 25 C trim value in triminfo_data reg. | ||
86 | * @triminfo_85_shift: shift bit of the 85 C trim value in triminfo_data reg. | ||
87 | * @triminfo_ctrl: trim info controller register. | 80 | * @triminfo_ctrl: trim info controller register. |
88 | * @triminfo_reload_shift: shift of triminfo reload enable bit in triminfo_ctrl | 81 | * @triminfo_ctrl_count: the number of trim info controller register. |
89 | reg. | ||
90 | * @tmu_ctrl: TMU main controller register. | 82 | * @tmu_ctrl: TMU main controller register. |
91 | * @test_mux_addr_shift: shift bits of test mux address. | 83 | * @test_mux_addr_shift: shift bits of test mux address. |
92 | * @buf_vref_sel_shift: shift bits of reference voltage in tmu_ctrl register. | ||
93 | * @buf_vref_sel_mask: mask bits of reference voltage in tmu_ctrl register. | ||
94 | * @therm_trip_mode_shift: shift bits of tripping mode in tmu_ctrl register. | 84 | * @therm_trip_mode_shift: shift bits of tripping mode in tmu_ctrl register. |
95 | * @therm_trip_mode_mask: mask bits of tripping mode in tmu_ctrl register. | 85 | * @therm_trip_mode_mask: mask bits of tripping mode in tmu_ctrl register. |
96 | * @therm_trip_en_shift: shift bits of tripping enable in tmu_ctrl register. | 86 | * @therm_trip_en_shift: shift bits of tripping enable in tmu_ctrl register. |
97 | * @buf_slope_sel_shift: shift bits of amplifier gain value in tmu_ctrl | ||
98 | register. | ||
99 | * @buf_slope_sel_mask: mask bits of amplifier gain value in tmu_ctrl register. | ||
100 | * @calib_mode_shift: shift bits of calibration mode value in tmu_ctrl | ||
101 | register. | ||
102 | * @calib_mode_mask: mask bits of calibration mode value in tmu_ctrl | ||
103 | register. | ||
104 | * @therm_trip_tq_en_shift: shift bits of thermal trip enable by TQ pin in | ||
105 | tmu_ctrl register. | ||
106 | * @core_en_shift: shift bits of TMU core enable bit in tmu_ctrl register. | ||
107 | * @tmu_status: register drescribing the TMU status. | 87 | * @tmu_status: register drescribing the TMU status. |
108 | * @tmu_cur_temp: register containing the current temperature of the TMU. | 88 | * @tmu_cur_temp: register containing the current temperature of the TMU. |
109 | * @tmu_cur_temp_shift: shift bits of current temp value in tmu_cur_temp | ||
110 | register. | ||
111 | * @threshold_temp: register containing the base threshold level. | 89 | * @threshold_temp: register containing the base threshold level. |
112 | * @threshold_th0: Register containing first set of rising levels. | 90 | * @threshold_th0: Register containing first set of rising levels. |
113 | * @threshold_th0_l0_shift: shift bits of level0 threshold temperature. | ||
114 | * @threshold_th0_l1_shift: shift bits of level1 threshold temperature. | ||
115 | * @threshold_th0_l2_shift: shift bits of level2 threshold temperature. | ||
116 | * @threshold_th0_l3_shift: shift bits of level3 threshold temperature. | ||
117 | * @threshold_th1: Register containing second set of rising levels. | 91 | * @threshold_th1: Register containing second set of rising levels. |
118 | * @threshold_th1_l0_shift: shift bits of level0 threshold temperature. | ||
119 | * @threshold_th1_l1_shift: shift bits of level1 threshold temperature. | ||
120 | * @threshold_th1_l2_shift: shift bits of level2 threshold temperature. | ||
121 | * @threshold_th1_l3_shift: shift bits of level3 threshold temperature. | ||
122 | * @threshold_th2: Register containing third set of rising levels. | 92 | * @threshold_th2: Register containing third set of rising levels. |
123 | * @threshold_th2_l0_shift: shift bits of level0 threshold temperature. | ||
124 | * @threshold_th3: Register containing fourth set of rising levels. | ||
125 | * @threshold_th3_l0_shift: shift bits of level0 threshold temperature. | 93 | * @threshold_th3_l0_shift: shift bits of level0 threshold temperature. |
126 | * @tmu_inten: register containing the different threshold interrupt | 94 | * @tmu_inten: register containing the different threshold interrupt |
127 | enable bits. | 95 | enable bits. |
@@ -130,68 +98,35 @@ enum soc_type { | |||
130 | * @inten_rise2_shift: shift bits of rising 2 interrupt bits. | 98 | * @inten_rise2_shift: shift bits of rising 2 interrupt bits. |
131 | * @inten_rise3_shift: shift bits of rising 3 interrupt bits. | 99 | * @inten_rise3_shift: shift bits of rising 3 interrupt bits. |
132 | * @inten_fall0_shift: shift bits of falling 0 interrupt bits. | 100 | * @inten_fall0_shift: shift bits of falling 0 interrupt bits. |
133 | * @inten_fall1_shift: shift bits of falling 1 interrupt bits. | ||
134 | * @inten_fall2_shift: shift bits of falling 2 interrupt bits. | ||
135 | * @inten_fall3_shift: shift bits of falling 3 interrupt bits. | ||
136 | * @tmu_intstat: Register containing the interrupt status values. | 101 | * @tmu_intstat: Register containing the interrupt status values. |
137 | * @tmu_intclear: Register for clearing the raised interrupt status. | 102 | * @tmu_intclear: Register for clearing the raised interrupt status. |
138 | * @intclr_fall_shift: shift bits for interrupt clear fall 0 | ||
139 | * @intclr_rise_shift: shift bits of all rising interrupt bits. | ||
140 | * @intclr_rise_mask: mask bits of all rising interrupt bits. | ||
141 | * @intclr_fall_mask: mask bits of all rising interrupt bits. | ||
142 | * @emul_con: TMU emulation controller register. | 103 | * @emul_con: TMU emulation controller register. |
143 | * @emul_temp_shift: shift bits of emulation temperature. | 104 | * @emul_temp_shift: shift bits of emulation temperature. |
144 | * @emul_time_shift: shift bits of emulation time. | 105 | * @emul_time_shift: shift bits of emulation time. |
145 | * @emul_time_mask: mask bits of emulation time. | ||
146 | * @tmu_irqstatus: register to find which TMU generated interrupts. | 106 | * @tmu_irqstatus: register to find which TMU generated interrupts. |
147 | * @tmu_pmin: register to get/set the Pmin value. | 107 | * @tmu_pmin: register to get/set the Pmin value. |
148 | */ | 108 | */ |
149 | struct exynos_tmu_registers { | 109 | struct exynos_tmu_registers { |
150 | u32 triminfo_data; | 110 | u32 triminfo_data; |
151 | u32 triminfo_25_shift; | ||
152 | u32 triminfo_85_shift; | ||
153 | 111 | ||
154 | u32 triminfo_ctrl; | 112 | u32 triminfo_ctrl[MAX_TRIMINFO_CTRL_REG]; |
155 | u32 triminfo_ctrl1; | 113 | u32 triminfo_ctrl_count; |
156 | u32 triminfo_reload_shift; | ||
157 | 114 | ||
158 | u32 tmu_ctrl; | 115 | u32 tmu_ctrl; |
159 | u32 test_mux_addr_shift; | 116 | u32 test_mux_addr_shift; |
160 | u32 buf_vref_sel_shift; | ||
161 | u32 buf_vref_sel_mask; | ||
162 | u32 therm_trip_mode_shift; | 117 | u32 therm_trip_mode_shift; |
163 | u32 therm_trip_mode_mask; | 118 | u32 therm_trip_mode_mask; |
164 | u32 therm_trip_en_shift; | 119 | u32 therm_trip_en_shift; |
165 | u32 buf_slope_sel_shift; | ||
166 | u32 buf_slope_sel_mask; | ||
167 | u32 calib_mode_shift; | ||
168 | u32 calib_mode_mask; | ||
169 | u32 therm_trip_tq_en_shift; | ||
170 | u32 core_en_shift; | ||
171 | 120 | ||
172 | u32 tmu_status; | 121 | u32 tmu_status; |
173 | 122 | ||
174 | u32 tmu_cur_temp; | 123 | u32 tmu_cur_temp; |
175 | u32 tmu_cur_temp_shift; | ||
176 | 124 | ||
177 | u32 threshold_temp; | 125 | u32 threshold_temp; |
178 | 126 | ||
179 | u32 threshold_th0; | 127 | u32 threshold_th0; |
180 | u32 threshold_th0_l0_shift; | ||
181 | u32 threshold_th0_l1_shift; | ||
182 | u32 threshold_th0_l2_shift; | ||
183 | u32 threshold_th0_l3_shift; | ||
184 | |||
185 | u32 threshold_th1; | 128 | u32 threshold_th1; |
186 | u32 threshold_th1_l0_shift; | ||
187 | u32 threshold_th1_l1_shift; | ||
188 | u32 threshold_th1_l2_shift; | ||
189 | u32 threshold_th1_l3_shift; | ||
190 | |||
191 | u32 threshold_th2; | 129 | u32 threshold_th2; |
192 | u32 threshold_th2_l0_shift; | ||
193 | |||
194 | u32 threshold_th3; | ||
195 | u32 threshold_th3_l0_shift; | 130 | u32 threshold_th3_l0_shift; |
196 | 131 | ||
197 | u32 tmu_inten; | 132 | u32 tmu_inten; |
@@ -200,22 +135,14 @@ struct exynos_tmu_registers { | |||
200 | u32 inten_rise2_shift; | 135 | u32 inten_rise2_shift; |
201 | u32 inten_rise3_shift; | 136 | u32 inten_rise3_shift; |
202 | u32 inten_fall0_shift; | 137 | u32 inten_fall0_shift; |
203 | u32 inten_fall1_shift; | ||
204 | u32 inten_fall2_shift; | ||
205 | u32 inten_fall3_shift; | ||
206 | 138 | ||
207 | u32 tmu_intstat; | 139 | u32 tmu_intstat; |
208 | 140 | ||
209 | u32 tmu_intclear; | 141 | u32 tmu_intclear; |
210 | u32 intclr_fall_shift; | ||
211 | u32 intclr_rise_shift; | ||
212 | u32 intclr_fall_mask; | ||
213 | u32 intclr_rise_mask; | ||
214 | 142 | ||
215 | u32 emul_con; | 143 | u32 emul_con; |
216 | u32 emul_temp_shift; | 144 | u32 emul_temp_shift; |
217 | u32 emul_time_shift; | 145 | u32 emul_time_shift; |
218 | u32 emul_time_mask; | ||
219 | 146 | ||
220 | u32 tmu_irqstatus; | 147 | u32 tmu_irqstatus; |
221 | u32 tmu_pmin; | 148 | u32 tmu_pmin; |
@@ -250,11 +177,12 @@ struct exynos_tmu_registers { | |||
250 | * 1 = enable trigger_level[] interrupt, | 177 | * 1 = enable trigger_level[] interrupt, |
251 | * 0 = disable trigger_level[] interrupt | 178 | * 0 = disable trigger_level[] interrupt |
252 | * @max_trigger_level: max trigger level supported by the TMU | 179 | * @max_trigger_level: max trigger level supported by the TMU |
180 | * @non_hw_trigger_levels: number of defined non-hardware trigger levels | ||
253 | * @gain: gain of amplifier in the positive-TC generator block | 181 | * @gain: gain of amplifier in the positive-TC generator block |
254 | * 0 <= gain <= 15 | 182 | * 0 < gain <= 15 |
255 | * @reference_voltage: reference voltage of amplifier | 183 | * @reference_voltage: reference voltage of amplifier |
256 | * in the positive-TC generator block | 184 | * in the positive-TC generator block |
257 | * 0 <= reference_voltage <= 31 | 185 | * 0 < reference_voltage <= 31 |
258 | * @noise_cancel_mode: noise cancellation mode | 186 | * @noise_cancel_mode: noise cancellation mode |
259 | * 000, 100, 101, 110 and 111 can be different modes | 187 | * 000, 100, 101, 110 and 111 can be different modes |
260 | * @type: determines the type of SOC | 188 | * @type: determines the type of SOC |
@@ -265,8 +193,8 @@ struct exynos_tmu_registers { | |||
265 | * @second_point_trim: temp value of the second point trimming | 193 | * @second_point_trim: temp value of the second point trimming |
266 | * @default_temp_offset: default temperature offset in case of no trimming | 194 | * @default_temp_offset: default temperature offset in case of no trimming |
267 | * @test_mux; information if SoC supports test MUX | 195 | * @test_mux; information if SoC supports test MUX |
196 | * @triminfo_reload: reload value to read TRIMINFO register | ||
268 | * @cal_type: calibration type for temperature | 197 | * @cal_type: calibration type for temperature |
269 | * @cal_mode: calibration mode for temperature | ||
270 | * @freq_clip_table: Table representing frequency reduction percentage. | 198 | * @freq_clip_table: Table representing frequency reduction percentage. |
271 | * @freq_tab_count: Count of the above table as frequency reduction may | 199 | * @freq_tab_count: Count of the above table as frequency reduction may |
272 | * applicable to only some of the trigger levels. | 200 | * applicable to only some of the trigger levels. |
@@ -284,6 +212,7 @@ struct exynos_tmu_platform_data { | |||
284 | enum trigger_type trigger_type[MAX_TRIP_COUNT]; | 212 | enum trigger_type trigger_type[MAX_TRIP_COUNT]; |
285 | bool trigger_enable[MAX_TRIP_COUNT]; | 213 | bool trigger_enable[MAX_TRIP_COUNT]; |
286 | u8 max_trigger_level; | 214 | u8 max_trigger_level; |
215 | u8 non_hw_trigger_levels; | ||
287 | u8 gain; | 216 | u8 gain; |
288 | u8 reference_voltage; | 217 | u8 reference_voltage; |
289 | u8 noise_cancel_mode; | 218 | u8 noise_cancel_mode; |
@@ -295,9 +224,9 @@ struct exynos_tmu_platform_data { | |||
295 | u8 second_point_trim; | 224 | u8 second_point_trim; |
296 | u8 default_temp_offset; | 225 | u8 default_temp_offset; |
297 | u8 test_mux; | 226 | u8 test_mux; |
227 | u8 triminfo_reload[MAX_TRIMINFO_CTRL_REG]; | ||
298 | 228 | ||
299 | enum calibration_type cal_type; | 229 | enum calibration_type cal_type; |
300 | enum calibration_mode cal_mode; | ||
301 | enum soc_type type; | 230 | enum soc_type type; |
302 | struct freq_clip_table freq_tab[4]; | 231 | struct freq_clip_table freq_tab[4]; |
303 | unsigned int freq_tab_count; | 232 | unsigned int freq_tab_count; |
diff --git a/drivers/thermal/samsung/exynos_tmu_data.c b/drivers/thermal/samsung/exynos_tmu_data.c index aa8e0dee2055..2683d2897e90 100644 --- a/drivers/thermal/samsung/exynos_tmu_data.c +++ b/drivers/thermal/samsung/exynos_tmu_data.c | |||
@@ -27,14 +27,7 @@ | |||
27 | #if defined(CONFIG_CPU_EXYNOS4210) | 27 | #if defined(CONFIG_CPU_EXYNOS4210) |
28 | static const struct exynos_tmu_registers exynos4210_tmu_registers = { | 28 | static const struct exynos_tmu_registers exynos4210_tmu_registers = { |
29 | .triminfo_data = EXYNOS_TMU_REG_TRIMINFO, | 29 | .triminfo_data = EXYNOS_TMU_REG_TRIMINFO, |
30 | .triminfo_25_shift = EXYNOS_TRIMINFO_25_SHIFT, | ||
31 | .triminfo_85_shift = EXYNOS_TRIMINFO_85_SHIFT, | ||
32 | .tmu_ctrl = EXYNOS_TMU_REG_CONTROL, | 30 | .tmu_ctrl = EXYNOS_TMU_REG_CONTROL, |
33 | .buf_vref_sel_shift = EXYNOS_TMU_REF_VOLTAGE_SHIFT, | ||
34 | .buf_vref_sel_mask = EXYNOS_TMU_REF_VOLTAGE_MASK, | ||
35 | .buf_slope_sel_shift = EXYNOS_TMU_BUF_SLOPE_SEL_SHIFT, | ||
36 | .buf_slope_sel_mask = EXYNOS_TMU_BUF_SLOPE_SEL_MASK, | ||
37 | .core_en_shift = EXYNOS_TMU_CORE_EN_SHIFT, | ||
38 | .tmu_status = EXYNOS_TMU_REG_STATUS, | 31 | .tmu_status = EXYNOS_TMU_REG_STATUS, |
39 | .tmu_cur_temp = EXYNOS_TMU_REG_CURRENT_TEMP, | 32 | .tmu_cur_temp = EXYNOS_TMU_REG_CURRENT_TEMP, |
40 | .threshold_temp = EXYNOS4210_TMU_REG_THRESHOLD_TEMP, | 33 | .threshold_temp = EXYNOS4210_TMU_REG_THRESHOLD_TEMP, |
@@ -46,7 +39,6 @@ static const struct exynos_tmu_registers exynos4210_tmu_registers = { | |||
46 | .inten_rise3_shift = EXYNOS_TMU_INTEN_RISE3_SHIFT, | 39 | .inten_rise3_shift = EXYNOS_TMU_INTEN_RISE3_SHIFT, |
47 | .tmu_intstat = EXYNOS_TMU_REG_INTSTAT, | 40 | .tmu_intstat = EXYNOS_TMU_REG_INTSTAT, |
48 | .tmu_intclear = EXYNOS_TMU_REG_INTCLEAR, | 41 | .tmu_intclear = EXYNOS_TMU_REG_INTCLEAR, |
49 | .intclr_rise_mask = EXYNOS4210_TMU_TRIG_LEVEL_MASK, | ||
50 | }; | 42 | }; |
51 | 43 | ||
52 | struct exynos_tmu_init_data const exynos4210_default_tmu_data = { | 44 | struct exynos_tmu_init_data const exynos4210_default_tmu_data = { |
@@ -64,6 +56,7 @@ struct exynos_tmu_init_data const exynos4210_default_tmu_data = { | |||
64 | .trigger_type[1] = THROTTLE_ACTIVE, | 56 | .trigger_type[1] = THROTTLE_ACTIVE, |
65 | .trigger_type[2] = SW_TRIP, | 57 | .trigger_type[2] = SW_TRIP, |
66 | .max_trigger_level = 4, | 58 | .max_trigger_level = 4, |
59 | .non_hw_trigger_levels = 3, | ||
67 | .gain = 15, | 60 | .gain = 15, |
68 | .reference_voltage = 7, | 61 | .reference_voltage = 7, |
69 | .cal_type = TYPE_ONE_POINT_TRIMMING, | 62 | .cal_type = TYPE_ONE_POINT_TRIMMING, |
@@ -93,18 +86,14 @@ struct exynos_tmu_init_data const exynos4210_default_tmu_data = { | |||
93 | #if defined(CONFIG_SOC_EXYNOS3250) | 86 | #if defined(CONFIG_SOC_EXYNOS3250) |
94 | static const struct exynos_tmu_registers exynos3250_tmu_registers = { | 87 | static const struct exynos_tmu_registers exynos3250_tmu_registers = { |
95 | .triminfo_data = EXYNOS_TMU_REG_TRIMINFO, | 88 | .triminfo_data = EXYNOS_TMU_REG_TRIMINFO, |
96 | .triminfo_25_shift = EXYNOS_TRIMINFO_25_SHIFT, | 89 | .triminfo_ctrl[0] = EXYNOS_TMU_TRIMINFO_CON1, |
97 | .triminfo_85_shift = EXYNOS_TRIMINFO_85_SHIFT, | 90 | .triminfo_ctrl[1] = EXYNOS_TMU_TRIMINFO_CON2, |
91 | .triminfo_ctrl_count = 2, | ||
98 | .tmu_ctrl = EXYNOS_TMU_REG_CONTROL, | 92 | .tmu_ctrl = EXYNOS_TMU_REG_CONTROL, |
99 | .test_mux_addr_shift = EXYNOS4412_MUX_ADDR_SHIFT, | 93 | .test_mux_addr_shift = EXYNOS4412_MUX_ADDR_SHIFT, |
100 | .buf_vref_sel_shift = EXYNOS_TMU_REF_VOLTAGE_SHIFT, | ||
101 | .buf_vref_sel_mask = EXYNOS_TMU_REF_VOLTAGE_MASK, | ||
102 | .therm_trip_mode_shift = EXYNOS_TMU_TRIP_MODE_SHIFT, | 94 | .therm_trip_mode_shift = EXYNOS_TMU_TRIP_MODE_SHIFT, |
103 | .therm_trip_mode_mask = EXYNOS_TMU_TRIP_MODE_MASK, | 95 | .therm_trip_mode_mask = EXYNOS_TMU_TRIP_MODE_MASK, |
104 | .therm_trip_en_shift = EXYNOS_TMU_THERM_TRIP_EN_SHIFT, | 96 | .therm_trip_en_shift = EXYNOS_TMU_THERM_TRIP_EN_SHIFT, |
105 | .buf_slope_sel_shift = EXYNOS_TMU_BUF_SLOPE_SEL_SHIFT, | ||
106 | .buf_slope_sel_mask = EXYNOS_TMU_BUF_SLOPE_SEL_MASK, | ||
107 | .core_en_shift = EXYNOS_TMU_CORE_EN_SHIFT, | ||
108 | .tmu_status = EXYNOS_TMU_REG_STATUS, | 97 | .tmu_status = EXYNOS_TMU_REG_STATUS, |
109 | .tmu_cur_temp = EXYNOS_TMU_REG_CURRENT_TEMP, | 98 | .tmu_cur_temp = EXYNOS_TMU_REG_CURRENT_TEMP, |
110 | .threshold_th0 = EXYNOS_THD_TEMP_RISE, | 99 | .threshold_th0 = EXYNOS_THD_TEMP_RISE, |
@@ -116,14 +105,9 @@ static const struct exynos_tmu_registers exynos3250_tmu_registers = { | |||
116 | .inten_fall0_shift = EXYNOS_TMU_INTEN_FALL0_SHIFT, | 105 | .inten_fall0_shift = EXYNOS_TMU_INTEN_FALL0_SHIFT, |
117 | .tmu_intstat = EXYNOS_TMU_REG_INTSTAT, | 106 | .tmu_intstat = EXYNOS_TMU_REG_INTSTAT, |
118 | .tmu_intclear = EXYNOS_TMU_REG_INTCLEAR, | 107 | .tmu_intclear = EXYNOS_TMU_REG_INTCLEAR, |
119 | .intclr_fall_shift = EXYNOS_TMU_CLEAR_FALL_INT_SHIFT, | ||
120 | .intclr_rise_shift = EXYNOS_TMU_RISE_INT_SHIFT, | ||
121 | .intclr_rise_mask = EXYNOS_TMU_RISE_INT_MASK, | ||
122 | .intclr_fall_mask = EXYNOS_TMU_FALL_INT_MASK, | ||
123 | .emul_con = EXYNOS_EMUL_CON, | 108 | .emul_con = EXYNOS_EMUL_CON, |
124 | .emul_temp_shift = EXYNOS_EMUL_DATA_SHIFT, | 109 | .emul_temp_shift = EXYNOS_EMUL_DATA_SHIFT, |
125 | .emul_time_shift = EXYNOS_EMUL_TIME_SHIFT, | 110 | .emul_time_shift = EXYNOS_EMUL_TIME_SHIFT, |
126 | .emul_time_mask = EXYNOS_EMUL_TIME_MASK, | ||
127 | }; | 111 | }; |
128 | 112 | ||
129 | #define EXYNOS3250_TMU_DATA \ | 113 | #define EXYNOS3250_TMU_DATA \ |
@@ -141,6 +125,7 @@ static const struct exynos_tmu_registers exynos3250_tmu_registers = { | |||
141 | .trigger_type[2] = SW_TRIP, \ | 125 | .trigger_type[2] = SW_TRIP, \ |
142 | .trigger_type[3] = HW_TRIP, \ | 126 | .trigger_type[3] = HW_TRIP, \ |
143 | .max_trigger_level = 4, \ | 127 | .max_trigger_level = 4, \ |
128 | .non_hw_trigger_levels = 3, \ | ||
144 | .gain = 8, \ | 129 | .gain = 8, \ |
145 | .reference_voltage = 16, \ | 130 | .reference_voltage = 16, \ |
146 | .noise_cancel_mode = 4, \ | 131 | .noise_cancel_mode = 4, \ |
@@ -160,8 +145,10 @@ static const struct exynos_tmu_registers exynos3250_tmu_registers = { | |||
160 | .temp_level = 95, \ | 145 | .temp_level = 95, \ |
161 | }, \ | 146 | }, \ |
162 | .freq_tab_count = 2, \ | 147 | .freq_tab_count = 2, \ |
148 | .triminfo_reload[0] = EXYNOS_TRIMINFO_RELOAD_ENABLE, \ | ||
149 | .triminfo_reload[1] = EXYNOS_TRIMINFO_RELOAD_ENABLE, \ | ||
163 | .registers = &exynos3250_tmu_registers, \ | 150 | .registers = &exynos3250_tmu_registers, \ |
164 | .features = (TMU_SUPPORT_EMULATION | \ | 151 | .features = (TMU_SUPPORT_EMULATION | TMU_SUPPORT_TRIM_RELOAD | \ |
165 | TMU_SUPPORT_FALLING_TRIP | TMU_SUPPORT_READY_STATUS | \ | 152 | TMU_SUPPORT_FALLING_TRIP | TMU_SUPPORT_READY_STATUS | \ |
166 | TMU_SUPPORT_EMUL_TIME) | 153 | TMU_SUPPORT_EMUL_TIME) |
167 | #endif | 154 | #endif |
@@ -182,20 +169,13 @@ struct exynos_tmu_init_data const exynos3250_default_tmu_data = { | |||
182 | #if defined(CONFIG_SOC_EXYNOS4412) || defined(CONFIG_SOC_EXYNOS5250) | 169 | #if defined(CONFIG_SOC_EXYNOS4412) || defined(CONFIG_SOC_EXYNOS5250) |
183 | static const struct exynos_tmu_registers exynos4412_tmu_registers = { | 170 | static const struct exynos_tmu_registers exynos4412_tmu_registers = { |
184 | .triminfo_data = EXYNOS_TMU_REG_TRIMINFO, | 171 | .triminfo_data = EXYNOS_TMU_REG_TRIMINFO, |
185 | .triminfo_25_shift = EXYNOS_TRIMINFO_25_SHIFT, | 172 | .triminfo_ctrl[0] = EXYNOS_TMU_TRIMINFO_CON2, |
186 | .triminfo_85_shift = EXYNOS_TRIMINFO_85_SHIFT, | 173 | .triminfo_ctrl_count = 1, |
187 | .triminfo_ctrl = EXYNOS_TMU_TRIMINFO_CON, | ||
188 | .triminfo_reload_shift = EXYNOS_TRIMINFO_RELOAD_SHIFT, | ||
189 | .tmu_ctrl = EXYNOS_TMU_REG_CONTROL, | 174 | .tmu_ctrl = EXYNOS_TMU_REG_CONTROL, |
190 | .test_mux_addr_shift = EXYNOS4412_MUX_ADDR_SHIFT, | 175 | .test_mux_addr_shift = EXYNOS4412_MUX_ADDR_SHIFT, |
191 | .buf_vref_sel_shift = EXYNOS_TMU_REF_VOLTAGE_SHIFT, | ||
192 | .buf_vref_sel_mask = EXYNOS_TMU_REF_VOLTAGE_MASK, | ||
193 | .therm_trip_mode_shift = EXYNOS_TMU_TRIP_MODE_SHIFT, | 176 | .therm_trip_mode_shift = EXYNOS_TMU_TRIP_MODE_SHIFT, |
194 | .therm_trip_mode_mask = EXYNOS_TMU_TRIP_MODE_MASK, | 177 | .therm_trip_mode_mask = EXYNOS_TMU_TRIP_MODE_MASK, |
195 | .therm_trip_en_shift = EXYNOS_TMU_THERM_TRIP_EN_SHIFT, | 178 | .therm_trip_en_shift = EXYNOS_TMU_THERM_TRIP_EN_SHIFT, |
196 | .buf_slope_sel_shift = EXYNOS_TMU_BUF_SLOPE_SEL_SHIFT, | ||
197 | .buf_slope_sel_mask = EXYNOS_TMU_BUF_SLOPE_SEL_MASK, | ||
198 | .core_en_shift = EXYNOS_TMU_CORE_EN_SHIFT, | ||
199 | .tmu_status = EXYNOS_TMU_REG_STATUS, | 179 | .tmu_status = EXYNOS_TMU_REG_STATUS, |
200 | .tmu_cur_temp = EXYNOS_TMU_REG_CURRENT_TEMP, | 180 | .tmu_cur_temp = EXYNOS_TMU_REG_CURRENT_TEMP, |
201 | .threshold_th0 = EXYNOS_THD_TEMP_RISE, | 181 | .threshold_th0 = EXYNOS_THD_TEMP_RISE, |
@@ -208,14 +188,9 @@ static const struct exynos_tmu_registers exynos4412_tmu_registers = { | |||
208 | .inten_fall0_shift = EXYNOS_TMU_INTEN_FALL0_SHIFT, | 188 | .inten_fall0_shift = EXYNOS_TMU_INTEN_FALL0_SHIFT, |
209 | .tmu_intstat = EXYNOS_TMU_REG_INTSTAT, | 189 | .tmu_intstat = EXYNOS_TMU_REG_INTSTAT, |
210 | .tmu_intclear = EXYNOS_TMU_REG_INTCLEAR, | 190 | .tmu_intclear = EXYNOS_TMU_REG_INTCLEAR, |
211 | .intclr_fall_shift = EXYNOS_TMU_CLEAR_FALL_INT_SHIFT, | ||
212 | .intclr_rise_shift = EXYNOS_TMU_RISE_INT_SHIFT, | ||
213 | .intclr_rise_mask = EXYNOS_TMU_RISE_INT_MASK, | ||
214 | .intclr_fall_mask = EXYNOS_TMU_FALL_INT_MASK, | ||
215 | .emul_con = EXYNOS_EMUL_CON, | 191 | .emul_con = EXYNOS_EMUL_CON, |
216 | .emul_temp_shift = EXYNOS_EMUL_DATA_SHIFT, | 192 | .emul_temp_shift = EXYNOS_EMUL_DATA_SHIFT, |
217 | .emul_time_shift = EXYNOS_EMUL_TIME_SHIFT, | 193 | .emul_time_shift = EXYNOS_EMUL_TIME_SHIFT, |
218 | .emul_time_mask = EXYNOS_EMUL_TIME_MASK, | ||
219 | }; | 194 | }; |
220 | 195 | ||
221 | #define EXYNOS4412_TMU_DATA \ | 196 | #define EXYNOS4412_TMU_DATA \ |
@@ -233,6 +208,7 @@ static const struct exynos_tmu_registers exynos4412_tmu_registers = { | |||
233 | .trigger_type[2] = SW_TRIP, \ | 208 | .trigger_type[2] = SW_TRIP, \ |
234 | .trigger_type[3] = HW_TRIP, \ | 209 | .trigger_type[3] = HW_TRIP, \ |
235 | .max_trigger_level = 4, \ | 210 | .max_trigger_level = 4, \ |
211 | .non_hw_trigger_levels = 3, \ | ||
236 | .gain = 8, \ | 212 | .gain = 8, \ |
237 | .reference_voltage = 16, \ | 213 | .reference_voltage = 16, \ |
238 | .noise_cancel_mode = 4, \ | 214 | .noise_cancel_mode = 4, \ |
@@ -252,6 +228,7 @@ static const struct exynos_tmu_registers exynos4412_tmu_registers = { | |||
252 | .temp_level = 95, \ | 228 | .temp_level = 95, \ |
253 | }, \ | 229 | }, \ |
254 | .freq_tab_count = 2, \ | 230 | .freq_tab_count = 2, \ |
231 | .triminfo_reload[0] = EXYNOS_TRIMINFO_RELOAD_ENABLE, \ | ||
255 | .registers = &exynos4412_tmu_registers, \ | 232 | .registers = &exynos4412_tmu_registers, \ |
256 | .features = (TMU_SUPPORT_EMULATION | TMU_SUPPORT_TRIM_RELOAD | \ | 233 | .features = (TMU_SUPPORT_EMULATION | TMU_SUPPORT_TRIM_RELOAD | \ |
257 | TMU_SUPPORT_FALLING_TRIP | TMU_SUPPORT_READY_STATUS | \ | 234 | TMU_SUPPORT_FALLING_TRIP | TMU_SUPPORT_READY_STATUS | \ |
@@ -286,18 +263,11 @@ struct exynos_tmu_init_data const exynos5250_default_tmu_data = { | |||
286 | #if defined(CONFIG_SOC_EXYNOS5260) | 263 | #if defined(CONFIG_SOC_EXYNOS5260) |
287 | static const struct exynos_tmu_registers exynos5260_tmu_registers = { | 264 | static const struct exynos_tmu_registers exynos5260_tmu_registers = { |
288 | .triminfo_data = EXYNOS_TMU_REG_TRIMINFO, | 265 | .triminfo_data = EXYNOS_TMU_REG_TRIMINFO, |
289 | .triminfo_25_shift = EXYNOS_TRIMINFO_25_SHIFT, | ||
290 | .triminfo_85_shift = EXYNOS_TRIMINFO_85_SHIFT, | ||
291 | .tmu_ctrl = EXYNOS_TMU_REG_CONTROL, | 266 | .tmu_ctrl = EXYNOS_TMU_REG_CONTROL, |
292 | .tmu_ctrl = EXYNOS_TMU_REG_CONTROL1, | 267 | .tmu_ctrl = EXYNOS_TMU_REG_CONTROL1, |
293 | .buf_vref_sel_shift = EXYNOS_TMU_REF_VOLTAGE_SHIFT, | ||
294 | .buf_vref_sel_mask = EXYNOS_TMU_REF_VOLTAGE_MASK, | ||
295 | .therm_trip_mode_shift = EXYNOS_TMU_TRIP_MODE_SHIFT, | 268 | .therm_trip_mode_shift = EXYNOS_TMU_TRIP_MODE_SHIFT, |
296 | .therm_trip_mode_mask = EXYNOS_TMU_TRIP_MODE_MASK, | 269 | .therm_trip_mode_mask = EXYNOS_TMU_TRIP_MODE_MASK, |
297 | .therm_trip_en_shift = EXYNOS_TMU_THERM_TRIP_EN_SHIFT, | 270 | .therm_trip_en_shift = EXYNOS_TMU_THERM_TRIP_EN_SHIFT, |
298 | .buf_slope_sel_shift = EXYNOS_TMU_BUF_SLOPE_SEL_SHIFT, | ||
299 | .buf_slope_sel_mask = EXYNOS_TMU_BUF_SLOPE_SEL_MASK, | ||
300 | .core_en_shift = EXYNOS_TMU_CORE_EN_SHIFT, | ||
301 | .tmu_status = EXYNOS_TMU_REG_STATUS, | 271 | .tmu_status = EXYNOS_TMU_REG_STATUS, |
302 | .tmu_cur_temp = EXYNOS_TMU_REG_CURRENT_TEMP, | 272 | .tmu_cur_temp = EXYNOS_TMU_REG_CURRENT_TEMP, |
303 | .threshold_th0 = EXYNOS_THD_TEMP_RISE, | 273 | .threshold_th0 = EXYNOS_THD_TEMP_RISE, |
@@ -310,14 +280,9 @@ static const struct exynos_tmu_registers exynos5260_tmu_registers = { | |||
310 | .inten_fall0_shift = EXYNOS_TMU_INTEN_FALL0_SHIFT, | 280 | .inten_fall0_shift = EXYNOS_TMU_INTEN_FALL0_SHIFT, |
311 | .tmu_intstat = EXYNOS5260_TMU_REG_INTSTAT, | 281 | .tmu_intstat = EXYNOS5260_TMU_REG_INTSTAT, |
312 | .tmu_intclear = EXYNOS5260_TMU_REG_INTCLEAR, | 282 | .tmu_intclear = EXYNOS5260_TMU_REG_INTCLEAR, |
313 | .intclr_fall_shift = EXYNOS5420_TMU_CLEAR_FALL_INT_SHIFT, | ||
314 | .intclr_rise_shift = EXYNOS_TMU_RISE_INT_SHIFT, | ||
315 | .intclr_rise_mask = EXYNOS5260_TMU_RISE_INT_MASK, | ||
316 | .intclr_fall_mask = EXYNOS5260_TMU_FALL_INT_MASK, | ||
317 | .emul_con = EXYNOS5260_EMUL_CON, | 283 | .emul_con = EXYNOS5260_EMUL_CON, |
318 | .emul_temp_shift = EXYNOS_EMUL_DATA_SHIFT, | 284 | .emul_temp_shift = EXYNOS_EMUL_DATA_SHIFT, |
319 | .emul_time_shift = EXYNOS_EMUL_TIME_SHIFT, | 285 | .emul_time_shift = EXYNOS_EMUL_TIME_SHIFT, |
320 | .emul_time_mask = EXYNOS_EMUL_TIME_MASK, | ||
321 | }; | 286 | }; |
322 | 287 | ||
323 | #define __EXYNOS5260_TMU_DATA \ | 288 | #define __EXYNOS5260_TMU_DATA \ |
@@ -335,6 +300,7 @@ static const struct exynos_tmu_registers exynos5260_tmu_registers = { | |||
335 | .trigger_type[2] = SW_TRIP, \ | 300 | .trigger_type[2] = SW_TRIP, \ |
336 | .trigger_type[3] = HW_TRIP, \ | 301 | .trigger_type[3] = HW_TRIP, \ |
337 | .max_trigger_level = 4, \ | 302 | .max_trigger_level = 4, \ |
303 | .non_hw_trigger_levels = 3, \ | ||
338 | .gain = 8, \ | 304 | .gain = 8, \ |
339 | .reference_voltage = 16, \ | 305 | .reference_voltage = 16, \ |
340 | .noise_cancel_mode = 4, \ | 306 | .noise_cancel_mode = 4, \ |
@@ -359,9 +325,8 @@ static const struct exynos_tmu_registers exynos5260_tmu_registers = { | |||
359 | #define EXYNOS5260_TMU_DATA \ | 325 | #define EXYNOS5260_TMU_DATA \ |
360 | __EXYNOS5260_TMU_DATA \ | 326 | __EXYNOS5260_TMU_DATA \ |
361 | .type = SOC_ARCH_EXYNOS5260, \ | 327 | .type = SOC_ARCH_EXYNOS5260, \ |
362 | .features = (TMU_SUPPORT_EMULATION | TMU_SUPPORT_TRIM_RELOAD | \ | 328 | .features = (TMU_SUPPORT_EMULATION | TMU_SUPPORT_FALLING_TRIP | \ |
363 | TMU_SUPPORT_FALLING_TRIP | TMU_SUPPORT_READY_STATUS | \ | 329 | TMU_SUPPORT_READY_STATUS | TMU_SUPPORT_EMUL_TIME) |
364 | TMU_SUPPORT_EMUL_TIME) | ||
365 | 330 | ||
366 | struct exynos_tmu_init_data const exynos5260_default_tmu_data = { | 331 | struct exynos_tmu_init_data const exynos5260_default_tmu_data = { |
367 | .tmu_data = { | 332 | .tmu_data = { |
@@ -378,17 +343,10 @@ struct exynos_tmu_init_data const exynos5260_default_tmu_data = { | |||
378 | #if defined(CONFIG_SOC_EXYNOS5420) | 343 | #if defined(CONFIG_SOC_EXYNOS5420) |
379 | static const struct exynos_tmu_registers exynos5420_tmu_registers = { | 344 | static const struct exynos_tmu_registers exynos5420_tmu_registers = { |
380 | .triminfo_data = EXYNOS_TMU_REG_TRIMINFO, | 345 | .triminfo_data = EXYNOS_TMU_REG_TRIMINFO, |
381 | .triminfo_25_shift = EXYNOS_TRIMINFO_25_SHIFT, | ||
382 | .triminfo_85_shift = EXYNOS_TRIMINFO_85_SHIFT, | ||
383 | .tmu_ctrl = EXYNOS_TMU_REG_CONTROL, | 346 | .tmu_ctrl = EXYNOS_TMU_REG_CONTROL, |
384 | .buf_vref_sel_shift = EXYNOS_TMU_REF_VOLTAGE_SHIFT, | ||
385 | .buf_vref_sel_mask = EXYNOS_TMU_REF_VOLTAGE_MASK, | ||
386 | .therm_trip_mode_shift = EXYNOS_TMU_TRIP_MODE_SHIFT, | 347 | .therm_trip_mode_shift = EXYNOS_TMU_TRIP_MODE_SHIFT, |
387 | .therm_trip_mode_mask = EXYNOS_TMU_TRIP_MODE_MASK, | 348 | .therm_trip_mode_mask = EXYNOS_TMU_TRIP_MODE_MASK, |
388 | .therm_trip_en_shift = EXYNOS_TMU_THERM_TRIP_EN_SHIFT, | 349 | .therm_trip_en_shift = EXYNOS_TMU_THERM_TRIP_EN_SHIFT, |
389 | .buf_slope_sel_shift = EXYNOS_TMU_BUF_SLOPE_SEL_SHIFT, | ||
390 | .buf_slope_sel_mask = EXYNOS_TMU_BUF_SLOPE_SEL_MASK, | ||
391 | .core_en_shift = EXYNOS_TMU_CORE_EN_SHIFT, | ||
392 | .tmu_status = EXYNOS_TMU_REG_STATUS, | 350 | .tmu_status = EXYNOS_TMU_REG_STATUS, |
393 | .tmu_cur_temp = EXYNOS_TMU_REG_CURRENT_TEMP, | 351 | .tmu_cur_temp = EXYNOS_TMU_REG_CURRENT_TEMP, |
394 | .threshold_th0 = EXYNOS_THD_TEMP_RISE, | 352 | .threshold_th0 = EXYNOS_THD_TEMP_RISE, |
@@ -402,14 +360,9 @@ static const struct exynos_tmu_registers exynos5420_tmu_registers = { | |||
402 | .inten_fall0_shift = EXYNOS_TMU_INTEN_FALL0_SHIFT, | 360 | .inten_fall0_shift = EXYNOS_TMU_INTEN_FALL0_SHIFT, |
403 | .tmu_intstat = EXYNOS_TMU_REG_INTSTAT, | 361 | .tmu_intstat = EXYNOS_TMU_REG_INTSTAT, |
404 | .tmu_intclear = EXYNOS_TMU_REG_INTCLEAR, | 362 | .tmu_intclear = EXYNOS_TMU_REG_INTCLEAR, |
405 | .intclr_fall_shift = EXYNOS5420_TMU_CLEAR_FALL_INT_SHIFT, | ||
406 | .intclr_rise_shift = EXYNOS_TMU_RISE_INT_SHIFT, | ||
407 | .intclr_rise_mask = EXYNOS_TMU_RISE_INT_MASK, | ||
408 | .intclr_fall_mask = EXYNOS_TMU_FALL_INT_MASK, | ||
409 | .emul_con = EXYNOS_EMUL_CON, | 363 | .emul_con = EXYNOS_EMUL_CON, |
410 | .emul_temp_shift = EXYNOS_EMUL_DATA_SHIFT, | 364 | .emul_temp_shift = EXYNOS_EMUL_DATA_SHIFT, |
411 | .emul_time_shift = EXYNOS_EMUL_TIME_SHIFT, | 365 | .emul_time_shift = EXYNOS_EMUL_TIME_SHIFT, |
412 | .emul_time_mask = EXYNOS_EMUL_TIME_MASK, | ||
413 | }; | 366 | }; |
414 | 367 | ||
415 | #define __EXYNOS5420_TMU_DATA \ | 368 | #define __EXYNOS5420_TMU_DATA \ |
@@ -427,6 +380,7 @@ static const struct exynos_tmu_registers exynos5420_tmu_registers = { | |||
427 | .trigger_type[2] = SW_TRIP, \ | 380 | .trigger_type[2] = SW_TRIP, \ |
428 | .trigger_type[3] = HW_TRIP, \ | 381 | .trigger_type[3] = HW_TRIP, \ |
429 | .max_trigger_level = 4, \ | 382 | .max_trigger_level = 4, \ |
383 | .non_hw_trigger_levels = 3, \ | ||
430 | .gain = 8, \ | 384 | .gain = 8, \ |
431 | .reference_voltage = 16, \ | 385 | .reference_voltage = 16, \ |
432 | .noise_cancel_mode = 4, \ | 386 | .noise_cancel_mode = 4, \ |
@@ -451,16 +405,15 @@ static const struct exynos_tmu_registers exynos5420_tmu_registers = { | |||
451 | #define EXYNOS5420_TMU_DATA \ | 405 | #define EXYNOS5420_TMU_DATA \ |
452 | __EXYNOS5420_TMU_DATA \ | 406 | __EXYNOS5420_TMU_DATA \ |
453 | .type = SOC_ARCH_EXYNOS5250, \ | 407 | .type = SOC_ARCH_EXYNOS5250, \ |
454 | .features = (TMU_SUPPORT_EMULATION | TMU_SUPPORT_TRIM_RELOAD | \ | 408 | .features = (TMU_SUPPORT_EMULATION | TMU_SUPPORT_FALLING_TRIP | \ |
455 | TMU_SUPPORT_FALLING_TRIP | TMU_SUPPORT_READY_STATUS | \ | 409 | TMU_SUPPORT_READY_STATUS | TMU_SUPPORT_EMUL_TIME) |
456 | TMU_SUPPORT_EMUL_TIME) | ||
457 | 410 | ||
458 | #define EXYNOS5420_TMU_DATA_SHARED \ | 411 | #define EXYNOS5420_TMU_DATA_SHARED \ |
459 | __EXYNOS5420_TMU_DATA \ | 412 | __EXYNOS5420_TMU_DATA \ |
460 | .type = SOC_ARCH_EXYNOS5420_TRIMINFO, \ | 413 | .type = SOC_ARCH_EXYNOS5420_TRIMINFO, \ |
461 | .features = (TMU_SUPPORT_EMULATION | TMU_SUPPORT_TRIM_RELOAD | \ | 414 | .features = (TMU_SUPPORT_EMULATION | TMU_SUPPORT_FALLING_TRIP | \ |
462 | TMU_SUPPORT_FALLING_TRIP | TMU_SUPPORT_READY_STATUS | \ | 415 | TMU_SUPPORT_READY_STATUS | TMU_SUPPORT_EMUL_TIME | \ |
463 | TMU_SUPPORT_EMUL_TIME | TMU_SUPPORT_ADDRESS_MULTIPLE) | 416 | TMU_SUPPORT_ADDRESS_MULTIPLE) |
464 | 417 | ||
465 | struct exynos_tmu_init_data const exynos5420_default_tmu_data = { | 418 | struct exynos_tmu_init_data const exynos5420_default_tmu_data = { |
466 | .tmu_data = { | 419 | .tmu_data = { |
@@ -477,19 +430,10 @@ struct exynos_tmu_init_data const exynos5420_default_tmu_data = { | |||
477 | #if defined(CONFIG_SOC_EXYNOS5440) | 430 | #if defined(CONFIG_SOC_EXYNOS5440) |
478 | static const struct exynos_tmu_registers exynos5440_tmu_registers = { | 431 | static const struct exynos_tmu_registers exynos5440_tmu_registers = { |
479 | .triminfo_data = EXYNOS5440_TMU_S0_7_TRIM, | 432 | .triminfo_data = EXYNOS5440_TMU_S0_7_TRIM, |
480 | .triminfo_25_shift = EXYNOS_TRIMINFO_25_SHIFT, | ||
481 | .triminfo_85_shift = EXYNOS_TRIMINFO_85_SHIFT, | ||
482 | .tmu_ctrl = EXYNOS5440_TMU_S0_7_CTRL, | 433 | .tmu_ctrl = EXYNOS5440_TMU_S0_7_CTRL, |
483 | .buf_vref_sel_shift = EXYNOS_TMU_REF_VOLTAGE_SHIFT, | ||
484 | .buf_vref_sel_mask = EXYNOS_TMU_REF_VOLTAGE_MASK, | ||
485 | .therm_trip_mode_shift = EXYNOS_TMU_TRIP_MODE_SHIFT, | 434 | .therm_trip_mode_shift = EXYNOS_TMU_TRIP_MODE_SHIFT, |
486 | .therm_trip_mode_mask = EXYNOS_TMU_TRIP_MODE_MASK, | 435 | .therm_trip_mode_mask = EXYNOS_TMU_TRIP_MODE_MASK, |
487 | .therm_trip_en_shift = EXYNOS_TMU_THERM_TRIP_EN_SHIFT, | 436 | .therm_trip_en_shift = EXYNOS_TMU_THERM_TRIP_EN_SHIFT, |
488 | .buf_slope_sel_shift = EXYNOS_TMU_BUF_SLOPE_SEL_SHIFT, | ||
489 | .buf_slope_sel_mask = EXYNOS_TMU_BUF_SLOPE_SEL_MASK, | ||
490 | .calib_mode_shift = EXYNOS_TMU_CALIB_MODE_SHIFT, | ||
491 | .calib_mode_mask = EXYNOS_TMU_CALIB_MODE_MASK, | ||
492 | .core_en_shift = EXYNOS_TMU_CORE_EN_SHIFT, | ||
493 | .tmu_status = EXYNOS5440_TMU_S0_7_STATUS, | 437 | .tmu_status = EXYNOS5440_TMU_S0_7_STATUS, |
494 | .tmu_cur_temp = EXYNOS5440_TMU_S0_7_TEMP, | 438 | .tmu_cur_temp = EXYNOS5440_TMU_S0_7_TEMP, |
495 | .threshold_th0 = EXYNOS5440_TMU_S0_7_TH0, | 439 | .threshold_th0 = EXYNOS5440_TMU_S0_7_TH0, |
@@ -504,10 +448,6 @@ static const struct exynos_tmu_registers exynos5440_tmu_registers = { | |||
504 | .inten_fall0_shift = EXYNOS5440_TMU_INTEN_FALL0_SHIFT, | 448 | .inten_fall0_shift = EXYNOS5440_TMU_INTEN_FALL0_SHIFT, |
505 | .tmu_intstat = EXYNOS5440_TMU_S0_7_IRQ, | 449 | .tmu_intstat = EXYNOS5440_TMU_S0_7_IRQ, |
506 | .tmu_intclear = EXYNOS5440_TMU_S0_7_IRQ, | 450 | .tmu_intclear = EXYNOS5440_TMU_S0_7_IRQ, |
507 | .intclr_fall_shift = EXYNOS5440_TMU_CLEAR_FALL_INT_SHIFT, | ||
508 | .intclr_rise_shift = EXYNOS5440_TMU_RISE_INT_SHIFT, | ||
509 | .intclr_rise_mask = EXYNOS5440_TMU_RISE_INT_MASK, | ||
510 | .intclr_fall_mask = EXYNOS5440_TMU_FALL_INT_MASK, | ||
511 | .tmu_irqstatus = EXYNOS5440_TMU_IRQ_STATUS, | 451 | .tmu_irqstatus = EXYNOS5440_TMU_IRQ_STATUS, |
512 | .emul_con = EXYNOS5440_TMU_S0_7_DEBUG, | 452 | .emul_con = EXYNOS5440_TMU_S0_7_DEBUG, |
513 | .emul_temp_shift = EXYNOS_EMUL_DATA_SHIFT, | 453 | .emul_temp_shift = EXYNOS_EMUL_DATA_SHIFT, |
@@ -521,11 +461,11 @@ static const struct exynos_tmu_registers exynos5440_tmu_registers = { | |||
521 | .trigger_type[0] = SW_TRIP, \ | 461 | .trigger_type[0] = SW_TRIP, \ |
522 | .trigger_type[4] = HW_TRIP, \ | 462 | .trigger_type[4] = HW_TRIP, \ |
523 | .max_trigger_level = 5, \ | 463 | .max_trigger_level = 5, \ |
464 | .non_hw_trigger_levels = 1, \ | ||
524 | .gain = 5, \ | 465 | .gain = 5, \ |
525 | .reference_voltage = 16, \ | 466 | .reference_voltage = 16, \ |
526 | .noise_cancel_mode = 4, \ | 467 | .noise_cancel_mode = 4, \ |
527 | .cal_type = TYPE_ONE_POINT_TRIMMING, \ | 468 | .cal_type = TYPE_ONE_POINT_TRIMMING, \ |
528 | .cal_mode = 0, \ | ||
529 | .efuse_value = 0x5b2d, \ | 469 | .efuse_value = 0x5b2d, \ |
530 | .min_efuse_value = 16, \ | 470 | .min_efuse_value = 16, \ |
531 | .max_efuse_value = 76, \ | 471 | .max_efuse_value = 76, \ |
diff --git a/drivers/thermal/samsung/exynos_tmu_data.h b/drivers/thermal/samsung/exynos_tmu_data.h index f0979e598491..65e2ea6a9579 100644 --- a/drivers/thermal/samsung/exynos_tmu_data.h +++ b/drivers/thermal/samsung/exynos_tmu_data.h | |||
@@ -39,55 +39,31 @@ | |||
39 | #define EXYNOS_TMU_BUF_SLOPE_SEL_SHIFT 8 | 39 | #define EXYNOS_TMU_BUF_SLOPE_SEL_SHIFT 8 |
40 | #define EXYNOS_TMU_CORE_EN_SHIFT 0 | 40 | #define EXYNOS_TMU_CORE_EN_SHIFT 0 |
41 | 41 | ||
42 | /* Exynos3250 specific registers */ | ||
43 | #define EXYNOS_TMU_TRIMINFO_CON1 0x10 | ||
44 | |||
42 | /* Exynos4210 specific registers */ | 45 | /* Exynos4210 specific registers */ |
43 | #define EXYNOS4210_TMU_REG_THRESHOLD_TEMP 0x44 | 46 | #define EXYNOS4210_TMU_REG_THRESHOLD_TEMP 0x44 |
44 | #define EXYNOS4210_TMU_REG_TRIG_LEVEL0 0x50 | 47 | #define EXYNOS4210_TMU_REG_TRIG_LEVEL0 0x50 |
45 | #define EXYNOS4210_TMU_REG_TRIG_LEVEL1 0x54 | 48 | |
46 | #define EXYNOS4210_TMU_REG_TRIG_LEVEL2 0x58 | 49 | /* Exynos5250, Exynos4412, Exynos3250 specific registers */ |
47 | #define EXYNOS4210_TMU_REG_TRIG_LEVEL3 0x5C | 50 | #define EXYNOS_TMU_TRIMINFO_CON2 0x14 |
48 | #define EXYNOS4210_TMU_REG_PAST_TEMP0 0x60 | ||
49 | #define EXYNOS4210_TMU_REG_PAST_TEMP1 0x64 | ||
50 | #define EXYNOS4210_TMU_REG_PAST_TEMP2 0x68 | ||
51 | #define EXYNOS4210_TMU_REG_PAST_TEMP3 0x6C | ||
52 | |||
53 | #define EXYNOS4210_TMU_TRIG_LEVEL0_MASK 0x1 | ||
54 | #define EXYNOS4210_TMU_TRIG_LEVEL1_MASK 0x10 | ||
55 | #define EXYNOS4210_TMU_TRIG_LEVEL2_MASK 0x100 | ||
56 | #define EXYNOS4210_TMU_TRIG_LEVEL3_MASK 0x1000 | ||
57 | #define EXYNOS4210_TMU_TRIG_LEVEL_MASK 0x1111 | ||
58 | #define EXYNOS4210_TMU_INTCLEAR_VAL 0x1111 | ||
59 | |||
60 | /* Exynos5250 and Exynos4412 specific registers */ | ||
61 | #define EXYNOS_TMU_TRIMINFO_CON 0x14 | ||
62 | #define EXYNOS_THD_TEMP_RISE 0x50 | 51 | #define EXYNOS_THD_TEMP_RISE 0x50 |
63 | #define EXYNOS_THD_TEMP_FALL 0x54 | 52 | #define EXYNOS_THD_TEMP_FALL 0x54 |
64 | #define EXYNOS_EMUL_CON 0x80 | 53 | #define EXYNOS_EMUL_CON 0x80 |
65 | 54 | ||
66 | #define EXYNOS_TRIMINFO_RELOAD_SHIFT 1 | 55 | #define EXYNOS_TRIMINFO_RELOAD_ENABLE 1 |
67 | #define EXYNOS_TRIMINFO_25_SHIFT 0 | 56 | #define EXYNOS_TRIMINFO_25_SHIFT 0 |
68 | #define EXYNOS_TRIMINFO_85_SHIFT 8 | 57 | #define EXYNOS_TRIMINFO_85_SHIFT 8 |
69 | #define EXYNOS_TMU_RISE_INT_MASK 0x111 | ||
70 | #define EXYNOS_TMU_RISE_INT_SHIFT 0 | ||
71 | #define EXYNOS_TMU_FALL_INT_MASK 0x111 | ||
72 | #define EXYNOS_TMU_CLEAR_RISE_INT 0x111 | ||
73 | #define EXYNOS_TMU_CLEAR_FALL_INT (0x111 << 12) | ||
74 | #define EXYNOS_TMU_CLEAR_FALL_INT_SHIFT 12 | ||
75 | #define EXYNOS5420_TMU_CLEAR_FALL_INT_SHIFT 16 | ||
76 | #define EXYNOS5440_TMU_CLEAR_FALL_INT_SHIFT 4 | ||
77 | #define EXYNOS_TMU_TRIP_MODE_SHIFT 13 | 58 | #define EXYNOS_TMU_TRIP_MODE_SHIFT 13 |
78 | #define EXYNOS_TMU_TRIP_MODE_MASK 0x7 | 59 | #define EXYNOS_TMU_TRIP_MODE_MASK 0x7 |
79 | #define EXYNOS_TMU_THERM_TRIP_EN_SHIFT 12 | 60 | #define EXYNOS_TMU_THERM_TRIP_EN_SHIFT 12 |
80 | #define EXYNOS_TMU_CALIB_MODE_SHIFT 4 | ||
81 | #define EXYNOS_TMU_CALIB_MODE_MASK 0x3 | ||
82 | 61 | ||
83 | #define EXYNOS_TMU_INTEN_RISE0_SHIFT 0 | 62 | #define EXYNOS_TMU_INTEN_RISE0_SHIFT 0 |
84 | #define EXYNOS_TMU_INTEN_RISE1_SHIFT 4 | 63 | #define EXYNOS_TMU_INTEN_RISE1_SHIFT 4 |
85 | #define EXYNOS_TMU_INTEN_RISE2_SHIFT 8 | 64 | #define EXYNOS_TMU_INTEN_RISE2_SHIFT 8 |
86 | #define EXYNOS_TMU_INTEN_RISE3_SHIFT 12 | 65 | #define EXYNOS_TMU_INTEN_RISE3_SHIFT 12 |
87 | #define EXYNOS_TMU_INTEN_FALL0_SHIFT 16 | 66 | #define EXYNOS_TMU_INTEN_FALL0_SHIFT 16 |
88 | #define EXYNOS_TMU_INTEN_FALL1_SHIFT 20 | ||
89 | #define EXYNOS_TMU_INTEN_FALL2_SHIFT 24 | ||
90 | #define EXYNOS_TMU_INTEN_FALL3_SHIFT 28 | ||
91 | 67 | ||
92 | #define EXYNOS_EMUL_TIME 0x57F0 | 68 | #define EXYNOS_EMUL_TIME 0x57F0 |
93 | #define EXYNOS_EMUL_TIME_MASK 0xffff | 69 | #define EXYNOS_EMUL_TIME_MASK 0xffff |
@@ -103,10 +79,6 @@ | |||
103 | #define EXYNOS5260_TMU_REG_INTEN 0xC0 | 79 | #define EXYNOS5260_TMU_REG_INTEN 0xC0 |
104 | #define EXYNOS5260_TMU_REG_INTSTAT 0xC4 | 80 | #define EXYNOS5260_TMU_REG_INTSTAT 0xC4 |
105 | #define EXYNOS5260_TMU_REG_INTCLEAR 0xC8 | 81 | #define EXYNOS5260_TMU_REG_INTCLEAR 0xC8 |
106 | #define EXYNOS5260_TMU_CLEAR_RISE_INT 0x1111 | ||
107 | #define EXYNOS5260_TMU_CLEAR_FALL_INT (0x1111 << 16) | ||
108 | #define EXYNOS5260_TMU_RISE_INT_MASK 0x1111 | ||
109 | #define EXYNOS5260_TMU_FALL_INT_MASK 0x1111 | ||
110 | #define EXYNOS5260_EMUL_CON 0x100 | 82 | #define EXYNOS5260_EMUL_CON 0x100 |
111 | 83 | ||
112 | /* Exynos4412 specific */ | 84 | /* Exynos4412 specific */ |
@@ -122,29 +94,17 @@ | |||
122 | #define EXYNOS5440_TMU_S0_7_TH0 0x110 | 94 | #define EXYNOS5440_TMU_S0_7_TH0 0x110 |
123 | #define EXYNOS5440_TMU_S0_7_TH1 0x130 | 95 | #define EXYNOS5440_TMU_S0_7_TH1 0x130 |
124 | #define EXYNOS5440_TMU_S0_7_TH2 0x150 | 96 | #define EXYNOS5440_TMU_S0_7_TH2 0x150 |
125 | #define EXYNOS5440_TMU_S0_7_EVTEN 0x1F0 | ||
126 | #define EXYNOS5440_TMU_S0_7_IRQEN 0x210 | 97 | #define EXYNOS5440_TMU_S0_7_IRQEN 0x210 |
127 | #define EXYNOS5440_TMU_S0_7_IRQ 0x230 | 98 | #define EXYNOS5440_TMU_S0_7_IRQ 0x230 |
128 | /* exynos5440 common registers */ | 99 | /* exynos5440 common registers */ |
129 | #define EXYNOS5440_TMU_IRQ_STATUS 0x000 | 100 | #define EXYNOS5440_TMU_IRQ_STATUS 0x000 |
130 | #define EXYNOS5440_TMU_PMIN 0x004 | 101 | #define EXYNOS5440_TMU_PMIN 0x004 |
131 | #define EXYNOS5440_TMU_TEMP 0x008 | ||
132 | 102 | ||
133 | #define EXYNOS5440_TMU_RISE_INT_MASK 0xf | ||
134 | #define EXYNOS5440_TMU_RISE_INT_SHIFT 0 | ||
135 | #define EXYNOS5440_TMU_FALL_INT_MASK 0xf | ||
136 | #define EXYNOS5440_TMU_INTEN_RISE0_SHIFT 0 | 103 | #define EXYNOS5440_TMU_INTEN_RISE0_SHIFT 0 |
137 | #define EXYNOS5440_TMU_INTEN_RISE1_SHIFT 1 | 104 | #define EXYNOS5440_TMU_INTEN_RISE1_SHIFT 1 |
138 | #define EXYNOS5440_TMU_INTEN_RISE2_SHIFT 2 | 105 | #define EXYNOS5440_TMU_INTEN_RISE2_SHIFT 2 |
139 | #define EXYNOS5440_TMU_INTEN_RISE3_SHIFT 3 | 106 | #define EXYNOS5440_TMU_INTEN_RISE3_SHIFT 3 |
140 | #define EXYNOS5440_TMU_INTEN_FALL0_SHIFT 4 | 107 | #define EXYNOS5440_TMU_INTEN_FALL0_SHIFT 4 |
141 | #define EXYNOS5440_TMU_INTEN_FALL1_SHIFT 5 | ||
142 | #define EXYNOS5440_TMU_INTEN_FALL2_SHIFT 6 | ||
143 | #define EXYNOS5440_TMU_INTEN_FALL3_SHIFT 7 | ||
144 | #define EXYNOS5440_TMU_TH_RISE0_SHIFT 0 | ||
145 | #define EXYNOS5440_TMU_TH_RISE1_SHIFT 8 | ||
146 | #define EXYNOS5440_TMU_TH_RISE2_SHIFT 16 | ||
147 | #define EXYNOS5440_TMU_TH_RISE3_SHIFT 24 | ||
148 | #define EXYNOS5440_TMU_TH_RISE4_SHIFT 24 | 108 | #define EXYNOS5440_TMU_TH_RISE4_SHIFT 24 |
149 | #define EXYNOS5440_EFUSE_SWAP_OFFSET 8 | 109 | #define EXYNOS5440_EFUSE_SWAP_OFFSET 8 |
150 | 110 | ||
diff --git a/drivers/thermal/thermal_core.c b/drivers/thermal/thermal_core.c index 9bf10aa6069b..43b90709585f 100644 --- a/drivers/thermal/thermal_core.c +++ b/drivers/thermal/thermal_core.c | |||
@@ -1575,8 +1575,7 @@ struct thermal_zone_device *thermal_zone_device_register(const char *type, | |||
1575 | 1575 | ||
1576 | thermal_zone_device_update(tz); | 1576 | thermal_zone_device_update(tz); |
1577 | 1577 | ||
1578 | if (!result) | 1578 | return tz; |
1579 | return tz; | ||
1580 | 1579 | ||
1581 | unregister: | 1580 | unregister: |
1582 | release_idr(&thermal_tz_idr, &thermal_idr_lock, tz->id); | 1581 | release_idr(&thermal_tz_idr, &thermal_idr_lock, tz->id); |
diff --git a/drivers/tty/n_tty.c b/drivers/tty/n_tty.c index 89c4cee253e3..2e900a98c3e3 100644 --- a/drivers/tty/n_tty.c +++ b/drivers/tty/n_tty.c | |||
@@ -2413,12 +2413,17 @@ static unsigned int n_tty_poll(struct tty_struct *tty, struct file *file, | |||
2413 | 2413 | ||
2414 | poll_wait(file, &tty->read_wait, wait); | 2414 | poll_wait(file, &tty->read_wait, wait); |
2415 | poll_wait(file, &tty->write_wait, wait); | 2415 | poll_wait(file, &tty->write_wait, wait); |
2416 | if (test_bit(TTY_OTHER_CLOSED, &tty->flags)) | ||
2417 | mask |= POLLHUP; | ||
2416 | if (input_available_p(tty, 1)) | 2418 | if (input_available_p(tty, 1)) |
2417 | mask |= POLLIN | POLLRDNORM; | 2419 | mask |= POLLIN | POLLRDNORM; |
2420 | else if (mask & POLLHUP) { | ||
2421 | tty_flush_to_ldisc(tty); | ||
2422 | if (input_available_p(tty, 1)) | ||
2423 | mask |= POLLIN | POLLRDNORM; | ||
2424 | } | ||
2418 | if (tty->packet && tty->link->ctrl_status) | 2425 | if (tty->packet && tty->link->ctrl_status) |
2419 | mask |= POLLPRI | POLLIN | POLLRDNORM; | 2426 | mask |= POLLPRI | POLLIN | POLLRDNORM; |
2420 | if (test_bit(TTY_OTHER_CLOSED, &tty->flags)) | ||
2421 | mask |= POLLHUP; | ||
2422 | if (tty_hung_up_p(file)) | 2427 | if (tty_hung_up_p(file)) |
2423 | mask |= POLLHUP; | 2428 | mask |= POLLHUP; |
2424 | if (!(mask & (POLLHUP | POLLIN | POLLRDNORM))) { | 2429 | if (!(mask & (POLLHUP | POLLIN | POLLRDNORM))) { |
diff --git a/drivers/tty/serial/8250/8250_mtk.c b/drivers/tty/serial/8250/8250_mtk.c index 8f37d57165ec..de7aae523b37 100644 --- a/drivers/tty/serial/8250/8250_mtk.c +++ b/drivers/tty/serial/8250/8250_mtk.c | |||
@@ -81,7 +81,7 @@ mtk8250_set_termios(struct uart_port *port, struct ktermios *termios, | |||
81 | /* Set to highest baudrate supported */ | 81 | /* Set to highest baudrate supported */ |
82 | if (baud >= 1152000) | 82 | if (baud >= 1152000) |
83 | baud = 921600; | 83 | baud = 921600; |
84 | quot = DIV_ROUND_CLOSEST(port->uartclk, 256 * baud); | 84 | quot = (port->uartclk / (256 * baud)) + 1; |
85 | } | 85 | } |
86 | 86 | ||
87 | /* | 87 | /* |
diff --git a/drivers/tty/serial/of_serial.c b/drivers/tty/serial/of_serial.c index 8bc2563335ae..56982da4a9e9 100644 --- a/drivers/tty/serial/of_serial.c +++ b/drivers/tty/serial/of_serial.c | |||
@@ -158,7 +158,7 @@ static int of_platform_serial_probe(struct platform_device *ofdev) | |||
158 | if (of_find_property(ofdev->dev.of_node, "used-by-rtas", NULL)) | 158 | if (of_find_property(ofdev->dev.of_node, "used-by-rtas", NULL)) |
159 | return -EBUSY; | 159 | return -EBUSY; |
160 | 160 | ||
161 | info = kmalloc(sizeof(*info), GFP_KERNEL); | 161 | info = kzalloc(sizeof(*info), GFP_KERNEL); |
162 | if (info == NULL) | 162 | if (info == NULL) |
163 | return -ENOMEM; | 163 | return -ENOMEM; |
164 | 164 | ||
diff --git a/drivers/tty/serial/serial_core.c b/drivers/tty/serial/serial_core.c index df3a8c74358e..eaeb9a02c7fe 100644 --- a/drivers/tty/serial/serial_core.c +++ b/drivers/tty/serial/serial_core.c | |||
@@ -363,7 +363,7 @@ uart_get_baud_rate(struct uart_port *port, struct ktermios *termios, | |||
363 | * The spd_hi, spd_vhi, spd_shi, spd_warp kludge... | 363 | * The spd_hi, spd_vhi, spd_shi, spd_warp kludge... |
364 | * Die! Die! Die! | 364 | * Die! Die! Die! |
365 | */ | 365 | */ |
366 | if (baud == 38400) | 366 | if (try == 0 && baud == 38400) |
367 | baud = altbaud; | 367 | baud = altbaud; |
368 | 368 | ||
369 | /* | 369 | /* |
diff --git a/drivers/tty/tty_io.c b/drivers/tty/tty_io.c index 16a2c0237dd6..0508a1d8e4cd 100644 --- a/drivers/tty/tty_io.c +++ b/drivers/tty/tty_io.c | |||
@@ -1709,6 +1709,8 @@ int tty_release(struct inode *inode, struct file *filp) | |||
1709 | int pty_master, tty_closing, o_tty_closing, do_sleep; | 1709 | int pty_master, tty_closing, o_tty_closing, do_sleep; |
1710 | int idx; | 1710 | int idx; |
1711 | char buf[64]; | 1711 | char buf[64]; |
1712 | long timeout = 0; | ||
1713 | int once = 1; | ||
1712 | 1714 | ||
1713 | if (tty_paranoia_check(tty, inode, __func__)) | 1715 | if (tty_paranoia_check(tty, inode, __func__)) |
1714 | return 0; | 1716 | return 0; |
@@ -1789,11 +1791,18 @@ int tty_release(struct inode *inode, struct file *filp) | |||
1789 | if (!do_sleep) | 1791 | if (!do_sleep) |
1790 | break; | 1792 | break; |
1791 | 1793 | ||
1792 | printk(KERN_WARNING "%s: %s: read/write wait queue active!\n", | 1794 | if (once) { |
1793 | __func__, tty_name(tty, buf)); | 1795 | once = 0; |
1796 | printk(KERN_WARNING "%s: %s: read/write wait queue active!\n", | ||
1797 | __func__, tty_name(tty, buf)); | ||
1798 | } | ||
1794 | tty_unlock_pair(tty, o_tty); | 1799 | tty_unlock_pair(tty, o_tty); |
1795 | mutex_unlock(&tty_mutex); | 1800 | mutex_unlock(&tty_mutex); |
1796 | schedule(); | 1801 | schedule_timeout_killable(timeout); |
1802 | if (timeout < 120 * HZ) | ||
1803 | timeout = 2 * timeout + 1; | ||
1804 | else | ||
1805 | timeout = MAX_SCHEDULE_TIMEOUT; | ||
1797 | } | 1806 | } |
1798 | 1807 | ||
1799 | /* | 1808 | /* |
diff --git a/drivers/tty/vt/consolemap.c b/drivers/tty/vt/consolemap.c index 610b720d3b91..59b25e039968 100644 --- a/drivers/tty/vt/consolemap.c +++ b/drivers/tty/vt/consolemap.c | |||
@@ -539,6 +539,12 @@ int con_set_unimap(struct vc_data *vc, ushort ct, struct unipair __user *list) | |||
539 | 539 | ||
540 | /* Save original vc_unipagdir_loc in case we allocate a new one */ | 540 | /* Save original vc_unipagdir_loc in case we allocate a new one */ |
541 | p = *vc->vc_uni_pagedir_loc; | 541 | p = *vc->vc_uni_pagedir_loc; |
542 | |||
543 | if (!p) { | ||
544 | err = -EINVAL; | ||
545 | |||
546 | goto out_unlock; | ||
547 | } | ||
542 | 548 | ||
543 | if (p->refcount > 1) { | 549 | if (p->refcount > 1) { |
544 | int j, k; | 550 | int j, k; |
@@ -623,6 +629,7 @@ int con_set_unimap(struct vc_data *vc, ushort ct, struct unipair __user *list) | |||
623 | set_inverse_transl(vc, p, i); /* Update inverse translations */ | 629 | set_inverse_transl(vc, p, i); /* Update inverse translations */ |
624 | set_inverse_trans_unicode(vc, p); | 630 | set_inverse_trans_unicode(vc, p); |
625 | 631 | ||
632 | out_unlock: | ||
626 | console_unlock(); | 633 | console_unlock(); |
627 | return err; | 634 | return err; |
628 | } | 635 | } |
diff --git a/drivers/usb/chipidea/core.c b/drivers/usb/chipidea/core.c index 3df5005c554d..9bdc6bd73432 100644 --- a/drivers/usb/chipidea/core.c +++ b/drivers/usb/chipidea/core.c | |||
@@ -742,7 +742,6 @@ static int ci_hdrc_remove(struct platform_device *pdev) | |||
742 | ci_role_destroy(ci); | 742 | ci_role_destroy(ci); |
743 | ci_hdrc_enter_lpm(ci, true); | 743 | ci_hdrc_enter_lpm(ci, true); |
744 | usb_phy_shutdown(ci->transceiver); | 744 | usb_phy_shutdown(ci->transceiver); |
745 | kfree(ci->hw_bank.regmap); | ||
746 | 745 | ||
747 | return 0; | 746 | return 0; |
748 | } | 747 | } |
diff --git a/drivers/usb/class/cdc-acm.c b/drivers/usb/class/cdc-acm.c index e934e19f49f5..077d58ac3dcb 100644 --- a/drivers/usb/class/cdc-acm.c +++ b/drivers/usb/class/cdc-acm.c | |||
@@ -60,6 +60,9 @@ static struct acm *acm_table[ACM_TTY_MINORS]; | |||
60 | 60 | ||
61 | static DEFINE_MUTEX(acm_table_lock); | 61 | static DEFINE_MUTEX(acm_table_lock); |
62 | 62 | ||
63 | static void acm_tty_set_termios(struct tty_struct *tty, | ||
64 | struct ktermios *termios_old); | ||
65 | |||
63 | /* | 66 | /* |
64 | * acm_table accessors | 67 | * acm_table accessors |
65 | */ | 68 | */ |
@@ -145,8 +148,15 @@ static int acm_ctrl_msg(struct acm *acm, int request, int value, | |||
145 | /* devices aren't required to support these requests. | 148 | /* devices aren't required to support these requests. |
146 | * the cdc acm descriptor tells whether they do... | 149 | * the cdc acm descriptor tells whether they do... |
147 | */ | 150 | */ |
148 | #define acm_set_control(acm, control) \ | 151 | static inline int acm_set_control(struct acm *acm, int control) |
149 | acm_ctrl_msg(acm, USB_CDC_REQ_SET_CONTROL_LINE_STATE, control, NULL, 0) | 152 | { |
153 | if (acm->quirks & QUIRK_CONTROL_LINE_STATE) | ||
154 | return -EOPNOTSUPP; | ||
155 | |||
156 | return acm_ctrl_msg(acm, USB_CDC_REQ_SET_CONTROL_LINE_STATE, | ||
157 | control, NULL, 0); | ||
158 | } | ||
159 | |||
150 | #define acm_set_line(acm, line) \ | 160 | #define acm_set_line(acm, line) \ |
151 | acm_ctrl_msg(acm, USB_CDC_REQ_SET_LINE_CODING, 0, line, sizeof *(line)) | 161 | acm_ctrl_msg(acm, USB_CDC_REQ_SET_LINE_CODING, 0, line, sizeof *(line)) |
152 | #define acm_send_break(acm, ms) \ | 162 | #define acm_send_break(acm, ms) \ |
@@ -554,6 +564,8 @@ static int acm_port_activate(struct tty_port *port, struct tty_struct *tty) | |||
554 | goto error_submit_urb; | 564 | goto error_submit_urb; |
555 | } | 565 | } |
556 | 566 | ||
567 | acm_tty_set_termios(tty, NULL); | ||
568 | |||
557 | /* | 569 | /* |
558 | * Unthrottle device in case the TTY was closed while throttled. | 570 | * Unthrottle device in case the TTY was closed while throttled. |
559 | */ | 571 | */ |
@@ -980,11 +992,12 @@ static void acm_tty_set_termios(struct tty_struct *tty, | |||
980 | /* FIXME: Needs to clear unsupported bits in the termios */ | 992 | /* FIXME: Needs to clear unsupported bits in the termios */ |
981 | acm->clocal = ((termios->c_cflag & CLOCAL) != 0); | 993 | acm->clocal = ((termios->c_cflag & CLOCAL) != 0); |
982 | 994 | ||
983 | if (!newline.dwDTERate) { | 995 | if (C_BAUD(tty) == B0) { |
984 | newline.dwDTERate = acm->line.dwDTERate; | 996 | newline.dwDTERate = acm->line.dwDTERate; |
985 | newctrl &= ~ACM_CTRL_DTR; | 997 | newctrl &= ~ACM_CTRL_DTR; |
986 | } else | 998 | } else if (termios_old && (termios_old->c_cflag & CBAUD) == B0) { |
987 | newctrl |= ACM_CTRL_DTR; | 999 | newctrl |= ACM_CTRL_DTR; |
1000 | } | ||
988 | 1001 | ||
989 | if (newctrl != acm->ctrlout) | 1002 | if (newctrl != acm->ctrlout) |
990 | acm_set_control(acm, acm->ctrlout = newctrl); | 1003 | acm_set_control(acm, acm->ctrlout = newctrl); |
@@ -1314,6 +1327,7 @@ made_compressed_probe: | |||
1314 | tty_port_init(&acm->port); | 1327 | tty_port_init(&acm->port); |
1315 | acm->port.ops = &acm_port_ops; | 1328 | acm->port.ops = &acm_port_ops; |
1316 | init_usb_anchor(&acm->delayed); | 1329 | init_usb_anchor(&acm->delayed); |
1330 | acm->quirks = quirks; | ||
1317 | 1331 | ||
1318 | buf = usb_alloc_coherent(usb_dev, ctrlsize, GFP_KERNEL, &acm->ctrl_dma); | 1332 | buf = usb_alloc_coherent(usb_dev, ctrlsize, GFP_KERNEL, &acm->ctrl_dma); |
1319 | if (!buf) { | 1333 | if (!buf) { |
@@ -1681,6 +1695,9 @@ static const struct usb_device_id acm_ids[] = { | |||
1681 | { USB_DEVICE(0x0572, 0x1328), /* Shiro / Aztech USB MODEM UM-3100 */ | 1695 | { USB_DEVICE(0x0572, 0x1328), /* Shiro / Aztech USB MODEM UM-3100 */ |
1682 | .driver_info = NO_UNION_NORMAL, /* has no union descriptor */ | 1696 | .driver_info = NO_UNION_NORMAL, /* has no union descriptor */ |
1683 | }, | 1697 | }, |
1698 | { USB_DEVICE(0x20df, 0x0001), /* Simtec Electronics Entropy Key */ | ||
1699 | .driver_info = QUIRK_CONTROL_LINE_STATE, }, | ||
1700 | { USB_DEVICE(0x2184, 0x001c) }, /* GW Instek AFG-2225 */ | ||
1684 | { USB_DEVICE(0x22b8, 0x6425), /* Motorola MOTOMAGX phones */ | 1701 | { USB_DEVICE(0x22b8, 0x6425), /* Motorola MOTOMAGX phones */ |
1685 | }, | 1702 | }, |
1686 | /* Motorola H24 HSPA module: */ | 1703 | /* Motorola H24 HSPA module: */ |
diff --git a/drivers/usb/class/cdc-acm.h b/drivers/usb/class/cdc-acm.h index fc75651afe1c..d3251ebd09e2 100644 --- a/drivers/usb/class/cdc-acm.h +++ b/drivers/usb/class/cdc-acm.h | |||
@@ -121,6 +121,7 @@ struct acm { | |||
121 | unsigned int throttle_req:1; /* throttle requested */ | 121 | unsigned int throttle_req:1; /* throttle requested */ |
122 | u8 bInterval; | 122 | u8 bInterval; |
123 | struct usb_anchor delayed; /* writes queued for a device about to be woken */ | 123 | struct usb_anchor delayed; /* writes queued for a device about to be woken */ |
124 | unsigned long quirks; | ||
124 | }; | 125 | }; |
125 | 126 | ||
126 | #define CDC_DATA_INTERFACE_TYPE 0x0a | 127 | #define CDC_DATA_INTERFACE_TYPE 0x0a |
@@ -132,3 +133,4 @@ struct acm { | |||
132 | #define NOT_A_MODEM BIT(3) | 133 | #define NOT_A_MODEM BIT(3) |
133 | #define NO_DATA_INTERFACE BIT(4) | 134 | #define NO_DATA_INTERFACE BIT(4) |
134 | #define IGNORE_DEVICE BIT(5) | 135 | #define IGNORE_DEVICE BIT(5) |
136 | #define QUIRK_CONTROL_LINE_STATE BIT(6) | ||
diff --git a/drivers/usb/core/hcd.c b/drivers/usb/core/hcd.c index b84fb141e122..a6efb4184f2b 100644 --- a/drivers/usb/core/hcd.c +++ b/drivers/usb/core/hcd.c | |||
@@ -2060,6 +2060,8 @@ int usb_alloc_streams(struct usb_interface *interface, | |||
2060 | return -EINVAL; | 2060 | return -EINVAL; |
2061 | if (dev->speed != USB_SPEED_SUPER) | 2061 | if (dev->speed != USB_SPEED_SUPER) |
2062 | return -EINVAL; | 2062 | return -EINVAL; |
2063 | if (dev->state < USB_STATE_CONFIGURED) | ||
2064 | return -ENODEV; | ||
2063 | 2065 | ||
2064 | for (i = 0; i < num_eps; i++) { | 2066 | for (i = 0; i < num_eps; i++) { |
2065 | /* Streams only apply to bulk endpoints. */ | 2067 | /* Streams only apply to bulk endpoints. */ |
diff --git a/drivers/usb/core/hub.c b/drivers/usb/core/hub.c index 11e80ac31324..b649fef2e35d 100644 --- a/drivers/usb/core/hub.c +++ b/drivers/usb/core/hub.c | |||
@@ -4468,9 +4468,6 @@ hub_port_init (struct usb_hub *hub, struct usb_device *udev, int port1, | |||
4468 | if (retval) | 4468 | if (retval) |
4469 | goto fail; | 4469 | goto fail; |
4470 | 4470 | ||
4471 | if (hcd->usb_phy && !hdev->parent) | ||
4472 | usb_phy_notify_connect(hcd->usb_phy, udev->speed); | ||
4473 | |||
4474 | /* | 4471 | /* |
4475 | * Some superspeed devices have finished the link training process | 4472 | * Some superspeed devices have finished the link training process |
4476 | * and attached to a superspeed hub port, but the device descriptor | 4473 | * and attached to a superspeed hub port, but the device descriptor |
@@ -4627,8 +4624,7 @@ static void hub_port_connect(struct usb_hub *hub, int port1, u16 portstatus, | |||
4627 | 4624 | ||
4628 | /* Disconnect any existing devices under this port */ | 4625 | /* Disconnect any existing devices under this port */ |
4629 | if (udev) { | 4626 | if (udev) { |
4630 | if (hcd->usb_phy && !hdev->parent && | 4627 | if (hcd->usb_phy && !hdev->parent) |
4631 | !(portstatus & USB_PORT_STAT_CONNECTION)) | ||
4632 | usb_phy_notify_disconnect(hcd->usb_phy, udev->speed); | 4628 | usb_phy_notify_disconnect(hcd->usb_phy, udev->speed); |
4633 | usb_disconnect(&port_dev->child); | 4629 | usb_disconnect(&port_dev->child); |
4634 | } | 4630 | } |
@@ -4783,6 +4779,10 @@ static void hub_port_connect(struct usb_hub *hub, int port1, u16 portstatus, | |||
4783 | port_dev->child = NULL; | 4779 | port_dev->child = NULL; |
4784 | spin_unlock_irq(&device_state_lock); | 4780 | spin_unlock_irq(&device_state_lock); |
4785 | mutex_unlock(&usb_port_peer_mutex); | 4781 | mutex_unlock(&usb_port_peer_mutex); |
4782 | } else { | ||
4783 | if (hcd->usb_phy && !hdev->parent) | ||
4784 | usb_phy_notify_connect(hcd->usb_phy, | ||
4785 | udev->speed); | ||
4786 | } | 4786 | } |
4787 | } | 4787 | } |
4788 | 4788 | ||
diff --git a/drivers/usb/core/quirks.c b/drivers/usb/core/quirks.c index 5ae883dc21f5..39b4081b632d 100644 --- a/drivers/usb/core/quirks.c +++ b/drivers/usb/core/quirks.c | |||
@@ -97,6 +97,12 @@ static const struct usb_device_id usb_quirk_list[] = { | |||
97 | { USB_DEVICE(0x04f3, 0x0089), .driver_info = | 97 | { USB_DEVICE(0x04f3, 0x0089), .driver_info = |
98 | USB_QUIRK_DEVICE_QUALIFIER }, | 98 | USB_QUIRK_DEVICE_QUALIFIER }, |
99 | 99 | ||
100 | { USB_DEVICE(0x04f3, 0x009b), .driver_info = | ||
101 | USB_QUIRK_DEVICE_QUALIFIER }, | ||
102 | |||
103 | { USB_DEVICE(0x04f3, 0x016f), .driver_info = | ||
104 | USB_QUIRK_DEVICE_QUALIFIER }, | ||
105 | |||
100 | /* Roland SC-8820 */ | 106 | /* Roland SC-8820 */ |
101 | { USB_DEVICE(0x0582, 0x0007), .driver_info = USB_QUIRK_RESET_RESUME }, | 107 | { USB_DEVICE(0x0582, 0x0007), .driver_info = USB_QUIRK_RESET_RESUME }, |
102 | 108 | ||
diff --git a/drivers/usb/dwc2/core.h b/drivers/usb/dwc2/core.h index bf015ab3b44c..55c90c53f2d6 100644 --- a/drivers/usb/dwc2/core.h +++ b/drivers/usb/dwc2/core.h | |||
@@ -619,7 +619,7 @@ struct dwc2_hsotg { | |||
619 | unsigned port_suspend_change:1; | 619 | unsigned port_suspend_change:1; |
620 | unsigned port_over_current_change:1; | 620 | unsigned port_over_current_change:1; |
621 | unsigned port_l1_change:1; | 621 | unsigned port_l1_change:1; |
622 | unsigned reserved:26; | 622 | unsigned reserved:25; |
623 | } b; | 623 | } b; |
624 | } flags; | 624 | } flags; |
625 | 625 | ||
diff --git a/drivers/usb/dwc2/gadget.c b/drivers/usb/dwc2/gadget.c index 7b5856fadd93..8b5c079c7b7d 100644 --- a/drivers/usb/dwc2/gadget.c +++ b/drivers/usb/dwc2/gadget.c | |||
@@ -2327,7 +2327,7 @@ irq_retry: | |||
2327 | 2327 | ||
2328 | u32 usb_status = readl(hsotg->regs + GOTGCTL); | 2328 | u32 usb_status = readl(hsotg->regs + GOTGCTL); |
2329 | 2329 | ||
2330 | dev_info(hsotg->dev, "%s: USBRst\n", __func__); | 2330 | dev_dbg(hsotg->dev, "%s: USBRst\n", __func__); |
2331 | dev_dbg(hsotg->dev, "GNPTXSTS=%08x\n", | 2331 | dev_dbg(hsotg->dev, "GNPTXSTS=%08x\n", |
2332 | readl(hsotg->regs + GNPTXSTS)); | 2332 | readl(hsotg->regs + GNPTXSTS)); |
2333 | 2333 | ||
@@ -2561,8 +2561,10 @@ static int s3c_hsotg_ep_enable(struct usb_ep *ep, | |||
2561 | hs_ep->fifo_size = val; | 2561 | hs_ep->fifo_size = val; |
2562 | break; | 2562 | break; |
2563 | } | 2563 | } |
2564 | if (i == 8) | 2564 | if (i == 8) { |
2565 | return -ENOMEM; | 2565 | ret = -ENOMEM; |
2566 | goto error; | ||
2567 | } | ||
2566 | } | 2568 | } |
2567 | 2569 | ||
2568 | /* for non control endpoints, set PID to D0 */ | 2570 | /* for non control endpoints, set PID to D0 */ |
@@ -2579,6 +2581,7 @@ static int s3c_hsotg_ep_enable(struct usb_ep *ep, | |||
2579 | /* enable the endpoint interrupt */ | 2581 | /* enable the endpoint interrupt */ |
2580 | s3c_hsotg_ctrl_epint(hsotg, index, dir_in, 1); | 2582 | s3c_hsotg_ctrl_epint(hsotg, index, dir_in, 1); |
2581 | 2583 | ||
2584 | error: | ||
2582 | spin_unlock_irqrestore(&hsotg->lock, flags); | 2585 | spin_unlock_irqrestore(&hsotg->lock, flags); |
2583 | return ret; | 2586 | return ret; |
2584 | } | 2587 | } |
@@ -2934,9 +2937,7 @@ static int s3c_hsotg_udc_stop(struct usb_gadget *gadget, | |||
2934 | 2937 | ||
2935 | spin_lock_irqsave(&hsotg->lock, flags); | 2938 | spin_lock_irqsave(&hsotg->lock, flags); |
2936 | 2939 | ||
2937 | if (!driver) | 2940 | hsotg->driver = NULL; |
2938 | hsotg->driver = NULL; | ||
2939 | |||
2940 | hsotg->gadget.speed = USB_SPEED_UNKNOWN; | 2941 | hsotg->gadget.speed = USB_SPEED_UNKNOWN; |
2941 | 2942 | ||
2942 | spin_unlock_irqrestore(&hsotg->lock, flags); | 2943 | spin_unlock_irqrestore(&hsotg->lock, flags); |
@@ -3567,6 +3568,7 @@ static int s3c_hsotg_probe(struct platform_device *pdev) | |||
3567 | s3c_hsotg_initep(hsotg, &hsotg->eps[epnum], epnum); | 3568 | s3c_hsotg_initep(hsotg, &hsotg->eps[epnum], epnum); |
3568 | 3569 | ||
3569 | /* disable power and clock */ | 3570 | /* disable power and clock */ |
3571 | s3c_hsotg_phy_disable(hsotg); | ||
3570 | 3572 | ||
3571 | ret = regulator_bulk_disable(ARRAY_SIZE(hsotg->supplies), | 3573 | ret = regulator_bulk_disable(ARRAY_SIZE(hsotg->supplies), |
3572 | hsotg->supplies); | 3574 | hsotg->supplies); |
@@ -3575,8 +3577,6 @@ static int s3c_hsotg_probe(struct platform_device *pdev) | |||
3575 | goto err_ep_mem; | 3577 | goto err_ep_mem; |
3576 | } | 3578 | } |
3577 | 3579 | ||
3578 | s3c_hsotg_phy_disable(hsotg); | ||
3579 | |||
3580 | ret = usb_add_gadget_udc(&pdev->dev, &hsotg->gadget); | 3580 | ret = usb_add_gadget_udc(&pdev->dev, &hsotg->gadget); |
3581 | if (ret) | 3581 | if (ret) |
3582 | goto err_ep_mem; | 3582 | goto err_ep_mem; |
diff --git a/drivers/usb/dwc3/dwc3-omap.c b/drivers/usb/dwc3/dwc3-omap.c index 2f537d588225..a0aa9f3da441 100644 --- a/drivers/usb/dwc3/dwc3-omap.c +++ b/drivers/usb/dwc3/dwc3-omap.c | |||
@@ -597,7 +597,7 @@ static int dwc3_omap_prepare(struct device *dev) | |||
597 | { | 597 | { |
598 | struct dwc3_omap *omap = dev_get_drvdata(dev); | 598 | struct dwc3_omap *omap = dev_get_drvdata(dev); |
599 | 599 | ||
600 | dwc3_omap_write_irqmisc_set(omap, 0x00); | 600 | dwc3_omap_disable_irqs(omap); |
601 | 601 | ||
602 | return 0; | 602 | return 0; |
603 | } | 603 | } |
@@ -605,19 +605,8 @@ static int dwc3_omap_prepare(struct device *dev) | |||
605 | static void dwc3_omap_complete(struct device *dev) | 605 | static void dwc3_omap_complete(struct device *dev) |
606 | { | 606 | { |
607 | struct dwc3_omap *omap = dev_get_drvdata(dev); | 607 | struct dwc3_omap *omap = dev_get_drvdata(dev); |
608 | u32 reg; | ||
609 | 608 | ||
610 | reg = (USBOTGSS_IRQMISC_OEVT | | 609 | dwc3_omap_enable_irqs(omap); |
611 | USBOTGSS_IRQMISC_DRVVBUS_RISE | | ||
612 | USBOTGSS_IRQMISC_CHRGVBUS_RISE | | ||
613 | USBOTGSS_IRQMISC_DISCHRGVBUS_RISE | | ||
614 | USBOTGSS_IRQMISC_IDPULLUP_RISE | | ||
615 | USBOTGSS_IRQMISC_DRVVBUS_FALL | | ||
616 | USBOTGSS_IRQMISC_CHRGVBUS_FALL | | ||
617 | USBOTGSS_IRQMISC_DISCHRGVBUS_FALL | | ||
618 | USBOTGSS_IRQMISC_IDPULLUP_FALL); | ||
619 | |||
620 | dwc3_omap_write_irqmisc_set(omap, reg); | ||
621 | } | 610 | } |
622 | 611 | ||
623 | static int dwc3_omap_suspend(struct device *dev) | 612 | static int dwc3_omap_suspend(struct device *dev) |
diff --git a/drivers/usb/dwc3/dwc3-pci.c b/drivers/usb/dwc3/dwc3-pci.c index 436fb08c40b8..a36cf66302fb 100644 --- a/drivers/usb/dwc3/dwc3-pci.c +++ b/drivers/usb/dwc3/dwc3-pci.c | |||
@@ -30,6 +30,7 @@ | |||
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 | #define PCI_DEVICE_ID_INTEL_MRFLD 0x119e |
33 | #define PCI_DEVICE_ID_INTEL_BSW 0x22B7 | ||
33 | 34 | ||
34 | struct dwc3_pci { | 35 | struct dwc3_pci { |
35 | struct device *dev; | 36 | struct device *dev; |
@@ -181,6 +182,7 @@ static const struct pci_device_id dwc3_pci_id_table[] = { | |||
181 | PCI_DEVICE(PCI_VENDOR_ID_SYNOPSYS, | 182 | PCI_DEVICE(PCI_VENDOR_ID_SYNOPSYS, |
182 | PCI_DEVICE_ID_SYNOPSYS_HAPSUSB3), | 183 | PCI_DEVICE_ID_SYNOPSYS_HAPSUSB3), |
183 | }, | 184 | }, |
185 | { PCI_DEVICE(PCI_VENDOR_ID_INTEL, PCI_DEVICE_ID_INTEL_BSW), }, | ||
184 | { PCI_DEVICE(PCI_VENDOR_ID_INTEL, PCI_DEVICE_ID_INTEL_BYT), }, | 186 | { PCI_DEVICE(PCI_VENDOR_ID_INTEL, PCI_DEVICE_ID_INTEL_BYT), }, |
185 | { PCI_DEVICE(PCI_VENDOR_ID_INTEL, PCI_DEVICE_ID_INTEL_MRFLD), }, | 187 | { PCI_DEVICE(PCI_VENDOR_ID_INTEL, PCI_DEVICE_ID_INTEL_MRFLD), }, |
186 | { } /* Terminating Entry */ | 188 | { } /* Terminating Entry */ |
diff --git a/drivers/usb/dwc3/ep0.c b/drivers/usb/dwc3/ep0.c index b35938777dde..711b23019d54 100644 --- a/drivers/usb/dwc3/ep0.c +++ b/drivers/usb/dwc3/ep0.c | |||
@@ -256,7 +256,7 @@ static void dwc3_ep0_stall_and_restart(struct dwc3 *dwc) | |||
256 | 256 | ||
257 | /* stall is always issued on EP0 */ | 257 | /* stall is always issued on EP0 */ |
258 | dep = dwc->eps[0]; | 258 | dep = dwc->eps[0]; |
259 | __dwc3_gadget_ep_set_halt(dep, 1); | 259 | __dwc3_gadget_ep_set_halt(dep, 1, false); |
260 | dep->flags = DWC3_EP_ENABLED; | 260 | dep->flags = DWC3_EP_ENABLED; |
261 | dwc->delayed_status = false; | 261 | dwc->delayed_status = false; |
262 | 262 | ||
@@ -271,7 +271,7 @@ static void dwc3_ep0_stall_and_restart(struct dwc3 *dwc) | |||
271 | dwc3_ep0_out_start(dwc); | 271 | dwc3_ep0_out_start(dwc); |
272 | } | 272 | } |
273 | 273 | ||
274 | int dwc3_gadget_ep0_set_halt(struct usb_ep *ep, int value) | 274 | int __dwc3_gadget_ep0_set_halt(struct usb_ep *ep, int value) |
275 | { | 275 | { |
276 | struct dwc3_ep *dep = to_dwc3_ep(ep); | 276 | struct dwc3_ep *dep = to_dwc3_ep(ep); |
277 | struct dwc3 *dwc = dep->dwc; | 277 | struct dwc3 *dwc = dep->dwc; |
@@ -281,6 +281,20 @@ int dwc3_gadget_ep0_set_halt(struct usb_ep *ep, int value) | |||
281 | return 0; | 281 | return 0; |
282 | } | 282 | } |
283 | 283 | ||
284 | int dwc3_gadget_ep0_set_halt(struct usb_ep *ep, int value) | ||
285 | { | ||
286 | struct dwc3_ep *dep = to_dwc3_ep(ep); | ||
287 | struct dwc3 *dwc = dep->dwc; | ||
288 | unsigned long flags; | ||
289 | int ret; | ||
290 | |||
291 | spin_lock_irqsave(&dwc->lock, flags); | ||
292 | ret = __dwc3_gadget_ep0_set_halt(ep, value); | ||
293 | spin_unlock_irqrestore(&dwc->lock, flags); | ||
294 | |||
295 | return ret; | ||
296 | } | ||
297 | |||
284 | void dwc3_ep0_out_start(struct dwc3 *dwc) | 298 | void dwc3_ep0_out_start(struct dwc3 *dwc) |
285 | { | 299 | { |
286 | int ret; | 300 | int ret; |
@@ -466,7 +480,7 @@ static int dwc3_ep0_handle_feature(struct dwc3 *dwc, | |||
466 | return -EINVAL; | 480 | return -EINVAL; |
467 | if (set == 0 && (dep->flags & DWC3_EP_WEDGE)) | 481 | if (set == 0 && (dep->flags & DWC3_EP_WEDGE)) |
468 | break; | 482 | break; |
469 | ret = __dwc3_gadget_ep_set_halt(dep, set); | 483 | ret = __dwc3_gadget_ep_set_halt(dep, set, true); |
470 | if (ret) | 484 | if (ret) |
471 | return -EINVAL; | 485 | return -EINVAL; |
472 | break; | 486 | break; |
@@ -775,9 +789,6 @@ static void dwc3_ep0_complete_data(struct dwc3 *dwc, | |||
775 | 789 | ||
776 | dwc->ep0_next_event = DWC3_EP0_NRDY_STATUS; | 790 | dwc->ep0_next_event = DWC3_EP0_NRDY_STATUS; |
777 | 791 | ||
778 | r = next_request(&ep0->request_list); | ||
779 | ur = &r->request; | ||
780 | |||
781 | trb = dwc->ep0_trb; | 792 | trb = dwc->ep0_trb; |
782 | 793 | ||
783 | status = DWC3_TRB_SIZE_TRBSTS(trb->size); | 794 | status = DWC3_TRB_SIZE_TRBSTS(trb->size); |
@@ -790,6 +801,12 @@ static void dwc3_ep0_complete_data(struct dwc3 *dwc, | |||
790 | return; | 801 | return; |
791 | } | 802 | } |
792 | 803 | ||
804 | r = next_request(&ep0->request_list); | ||
805 | if (!r) | ||
806 | return; | ||
807 | |||
808 | ur = &r->request; | ||
809 | |||
793 | length = trb->size & DWC3_TRB_SIZE_MASK; | 810 | length = trb->size & DWC3_TRB_SIZE_MASK; |
794 | 811 | ||
795 | if (dwc->ep0_bounced) { | 812 | if (dwc->ep0_bounced) { |
@@ -811,12 +828,19 @@ static void dwc3_ep0_complete_data(struct dwc3 *dwc, | |||
811 | 828 | ||
812 | dwc3_ep0_stall_and_restart(dwc); | 829 | dwc3_ep0_stall_and_restart(dwc); |
813 | } else { | 830 | } else { |
814 | /* | 831 | dwc3_gadget_giveback(ep0, r, 0); |
815 | * handle the case where we have to send a zero packet. This | 832 | |
816 | * seems to be case when req.length > maxpacket. Could it be? | 833 | if (IS_ALIGNED(ur->length, ep0->endpoint.maxpacket) && |
817 | */ | 834 | ur->length && ur->zero) { |
818 | if (r) | 835 | int ret; |
819 | dwc3_gadget_giveback(ep0, r, 0); | 836 | |
837 | dwc->ep0_next_event = DWC3_EP0_COMPLETE; | ||
838 | |||
839 | ret = dwc3_ep0_start_trans(dwc, epnum, | ||
840 | dwc->ctrl_req_addr, 0, | ||
841 | DWC3_TRBCTL_CONTROL_DATA); | ||
842 | WARN_ON(ret < 0); | ||
843 | } | ||
820 | } | 844 | } |
821 | } | 845 | } |
822 | 846 | ||
diff --git a/drivers/usb/dwc3/gadget.c b/drivers/usb/dwc3/gadget.c index 3818b26bfc05..546ea5431b8c 100644 --- a/drivers/usb/dwc3/gadget.c +++ b/drivers/usb/dwc3/gadget.c | |||
@@ -525,12 +525,11 @@ static int __dwc3_gadget_ep_enable(struct dwc3_ep *dep, | |||
525 | if (!usb_endpoint_xfer_isoc(desc)) | 525 | if (!usb_endpoint_xfer_isoc(desc)) |
526 | return 0; | 526 | return 0; |
527 | 527 | ||
528 | memset(&trb_link, 0, sizeof(trb_link)); | ||
529 | |||
530 | /* Link TRB for ISOC. The HWO bit is never reset */ | 528 | /* Link TRB for ISOC. The HWO bit is never reset */ |
531 | trb_st_hw = &dep->trb_pool[0]; | 529 | trb_st_hw = &dep->trb_pool[0]; |
532 | 530 | ||
533 | trb_link = &dep->trb_pool[DWC3_TRB_NUM - 1]; | 531 | trb_link = &dep->trb_pool[DWC3_TRB_NUM - 1]; |
532 | memset(trb_link, 0, sizeof(*trb_link)); | ||
534 | 533 | ||
535 | trb_link->bpl = lower_32_bits(dwc3_trb_dma_offset(dep, trb_st_hw)); | 534 | trb_link->bpl = lower_32_bits(dwc3_trb_dma_offset(dep, trb_st_hw)); |
536 | trb_link->bph = upper_32_bits(dwc3_trb_dma_offset(dep, trb_st_hw)); | 535 | trb_link->bph = upper_32_bits(dwc3_trb_dma_offset(dep, trb_st_hw)); |
@@ -581,7 +580,7 @@ static int __dwc3_gadget_ep_disable(struct dwc3_ep *dep) | |||
581 | 580 | ||
582 | /* make sure HW endpoint isn't stalled */ | 581 | /* make sure HW endpoint isn't stalled */ |
583 | if (dep->flags & DWC3_EP_STALL) | 582 | if (dep->flags & DWC3_EP_STALL) |
584 | __dwc3_gadget_ep_set_halt(dep, 0); | 583 | __dwc3_gadget_ep_set_halt(dep, 0, false); |
585 | 584 | ||
586 | reg = dwc3_readl(dwc->regs, DWC3_DALEPENA); | 585 | reg = dwc3_readl(dwc->regs, DWC3_DALEPENA); |
587 | reg &= ~DWC3_DALEPENA_EP(dep->number); | 586 | reg &= ~DWC3_DALEPENA_EP(dep->number); |
@@ -1202,15 +1201,28 @@ out0: | |||
1202 | return ret; | 1201 | return ret; |
1203 | } | 1202 | } |
1204 | 1203 | ||
1205 | int __dwc3_gadget_ep_set_halt(struct dwc3_ep *dep, int value) | 1204 | int __dwc3_gadget_ep_set_halt(struct dwc3_ep *dep, int value, int protocol) |
1206 | { | 1205 | { |
1207 | struct dwc3_gadget_ep_cmd_params params; | 1206 | struct dwc3_gadget_ep_cmd_params params; |
1208 | struct dwc3 *dwc = dep->dwc; | 1207 | struct dwc3 *dwc = dep->dwc; |
1209 | int ret; | 1208 | int ret; |
1210 | 1209 | ||
1210 | if (usb_endpoint_xfer_isoc(dep->endpoint.desc)) { | ||
1211 | dev_err(dwc->dev, "%s is of Isochronous type\n", dep->name); | ||
1212 | return -EINVAL; | ||
1213 | } | ||
1214 | |||
1211 | memset(¶ms, 0x00, sizeof(params)); | 1215 | memset(¶ms, 0x00, sizeof(params)); |
1212 | 1216 | ||
1213 | if (value) { | 1217 | if (value) { |
1218 | if (!protocol && ((dep->direction && dep->flags & DWC3_EP_BUSY) || | ||
1219 | (!list_empty(&dep->req_queued) || | ||
1220 | !list_empty(&dep->request_list)))) { | ||
1221 | dev_dbg(dwc->dev, "%s: pending request, cannot halt\n", | ||
1222 | dep->name); | ||
1223 | return -EAGAIN; | ||
1224 | } | ||
1225 | |||
1214 | ret = dwc3_send_gadget_ep_cmd(dwc, dep->number, | 1226 | ret = dwc3_send_gadget_ep_cmd(dwc, dep->number, |
1215 | DWC3_DEPCMD_SETSTALL, ¶ms); | 1227 | DWC3_DEPCMD_SETSTALL, ¶ms); |
1216 | if (ret) | 1228 | if (ret) |
@@ -1241,15 +1253,7 @@ static int dwc3_gadget_ep_set_halt(struct usb_ep *ep, int value) | |||
1241 | int ret; | 1253 | int ret; |
1242 | 1254 | ||
1243 | spin_lock_irqsave(&dwc->lock, flags); | 1255 | spin_lock_irqsave(&dwc->lock, flags); |
1244 | 1256 | ret = __dwc3_gadget_ep_set_halt(dep, value, false); | |
1245 | if (usb_endpoint_xfer_isoc(dep->endpoint.desc)) { | ||
1246 | dev_err(dwc->dev, "%s is of Isochronous type\n", dep->name); | ||
1247 | ret = -EINVAL; | ||
1248 | goto out; | ||
1249 | } | ||
1250 | |||
1251 | ret = __dwc3_gadget_ep_set_halt(dep, value); | ||
1252 | out: | ||
1253 | spin_unlock_irqrestore(&dwc->lock, flags); | 1257 | spin_unlock_irqrestore(&dwc->lock, flags); |
1254 | 1258 | ||
1255 | return ret; | 1259 | return ret; |
@@ -1260,15 +1264,18 @@ static int dwc3_gadget_ep_set_wedge(struct usb_ep *ep) | |||
1260 | struct dwc3_ep *dep = to_dwc3_ep(ep); | 1264 | struct dwc3_ep *dep = to_dwc3_ep(ep); |
1261 | struct dwc3 *dwc = dep->dwc; | 1265 | struct dwc3 *dwc = dep->dwc; |
1262 | unsigned long flags; | 1266 | unsigned long flags; |
1267 | int ret; | ||
1263 | 1268 | ||
1264 | spin_lock_irqsave(&dwc->lock, flags); | 1269 | spin_lock_irqsave(&dwc->lock, flags); |
1265 | dep->flags |= DWC3_EP_WEDGE; | 1270 | dep->flags |= DWC3_EP_WEDGE; |
1266 | spin_unlock_irqrestore(&dwc->lock, flags); | ||
1267 | 1271 | ||
1268 | if (dep->number == 0 || dep->number == 1) | 1272 | if (dep->number == 0 || dep->number == 1) |
1269 | return dwc3_gadget_ep0_set_halt(ep, 1); | 1273 | ret = __dwc3_gadget_ep0_set_halt(ep, 1); |
1270 | else | 1274 | else |
1271 | return dwc3_gadget_ep_set_halt(ep, 1); | 1275 | ret = __dwc3_gadget_ep_set_halt(dep, 1, false); |
1276 | spin_unlock_irqrestore(&dwc->lock, flags); | ||
1277 | |||
1278 | return ret; | ||
1272 | } | 1279 | } |
1273 | 1280 | ||
1274 | /* -------------------------------------------------------------------------- */ | 1281 | /* -------------------------------------------------------------------------- */ |
diff --git a/drivers/usb/dwc3/gadget.h b/drivers/usb/dwc3/gadget.h index 178ad8982206..18ae3eaa8b6f 100644 --- a/drivers/usb/dwc3/gadget.h +++ b/drivers/usb/dwc3/gadget.h | |||
@@ -82,10 +82,11 @@ void dwc3_gadget_giveback(struct dwc3_ep *dep, struct dwc3_request *req, | |||
82 | void dwc3_ep0_interrupt(struct dwc3 *dwc, | 82 | void dwc3_ep0_interrupt(struct dwc3 *dwc, |
83 | const struct dwc3_event_depevt *event); | 83 | const struct dwc3_event_depevt *event); |
84 | void dwc3_ep0_out_start(struct dwc3 *dwc); | 84 | void dwc3_ep0_out_start(struct dwc3 *dwc); |
85 | int __dwc3_gadget_ep0_set_halt(struct usb_ep *ep, int value); | ||
85 | int dwc3_gadget_ep0_set_halt(struct usb_ep *ep, int value); | 86 | int dwc3_gadget_ep0_set_halt(struct usb_ep *ep, int value); |
86 | int dwc3_gadget_ep0_queue(struct usb_ep *ep, struct usb_request *request, | 87 | int dwc3_gadget_ep0_queue(struct usb_ep *ep, struct usb_request *request, |
87 | gfp_t gfp_flags); | 88 | gfp_t gfp_flags); |
88 | int __dwc3_gadget_ep_set_halt(struct dwc3_ep *dep, int value); | 89 | int __dwc3_gadget_ep_set_halt(struct dwc3_ep *dep, int value, int protocol); |
89 | 90 | ||
90 | /** | 91 | /** |
91 | * dwc3_gadget_ep_get_transfer_index - Gets transfer index from HW | 92 | * dwc3_gadget_ep_get_transfer_index - Gets transfer index from HW |
diff --git a/drivers/usb/dwc3/trace.h b/drivers/usb/dwc3/trace.h index 78aff1da089a..60b0f41eafc4 100644 --- a/drivers/usb/dwc3/trace.h +++ b/drivers/usb/dwc3/trace.h | |||
@@ -73,15 +73,23 @@ DECLARE_EVENT_CLASS(dwc3_log_ctrl, | |||
73 | TP_PROTO(struct usb_ctrlrequest *ctrl), | 73 | TP_PROTO(struct usb_ctrlrequest *ctrl), |
74 | TP_ARGS(ctrl), | 74 | TP_ARGS(ctrl), |
75 | TP_STRUCT__entry( | 75 | TP_STRUCT__entry( |
76 | __field(struct usb_ctrlrequest *, ctrl) | 76 | __field(__u8, bRequestType) |
77 | __field(__u8, bRequest) | ||
78 | __field(__le16, wValue) | ||
79 | __field(__le16, wIndex) | ||
80 | __field(__le16, wLength) | ||
77 | ), | 81 | ), |
78 | TP_fast_assign( | 82 | TP_fast_assign( |
79 | __entry->ctrl = ctrl; | 83 | __entry->bRequestType = ctrl->bRequestType; |
84 | __entry->bRequest = ctrl->bRequest; | ||
85 | __entry->wValue = ctrl->wValue; | ||
86 | __entry->wIndex = ctrl->wIndex; | ||
87 | __entry->wLength = ctrl->wLength; | ||
80 | ), | 88 | ), |
81 | TP_printk("bRequestType %02x bRequest %02x wValue %04x wIndex %04x wLength %d", | 89 | TP_printk("bRequestType %02x bRequest %02x wValue %04x wIndex %04x wLength %d", |
82 | __entry->ctrl->bRequestType, __entry->ctrl->bRequest, | 90 | __entry->bRequestType, __entry->bRequest, |
83 | le16_to_cpu(__entry->ctrl->wValue), le16_to_cpu(__entry->ctrl->wIndex), | 91 | le16_to_cpu(__entry->wValue), le16_to_cpu(__entry->wIndex), |
84 | le16_to_cpu(__entry->ctrl->wLength) | 92 | le16_to_cpu(__entry->wLength) |
85 | ) | 93 | ) |
86 | ); | 94 | ); |
87 | 95 | ||
@@ -94,15 +102,22 @@ DECLARE_EVENT_CLASS(dwc3_log_request, | |||
94 | TP_PROTO(struct dwc3_request *req), | 102 | TP_PROTO(struct dwc3_request *req), |
95 | TP_ARGS(req), | 103 | TP_ARGS(req), |
96 | TP_STRUCT__entry( | 104 | TP_STRUCT__entry( |
105 | __dynamic_array(char, name, DWC3_MSG_MAX) | ||
97 | __field(struct dwc3_request *, req) | 106 | __field(struct dwc3_request *, req) |
107 | __field(unsigned, actual) | ||
108 | __field(unsigned, length) | ||
109 | __field(int, status) | ||
98 | ), | 110 | ), |
99 | TP_fast_assign( | 111 | TP_fast_assign( |
112 | snprintf(__get_str(name), DWC3_MSG_MAX, "%s", req->dep->name); | ||
100 | __entry->req = req; | 113 | __entry->req = req; |
114 | __entry->actual = req->request.actual; | ||
115 | __entry->length = req->request.length; | ||
116 | __entry->status = req->request.status; | ||
101 | ), | 117 | ), |
102 | TP_printk("%s: req %p length %u/%u ==> %d", | 118 | TP_printk("%s: req %p length %u/%u ==> %d", |
103 | __entry->req->dep->name, __entry->req, | 119 | __get_str(name), __entry->req, __entry->actual, __entry->length, |
104 | __entry->req->request.actual, __entry->req->request.length, | 120 | __entry->status |
105 | __entry->req->request.status | ||
106 | ) | 121 | ) |
107 | ); | 122 | ); |
108 | 123 | ||
@@ -158,17 +173,17 @@ DECLARE_EVENT_CLASS(dwc3_log_gadget_ep_cmd, | |||
158 | struct dwc3_gadget_ep_cmd_params *params), | 173 | struct dwc3_gadget_ep_cmd_params *params), |
159 | TP_ARGS(dep, cmd, params), | 174 | TP_ARGS(dep, cmd, params), |
160 | TP_STRUCT__entry( | 175 | TP_STRUCT__entry( |
161 | __field(struct dwc3_ep *, dep) | 176 | __dynamic_array(char, name, DWC3_MSG_MAX) |
162 | __field(unsigned int, cmd) | 177 | __field(unsigned int, cmd) |
163 | __field(struct dwc3_gadget_ep_cmd_params *, params) | 178 | __field(struct dwc3_gadget_ep_cmd_params *, params) |
164 | ), | 179 | ), |
165 | TP_fast_assign( | 180 | TP_fast_assign( |
166 | __entry->dep = dep; | 181 | snprintf(__get_str(name), DWC3_MSG_MAX, "%s", dep->name); |
167 | __entry->cmd = cmd; | 182 | __entry->cmd = cmd; |
168 | __entry->params = params; | 183 | __entry->params = params; |
169 | ), | 184 | ), |
170 | TP_printk("%s: cmd '%s' [%d] params %08x %08x %08x\n", | 185 | TP_printk("%s: cmd '%s' [%d] params %08x %08x %08x\n", |
171 | __entry->dep->name, dwc3_gadget_ep_cmd_string(__entry->cmd), | 186 | __get_str(name), dwc3_gadget_ep_cmd_string(__entry->cmd), |
172 | __entry->cmd, __entry->params->param0, | 187 | __entry->cmd, __entry->params->param0, |
173 | __entry->params->param1, __entry->params->param2 | 188 | __entry->params->param1, __entry->params->param2 |
174 | ) | 189 | ) |
@@ -184,16 +199,24 @@ DECLARE_EVENT_CLASS(dwc3_log_trb, | |||
184 | TP_PROTO(struct dwc3_ep *dep, struct dwc3_trb *trb), | 199 | TP_PROTO(struct dwc3_ep *dep, struct dwc3_trb *trb), |
185 | TP_ARGS(dep, trb), | 200 | TP_ARGS(dep, trb), |
186 | TP_STRUCT__entry( | 201 | TP_STRUCT__entry( |
187 | __field(struct dwc3_ep *, dep) | 202 | __dynamic_array(char, name, DWC3_MSG_MAX) |
188 | __field(struct dwc3_trb *, trb) | 203 | __field(struct dwc3_trb *, trb) |
204 | __field(u32, bpl) | ||
205 | __field(u32, bph) | ||
206 | __field(u32, size) | ||
207 | __field(u32, ctrl) | ||
189 | ), | 208 | ), |
190 | TP_fast_assign( | 209 | TP_fast_assign( |
191 | __entry->dep = dep; | 210 | snprintf(__get_str(name), DWC3_MSG_MAX, "%s", dep->name); |
192 | __entry->trb = trb; | 211 | __entry->trb = trb; |
212 | __entry->bpl = trb->bpl; | ||
213 | __entry->bph = trb->bph; | ||
214 | __entry->size = trb->size; | ||
215 | __entry->ctrl = trb->ctrl; | ||
193 | ), | 216 | ), |
194 | TP_printk("%s: trb %p bph %08x bpl %08x size %08x ctrl %08x\n", | 217 | TP_printk("%s: trb %p bph %08x bpl %08x size %08x ctrl %08x\n", |
195 | __entry->dep->name, __entry->trb, __entry->trb->bph, | 218 | __get_str(name), __entry->trb, __entry->bph, __entry->bpl, |
196 | __entry->trb->bpl, __entry->trb->size, __entry->trb->ctrl | 219 | __entry->size, __entry->ctrl |
197 | ) | 220 | ) |
198 | ); | 221 | ); |
199 | 222 | ||
diff --git a/drivers/usb/gadget/composite.c b/drivers/usb/gadget/composite.c index a8c18df171c3..f6a51fddd5b5 100644 --- a/drivers/usb/gadget/composite.c +++ b/drivers/usb/gadget/composite.c | |||
@@ -560,7 +560,7 @@ static int bos_desc(struct usb_composite_dev *cdev) | |||
560 | usb_ext->bLength = USB_DT_USB_EXT_CAP_SIZE; | 560 | usb_ext->bLength = USB_DT_USB_EXT_CAP_SIZE; |
561 | usb_ext->bDescriptorType = USB_DT_DEVICE_CAPABILITY; | 561 | usb_ext->bDescriptorType = USB_DT_DEVICE_CAPABILITY; |
562 | usb_ext->bDevCapabilityType = USB_CAP_TYPE_EXT; | 562 | usb_ext->bDevCapabilityType = USB_CAP_TYPE_EXT; |
563 | usb_ext->bmAttributes = cpu_to_le32(USB_LPM_SUPPORT); | 563 | usb_ext->bmAttributes = cpu_to_le32(USB_LPM_SUPPORT | USB_BESL_SUPPORT); |
564 | 564 | ||
565 | /* | 565 | /* |
566 | * The Superspeed USB Capability descriptor shall be implemented by all | 566 | * The Superspeed USB Capability descriptor shall be implemented by all |
diff --git a/drivers/usb/gadget/function/f_acm.c b/drivers/usb/gadget/function/f_acm.c index 6da4685490ef..aad8165e98ef 100644 --- a/drivers/usb/gadget/function/f_acm.c +++ b/drivers/usb/gadget/function/f_acm.c | |||
@@ -433,12 +433,12 @@ static int acm_set_alt(struct usb_function *f, unsigned intf, unsigned alt) | |||
433 | dev_vdbg(&cdev->gadget->dev, | 433 | dev_vdbg(&cdev->gadget->dev, |
434 | "reset acm control interface %d\n", intf); | 434 | "reset acm control interface %d\n", intf); |
435 | usb_ep_disable(acm->notify); | 435 | usb_ep_disable(acm->notify); |
436 | } else { | 436 | } |
437 | dev_vdbg(&cdev->gadget->dev, | 437 | |
438 | "init acm ctrl interface %d\n", intf); | 438 | if (!acm->notify->desc) |
439 | if (config_ep_by_speed(cdev->gadget, f, acm->notify)) | 439 | if (config_ep_by_speed(cdev->gadget, f, acm->notify)) |
440 | return -EINVAL; | 440 | return -EINVAL; |
441 | } | 441 | |
442 | usb_ep_enable(acm->notify); | 442 | usb_ep_enable(acm->notify); |
443 | acm->notify->driver_data = acm; | 443 | acm->notify->driver_data = acm; |
444 | 444 | ||
diff --git a/drivers/usb/gadget/function/f_eem.c b/drivers/usb/gadget/function/f_eem.c index 4d8b236ea608..c9e90de5bdd9 100644 --- a/drivers/usb/gadget/function/f_eem.c +++ b/drivers/usb/gadget/function/f_eem.c | |||
@@ -325,7 +325,6 @@ static int eem_bind(struct usb_configuration *c, struct usb_function *f) | |||
325 | return 0; | 325 | return 0; |
326 | 326 | ||
327 | fail: | 327 | fail: |
328 | usb_free_all_descriptors(f); | ||
329 | if (eem->port.out_ep) | 328 | if (eem->port.out_ep) |
330 | eem->port.out_ep->driver_data = NULL; | 329 | eem->port.out_ep->driver_data = NULL; |
331 | if (eem->port.in_ep) | 330 | if (eem->port.in_ep) |
diff --git a/drivers/usb/gadget/function/f_fs.c b/drivers/usb/gadget/function/f_fs.c index 7c6771d027a2..63314ede7ba6 100644 --- a/drivers/usb/gadget/function/f_fs.c +++ b/drivers/usb/gadget/function/f_fs.c | |||
@@ -647,15 +647,26 @@ static void ffs_user_copy_worker(struct work_struct *work) | |||
647 | if (io_data->read && ret > 0) { | 647 | if (io_data->read && ret > 0) { |
648 | int i; | 648 | int i; |
649 | size_t pos = 0; | 649 | size_t pos = 0; |
650 | |||
651 | /* | ||
652 | * Since req->length may be bigger than io_data->len (after | ||
653 | * being rounded up to maxpacketsize), we may end up with more | ||
654 | * data then user space has space for. | ||
655 | */ | ||
656 | ret = min_t(int, ret, io_data->len); | ||
657 | |||
650 | use_mm(io_data->mm); | 658 | use_mm(io_data->mm); |
651 | for (i = 0; i < io_data->nr_segs; i++) { | 659 | for (i = 0; i < io_data->nr_segs; i++) { |
660 | size_t len = min_t(size_t, ret - pos, | ||
661 | io_data->iovec[i].iov_len); | ||
662 | if (!len) | ||
663 | break; | ||
652 | if (unlikely(copy_to_user(io_data->iovec[i].iov_base, | 664 | if (unlikely(copy_to_user(io_data->iovec[i].iov_base, |
653 | &io_data->buf[pos], | 665 | &io_data->buf[pos], len))) { |
654 | io_data->iovec[i].iov_len))) { | ||
655 | ret = -EFAULT; | 666 | ret = -EFAULT; |
656 | break; | 667 | break; |
657 | } | 668 | } |
658 | pos += io_data->iovec[i].iov_len; | 669 | pos += len; |
659 | } | 670 | } |
660 | unuse_mm(io_data->mm); | 671 | unuse_mm(io_data->mm); |
661 | } | 672 | } |
@@ -687,7 +698,7 @@ static ssize_t ffs_epfile_io(struct file *file, struct ffs_io_data *io_data) | |||
687 | struct ffs_epfile *epfile = file->private_data; | 698 | struct ffs_epfile *epfile = file->private_data; |
688 | struct ffs_ep *ep; | 699 | struct ffs_ep *ep; |
689 | char *data = NULL; | 700 | char *data = NULL; |
690 | ssize_t ret, data_len; | 701 | ssize_t ret, data_len = -EINVAL; |
691 | int halt; | 702 | int halt; |
692 | 703 | ||
693 | /* Are we still active? */ | 704 | /* Are we still active? */ |
@@ -787,13 +798,30 @@ static ssize_t ffs_epfile_io(struct file *file, struct ffs_io_data *io_data) | |||
787 | /* Fire the request */ | 798 | /* Fire the request */ |
788 | struct usb_request *req; | 799 | struct usb_request *req; |
789 | 800 | ||
801 | /* | ||
802 | * Sanity Check: even though data_len can't be used | ||
803 | * uninitialized at the time I write this comment, some | ||
804 | * compilers complain about this situation. | ||
805 | * In order to keep the code clean from warnings, data_len is | ||
806 | * being initialized to -EINVAL during its declaration, which | ||
807 | * means we can't rely on compiler anymore to warn no future | ||
808 | * changes won't result in data_len being used uninitialized. | ||
809 | * For such reason, we're adding this redundant sanity check | ||
810 | * here. | ||
811 | */ | ||
812 | if (unlikely(data_len == -EINVAL)) { | ||
813 | WARN(1, "%s: data_len == -EINVAL\n", __func__); | ||
814 | ret = -EINVAL; | ||
815 | goto error_lock; | ||
816 | } | ||
817 | |||
790 | if (io_data->aio) { | 818 | if (io_data->aio) { |
791 | req = usb_ep_alloc_request(ep->ep, GFP_KERNEL); | 819 | req = usb_ep_alloc_request(ep->ep, GFP_KERNEL); |
792 | if (unlikely(!req)) | 820 | if (unlikely(!req)) |
793 | goto error_lock; | 821 | goto error_lock; |
794 | 822 | ||
795 | req->buf = data; | 823 | req->buf = data; |
796 | req->length = io_data->len; | 824 | req->length = data_len; |
797 | 825 | ||
798 | io_data->buf = data; | 826 | io_data->buf = data; |
799 | io_data->ep = ep->ep; | 827 | io_data->ep = ep->ep; |
@@ -815,7 +843,7 @@ static ssize_t ffs_epfile_io(struct file *file, struct ffs_io_data *io_data) | |||
815 | 843 | ||
816 | req = ep->req; | 844 | req = ep->req; |
817 | req->buf = data; | 845 | req->buf = data; |
818 | req->length = io_data->len; | 846 | req->length = data_len; |
819 | 847 | ||
820 | req->context = &done; | 848 | req->context = &done; |
821 | req->complete = ffs_epfile_io_complete; | 849 | req->complete = ffs_epfile_io_complete; |
@@ -2663,8 +2691,6 @@ static inline struct f_fs_opts *ffs_do_functionfs_bind(struct usb_function *f, | |||
2663 | func->conf = c; | 2691 | func->conf = c; |
2664 | func->gadget = c->cdev->gadget; | 2692 | func->gadget = c->cdev->gadget; |
2665 | 2693 | ||
2666 | ffs_data_get(func->ffs); | ||
2667 | |||
2668 | /* | 2694 | /* |
2669 | * in drivers/usb/gadget/configfs.c:configfs_composite_bind() | 2695 | * in drivers/usb/gadget/configfs.c:configfs_composite_bind() |
2670 | * configurations are bound in sequence with list_for_each_entry, | 2696 | * configurations are bound in sequence with list_for_each_entry, |
diff --git a/drivers/usb/gadget/function/f_hid.c b/drivers/usb/gadget/function/f_hid.c index a95290a1289f..59ab62c92b66 100644 --- a/drivers/usb/gadget/function/f_hid.c +++ b/drivers/usb/gadget/function/f_hid.c | |||
@@ -621,12 +621,14 @@ static int __init hidg_bind(struct usb_configuration *c, struct usb_function *f) | |||
621 | dev = MKDEV(major, hidg->minor); | 621 | dev = MKDEV(major, hidg->minor); |
622 | status = cdev_add(&hidg->cdev, dev, 1); | 622 | status = cdev_add(&hidg->cdev, dev, 1); |
623 | if (status) | 623 | if (status) |
624 | goto fail; | 624 | goto fail_free_descs; |
625 | 625 | ||
626 | device_create(hidg_class, NULL, dev, NULL, "%s%d", "hidg", hidg->minor); | 626 | device_create(hidg_class, NULL, dev, NULL, "%s%d", "hidg", hidg->minor); |
627 | 627 | ||
628 | return 0; | 628 | return 0; |
629 | 629 | ||
630 | fail_free_descs: | ||
631 | usb_free_all_descriptors(f); | ||
630 | fail: | 632 | fail: |
631 | ERROR(f->config->cdev, "hidg_bind FAILED\n"); | 633 | ERROR(f->config->cdev, "hidg_bind FAILED\n"); |
632 | if (hidg->req != NULL) { | 634 | if (hidg->req != NULL) { |
@@ -635,7 +637,6 @@ fail: | |||
635 | usb_ep_free_request(hidg->in_ep, hidg->req); | 637 | usb_ep_free_request(hidg->in_ep, hidg->req); |
636 | } | 638 | } |
637 | 639 | ||
638 | usb_free_all_descriptors(f); | ||
639 | return status; | 640 | return status; |
640 | } | 641 | } |
641 | 642 | ||
diff --git a/drivers/usb/gadget/function/f_loopback.c b/drivers/usb/gadget/function/f_loopback.c index bf04389137e6..298b46112b1a 100644 --- a/drivers/usb/gadget/function/f_loopback.c +++ b/drivers/usb/gadget/function/f_loopback.c | |||
@@ -253,22 +253,13 @@ static void loopback_complete(struct usb_ep *ep, struct usb_request *req) | |||
253 | 253 | ||
254 | case 0: /* normal completion? */ | 254 | case 0: /* normal completion? */ |
255 | if (ep == loop->out_ep) { | 255 | if (ep == loop->out_ep) { |
256 | /* loop this OUT packet back IN to the host */ | ||
257 | req->zero = (req->actual < req->length); | 256 | req->zero = (req->actual < req->length); |
258 | req->length = req->actual; | 257 | req->length = req->actual; |
259 | status = usb_ep_queue(loop->in_ep, req, GFP_ATOMIC); | ||
260 | if (status == 0) | ||
261 | return; | ||
262 | |||
263 | /* "should never get here" */ | ||
264 | ERROR(cdev, "can't loop %s to %s: %d\n", | ||
265 | ep->name, loop->in_ep->name, | ||
266 | status); | ||
267 | } | 258 | } |
268 | 259 | ||
269 | /* queue the buffer for some later OUT packet */ | 260 | /* queue the buffer for some later OUT packet */ |
270 | req->length = buflen; | 261 | req->length = buflen; |
271 | status = usb_ep_queue(loop->out_ep, req, GFP_ATOMIC); | 262 | status = usb_ep_queue(ep, req, GFP_ATOMIC); |
272 | if (status == 0) | 263 | if (status == 0) |
273 | return; | 264 | return; |
274 | 265 | ||
@@ -308,60 +299,66 @@ static inline struct usb_request *lb_alloc_ep_req(struct usb_ep *ep, int len) | |||
308 | return alloc_ep_req(ep, len, buflen); | 299 | return alloc_ep_req(ep, len, buflen); |
309 | } | 300 | } |
310 | 301 | ||
311 | static int | 302 | static int enable_endpoint(struct usb_composite_dev *cdev, struct f_loopback *loop, |
312 | enable_loopback(struct usb_composite_dev *cdev, struct f_loopback *loop) | 303 | struct usb_ep *ep) |
313 | { | 304 | { |
314 | int result = 0; | ||
315 | struct usb_ep *ep; | ||
316 | struct usb_request *req; | 305 | struct usb_request *req; |
317 | unsigned i; | 306 | unsigned i; |
307 | int result; | ||
318 | 308 | ||
319 | /* one endpoint writes data back IN to the host */ | 309 | /* |
320 | ep = loop->in_ep; | 310 | * one endpoint writes data back IN to the host while another endpoint |
311 | * just reads OUT packets | ||
312 | */ | ||
321 | result = config_ep_by_speed(cdev->gadget, &(loop->function), ep); | 313 | result = config_ep_by_speed(cdev->gadget, &(loop->function), ep); |
322 | if (result) | 314 | if (result) |
323 | return result; | 315 | goto fail0; |
324 | result = usb_ep_enable(ep); | 316 | result = usb_ep_enable(ep); |
325 | if (result < 0) | 317 | if (result < 0) |
326 | return result; | ||
327 | ep->driver_data = loop; | ||
328 | |||
329 | /* one endpoint just reads OUT packets */ | ||
330 | ep = loop->out_ep; | ||
331 | result = config_ep_by_speed(cdev->gadget, &(loop->function), ep); | ||
332 | if (result) | ||
333 | goto fail0; | 318 | goto fail0; |
334 | |||
335 | result = usb_ep_enable(ep); | ||
336 | if (result < 0) { | ||
337 | fail0: | ||
338 | ep = loop->in_ep; | ||
339 | usb_ep_disable(ep); | ||
340 | ep->driver_data = NULL; | ||
341 | return result; | ||
342 | } | ||
343 | ep->driver_data = loop; | 319 | ep->driver_data = loop; |
344 | 320 | ||
345 | /* allocate a bunch of read buffers and queue them all at once. | 321 | /* |
322 | * allocate a bunch of read buffers and queue them all at once. | ||
346 | * we buffer at most 'qlen' transfers; fewer if any need more | 323 | * we buffer at most 'qlen' transfers; fewer if any need more |
347 | * than 'buflen' bytes each. | 324 | * than 'buflen' bytes each. |
348 | */ | 325 | */ |
349 | for (i = 0; i < qlen && result == 0; i++) { | 326 | for (i = 0; i < qlen && result == 0; i++) { |
350 | req = lb_alloc_ep_req(ep, 0); | 327 | req = lb_alloc_ep_req(ep, 0); |
351 | if (req) { | 328 | if (!req) |
352 | req->complete = loopback_complete; | 329 | goto fail1; |
353 | result = usb_ep_queue(ep, req, GFP_ATOMIC); | 330 | |
354 | if (result) | 331 | req->complete = loopback_complete; |
355 | ERROR(cdev, "%s queue req --> %d\n", | 332 | result = usb_ep_queue(ep, req, GFP_ATOMIC); |
356 | ep->name, result); | 333 | if (result) { |
357 | } else { | 334 | ERROR(cdev, "%s queue req --> %d\n", |
358 | usb_ep_disable(ep); | 335 | ep->name, result); |
359 | ep->driver_data = NULL; | 336 | goto fail1; |
360 | result = -ENOMEM; | ||
361 | goto fail0; | ||
362 | } | 337 | } |
363 | } | 338 | } |
364 | 339 | ||
340 | return 0; | ||
341 | |||
342 | fail1: | ||
343 | usb_ep_disable(ep); | ||
344 | |||
345 | fail0: | ||
346 | return result; | ||
347 | } | ||
348 | |||
349 | static int | ||
350 | enable_loopback(struct usb_composite_dev *cdev, struct f_loopback *loop) | ||
351 | { | ||
352 | int result = 0; | ||
353 | |||
354 | result = enable_endpoint(cdev, loop, loop->in_ep); | ||
355 | if (result) | ||
356 | return result; | ||
357 | |||
358 | result = enable_endpoint(cdev, loop, loop->out_ep); | ||
359 | if (result) | ||
360 | return result; | ||
361 | |||
365 | DBG(cdev, "%s enabled\n", loop->function.name); | 362 | DBG(cdev, "%s enabled\n", loop->function.name); |
366 | return result; | 363 | return result; |
367 | } | 364 | } |
diff --git a/drivers/usb/gadget/function/f_ncm.c b/drivers/usb/gadget/function/f_ncm.c index 146f48cc65d7..16361b0a8b46 100644 --- a/drivers/usb/gadget/function/f_ncm.c +++ b/drivers/usb/gadget/function/f_ncm.c | |||
@@ -1461,7 +1461,6 @@ static int ncm_bind(struct usb_configuration *c, struct usb_function *f) | |||
1461 | return 0; | 1461 | return 0; |
1462 | 1462 | ||
1463 | fail: | 1463 | fail: |
1464 | usb_free_all_descriptors(f); | ||
1465 | if (ncm->notify_req) { | 1464 | if (ncm->notify_req) { |
1466 | kfree(ncm->notify_req->buf); | 1465 | kfree(ncm->notify_req->buf); |
1467 | usb_ep_free_request(ncm->notify, ncm->notify_req); | 1466 | usb_ep_free_request(ncm->notify, ncm->notify_req); |
diff --git a/drivers/usb/gadget/function/f_obex.c b/drivers/usb/gadget/function/f_obex.c index 5f40080c92cc..a1b79c53499c 100644 --- a/drivers/usb/gadget/function/f_obex.c +++ b/drivers/usb/gadget/function/f_obex.c | |||
@@ -35,6 +35,7 @@ struct f_obex { | |||
35 | struct gserial port; | 35 | struct gserial port; |
36 | u8 ctrl_id; | 36 | u8 ctrl_id; |
37 | u8 data_id; | 37 | u8 data_id; |
38 | u8 cur_alt; | ||
38 | u8 port_num; | 39 | u8 port_num; |
39 | u8 can_activate; | 40 | u8 can_activate; |
40 | }; | 41 | }; |
@@ -235,6 +236,8 @@ static int obex_set_alt(struct usb_function *f, unsigned intf, unsigned alt) | |||
235 | } else | 236 | } else |
236 | goto fail; | 237 | goto fail; |
237 | 238 | ||
239 | obex->cur_alt = alt; | ||
240 | |||
238 | return 0; | 241 | return 0; |
239 | 242 | ||
240 | fail: | 243 | fail: |
@@ -245,10 +248,7 @@ static int obex_get_alt(struct usb_function *f, unsigned intf) | |||
245 | { | 248 | { |
246 | struct f_obex *obex = func_to_obex(f); | 249 | struct f_obex *obex = func_to_obex(f); |
247 | 250 | ||
248 | if (intf == obex->ctrl_id) | 251 | return obex->cur_alt; |
249 | return 0; | ||
250 | |||
251 | return obex->port.in->driver_data ? 1 : 0; | ||
252 | } | 252 | } |
253 | 253 | ||
254 | static void obex_disable(struct usb_function *f) | 254 | static void obex_disable(struct usb_function *f) |
@@ -397,7 +397,6 @@ static int obex_bind(struct usb_configuration *c, struct usb_function *f) | |||
397 | return 0; | 397 | return 0; |
398 | 398 | ||
399 | fail: | 399 | fail: |
400 | usb_free_all_descriptors(f); | ||
401 | /* we might as well release our claims on endpoints */ | 400 | /* we might as well release our claims on endpoints */ |
402 | if (obex->port.out) | 401 | if (obex->port.out) |
403 | obex->port.out->driver_data = NULL; | 402 | obex->port.out->driver_data = NULL; |
diff --git a/drivers/usb/gadget/function/f_phonet.c b/drivers/usb/gadget/function/f_phonet.c index b9cfc1571d71..1ec8b7ffdccd 100644 --- a/drivers/usb/gadget/function/f_phonet.c +++ b/drivers/usb/gadget/function/f_phonet.c | |||
@@ -570,8 +570,8 @@ static int pn_bind(struct usb_configuration *c, struct usb_function *f) | |||
570 | err_req: | 570 | err_req: |
571 | for (i = 0; i < phonet_rxq_size && fp->out_reqv[i]; i++) | 571 | for (i = 0; i < phonet_rxq_size && fp->out_reqv[i]; i++) |
572 | usb_ep_free_request(fp->out_ep, fp->out_reqv[i]); | 572 | usb_ep_free_request(fp->out_ep, fp->out_reqv[i]); |
573 | err: | ||
574 | usb_free_all_descriptors(f); | 573 | usb_free_all_descriptors(f); |
574 | err: | ||
575 | if (fp->out_ep) | 575 | if (fp->out_ep) |
576 | fp->out_ep->driver_data = NULL; | 576 | fp->out_ep->driver_data = NULL; |
577 | if (fp->in_ep) | 577 | if (fp->in_ep) |
diff --git a/drivers/usb/gadget/function/f_rndis.c b/drivers/usb/gadget/function/f_rndis.c index ddb09dc6d1f2..f13fc6a58565 100644 --- a/drivers/usb/gadget/function/f_rndis.c +++ b/drivers/usb/gadget/function/f_rndis.c | |||
@@ -802,8 +802,10 @@ rndis_bind(struct usb_configuration *c, struct usb_function *f) | |||
802 | 802 | ||
803 | if (rndis->manufacturer && rndis->vendorID && | 803 | if (rndis->manufacturer && rndis->vendorID && |
804 | rndis_set_param_vendor(rndis->config, rndis->vendorID, | 804 | rndis_set_param_vendor(rndis->config, rndis->vendorID, |
805 | rndis->manufacturer)) | 805 | rndis->manufacturer)) { |
806 | goto fail; | 806 | status = -EINVAL; |
807 | goto fail_free_descs; | ||
808 | } | ||
807 | 809 | ||
808 | /* NOTE: all that is done without knowing or caring about | 810 | /* NOTE: all that is done without knowing or caring about |
809 | * the network link ... which is unavailable to this code | 811 | * the network link ... which is unavailable to this code |
@@ -817,10 +819,11 @@ rndis_bind(struct usb_configuration *c, struct usb_function *f) | |||
817 | rndis->notify->name); | 819 | rndis->notify->name); |
818 | return 0; | 820 | return 0; |
819 | 821 | ||
822 | fail_free_descs: | ||
823 | usb_free_all_descriptors(f); | ||
820 | fail: | 824 | fail: |
821 | kfree(f->os_desc_table); | 825 | kfree(f->os_desc_table); |
822 | f->os_desc_n = 0; | 826 | f->os_desc_n = 0; |
823 | usb_free_all_descriptors(f); | ||
824 | 827 | ||
825 | if (rndis->notify_req) { | 828 | if (rndis->notify_req) { |
826 | kfree(rndis->notify_req->buf); | 829 | kfree(rndis->notify_req->buf); |
diff --git a/drivers/usb/gadget/function/f_subset.c b/drivers/usb/gadget/function/f_subset.c index 1ea8baf33333..e3dfa675ff06 100644 --- a/drivers/usb/gadget/function/f_subset.c +++ b/drivers/usb/gadget/function/f_subset.c | |||
@@ -380,7 +380,6 @@ geth_bind(struct usb_configuration *c, struct usb_function *f) | |||
380 | return 0; | 380 | return 0; |
381 | 381 | ||
382 | fail: | 382 | fail: |
383 | usb_free_all_descriptors(f); | ||
384 | /* we might as well release our claims on endpoints */ | 383 | /* we might as well release our claims on endpoints */ |
385 | if (geth->port.out_ep) | 384 | if (geth->port.out_ep) |
386 | geth->port.out_ep->driver_data = NULL; | 385 | geth->port.out_ep->driver_data = NULL; |
diff --git a/drivers/usb/gadget/function/f_uac2.c b/drivers/usb/gadget/function/f_uac2.c index a5a27a504d67..33e16658e5cf 100644 --- a/drivers/usb/gadget/function/f_uac2.c +++ b/drivers/usb/gadget/function/f_uac2.c | |||
@@ -512,6 +512,11 @@ static int snd_uac2_remove(struct platform_device *pdev) | |||
512 | return 0; | 512 | return 0; |
513 | } | 513 | } |
514 | 514 | ||
515 | static void snd_uac2_release(struct device *dev) | ||
516 | { | ||
517 | dev_dbg(dev, "releasing '%s'\n", dev_name(dev)); | ||
518 | } | ||
519 | |||
515 | static int alsa_uac2_init(struct audio_dev *agdev) | 520 | static int alsa_uac2_init(struct audio_dev *agdev) |
516 | { | 521 | { |
517 | struct snd_uac2_chip *uac2 = &agdev->uac2; | 522 | struct snd_uac2_chip *uac2 = &agdev->uac2; |
@@ -523,6 +528,7 @@ static int alsa_uac2_init(struct audio_dev *agdev) | |||
523 | 528 | ||
524 | uac2->pdev.id = 0; | 529 | uac2->pdev.id = 0; |
525 | uac2->pdev.name = uac2_name; | 530 | uac2->pdev.name = uac2_name; |
531 | uac2->pdev.dev.release = snd_uac2_release; | ||
526 | 532 | ||
527 | /* Register snd_uac2 driver */ | 533 | /* Register snd_uac2 driver */ |
528 | err = platform_driver_register(&uac2->pdrv); | 534 | err = platform_driver_register(&uac2->pdrv); |
@@ -772,6 +778,7 @@ struct usb_endpoint_descriptor fs_epout_desc = { | |||
772 | 778 | ||
773 | .bEndpointAddress = USB_DIR_OUT, | 779 | .bEndpointAddress = USB_DIR_OUT, |
774 | .bmAttributes = USB_ENDPOINT_XFER_ISOC | USB_ENDPOINT_SYNC_ASYNC, | 780 | .bmAttributes = USB_ENDPOINT_XFER_ISOC | USB_ENDPOINT_SYNC_ASYNC, |
781 | .wMaxPacketSize = cpu_to_le16(1023), | ||
775 | .bInterval = 1, | 782 | .bInterval = 1, |
776 | }; | 783 | }; |
777 | 784 | ||
@@ -780,6 +787,7 @@ struct usb_endpoint_descriptor hs_epout_desc = { | |||
780 | .bDescriptorType = USB_DT_ENDPOINT, | 787 | .bDescriptorType = USB_DT_ENDPOINT, |
781 | 788 | ||
782 | .bmAttributes = USB_ENDPOINT_XFER_ISOC | USB_ENDPOINT_SYNC_ASYNC, | 789 | .bmAttributes = USB_ENDPOINT_XFER_ISOC | USB_ENDPOINT_SYNC_ASYNC, |
790 | .wMaxPacketSize = cpu_to_le16(1024), | ||
783 | .bInterval = 4, | 791 | .bInterval = 4, |
784 | }; | 792 | }; |
785 | 793 | ||
@@ -847,6 +855,7 @@ struct usb_endpoint_descriptor fs_epin_desc = { | |||
847 | 855 | ||
848 | .bEndpointAddress = USB_DIR_IN, | 856 | .bEndpointAddress = USB_DIR_IN, |
849 | .bmAttributes = USB_ENDPOINT_XFER_ISOC | USB_ENDPOINT_SYNC_ASYNC, | 857 | .bmAttributes = USB_ENDPOINT_XFER_ISOC | USB_ENDPOINT_SYNC_ASYNC, |
858 | .wMaxPacketSize = cpu_to_le16(1023), | ||
850 | .bInterval = 1, | 859 | .bInterval = 1, |
851 | }; | 860 | }; |
852 | 861 | ||
@@ -855,6 +864,7 @@ struct usb_endpoint_descriptor hs_epin_desc = { | |||
855 | .bDescriptorType = USB_DT_ENDPOINT, | 864 | .bDescriptorType = USB_DT_ENDPOINT, |
856 | 865 | ||
857 | .bmAttributes = USB_ENDPOINT_XFER_ISOC | USB_ENDPOINT_SYNC_ASYNC, | 866 | .bmAttributes = USB_ENDPOINT_XFER_ISOC | USB_ENDPOINT_SYNC_ASYNC, |
867 | .wMaxPacketSize = cpu_to_le16(1024), | ||
858 | .bInterval = 4, | 868 | .bInterval = 4, |
859 | }; | 869 | }; |
860 | 870 | ||
@@ -947,6 +957,9 @@ free_ep(struct uac2_rtd_params *prm, struct usb_ep *ep) | |||
947 | struct snd_uac2_chip *uac2 = prm->uac2; | 957 | struct snd_uac2_chip *uac2 = prm->uac2; |
948 | int i; | 958 | int i; |
949 | 959 | ||
960 | if (!prm->ep_enabled) | ||
961 | return; | ||
962 | |||
950 | prm->ep_enabled = false; | 963 | prm->ep_enabled = false; |
951 | 964 | ||
952 | for (i = 0; i < USB_XFERS; i++) { | 965 | for (i = 0; i < USB_XFERS; i++) { |
@@ -1071,7 +1084,7 @@ afunc_bind(struct usb_configuration *cfg, struct usb_function *fn) | |||
1071 | prm->rbuf = kzalloc(prm->max_psize * USB_XFERS, GFP_KERNEL); | 1084 | prm->rbuf = kzalloc(prm->max_psize * USB_XFERS, GFP_KERNEL); |
1072 | if (!prm->rbuf) { | 1085 | if (!prm->rbuf) { |
1073 | prm->max_psize = 0; | 1086 | prm->max_psize = 0; |
1074 | goto err; | 1087 | goto err_free_descs; |
1075 | } | 1088 | } |
1076 | 1089 | ||
1077 | prm = &agdev->uac2.p_prm; | 1090 | prm = &agdev->uac2.p_prm; |
@@ -1079,17 +1092,19 @@ afunc_bind(struct usb_configuration *cfg, struct usb_function *fn) | |||
1079 | prm->rbuf = kzalloc(prm->max_psize * USB_XFERS, GFP_KERNEL); | 1092 | prm->rbuf = kzalloc(prm->max_psize * USB_XFERS, GFP_KERNEL); |
1080 | if (!prm->rbuf) { | 1093 | if (!prm->rbuf) { |
1081 | prm->max_psize = 0; | 1094 | prm->max_psize = 0; |
1082 | goto err; | 1095 | goto err_free_descs; |
1083 | } | 1096 | } |
1084 | 1097 | ||
1085 | ret = alsa_uac2_init(agdev); | 1098 | ret = alsa_uac2_init(agdev); |
1086 | if (ret) | 1099 | if (ret) |
1087 | goto err; | 1100 | goto err_free_descs; |
1088 | return 0; | 1101 | return 0; |
1102 | |||
1103 | err_free_descs: | ||
1104 | usb_free_all_descriptors(fn); | ||
1089 | err: | 1105 | err: |
1090 | kfree(agdev->uac2.p_prm.rbuf); | 1106 | kfree(agdev->uac2.p_prm.rbuf); |
1091 | kfree(agdev->uac2.c_prm.rbuf); | 1107 | kfree(agdev->uac2.c_prm.rbuf); |
1092 | usb_free_all_descriptors(fn); | ||
1093 | if (agdev->in_ep) | 1108 | if (agdev->in_ep) |
1094 | agdev->in_ep->driver_data = NULL; | 1109 | agdev->in_ep->driver_data = NULL; |
1095 | if (agdev->out_ep) | 1110 | if (agdev->out_ep) |
diff --git a/drivers/usb/gadget/function/f_uvc.c b/drivers/usb/gadget/function/f_uvc.c index e126439e4b65..945b3bd2ca98 100644 --- a/drivers/usb/gadget/function/f_uvc.c +++ b/drivers/usb/gadget/function/f_uvc.c | |||
@@ -279,27 +279,41 @@ uvc_function_get_alt(struct usb_function *f, unsigned interface) | |||
279 | else if (interface != uvc->streaming_intf) | 279 | else if (interface != uvc->streaming_intf) |
280 | return -EINVAL; | 280 | return -EINVAL; |
281 | else | 281 | else |
282 | return uvc->state == UVC_STATE_STREAMING ? 1 : 0; | 282 | return uvc->video.ep->driver_data ? 1 : 0; |
283 | } | 283 | } |
284 | 284 | ||
285 | static int | 285 | static int |
286 | uvc_function_set_alt(struct usb_function *f, unsigned interface, unsigned alt) | 286 | uvc_function_set_alt(struct usb_function *f, unsigned interface, unsigned alt) |
287 | { | 287 | { |
288 | struct uvc_device *uvc = to_uvc(f); | 288 | struct uvc_device *uvc = to_uvc(f); |
289 | struct usb_composite_dev *cdev = f->config->cdev; | ||
289 | struct v4l2_event v4l2_event; | 290 | struct v4l2_event v4l2_event; |
290 | struct uvc_event *uvc_event = (void *)&v4l2_event.u.data; | 291 | struct uvc_event *uvc_event = (void *)&v4l2_event.u.data; |
291 | int ret; | 292 | int ret; |
292 | 293 | ||
293 | INFO(f->config->cdev, "uvc_function_set_alt(%u, %u)\n", interface, alt); | 294 | INFO(cdev, "uvc_function_set_alt(%u, %u)\n", interface, alt); |
294 | 295 | ||
295 | if (interface == uvc->control_intf) { | 296 | if (interface == uvc->control_intf) { |
296 | if (alt) | 297 | if (alt) |
297 | return -EINVAL; | 298 | return -EINVAL; |
298 | 299 | ||
300 | if (uvc->control_ep->driver_data) { | ||
301 | INFO(cdev, "reset UVC Control\n"); | ||
302 | usb_ep_disable(uvc->control_ep); | ||
303 | uvc->control_ep->driver_data = NULL; | ||
304 | } | ||
305 | |||
306 | if (!uvc->control_ep->desc) | ||
307 | if (config_ep_by_speed(cdev->gadget, f, uvc->control_ep)) | ||
308 | return -EINVAL; | ||
309 | |||
310 | usb_ep_enable(uvc->control_ep); | ||
311 | uvc->control_ep->driver_data = uvc; | ||
312 | |||
299 | if (uvc->state == UVC_STATE_DISCONNECTED) { | 313 | if (uvc->state == UVC_STATE_DISCONNECTED) { |
300 | memset(&v4l2_event, 0, sizeof(v4l2_event)); | 314 | memset(&v4l2_event, 0, sizeof(v4l2_event)); |
301 | v4l2_event.type = UVC_EVENT_CONNECT; | 315 | v4l2_event.type = UVC_EVENT_CONNECT; |
302 | uvc_event->speed = f->config->cdev->gadget->speed; | 316 | uvc_event->speed = cdev->gadget->speed; |
303 | v4l2_event_queue(uvc->vdev, &v4l2_event); | 317 | v4l2_event_queue(uvc->vdev, &v4l2_event); |
304 | 318 | ||
305 | uvc->state = UVC_STATE_CONNECTED; | 319 | uvc->state = UVC_STATE_CONNECTED; |
@@ -321,8 +335,10 @@ uvc_function_set_alt(struct usb_function *f, unsigned interface, unsigned alt) | |||
321 | if (uvc->state != UVC_STATE_STREAMING) | 335 | if (uvc->state != UVC_STATE_STREAMING) |
322 | return 0; | 336 | return 0; |
323 | 337 | ||
324 | if (uvc->video.ep) | 338 | if (uvc->video.ep) { |
325 | usb_ep_disable(uvc->video.ep); | 339 | usb_ep_disable(uvc->video.ep); |
340 | uvc->video.ep->driver_data = NULL; | ||
341 | } | ||
326 | 342 | ||
327 | memset(&v4l2_event, 0, sizeof(v4l2_event)); | 343 | memset(&v4l2_event, 0, sizeof(v4l2_event)); |
328 | v4l2_event.type = UVC_EVENT_STREAMOFF; | 344 | v4l2_event.type = UVC_EVENT_STREAMOFF; |
@@ -335,14 +351,22 @@ uvc_function_set_alt(struct usb_function *f, unsigned interface, unsigned alt) | |||
335 | if (uvc->state != UVC_STATE_CONNECTED) | 351 | if (uvc->state != UVC_STATE_CONNECTED) |
336 | return 0; | 352 | return 0; |
337 | 353 | ||
338 | if (uvc->video.ep) { | 354 | if (!uvc->video.ep) |
339 | ret = config_ep_by_speed(f->config->cdev->gadget, | 355 | return -EINVAL; |
340 | &(uvc->func), uvc->video.ep); | 356 | |
341 | if (ret) | 357 | if (uvc->video.ep->driver_data) { |
342 | return ret; | 358 | INFO(cdev, "reset UVC\n"); |
343 | usb_ep_enable(uvc->video.ep); | 359 | usb_ep_disable(uvc->video.ep); |
360 | uvc->video.ep->driver_data = NULL; | ||
344 | } | 361 | } |
345 | 362 | ||
363 | ret = config_ep_by_speed(f->config->cdev->gadget, | ||
364 | &(uvc->func), uvc->video.ep); | ||
365 | if (ret) | ||
366 | return ret; | ||
367 | usb_ep_enable(uvc->video.ep); | ||
368 | uvc->video.ep->driver_data = uvc; | ||
369 | |||
346 | memset(&v4l2_event, 0, sizeof(v4l2_event)); | 370 | memset(&v4l2_event, 0, sizeof(v4l2_event)); |
347 | v4l2_event.type = UVC_EVENT_STREAMON; | 371 | v4l2_event.type = UVC_EVENT_STREAMON; |
348 | v4l2_event_queue(uvc->vdev, &v4l2_event); | 372 | v4l2_event_queue(uvc->vdev, &v4l2_event); |
@@ -366,6 +390,16 @@ uvc_function_disable(struct usb_function *f) | |||
366 | v4l2_event_queue(uvc->vdev, &v4l2_event); | 390 | v4l2_event_queue(uvc->vdev, &v4l2_event); |
367 | 391 | ||
368 | uvc->state = UVC_STATE_DISCONNECTED; | 392 | uvc->state = UVC_STATE_DISCONNECTED; |
393 | |||
394 | if (uvc->video.ep->driver_data) { | ||
395 | usb_ep_disable(uvc->video.ep); | ||
396 | uvc->video.ep->driver_data = NULL; | ||
397 | } | ||
398 | |||
399 | if (uvc->control_ep->driver_data) { | ||
400 | usb_ep_disable(uvc->control_ep); | ||
401 | uvc->control_ep->driver_data = NULL; | ||
402 | } | ||
369 | } | 403 | } |
370 | 404 | ||
371 | /* -------------------------------------------------------------------------- | 405 | /* -------------------------------------------------------------------------- |
diff --git a/drivers/usb/gadget/function/uvc_video.c b/drivers/usb/gadget/function/uvc_video.c index c3e1f27dbbef..9cb86bc1a9a5 100644 --- a/drivers/usb/gadget/function/uvc_video.c +++ b/drivers/usb/gadget/function/uvc_video.c | |||
@@ -352,7 +352,8 @@ int uvcg_video_enable(struct uvc_video *video, int enable) | |||
352 | 352 | ||
353 | if (!enable) { | 353 | if (!enable) { |
354 | for (i = 0; i < UVC_NUM_REQUESTS; ++i) | 354 | for (i = 0; i < UVC_NUM_REQUESTS; ++i) |
355 | usb_ep_dequeue(video->ep, video->req[i]); | 355 | if (video->req[i]) |
356 | usb_ep_dequeue(video->ep, video->req[i]); | ||
356 | 357 | ||
357 | uvc_video_free_requests(video); | 358 | uvc_video_free_requests(video); |
358 | uvcg_queue_enable(&video->queue, 0); | 359 | uvcg_queue_enable(&video->queue, 0); |
diff --git a/drivers/usb/gadget/udc/Kconfig b/drivers/usb/gadget/udc/Kconfig index 3ea287b0e448..217365d35a25 100644 --- a/drivers/usb/gadget/udc/Kconfig +++ b/drivers/usb/gadget/udc/Kconfig | |||
@@ -357,6 +357,7 @@ config USB_EG20T | |||
357 | 357 | ||
358 | config USB_GADGET_XILINX | 358 | config USB_GADGET_XILINX |
359 | tristate "Xilinx USB Driver" | 359 | tristate "Xilinx USB Driver" |
360 | depends on HAS_DMA | ||
360 | depends on OF || COMPILE_TEST | 361 | depends on OF || COMPILE_TEST |
361 | help | 362 | help |
362 | USB peripheral controller driver for Xilinx USB2 device. | 363 | USB peripheral controller driver for Xilinx USB2 device. |
diff --git a/drivers/usb/gadget/udc/udc-core.c b/drivers/usb/gadget/udc/udc-core.c index f107bb60a5ab..f2054659f25b 100644 --- a/drivers/usb/gadget/udc/udc-core.c +++ b/drivers/usb/gadget/udc/udc-core.c | |||
@@ -507,6 +507,11 @@ static ssize_t usb_udc_softconn_store(struct device *dev, | |||
507 | { | 507 | { |
508 | struct usb_udc *udc = container_of(dev, struct usb_udc, dev); | 508 | struct usb_udc *udc = container_of(dev, struct usb_udc, dev); |
509 | 509 | ||
510 | if (!udc->driver) { | ||
511 | dev_err(dev, "soft-connect without a gadget driver\n"); | ||
512 | return -EOPNOTSUPP; | ||
513 | } | ||
514 | |||
510 | if (sysfs_streq(buf, "connect")) { | 515 | if (sysfs_streq(buf, "connect")) { |
511 | usb_gadget_udc_start(udc->gadget, udc->driver); | 516 | usb_gadget_udc_start(udc->gadget, udc->driver); |
512 | usb_gadget_connect(udc->gadget); | 517 | usb_gadget_connect(udc->gadget); |
diff --git a/drivers/usb/host/Kconfig b/drivers/usb/host/Kconfig index a8a30b1d4167..a3ca1375dd52 100644 --- a/drivers/usb/host/Kconfig +++ b/drivers/usb/host/Kconfig | |||
@@ -234,7 +234,7 @@ config USB_EHCI_SH | |||
234 | 234 | ||
235 | config USB_EHCI_EXYNOS | 235 | config USB_EHCI_EXYNOS |
236 | tristate "EHCI support for Samsung S5P/EXYNOS SoC Series" | 236 | tristate "EHCI support for Samsung S5P/EXYNOS SoC Series" |
237 | depends on PLAT_S5P || ARCH_EXYNOS | 237 | depends on ARCH_S5PV210 || ARCH_EXYNOS |
238 | help | 238 | help |
239 | Enable support for the Samsung Exynos SOC's on-chip EHCI controller. | 239 | Enable support for the Samsung Exynos SOC's on-chip EHCI controller. |
240 | 240 | ||
@@ -550,7 +550,7 @@ config USB_OHCI_SH | |||
550 | 550 | ||
551 | config USB_OHCI_EXYNOS | 551 | config USB_OHCI_EXYNOS |
552 | tristate "OHCI support for Samsung S5P/EXYNOS SoC Series" | 552 | tristate "OHCI support for Samsung S5P/EXYNOS SoC Series" |
553 | depends on PLAT_S5P || ARCH_EXYNOS | 553 | depends on ARCH_S5PV210 || ARCH_EXYNOS |
554 | help | 554 | help |
555 | Enable support for the Samsung Exynos SOC's on-chip OHCI controller. | 555 | Enable support for the Samsung Exynos SOC's on-chip OHCI controller. |
556 | 556 | ||
diff --git a/drivers/usb/host/hwa-hc.c b/drivers/usb/host/hwa-hc.c index d0d8fadf7066..1db0626c8bf4 100644 --- a/drivers/usb/host/hwa-hc.c +++ b/drivers/usb/host/hwa-hc.c | |||
@@ -607,7 +607,7 @@ found: | |||
607 | wa->wa_descr = wa_descr = (struct usb_wa_descriptor *) hdr; | 607 | wa->wa_descr = wa_descr = (struct usb_wa_descriptor *) hdr; |
608 | if (le16_to_cpu(wa_descr->bcdWAVersion) > 0x0100) | 608 | if (le16_to_cpu(wa_descr->bcdWAVersion) > 0x0100) |
609 | dev_warn(dev, "Wire Adapter v%d.%d newer than groked v1.0\n", | 609 | dev_warn(dev, "Wire Adapter v%d.%d newer than groked v1.0\n", |
610 | le16_to_cpu(wa_descr->bcdWAVersion) & 0xff00 >> 8, | 610 | (le16_to_cpu(wa_descr->bcdWAVersion) & 0xff00) >> 8, |
611 | le16_to_cpu(wa_descr->bcdWAVersion) & 0x00ff); | 611 | le16_to_cpu(wa_descr->bcdWAVersion) & 0x00ff); |
612 | result = 0; | 612 | result = 0; |
613 | error: | 613 | error: |
diff --git a/drivers/usb/host/xhci-pci.c b/drivers/usb/host/xhci-pci.c index 280dde93abe5..9a69b1f1b300 100644 --- a/drivers/usb/host/xhci-pci.c +++ b/drivers/usb/host/xhci-pci.c | |||
@@ -128,20 +128,6 @@ static void xhci_pci_quirks(struct device *dev, struct xhci_hcd *xhci) | |||
128 | xhci->quirks |= XHCI_AVOID_BEI; | 128 | xhci->quirks |= XHCI_AVOID_BEI; |
129 | } | 129 | } |
130 | if (pdev->vendor == PCI_VENDOR_ID_INTEL && | 130 | if (pdev->vendor == PCI_VENDOR_ID_INTEL && |
131 | (pdev->device == PCI_DEVICE_ID_INTEL_LYNXPOINT_XHCI || | ||
132 | pdev->device == PCI_DEVICE_ID_INTEL_LYNXPOINT_LP_XHCI)) { | ||
133 | /* Workaround for occasional spurious wakeups from S5 (or | ||
134 | * any other sleep) on Haswell machines with LPT and LPT-LP | ||
135 | * with the new Intel BIOS | ||
136 | */ | ||
137 | /* Limit the quirk to only known vendors, as this triggers | ||
138 | * yet another BIOS bug on some other machines | ||
139 | * https://bugzilla.kernel.org/show_bug.cgi?id=66171 | ||
140 | */ | ||
141 | if (pdev->subsystem_vendor == PCI_VENDOR_ID_HP) | ||
142 | xhci->quirks |= XHCI_SPURIOUS_WAKEUP; | ||
143 | } | ||
144 | if (pdev->vendor == PCI_VENDOR_ID_INTEL && | ||
145 | pdev->device == PCI_DEVICE_ID_INTEL_LYNXPOINT_LP_XHCI) { | 131 | pdev->device == PCI_DEVICE_ID_INTEL_LYNXPOINT_LP_XHCI) { |
146 | xhci->quirks |= XHCI_SPURIOUS_REBOOT; | 132 | xhci->quirks |= XHCI_SPURIOUS_REBOOT; |
147 | } | 133 | } |
@@ -162,6 +148,10 @@ static void xhci_pci_quirks(struct device *dev, struct xhci_hcd *xhci) | |||
162 | pdev->device == 0x3432) | 148 | pdev->device == 0x3432) |
163 | xhci->quirks |= XHCI_BROKEN_STREAMS; | 149 | xhci->quirks |= XHCI_BROKEN_STREAMS; |
164 | 150 | ||
151 | if (pdev->vendor == PCI_VENDOR_ID_ASMEDIA && | ||
152 | pdev->device == 0x1042) | ||
153 | xhci->quirks |= XHCI_BROKEN_STREAMS; | ||
154 | |||
165 | if (xhci->quirks & XHCI_RESET_ON_RESUME) | 155 | if (xhci->quirks & XHCI_RESET_ON_RESUME) |
166 | xhci_dbg_trace(xhci, trace_xhci_dbg_quirks, | 156 | xhci_dbg_trace(xhci, trace_xhci_dbg_quirks, |
167 | "QUIRK: Resetting on resume"); | 157 | "QUIRK: Resetting on resume"); |
diff --git a/drivers/usb/musb/musb_cppi41.c b/drivers/usb/musb/musb_cppi41.c index acdfb3e68a90..5a9b977fbc19 100644 --- a/drivers/usb/musb/musb_cppi41.c +++ b/drivers/usb/musb/musb_cppi41.c | |||
@@ -209,7 +209,8 @@ static enum hrtimer_restart cppi41_recheck_tx_req(struct hrtimer *timer) | |||
209 | } | 209 | } |
210 | } | 210 | } |
211 | 211 | ||
212 | if (!list_empty(&controller->early_tx_list)) { | 212 | if (!list_empty(&controller->early_tx_list) && |
213 | !hrtimer_is_queued(&controller->early_tx)) { | ||
213 | ret = HRTIMER_RESTART; | 214 | ret = HRTIMER_RESTART; |
214 | hrtimer_forward_now(&controller->early_tx, | 215 | hrtimer_forward_now(&controller->early_tx, |
215 | ktime_set(0, 20 * NSEC_PER_USEC)); | 216 | ktime_set(0, 20 * NSEC_PER_USEC)); |
diff --git a/drivers/usb/musb/musb_dsps.c b/drivers/usb/musb/musb_dsps.c index 154bcf1b5dfa..48bc09e7b83b 100644 --- a/drivers/usb/musb/musb_dsps.c +++ b/drivers/usb/musb/musb_dsps.c | |||
@@ -868,9 +868,15 @@ static int dsps_suspend(struct device *dev) | |||
868 | struct dsps_glue *glue = dev_get_drvdata(dev); | 868 | struct dsps_glue *glue = dev_get_drvdata(dev); |
869 | const struct dsps_musb_wrapper *wrp = glue->wrp; | 869 | const struct dsps_musb_wrapper *wrp = glue->wrp; |
870 | struct musb *musb = platform_get_drvdata(glue->musb); | 870 | struct musb *musb = platform_get_drvdata(glue->musb); |
871 | void __iomem *mbase = musb->ctrl_base; | 871 | void __iomem *mbase; |
872 | 872 | ||
873 | del_timer_sync(&glue->timer); | 873 | del_timer_sync(&glue->timer); |
874 | |||
875 | if (!musb) | ||
876 | /* This can happen if the musb device is in -EPROBE_DEFER */ | ||
877 | return 0; | ||
878 | |||
879 | mbase = musb->ctrl_base; | ||
874 | glue->context.control = dsps_readl(mbase, wrp->control); | 880 | glue->context.control = dsps_readl(mbase, wrp->control); |
875 | glue->context.epintr = dsps_readl(mbase, wrp->epintr_set); | 881 | glue->context.epintr = dsps_readl(mbase, wrp->epintr_set); |
876 | glue->context.coreintr = dsps_readl(mbase, wrp->coreintr_set); | 882 | glue->context.coreintr = dsps_readl(mbase, wrp->coreintr_set); |
@@ -887,8 +893,12 @@ static int dsps_resume(struct device *dev) | |||
887 | struct dsps_glue *glue = dev_get_drvdata(dev); | 893 | struct dsps_glue *glue = dev_get_drvdata(dev); |
888 | const struct dsps_musb_wrapper *wrp = glue->wrp; | 894 | const struct dsps_musb_wrapper *wrp = glue->wrp; |
889 | struct musb *musb = platform_get_drvdata(glue->musb); | 895 | struct musb *musb = platform_get_drvdata(glue->musb); |
890 | void __iomem *mbase = musb->ctrl_base; | 896 | void __iomem *mbase; |
897 | |||
898 | if (!musb) | ||
899 | return 0; | ||
891 | 900 | ||
901 | mbase = musb->ctrl_base; | ||
892 | dsps_writel(mbase, wrp->control, glue->context.control); | 902 | dsps_writel(mbase, wrp->control, glue->context.control); |
893 | dsps_writel(mbase, wrp->epintr_set, glue->context.epintr); | 903 | dsps_writel(mbase, wrp->epintr_set, glue->context.epintr); |
894 | dsps_writel(mbase, wrp->coreintr_set, glue->context.coreintr); | 904 | dsps_writel(mbase, wrp->coreintr_set, glue->context.coreintr); |
@@ -896,7 +906,9 @@ static int dsps_resume(struct device *dev) | |||
896 | dsps_writel(mbase, wrp->mode, glue->context.mode); | 906 | dsps_writel(mbase, wrp->mode, glue->context.mode); |
897 | dsps_writel(mbase, wrp->tx_mode, glue->context.tx_mode); | 907 | dsps_writel(mbase, wrp->tx_mode, glue->context.tx_mode); |
898 | dsps_writel(mbase, wrp->rx_mode, glue->context.rx_mode); | 908 | dsps_writel(mbase, wrp->rx_mode, glue->context.rx_mode); |
899 | setup_timer(&glue->timer, otg_timer, (unsigned long) musb); | 909 | if (musb->xceiv->state == OTG_STATE_B_IDLE && |
910 | musb->port_mode == MUSB_PORT_MODE_DUAL_ROLE) | ||
911 | mod_timer(&glue->timer, jiffies + wrp->poll_seconds * HZ); | ||
900 | 912 | ||
901 | return 0; | 913 | return 0; |
902 | } | 914 | } |
diff --git a/drivers/usb/serial/cp210x.c b/drivers/usb/serial/cp210x.c index eca1747ca8c7..cfd009dc4018 100644 --- a/drivers/usb/serial/cp210x.c +++ b/drivers/usb/serial/cp210x.c | |||
@@ -155,6 +155,7 @@ static const struct usb_device_id id_table[] = { | |||
155 | { USB_DEVICE(0x18EF, 0xE00F) }, /* ELV USB-I2C-Interface */ | 155 | { USB_DEVICE(0x18EF, 0xE00F) }, /* ELV USB-I2C-Interface */ |
156 | { USB_DEVICE(0x1ADB, 0x0001) }, /* Schweitzer Engineering C662 Cable */ | 156 | { USB_DEVICE(0x1ADB, 0x0001) }, /* Schweitzer Engineering C662 Cable */ |
157 | { USB_DEVICE(0x1B1C, 0x1C00) }, /* Corsair USB Dongle */ | 157 | { USB_DEVICE(0x1B1C, 0x1C00) }, /* Corsair USB Dongle */ |
158 | { USB_DEVICE(0x1BA4, 0x0002) }, /* Silicon Labs 358x factory default */ | ||
158 | { USB_DEVICE(0x1BE3, 0x07A6) }, /* WAGO 750-923 USB Service Cable */ | 159 | { USB_DEVICE(0x1BE3, 0x07A6) }, /* WAGO 750-923 USB Service Cable */ |
159 | { USB_DEVICE(0x1D6F, 0x0010) }, /* Seluxit ApS RF Dongle */ | 160 | { USB_DEVICE(0x1D6F, 0x0010) }, /* Seluxit ApS RF Dongle */ |
160 | { USB_DEVICE(0x1E29, 0x0102) }, /* Festo CPX-USB */ | 161 | { USB_DEVICE(0x1E29, 0x0102) }, /* Festo CPX-USB */ |
diff --git a/drivers/usb/serial/ftdi_sio.c b/drivers/usb/serial/ftdi_sio.c index dc72b924c399..0dad8ce5a609 100644 --- a/drivers/usb/serial/ftdi_sio.c +++ b/drivers/usb/serial/ftdi_sio.c | |||
@@ -140,6 +140,7 @@ static struct ftdi_sio_quirk ftdi_8u2232c_quirk = { | |||
140 | * /sys/bus/usb-serial/drivers/ftdi_sio/new_id and send a patch or report. | 140 | * /sys/bus/usb-serial/drivers/ftdi_sio/new_id and send a patch or report. |
141 | */ | 141 | */ |
142 | static const struct usb_device_id id_table_combined[] = { | 142 | static const struct usb_device_id id_table_combined[] = { |
143 | { USB_DEVICE(FTDI_VID, FTDI_BRICK_PID) }, | ||
143 | { USB_DEVICE(FTDI_VID, FTDI_ZEITCONTROL_TAGTRACE_MIFARE_PID) }, | 144 | { USB_DEVICE(FTDI_VID, FTDI_ZEITCONTROL_TAGTRACE_MIFARE_PID) }, |
144 | { USB_DEVICE(FTDI_VID, FTDI_CTI_MINI_PID) }, | 145 | { USB_DEVICE(FTDI_VID, FTDI_CTI_MINI_PID) }, |
145 | { USB_DEVICE(FTDI_VID, FTDI_CTI_NANO_PID) }, | 146 | { USB_DEVICE(FTDI_VID, FTDI_CTI_NANO_PID) }, |
@@ -661,6 +662,8 @@ static const struct usb_device_id id_table_combined[] = { | |||
661 | { USB_DEVICE(FTDI_VID, XSENS_CONVERTER_5_PID) }, | 662 | { USB_DEVICE(FTDI_VID, XSENS_CONVERTER_5_PID) }, |
662 | { USB_DEVICE(FTDI_VID, XSENS_CONVERTER_6_PID) }, | 663 | { USB_DEVICE(FTDI_VID, XSENS_CONVERTER_6_PID) }, |
663 | { USB_DEVICE(FTDI_VID, XSENS_CONVERTER_7_PID) }, | 664 | { USB_DEVICE(FTDI_VID, XSENS_CONVERTER_7_PID) }, |
665 | { USB_DEVICE(XSENS_VID, XSENS_AWINDA_DONGLE_PID) }, | ||
666 | { USB_DEVICE(XSENS_VID, XSENS_AWINDA_STATION_PID) }, | ||
664 | { USB_DEVICE(XSENS_VID, XSENS_CONVERTER_PID) }, | 667 | { USB_DEVICE(XSENS_VID, XSENS_CONVERTER_PID) }, |
665 | { USB_DEVICE(XSENS_VID, XSENS_MTW_PID) }, | 668 | { USB_DEVICE(XSENS_VID, XSENS_MTW_PID) }, |
666 | { USB_DEVICE(FTDI_VID, FTDI_OMNI1509) }, | 669 | { USB_DEVICE(FTDI_VID, FTDI_OMNI1509) }, |
diff --git a/drivers/usb/serial/ftdi_sio_ids.h b/drivers/usb/serial/ftdi_sio_ids.h index 5937b2d242f2..6786b705ccf6 100644 --- a/drivers/usb/serial/ftdi_sio_ids.h +++ b/drivers/usb/serial/ftdi_sio_ids.h | |||
@@ -30,6 +30,12 @@ | |||
30 | 30 | ||
31 | /*** third-party PIDs (using FTDI_VID) ***/ | 31 | /*** third-party PIDs (using FTDI_VID) ***/ |
32 | 32 | ||
33 | /* | ||
34 | * Certain versions of the official Windows FTDI driver reprogrammed | ||
35 | * counterfeit FTDI devices to PID 0. Support these devices anyway. | ||
36 | */ | ||
37 | #define FTDI_BRICK_PID 0x0000 | ||
38 | |||
33 | #define FTDI_LUMEL_PD12_PID 0x6002 | 39 | #define FTDI_LUMEL_PD12_PID 0x6002 |
34 | 40 | ||
35 | /* | 41 | /* |
@@ -143,8 +149,12 @@ | |||
143 | * Xsens Technologies BV products (http://www.xsens.com). | 149 | * Xsens Technologies BV products (http://www.xsens.com). |
144 | */ | 150 | */ |
145 | #define XSENS_VID 0x2639 | 151 | #define XSENS_VID 0x2639 |
146 | #define XSENS_CONVERTER_PID 0xD00D /* Xsens USB-serial converter */ | 152 | #define XSENS_AWINDA_STATION_PID 0x0101 |
153 | #define XSENS_AWINDA_DONGLE_PID 0x0102 | ||
147 | #define XSENS_MTW_PID 0x0200 /* Xsens MTw */ | 154 | #define XSENS_MTW_PID 0x0200 /* Xsens MTw */ |
155 | #define XSENS_CONVERTER_PID 0xD00D /* Xsens USB-serial converter */ | ||
156 | |||
157 | /* Xsens devices using FTDI VID */ | ||
148 | #define XSENS_CONVERTER_0_PID 0xD388 /* Xsens USB converter */ | 158 | #define XSENS_CONVERTER_0_PID 0xD388 /* Xsens USB converter */ |
149 | #define XSENS_CONVERTER_1_PID 0xD389 /* Xsens Wireless Receiver */ | 159 | #define XSENS_CONVERTER_1_PID 0xD389 /* Xsens Wireless Receiver */ |
150 | #define XSENS_CONVERTER_2_PID 0xD38A | 160 | #define XSENS_CONVERTER_2_PID 0xD38A |
diff --git a/drivers/usb/serial/kobil_sct.c b/drivers/usb/serial/kobil_sct.c index 078f9ed419c8..02c420af251e 100644 --- a/drivers/usb/serial/kobil_sct.c +++ b/drivers/usb/serial/kobil_sct.c | |||
@@ -335,7 +335,8 @@ static int kobil_write(struct tty_struct *tty, struct usb_serial_port *port, | |||
335 | port->interrupt_out_urb->transfer_buffer_length = length; | 335 | port->interrupt_out_urb->transfer_buffer_length = length; |
336 | 336 | ||
337 | priv->cur_pos = priv->cur_pos + length; | 337 | priv->cur_pos = priv->cur_pos + length; |
338 | result = usb_submit_urb(port->interrupt_out_urb, GFP_NOIO); | 338 | result = usb_submit_urb(port->interrupt_out_urb, |
339 | GFP_ATOMIC); | ||
339 | dev_dbg(&port->dev, "%s - Send write URB returns: %i\n", __func__, result); | 340 | dev_dbg(&port->dev, "%s - Send write URB returns: %i\n", __func__, result); |
340 | todo = priv->filled - priv->cur_pos; | 341 | todo = priv->filled - priv->cur_pos; |
341 | 342 | ||
@@ -350,7 +351,7 @@ static int kobil_write(struct tty_struct *tty, struct usb_serial_port *port, | |||
350 | if (priv->device_type == KOBIL_ADAPTER_B_PRODUCT_ID || | 351 | if (priv->device_type == KOBIL_ADAPTER_B_PRODUCT_ID || |
351 | priv->device_type == KOBIL_ADAPTER_K_PRODUCT_ID) { | 352 | priv->device_type == KOBIL_ADAPTER_K_PRODUCT_ID) { |
352 | result = usb_submit_urb(port->interrupt_in_urb, | 353 | result = usb_submit_urb(port->interrupt_in_urb, |
353 | GFP_NOIO); | 354 | GFP_ATOMIC); |
354 | dev_dbg(&port->dev, "%s - Send read URB returns: %i\n", __func__, result); | 355 | dev_dbg(&port->dev, "%s - Send read URB returns: %i\n", __func__, result); |
355 | } | 356 | } |
356 | } | 357 | } |
@@ -414,8 +415,6 @@ static int kobil_tiocmset(struct tty_struct *tty, | |||
414 | int result; | 415 | int result; |
415 | int dtr = 0; | 416 | int dtr = 0; |
416 | int rts = 0; | 417 | int rts = 0; |
417 | unsigned char *transfer_buffer; | ||
418 | int transfer_buffer_length = 8; | ||
419 | 418 | ||
420 | /* FIXME: locking ? */ | 419 | /* FIXME: locking ? */ |
421 | priv = usb_get_serial_port_data(port); | 420 | priv = usb_get_serial_port_data(port); |
@@ -425,11 +424,6 @@ static int kobil_tiocmset(struct tty_struct *tty, | |||
425 | return -EINVAL; | 424 | return -EINVAL; |
426 | } | 425 | } |
427 | 426 | ||
428 | /* allocate memory for transfer buffer */ | ||
429 | transfer_buffer = kzalloc(transfer_buffer_length, GFP_KERNEL); | ||
430 | if (!transfer_buffer) | ||
431 | return -ENOMEM; | ||
432 | |||
433 | if (set & TIOCM_RTS) | 427 | if (set & TIOCM_RTS) |
434 | rts = 1; | 428 | rts = 1; |
435 | if (set & TIOCM_DTR) | 429 | if (set & TIOCM_DTR) |
@@ -469,7 +463,6 @@ static int kobil_tiocmset(struct tty_struct *tty, | |||
469 | KOBIL_TIMEOUT); | 463 | KOBIL_TIMEOUT); |
470 | } | 464 | } |
471 | dev_dbg(dev, "%s - Send set_status_line URB returns: %i\n", __func__, result); | 465 | dev_dbg(dev, "%s - Send set_status_line URB returns: %i\n", __func__, result); |
472 | kfree(transfer_buffer); | ||
473 | return (result < 0) ? result : 0; | 466 | return (result < 0) ? result : 0; |
474 | } | 467 | } |
475 | 468 | ||
@@ -530,8 +523,6 @@ static int kobil_ioctl(struct tty_struct *tty, | |||
530 | { | 523 | { |
531 | struct usb_serial_port *port = tty->driver_data; | 524 | struct usb_serial_port *port = tty->driver_data; |
532 | struct kobil_private *priv = usb_get_serial_port_data(port); | 525 | struct kobil_private *priv = usb_get_serial_port_data(port); |
533 | unsigned char *transfer_buffer; | ||
534 | int transfer_buffer_length = 8; | ||
535 | int result; | 526 | int result; |
536 | 527 | ||
537 | if (priv->device_type == KOBIL_USBTWIN_PRODUCT_ID || | 528 | if (priv->device_type == KOBIL_USBTWIN_PRODUCT_ID || |
@@ -541,10 +532,6 @@ static int kobil_ioctl(struct tty_struct *tty, | |||
541 | 532 | ||
542 | switch (cmd) { | 533 | switch (cmd) { |
543 | case TCFLSH: | 534 | case TCFLSH: |
544 | transfer_buffer = kmalloc(transfer_buffer_length, GFP_KERNEL); | ||
545 | if (!transfer_buffer) | ||
546 | return -ENOBUFS; | ||
547 | |||
548 | result = usb_control_msg(port->serial->dev, | 535 | result = usb_control_msg(port->serial->dev, |
549 | usb_sndctrlpipe(port->serial->dev, 0), | 536 | usb_sndctrlpipe(port->serial->dev, 0), |
550 | SUSBCRequest_Misc, | 537 | SUSBCRequest_Misc, |
@@ -559,7 +546,6 @@ static int kobil_ioctl(struct tty_struct *tty, | |||
559 | dev_dbg(&port->dev, | 546 | dev_dbg(&port->dev, |
560 | "%s - Send reset_all_queues (FLUSH) URB returns: %i\n", | 547 | "%s - Send reset_all_queues (FLUSH) URB returns: %i\n", |
561 | __func__, result); | 548 | __func__, result); |
562 | kfree(transfer_buffer); | ||
563 | return (result < 0) ? -EIO: 0; | 549 | return (result < 0) ? -EIO: 0; |
564 | default: | 550 | default: |
565 | return -ENOIOCTLCMD; | 551 | return -ENOIOCTLCMD; |
diff --git a/drivers/usb/serial/opticon.c b/drivers/usb/serial/opticon.c index 4856fb7e637e..4b7bfb394a32 100644 --- a/drivers/usb/serial/opticon.c +++ b/drivers/usb/serial/opticon.c | |||
@@ -215,7 +215,7 @@ static int opticon_write(struct tty_struct *tty, struct usb_serial_port *port, | |||
215 | 215 | ||
216 | /* The connected devices do not have a bulk write endpoint, | 216 | /* The connected devices do not have a bulk write endpoint, |
217 | * to transmit data to de barcode device the control endpoint is used */ | 217 | * to transmit data to de barcode device the control endpoint is used */ |
218 | dr = kmalloc(sizeof(struct usb_ctrlrequest), GFP_NOIO); | 218 | dr = kmalloc(sizeof(struct usb_ctrlrequest), GFP_ATOMIC); |
219 | if (!dr) { | 219 | if (!dr) { |
220 | count = -ENOMEM; | 220 | count = -ENOMEM; |
221 | goto error_no_dr; | 221 | goto error_no_dr; |
diff --git a/drivers/usb/serial/option.c b/drivers/usb/serial/option.c index d1a3f6044c8a..7a4c21b4f676 100644 --- a/drivers/usb/serial/option.c +++ b/drivers/usb/serial/option.c | |||
@@ -269,6 +269,7 @@ static void option_instat_callback(struct urb *urb); | |||
269 | #define TELIT_PRODUCT_DE910_DUAL 0x1010 | 269 | #define TELIT_PRODUCT_DE910_DUAL 0x1010 |
270 | #define TELIT_PRODUCT_UE910_V2 0x1012 | 270 | #define TELIT_PRODUCT_UE910_V2 0x1012 |
271 | #define TELIT_PRODUCT_LE920 0x1200 | 271 | #define TELIT_PRODUCT_LE920 0x1200 |
272 | #define TELIT_PRODUCT_LE910 0x1201 | ||
272 | 273 | ||
273 | /* ZTE PRODUCTS */ | 274 | /* ZTE PRODUCTS */ |
274 | #define ZTE_VENDOR_ID 0x19d2 | 275 | #define ZTE_VENDOR_ID 0x19d2 |
@@ -362,6 +363,7 @@ static void option_instat_callback(struct urb *urb); | |||
362 | 363 | ||
363 | /* Haier products */ | 364 | /* Haier products */ |
364 | #define HAIER_VENDOR_ID 0x201e | 365 | #define HAIER_VENDOR_ID 0x201e |
366 | #define HAIER_PRODUCT_CE81B 0x10f8 | ||
365 | #define HAIER_PRODUCT_CE100 0x2009 | 367 | #define HAIER_PRODUCT_CE100 0x2009 |
366 | 368 | ||
367 | /* Cinterion (formerly Siemens) products */ | 369 | /* Cinterion (formerly Siemens) products */ |
@@ -589,6 +591,11 @@ static const struct option_blacklist_info zte_1255_blacklist = { | |||
589 | .reserved = BIT(3) | BIT(4), | 591 | .reserved = BIT(3) | BIT(4), |
590 | }; | 592 | }; |
591 | 593 | ||
594 | static const struct option_blacklist_info telit_le910_blacklist = { | ||
595 | .sendsetup = BIT(0), | ||
596 | .reserved = BIT(1) | BIT(2), | ||
597 | }; | ||
598 | |||
592 | static const struct option_blacklist_info telit_le920_blacklist = { | 599 | static const struct option_blacklist_info telit_le920_blacklist = { |
593 | .sendsetup = BIT(0), | 600 | .sendsetup = BIT(0), |
594 | .reserved = BIT(1) | BIT(5), | 601 | .reserved = BIT(1) | BIT(5), |
@@ -1138,6 +1145,8 @@ static const struct usb_device_id option_ids[] = { | |||
1138 | { USB_DEVICE(TELIT_VENDOR_ID, TELIT_PRODUCT_CC864_SINGLE) }, | 1145 | { USB_DEVICE(TELIT_VENDOR_ID, TELIT_PRODUCT_CC864_SINGLE) }, |
1139 | { USB_DEVICE(TELIT_VENDOR_ID, TELIT_PRODUCT_DE910_DUAL) }, | 1146 | { USB_DEVICE(TELIT_VENDOR_ID, TELIT_PRODUCT_DE910_DUAL) }, |
1140 | { USB_DEVICE(TELIT_VENDOR_ID, TELIT_PRODUCT_UE910_V2) }, | 1147 | { USB_DEVICE(TELIT_VENDOR_ID, TELIT_PRODUCT_UE910_V2) }, |
1148 | { USB_DEVICE(TELIT_VENDOR_ID, TELIT_PRODUCT_LE910), | ||
1149 | .driver_info = (kernel_ulong_t)&telit_le910_blacklist }, | ||
1141 | { USB_DEVICE(TELIT_VENDOR_ID, TELIT_PRODUCT_LE920), | 1150 | { USB_DEVICE(TELIT_VENDOR_ID, TELIT_PRODUCT_LE920), |
1142 | .driver_info = (kernel_ulong_t)&telit_le920_blacklist }, | 1151 | .driver_info = (kernel_ulong_t)&telit_le920_blacklist }, |
1143 | { USB_DEVICE_AND_INTERFACE_INFO(ZTE_VENDOR_ID, ZTE_PRODUCT_MF622, 0xff, 0xff, 0xff) }, /* ZTE WCDMA products */ | 1152 | { USB_DEVICE_AND_INTERFACE_INFO(ZTE_VENDOR_ID, ZTE_PRODUCT_MF622, 0xff, 0xff, 0xff) }, /* ZTE WCDMA products */ |
@@ -1621,6 +1630,7 @@ static const struct usb_device_id option_ids[] = { | |||
1621 | { USB_DEVICE(LONGCHEER_VENDOR_ID, ZOOM_PRODUCT_4597) }, | 1630 | { USB_DEVICE(LONGCHEER_VENDOR_ID, ZOOM_PRODUCT_4597) }, |
1622 | { USB_DEVICE(LONGCHEER_VENDOR_ID, IBALL_3_5G_CONNECT) }, | 1631 | { USB_DEVICE(LONGCHEER_VENDOR_ID, IBALL_3_5G_CONNECT) }, |
1623 | { USB_DEVICE(HAIER_VENDOR_ID, HAIER_PRODUCT_CE100) }, | 1632 | { USB_DEVICE(HAIER_VENDOR_ID, HAIER_PRODUCT_CE100) }, |
1633 | { USB_DEVICE_AND_INTERFACE_INFO(HAIER_VENDOR_ID, HAIER_PRODUCT_CE81B, 0xff, 0xff, 0xff) }, | ||
1624 | /* Pirelli */ | 1634 | /* Pirelli */ |
1625 | { USB_DEVICE_INTERFACE_CLASS(PIRELLI_VENDOR_ID, PIRELLI_PRODUCT_C100_1, 0xff) }, | 1635 | { USB_DEVICE_INTERFACE_CLASS(PIRELLI_VENDOR_ID, PIRELLI_PRODUCT_C100_1, 0xff) }, |
1626 | { USB_DEVICE_INTERFACE_CLASS(PIRELLI_VENDOR_ID, PIRELLI_PRODUCT_C100_2, 0xff) }, | 1636 | { USB_DEVICE_INTERFACE_CLASS(PIRELLI_VENDOR_ID, PIRELLI_PRODUCT_C100_2, 0xff) }, |
diff --git a/drivers/usb/storage/initializers.c b/drivers/usb/storage/initializers.c index 4bc2fc98636e..73f125e0cb58 100644 --- a/drivers/usb/storage/initializers.c +++ b/drivers/usb/storage/initializers.c | |||
@@ -52,7 +52,7 @@ int usb_stor_euscsi_init(struct us_data *us) | |||
52 | us->iobuf[0] = 0x1; | 52 | us->iobuf[0] = 0x1; |
53 | result = usb_stor_control_msg(us, us->send_ctrl_pipe, | 53 | result = usb_stor_control_msg(us, us->send_ctrl_pipe, |
54 | 0x0C, USB_RECIP_INTERFACE | USB_TYPE_VENDOR, | 54 | 0x0C, USB_RECIP_INTERFACE | USB_TYPE_VENDOR, |
55 | 0x01, 0x0, us->iobuf, 0x1, USB_CTRL_SET_TIMEOUT); | 55 | 0x01, 0x0, us->iobuf, 0x1, 5 * HZ); |
56 | usb_stor_dbg(us, "-- result is %d\n", result); | 56 | usb_stor_dbg(us, "-- result is %d\n", result); |
57 | 57 | ||
58 | return 0; | 58 | return 0; |
@@ -100,7 +100,7 @@ int usb_stor_huawei_e220_init(struct us_data *us) | |||
100 | result = usb_stor_control_msg(us, us->send_ctrl_pipe, | 100 | result = usb_stor_control_msg(us, us->send_ctrl_pipe, |
101 | USB_REQ_SET_FEATURE, | 101 | USB_REQ_SET_FEATURE, |
102 | USB_TYPE_STANDARD | USB_RECIP_DEVICE, | 102 | USB_TYPE_STANDARD | USB_RECIP_DEVICE, |
103 | 0x01, 0x0, NULL, 0x0, 1000); | 103 | 0x01, 0x0, NULL, 0x0, 1 * HZ); |
104 | usb_stor_dbg(us, "Huawei mode set result is %d\n", result); | 104 | usb_stor_dbg(us, "Huawei mode set result is %d\n", result); |
105 | return 0; | 105 | return 0; |
106 | } | 106 | } |
diff --git a/drivers/usb/storage/realtek_cr.c b/drivers/usb/storage/realtek_cr.c index 8591d89a38e6..27e4a580d2ed 100644 --- a/drivers/usb/storage/realtek_cr.c +++ b/drivers/usb/storage/realtek_cr.c | |||
@@ -626,6 +626,7 @@ static int config_autodelink_after_power_on(struct us_data *us) | |||
626 | return 0; | 626 | return 0; |
627 | } | 627 | } |
628 | 628 | ||
629 | #ifdef CONFIG_PM | ||
629 | static int config_autodelink_before_power_down(struct us_data *us) | 630 | static int config_autodelink_before_power_down(struct us_data *us) |
630 | { | 631 | { |
631 | struct rts51x_chip *chip = (struct rts51x_chip *)(us->extra); | 632 | struct rts51x_chip *chip = (struct rts51x_chip *)(us->extra); |
@@ -716,6 +717,7 @@ static void fw5895_init(struct us_data *us) | |||
716 | } | 717 | } |
717 | } | 718 | } |
718 | } | 719 | } |
720 | #endif | ||
719 | 721 | ||
720 | #ifdef CONFIG_REALTEK_AUTOPM | 722 | #ifdef CONFIG_REALTEK_AUTOPM |
721 | static void fw5895_set_mmc_wp(struct us_data *us) | 723 | static void fw5895_set_mmc_wp(struct us_data *us) |
diff --git a/drivers/usb/storage/transport.c b/drivers/usb/storage/transport.c index 22c7d4360fa2..b1d815eb6d0b 100644 --- a/drivers/usb/storage/transport.c +++ b/drivers/usb/storage/transport.c | |||
@@ -1118,6 +1118,31 @@ int usb_stor_Bulk_transport(struct scsi_cmnd *srb, struct us_data *us) | |||
1118 | */ | 1118 | */ |
1119 | if (result == USB_STOR_XFER_LONG) | 1119 | if (result == USB_STOR_XFER_LONG) |
1120 | fake_sense = 1; | 1120 | fake_sense = 1; |
1121 | |||
1122 | /* | ||
1123 | * Sometimes a device will mistakenly skip the data phase | ||
1124 | * and go directly to the status phase without sending a | ||
1125 | * zero-length packet. If we get a 13-byte response here, | ||
1126 | * check whether it really is a CSW. | ||
1127 | */ | ||
1128 | if (result == USB_STOR_XFER_SHORT && | ||
1129 | srb->sc_data_direction == DMA_FROM_DEVICE && | ||
1130 | transfer_length - scsi_get_resid(srb) == | ||
1131 | US_BULK_CS_WRAP_LEN) { | ||
1132 | struct scatterlist *sg = NULL; | ||
1133 | unsigned int offset = 0; | ||
1134 | |||
1135 | if (usb_stor_access_xfer_buf((unsigned char *) bcs, | ||
1136 | US_BULK_CS_WRAP_LEN, srb, &sg, | ||
1137 | &offset, FROM_XFER_BUF) == | ||
1138 | US_BULK_CS_WRAP_LEN && | ||
1139 | bcs->Signature == | ||
1140 | cpu_to_le32(US_BULK_CS_SIGN)) { | ||
1141 | usb_stor_dbg(us, "Device skipped data phase\n"); | ||
1142 | scsi_set_resid(srb, transfer_length); | ||
1143 | goto skipped_data_phase; | ||
1144 | } | ||
1145 | } | ||
1121 | } | 1146 | } |
1122 | 1147 | ||
1123 | /* See flow chart on pg 15 of the Bulk Only Transport spec for | 1148 | /* See flow chart on pg 15 of the Bulk Only Transport spec for |
@@ -1153,6 +1178,7 @@ int usb_stor_Bulk_transport(struct scsi_cmnd *srb, struct us_data *us) | |||
1153 | if (result != USB_STOR_XFER_GOOD) | 1178 | if (result != USB_STOR_XFER_GOOD) |
1154 | return USB_STOR_TRANSPORT_ERROR; | 1179 | return USB_STOR_TRANSPORT_ERROR; |
1155 | 1180 | ||
1181 | skipped_data_phase: | ||
1156 | /* check bulk status */ | 1182 | /* check bulk status */ |
1157 | residue = le32_to_cpu(bcs->Residue); | 1183 | residue = le32_to_cpu(bcs->Residue); |
1158 | usb_stor_dbg(us, "Bulk Status S 0x%x T 0x%x R %u Stat 0x%x\n", | 1184 | usb_stor_dbg(us, "Bulk Status S 0x%x T 0x%x R %u Stat 0x%x\n", |
diff --git a/drivers/usb/storage/unusual_uas.h b/drivers/usb/storage/unusual_uas.h index 8511b54a65d9..2fefaf923e4a 100644 --- a/drivers/usb/storage/unusual_uas.h +++ b/drivers/usb/storage/unusual_uas.h | |||
@@ -54,6 +54,20 @@ UNUSUAL_DEV(0x0bc2, 0x3312, 0x0000, 0x9999, | |||
54 | USB_SC_DEVICE, USB_PR_DEVICE, NULL, | 54 | USB_SC_DEVICE, USB_PR_DEVICE, NULL, |
55 | US_FL_NO_ATA_1X), | 55 | US_FL_NO_ATA_1X), |
56 | 56 | ||
57 | /* Reported-by: Hans de Goede <hdegoede@redhat.com> */ | ||
58 | UNUSUAL_DEV(0x0bc2, 0x3320, 0x0000, 0x9999, | ||
59 | "Seagate", | ||
60 | "Expansion Desk", | ||
61 | USB_SC_DEVICE, USB_PR_DEVICE, NULL, | ||
62 | US_FL_NO_ATA_1X), | ||
63 | |||
64 | /* Reported-by: Bogdan Mihalcea <bogdan.mihalcea@infim.ro> */ | ||
65 | UNUSUAL_DEV(0x0bc2, 0xa003, 0x0000, 0x9999, | ||
66 | "Seagate", | ||
67 | "Backup Plus", | ||
68 | USB_SC_DEVICE, USB_PR_DEVICE, NULL, | ||
69 | US_FL_NO_ATA_1X), | ||
70 | |||
57 | /* https://bbs.archlinux.org/viewtopic.php?id=183190 */ | 71 | /* https://bbs.archlinux.org/viewtopic.php?id=183190 */ |
58 | UNUSUAL_DEV(0x0bc2, 0xab20, 0x0000, 0x9999, | 72 | UNUSUAL_DEV(0x0bc2, 0xab20, 0x0000, 0x9999, |
59 | "Seagate", | 73 | "Seagate", |
@@ -61,6 +75,13 @@ UNUSUAL_DEV(0x0bc2, 0xab20, 0x0000, 0x9999, | |||
61 | USB_SC_DEVICE, USB_PR_DEVICE, NULL, | 75 | USB_SC_DEVICE, USB_PR_DEVICE, NULL, |
62 | US_FL_NO_ATA_1X), | 76 | US_FL_NO_ATA_1X), |
63 | 77 | ||
78 | /* https://bbs.archlinux.org/viewtopic.php?id=183190 */ | ||
79 | UNUSUAL_DEV(0x0bc2, 0xab21, 0x0000, 0x9999, | ||
80 | "Seagate", | ||
81 | "Backup+ BK", | ||
82 | USB_SC_DEVICE, USB_PR_DEVICE, NULL, | ||
83 | US_FL_NO_ATA_1X), | ||
84 | |||
64 | /* Reported-by: Claudio Bizzarri <claudio.bizzarri@gmail.com> */ | 85 | /* Reported-by: Claudio Bizzarri <claudio.bizzarri@gmail.com> */ |
65 | UNUSUAL_DEV(0x152d, 0x0567, 0x0000, 0x9999, | 86 | UNUSUAL_DEV(0x152d, 0x0567, 0x0000, 0x9999, |
66 | "JMicron", | 87 | "JMicron", |
@@ -75,3 +96,10 @@ UNUSUAL_DEV(0x174c, 0x5106, 0x0000, 0x9999, | |||
75 | "ASM1051", | 96 | "ASM1051", |
76 | USB_SC_DEVICE, USB_PR_DEVICE, NULL, | 97 | USB_SC_DEVICE, USB_PR_DEVICE, NULL, |
77 | US_FL_IGNORE_UAS), | 98 | US_FL_IGNORE_UAS), |
99 | |||
100 | /* Reported-by: Hans de Goede <hdegoede@redhat.com> */ | ||
101 | UNUSUAL_DEV(0x2109, 0x0711, 0x0000, 0x9999, | ||
102 | "VIA", | ||
103 | "VL711", | ||
104 | USB_SC_DEVICE, USB_PR_DEVICE, NULL, | ||
105 | US_FL_NO_ATA_1X), | ||
diff --git a/drivers/video/console/fbcon.c b/drivers/video/console/fbcon.c index 57b1d44acbfe..eb976ee3a02f 100644 --- a/drivers/video/console/fbcon.c +++ b/drivers/video/console/fbcon.c | |||
@@ -448,8 +448,10 @@ static int __init fb_console_setup(char *this_opt) | |||
448 | return 1; | 448 | return 1; |
449 | 449 | ||
450 | while ((options = strsep(&this_opt, ",")) != NULL) { | 450 | while ((options = strsep(&this_opt, ",")) != NULL) { |
451 | if (!strncmp(options, "font:", 5)) | 451 | if (!strncmp(options, "font:", 5)) { |
452 | strlcpy(fontname, options + 5, sizeof(fontname)); | 452 | strlcpy(fontname, options + 5, sizeof(fontname)); |
453 | continue; | ||
454 | } | ||
453 | 455 | ||
454 | if (!strncmp(options, "scrollback:", 11)) { | 456 | if (!strncmp(options, "scrollback:", 11)) { |
455 | options += 11; | 457 | options += 11; |
@@ -457,13 +459,9 @@ static int __init fb_console_setup(char *this_opt) | |||
457 | fbcon_softback_size = simple_strtoul(options, &options, 0); | 459 | fbcon_softback_size = simple_strtoul(options, &options, 0); |
458 | if (*options == 'k' || *options == 'K') { | 460 | if (*options == 'k' || *options == 'K') { |
459 | fbcon_softback_size *= 1024; | 461 | fbcon_softback_size *= 1024; |
460 | options++; | ||
461 | } | 462 | } |
462 | if (*options != ',') | 463 | } |
463 | return 1; | 464 | continue; |
464 | options++; | ||
465 | } else | ||
466 | return 1; | ||
467 | } | 465 | } |
468 | 466 | ||
469 | if (!strncmp(options, "map:", 4)) { | 467 | if (!strncmp(options, "map:", 4)) { |
@@ -478,8 +476,7 @@ static int __init fb_console_setup(char *this_opt) | |||
478 | 476 | ||
479 | fbcon_map_override(); | 477 | fbcon_map_override(); |
480 | } | 478 | } |
481 | 479 | continue; | |
482 | return 1; | ||
483 | } | 480 | } |
484 | 481 | ||
485 | if (!strncmp(options, "vc:", 3)) { | 482 | if (!strncmp(options, "vc:", 3)) { |
@@ -491,7 +488,8 @@ static int __init fb_console_setup(char *this_opt) | |||
491 | if (*options++ == '-') | 488 | if (*options++ == '-') |
492 | last_fb_vc = simple_strtoul(options, &options, 10) - 1; | 489 | last_fb_vc = simple_strtoul(options, &options, 10) - 1; |
493 | fbcon_is_default = 0; | 490 | fbcon_is_default = 0; |
494 | } | 491 | continue; |
492 | } | ||
495 | 493 | ||
496 | if (!strncmp(options, "rotate:", 7)) { | 494 | if (!strncmp(options, "rotate:", 7)) { |
497 | options += 7; | 495 | options += 7; |
@@ -499,6 +497,7 @@ static int __init fb_console_setup(char *this_opt) | |||
499 | initial_rotation = simple_strtoul(options, &options, 0); | 497 | initial_rotation = simple_strtoul(options, &options, 0); |
500 | if (initial_rotation > 3) | 498 | if (initial_rotation > 3) |
501 | initial_rotation = 0; | 499 | initial_rotation = 0; |
500 | continue; | ||
502 | } | 501 | } |
503 | } | 502 | } |
504 | return 1; | 503 | return 1; |
diff --git a/drivers/video/console/vgacon.c b/drivers/video/console/vgacon.c index 6e6aa704fe84..517f565b65d7 100644 --- a/drivers/video/console/vgacon.c +++ b/drivers/video/console/vgacon.c | |||
@@ -56,7 +56,7 @@ static int cursor_size_lastfrom; | |||
56 | static int cursor_size_lastto; | 56 | static int cursor_size_lastto; |
57 | static u32 vgacon_xres; | 57 | static u32 vgacon_xres; |
58 | static u32 vgacon_yres; | 58 | static u32 vgacon_yres; |
59 | static struct vgastate state; | 59 | static struct vgastate vgastate; |
60 | 60 | ||
61 | #define BLANK 0x0020 | 61 | #define BLANK 0x0020 |
62 | 62 | ||
@@ -400,7 +400,7 @@ static const char *vgacon_startup(void) | |||
400 | 400 | ||
401 | vga_video_num_lines = screen_info.orig_video_lines; | 401 | vga_video_num_lines = screen_info.orig_video_lines; |
402 | vga_video_num_columns = screen_info.orig_video_cols; | 402 | vga_video_num_columns = screen_info.orig_video_cols; |
403 | state.vgabase = NULL; | 403 | vgastate.vgabase = NULL; |
404 | 404 | ||
405 | if (screen_info.orig_video_mode == 7) { | 405 | if (screen_info.orig_video_mode == 7) { |
406 | /* Monochrome display */ | 406 | /* Monochrome display */ |
@@ -851,12 +851,12 @@ static void vga_set_palette(struct vc_data *vc, unsigned char *table) | |||
851 | { | 851 | { |
852 | int i, j; | 852 | int i, j; |
853 | 853 | ||
854 | vga_w(state.vgabase, VGA_PEL_MSK, 0xff); | 854 | vga_w(vgastate.vgabase, VGA_PEL_MSK, 0xff); |
855 | for (i = j = 0; i < 16; i++) { | 855 | for (i = j = 0; i < 16; i++) { |
856 | vga_w(state.vgabase, VGA_PEL_IW, table[i]); | 856 | vga_w(vgastate.vgabase, VGA_PEL_IW, table[i]); |
857 | vga_w(state.vgabase, VGA_PEL_D, vc->vc_palette[j++] >> 2); | 857 | vga_w(vgastate.vgabase, VGA_PEL_D, vc->vc_palette[j++] >> 2); |
858 | vga_w(state.vgabase, VGA_PEL_D, vc->vc_palette[j++] >> 2); | 858 | vga_w(vgastate.vgabase, VGA_PEL_D, vc->vc_palette[j++] >> 2); |
859 | vga_w(state.vgabase, VGA_PEL_D, vc->vc_palette[j++] >> 2); | 859 | vga_w(vgastate.vgabase, VGA_PEL_D, vc->vc_palette[j++] >> 2); |
860 | } | 860 | } |
861 | } | 861 | } |
862 | 862 | ||
@@ -1008,7 +1008,7 @@ static int vgacon_blank(struct vc_data *c, int blank, int mode_switch) | |||
1008 | switch (blank) { | 1008 | switch (blank) { |
1009 | case 0: /* Unblank */ | 1009 | case 0: /* Unblank */ |
1010 | if (vga_vesa_blanked) { | 1010 | if (vga_vesa_blanked) { |
1011 | vga_vesa_unblank(&state); | 1011 | vga_vesa_unblank(&vgastate); |
1012 | vga_vesa_blanked = 0; | 1012 | vga_vesa_blanked = 0; |
1013 | } | 1013 | } |
1014 | if (vga_palette_blanked) { | 1014 | if (vga_palette_blanked) { |
@@ -1022,7 +1022,7 @@ static int vgacon_blank(struct vc_data *c, int blank, int mode_switch) | |||
1022 | case 1: /* Normal blanking */ | 1022 | case 1: /* Normal blanking */ |
1023 | case -1: /* Obsolete */ | 1023 | case -1: /* Obsolete */ |
1024 | if (!mode_switch && vga_video_type == VIDEO_TYPE_VGAC) { | 1024 | if (!mode_switch && vga_video_type == VIDEO_TYPE_VGAC) { |
1025 | vga_pal_blank(&state); | 1025 | vga_pal_blank(&vgastate); |
1026 | vga_palette_blanked = 1; | 1026 | vga_palette_blanked = 1; |
1027 | return 0; | 1027 | return 0; |
1028 | } | 1028 | } |
@@ -1034,7 +1034,7 @@ static int vgacon_blank(struct vc_data *c, int blank, int mode_switch) | |||
1034 | return 1; | 1034 | return 1; |
1035 | default: /* VESA blanking */ | 1035 | default: /* VESA blanking */ |
1036 | if (vga_video_type == VIDEO_TYPE_VGAC) { | 1036 | if (vga_video_type == VIDEO_TYPE_VGAC) { |
1037 | vga_vesa_blank(&state, blank - 1); | 1037 | vga_vesa_blank(&vgastate, blank - 1); |
1038 | vga_vesa_blanked = blank; | 1038 | vga_vesa_blanked = blank; |
1039 | } | 1039 | } |
1040 | return 0; | 1040 | return 0; |
@@ -1280,7 +1280,7 @@ static int vgacon_font_set(struct vc_data *c, struct console_font *font, unsigne | |||
1280 | (charcount != 256 && charcount != 512)) | 1280 | (charcount != 256 && charcount != 512)) |
1281 | return -EINVAL; | 1281 | return -EINVAL; |
1282 | 1282 | ||
1283 | rc = vgacon_do_font_op(&state, font->data, 1, charcount == 512); | 1283 | rc = vgacon_do_font_op(&vgastate, font->data, 1, charcount == 512); |
1284 | if (rc) | 1284 | if (rc) |
1285 | return rc; | 1285 | return rc; |
1286 | 1286 | ||
@@ -1299,7 +1299,7 @@ static int vgacon_font_get(struct vc_data *c, struct console_font *font) | |||
1299 | font->charcount = vga_512_chars ? 512 : 256; | 1299 | font->charcount = vga_512_chars ? 512 : 256; |
1300 | if (!font->data) | 1300 | if (!font->data) |
1301 | return 0; | 1301 | return 0; |
1302 | return vgacon_do_font_op(&state, font->data, 0, vga_512_chars); | 1302 | return vgacon_do_font_op(&vgastate, font->data, 0, vga_512_chars); |
1303 | } | 1303 | } |
1304 | 1304 | ||
1305 | #else | 1305 | #else |
diff --git a/drivers/video/fbdev/atmel_lcdfb.c b/drivers/video/fbdev/atmel_lcdfb.c index 3bf403150a2d..9ec81d46fc57 100644 --- a/drivers/video/fbdev/atmel_lcdfb.c +++ b/drivers/video/fbdev/atmel_lcdfb.c | |||
@@ -27,7 +27,6 @@ | |||
27 | #include <linux/regulator/consumer.h> | 27 | #include <linux/regulator/consumer.h> |
28 | #include <video/videomode.h> | 28 | #include <video/videomode.h> |
29 | 29 | ||
30 | #include <mach/cpu.h> | ||
31 | #include <asm/gpio.h> | 30 | #include <asm/gpio.h> |
32 | 31 | ||
33 | #include <video/atmel_lcdc.h> | 32 | #include <video/atmel_lcdc.h> |
diff --git a/drivers/video/fbdev/omap2/displays-new/connector-analog-tv.c b/drivers/video/fbdev/omap2/displays-new/connector-analog-tv.c index 5ee3b5505f7f..91921665b98b 100644 --- a/drivers/video/fbdev/omap2/displays-new/connector-analog-tv.c +++ b/drivers/video/fbdev/omap2/displays-new/connector-analog-tv.c | |||
@@ -301,6 +301,8 @@ static const struct of_device_id tvc_of_match[] = { | |||
301 | {}, | 301 | {}, |
302 | }; | 302 | }; |
303 | 303 | ||
304 | MODULE_DEVICE_TABLE(of, tvc_of_match); | ||
305 | |||
304 | static struct platform_driver tvc_connector_driver = { | 306 | static struct platform_driver tvc_connector_driver = { |
305 | .probe = tvc_probe, | 307 | .probe = tvc_probe, |
306 | .remove = __exit_p(tvc_remove), | 308 | .remove = __exit_p(tvc_remove), |
@@ -308,6 +310,7 @@ static struct platform_driver tvc_connector_driver = { | |||
308 | .name = "connector-analog-tv", | 310 | .name = "connector-analog-tv", |
309 | .owner = THIS_MODULE, | 311 | .owner = THIS_MODULE, |
310 | .of_match_table = tvc_of_match, | 312 | .of_match_table = tvc_of_match, |
313 | .suppress_bind_attrs = true, | ||
311 | }, | 314 | }, |
312 | }; | 315 | }; |
313 | 316 | ||
diff --git a/drivers/video/fbdev/omap2/displays-new/connector-dvi.c b/drivers/video/fbdev/omap2/displays-new/connector-dvi.c index 74de2bc50c4f..2dfb6e5ff0cc 100644 --- a/drivers/video/fbdev/omap2/displays-new/connector-dvi.c +++ b/drivers/video/fbdev/omap2/displays-new/connector-dvi.c | |||
@@ -391,6 +391,7 @@ static struct platform_driver dvi_connector_driver = { | |||
391 | .name = "connector-dvi", | 391 | .name = "connector-dvi", |
392 | .owner = THIS_MODULE, | 392 | .owner = THIS_MODULE, |
393 | .of_match_table = dvic_of_match, | 393 | .of_match_table = dvic_of_match, |
394 | .suppress_bind_attrs = true, | ||
394 | }, | 395 | }, |
395 | }; | 396 | }; |
396 | 397 | ||
diff --git a/drivers/video/fbdev/omap2/displays-new/connector-hdmi.c b/drivers/video/fbdev/omap2/displays-new/connector-hdmi.c index 131c6e260898..7b25967a91eb 100644 --- a/drivers/video/fbdev/omap2/displays-new/connector-hdmi.c +++ b/drivers/video/fbdev/omap2/displays-new/connector-hdmi.c | |||
@@ -437,6 +437,7 @@ static struct platform_driver hdmi_connector_driver = { | |||
437 | .name = "connector-hdmi", | 437 | .name = "connector-hdmi", |
438 | .owner = THIS_MODULE, | 438 | .owner = THIS_MODULE, |
439 | .of_match_table = hdmic_of_match, | 439 | .of_match_table = hdmic_of_match, |
440 | .suppress_bind_attrs = true, | ||
440 | }, | 441 | }, |
441 | }; | 442 | }; |
442 | 443 | ||
diff --git a/drivers/video/fbdev/omap2/displays-new/encoder-tfp410.c b/drivers/video/fbdev/omap2/displays-new/encoder-tfp410.c index b4e9a42a79e6..47ee7cdee1c5 100644 --- a/drivers/video/fbdev/omap2/displays-new/encoder-tfp410.c +++ b/drivers/video/fbdev/omap2/displays-new/encoder-tfp410.c | |||
@@ -298,6 +298,7 @@ static struct platform_driver tfp410_driver = { | |||
298 | .name = "tfp410", | 298 | .name = "tfp410", |
299 | .owner = THIS_MODULE, | 299 | .owner = THIS_MODULE, |
300 | .of_match_table = tfp410_of_match, | 300 | .of_match_table = tfp410_of_match, |
301 | .suppress_bind_attrs = true, | ||
301 | }, | 302 | }, |
302 | }; | 303 | }; |
303 | 304 | ||
diff --git a/drivers/video/fbdev/omap2/displays-new/encoder-tpd12s015.c b/drivers/video/fbdev/omap2/displays-new/encoder-tpd12s015.c index c891d8f84cb2..c4abd56dd846 100644 --- a/drivers/video/fbdev/omap2/displays-new/encoder-tpd12s015.c +++ b/drivers/video/fbdev/omap2/displays-new/encoder-tpd12s015.c | |||
@@ -461,6 +461,7 @@ static struct platform_driver tpd_driver = { | |||
461 | .name = "tpd12s015", | 461 | .name = "tpd12s015", |
462 | .owner = THIS_MODULE, | 462 | .owner = THIS_MODULE, |
463 | .of_match_table = tpd_of_match, | 463 | .of_match_table = tpd_of_match, |
464 | .suppress_bind_attrs = true, | ||
464 | }, | 465 | }, |
465 | }; | 466 | }; |
466 | 467 | ||
diff --git a/drivers/video/fbdev/omap2/displays-new/panel-dpi.c b/drivers/video/fbdev/omap2/displays-new/panel-dpi.c index 3636b61dc9b4..a9c3dcf0f6b5 100644 --- a/drivers/video/fbdev/omap2/displays-new/panel-dpi.c +++ b/drivers/video/fbdev/omap2/displays-new/panel-dpi.c | |||
@@ -327,6 +327,7 @@ static struct platform_driver panel_dpi_driver = { | |||
327 | .name = "panel-dpi", | 327 | .name = "panel-dpi", |
328 | .owner = THIS_MODULE, | 328 | .owner = THIS_MODULE, |
329 | .of_match_table = panel_dpi_of_match, | 329 | .of_match_table = panel_dpi_of_match, |
330 | .suppress_bind_attrs = true, | ||
330 | }, | 331 | }, |
331 | }; | 332 | }; |
332 | 333 | ||
diff --git a/drivers/video/fbdev/omap2/displays-new/panel-dsi-cm.c b/drivers/video/fbdev/omap2/displays-new/panel-dsi-cm.c index d6f14e8717e8..899cb1ab523d 100644 --- a/drivers/video/fbdev/omap2/displays-new/panel-dsi-cm.c +++ b/drivers/video/fbdev/omap2/displays-new/panel-dsi-cm.c | |||
@@ -1378,6 +1378,7 @@ static struct platform_driver dsicm_driver = { | |||
1378 | .name = "panel-dsi-cm", | 1378 | .name = "panel-dsi-cm", |
1379 | .owner = THIS_MODULE, | 1379 | .owner = THIS_MODULE, |
1380 | .of_match_table = dsicm_of_match, | 1380 | .of_match_table = dsicm_of_match, |
1381 | .suppress_bind_attrs = true, | ||
1381 | }, | 1382 | }, |
1382 | }; | 1383 | }; |
1383 | 1384 | ||
diff --git a/drivers/video/fbdev/omap2/displays-new/panel-lgphilips-lb035q02.c b/drivers/video/fbdev/omap2/displays-new/panel-lgphilips-lb035q02.c index cc5b5124e0b4..27d4fcfa1824 100644 --- a/drivers/video/fbdev/omap2/displays-new/panel-lgphilips-lb035q02.c +++ b/drivers/video/fbdev/omap2/displays-new/panel-lgphilips-lb035q02.c | |||
@@ -394,6 +394,7 @@ static struct spi_driver lb035q02_spi_driver = { | |||
394 | .name = "panel_lgphilips_lb035q02", | 394 | .name = "panel_lgphilips_lb035q02", |
395 | .owner = THIS_MODULE, | 395 | .owner = THIS_MODULE, |
396 | .of_match_table = lb035q02_of_match, | 396 | .of_match_table = lb035q02_of_match, |
397 | .suppress_bind_attrs = true, | ||
397 | }, | 398 | }, |
398 | }; | 399 | }; |
399 | 400 | ||
diff --git a/drivers/video/fbdev/omap2/displays-new/panel-nec-nl8048hl11.c b/drivers/video/fbdev/omap2/displays-new/panel-nec-nl8048hl11.c index 3595f111aa35..ccf3f4f3c703 100644 --- a/drivers/video/fbdev/omap2/displays-new/panel-nec-nl8048hl11.c +++ b/drivers/video/fbdev/omap2/displays-new/panel-nec-nl8048hl11.c | |||
@@ -424,6 +424,7 @@ static struct spi_driver nec_8048_driver = { | |||
424 | .owner = THIS_MODULE, | 424 | .owner = THIS_MODULE, |
425 | .pm = NEC_8048_PM_OPS, | 425 | .pm = NEC_8048_PM_OPS, |
426 | .of_match_table = nec_8048_of_match, | 426 | .of_match_table = nec_8048_of_match, |
427 | .suppress_bind_attrs = true, | ||
427 | }, | 428 | }, |
428 | .probe = nec_8048_probe, | 429 | .probe = nec_8048_probe, |
429 | .remove = nec_8048_remove, | 430 | .remove = nec_8048_remove, |
diff --git a/drivers/video/fbdev/omap2/displays-new/panel-sharp-ls037v7dw01.c b/drivers/video/fbdev/omap2/displays-new/panel-sharp-ls037v7dw01.c index f1f72ce50a17..234142cc3764 100644 --- a/drivers/video/fbdev/omap2/displays-new/panel-sharp-ls037v7dw01.c +++ b/drivers/video/fbdev/omap2/displays-new/panel-sharp-ls037v7dw01.c | |||
@@ -410,6 +410,7 @@ static struct platform_driver sharp_ls_driver = { | |||
410 | .name = "panel-sharp-ls037v7dw01", | 410 | .name = "panel-sharp-ls037v7dw01", |
411 | .owner = THIS_MODULE, | 411 | .owner = THIS_MODULE, |
412 | .of_match_table = sharp_ls_of_match, | 412 | .of_match_table = sharp_ls_of_match, |
413 | .suppress_bind_attrs = true, | ||
413 | }, | 414 | }, |
414 | }; | 415 | }; |
415 | 416 | ||
diff --git a/drivers/video/fbdev/omap2/displays-new/panel-sony-acx565akm.c b/drivers/video/fbdev/omap2/displays-new/panel-sony-acx565akm.c index 617f8d2f5127..337ccc5c0f5e 100644 --- a/drivers/video/fbdev/omap2/displays-new/panel-sony-acx565akm.c +++ b/drivers/video/fbdev/omap2/displays-new/panel-sony-acx565akm.c | |||
@@ -904,6 +904,7 @@ static struct spi_driver acx565akm_driver = { | |||
904 | .name = "acx565akm", | 904 | .name = "acx565akm", |
905 | .owner = THIS_MODULE, | 905 | .owner = THIS_MODULE, |
906 | .of_match_table = acx565akm_of_match, | 906 | .of_match_table = acx565akm_of_match, |
907 | .suppress_bind_attrs = true, | ||
907 | }, | 908 | }, |
908 | .probe = acx565akm_probe, | 909 | .probe = acx565akm_probe, |
909 | .remove = acx565akm_remove, | 910 | .remove = acx565akm_remove, |
diff --git a/drivers/video/fbdev/omap2/displays-new/panel-tpo-td028ttec1.c b/drivers/video/fbdev/omap2/displays-new/panel-tpo-td028ttec1.c index 728808bcceeb..fbba0b8ca871 100644 --- a/drivers/video/fbdev/omap2/displays-new/panel-tpo-td028ttec1.c +++ b/drivers/video/fbdev/omap2/displays-new/panel-tpo-td028ttec1.c | |||
@@ -500,6 +500,7 @@ static struct spi_driver td028ttec1_spi_driver = { | |||
500 | .name = "panel-tpo-td028ttec1", | 500 | .name = "panel-tpo-td028ttec1", |
501 | .owner = THIS_MODULE, | 501 | .owner = THIS_MODULE, |
502 | .of_match_table = td028ttec1_of_match, | 502 | .of_match_table = td028ttec1_of_match, |
503 | .suppress_bind_attrs = true, | ||
503 | }, | 504 | }, |
504 | }; | 505 | }; |
505 | 506 | ||
diff --git a/drivers/video/fbdev/omap2/displays-new/panel-tpo-td043mtea1.c b/drivers/video/fbdev/omap2/displays-new/panel-tpo-td043mtea1.c index de78ab0caaa8..5aba76bca25a 100644 --- a/drivers/video/fbdev/omap2/displays-new/panel-tpo-td043mtea1.c +++ b/drivers/video/fbdev/omap2/displays-new/panel-tpo-td043mtea1.c | |||
@@ -673,6 +673,7 @@ static struct spi_driver tpo_td043_spi_driver = { | |||
673 | .owner = THIS_MODULE, | 673 | .owner = THIS_MODULE, |
674 | .pm = &tpo_td043_spi_pm, | 674 | .pm = &tpo_td043_spi_pm, |
675 | .of_match_table = tpo_td043_of_match, | 675 | .of_match_table = tpo_td043_of_match, |
676 | .suppress_bind_attrs = true, | ||
676 | }, | 677 | }, |
677 | .probe = tpo_td043_probe, | 678 | .probe = tpo_td043_probe, |
678 | .remove = tpo_td043_remove, | 679 | .remove = tpo_td043_remove, |
diff --git a/drivers/video/fbdev/omap2/dss/apply.c b/drivers/video/fbdev/omap2/dss/apply.c index 0a0b084ce65d..663ccc3bf4e5 100644 --- a/drivers/video/fbdev/omap2/dss/apply.c +++ b/drivers/video/fbdev/omap2/dss/apply.c | |||
@@ -1132,6 +1132,8 @@ static void dss_mgr_disable_compat(struct omap_overlay_manager *mgr) | |||
1132 | if (!mp->enabled) | 1132 | if (!mp->enabled) |
1133 | goto out; | 1133 | goto out; |
1134 | 1134 | ||
1135 | wait_pending_extra_info_updates(); | ||
1136 | |||
1135 | if (!mgr_manual_update(mgr)) | 1137 | if (!mgr_manual_update(mgr)) |
1136 | dispc_mgr_disable_sync(mgr->id); | 1138 | dispc_mgr_disable_sync(mgr->id); |
1137 | 1139 | ||
diff --git a/drivers/video/fbdev/omap2/dss/dispc.c b/drivers/video/fbdev/omap2/dss/dispc.c index be053aa80880..0e9a74bb9fc2 100644 --- a/drivers/video/fbdev/omap2/dss/dispc.c +++ b/drivers/video/fbdev/omap2/dss/dispc.c | |||
@@ -3290,8 +3290,11 @@ static void dispc_dump_regs(struct seq_file *s) | |||
3290 | DUMPREG(i, DISPC_OVL_FIFO_SIZE_STATUS); | 3290 | DUMPREG(i, DISPC_OVL_FIFO_SIZE_STATUS); |
3291 | DUMPREG(i, DISPC_OVL_ROW_INC); | 3291 | DUMPREG(i, DISPC_OVL_ROW_INC); |
3292 | DUMPREG(i, DISPC_OVL_PIXEL_INC); | 3292 | DUMPREG(i, DISPC_OVL_PIXEL_INC); |
3293 | |||
3293 | if (dss_has_feature(FEAT_PRELOAD)) | 3294 | if (dss_has_feature(FEAT_PRELOAD)) |
3294 | DUMPREG(i, DISPC_OVL_PRELOAD); | 3295 | DUMPREG(i, DISPC_OVL_PRELOAD); |
3296 | if (dss_has_feature(FEAT_MFLAG)) | ||
3297 | DUMPREG(i, DISPC_OVL_MFLAG_THRESHOLD); | ||
3295 | 3298 | ||
3296 | if (i == OMAP_DSS_GFX) { | 3299 | if (i == OMAP_DSS_GFX) { |
3297 | DUMPREG(i, DISPC_OVL_WINDOW_SKIP); | 3300 | DUMPREG(i, DISPC_OVL_WINDOW_SKIP); |
@@ -3312,10 +3315,6 @@ static void dispc_dump_regs(struct seq_file *s) | |||
3312 | } | 3315 | } |
3313 | if (dss_has_feature(FEAT_ATTR2)) | 3316 | if (dss_has_feature(FEAT_ATTR2)) |
3314 | DUMPREG(i, DISPC_OVL_ATTRIBUTES2); | 3317 | DUMPREG(i, DISPC_OVL_ATTRIBUTES2); |
3315 | if (dss_has_feature(FEAT_PRELOAD)) | ||
3316 | DUMPREG(i, DISPC_OVL_PRELOAD); | ||
3317 | if (dss_has_feature(FEAT_MFLAG)) | ||
3318 | DUMPREG(i, DISPC_OVL_MFLAG_THRESHOLD); | ||
3319 | } | 3318 | } |
3320 | 3319 | ||
3321 | #undef DISPC_REG | 3320 | #undef DISPC_REG |
@@ -3843,6 +3842,7 @@ static struct platform_driver omap_dispchw_driver = { | |||
3843 | .owner = THIS_MODULE, | 3842 | .owner = THIS_MODULE, |
3844 | .pm = &dispc_pm_ops, | 3843 | .pm = &dispc_pm_ops, |
3845 | .of_match_table = dispc_of_match, | 3844 | .of_match_table = dispc_of_match, |
3845 | .suppress_bind_attrs = true, | ||
3846 | }, | 3846 | }, |
3847 | }; | 3847 | }; |
3848 | 3848 | ||
diff --git a/drivers/video/fbdev/omap2/dss/dispc.h b/drivers/video/fbdev/omap2/dss/dispc.h index 78edb449c763..3043d6e0a5f9 100644 --- a/drivers/video/fbdev/omap2/dss/dispc.h +++ b/drivers/video/fbdev/omap2/dss/dispc.h | |||
@@ -101,8 +101,7 @@ | |||
101 | DISPC_FIR_COEF_V2_OFFSET(n, i)) | 101 | DISPC_FIR_COEF_V2_OFFSET(n, i)) |
102 | #define DISPC_OVL_PRELOAD(n) (DISPC_OVL_BASE(n) + \ | 102 | #define DISPC_OVL_PRELOAD(n) (DISPC_OVL_BASE(n) + \ |
103 | DISPC_PRELOAD_OFFSET(n)) | 103 | DISPC_PRELOAD_OFFSET(n)) |
104 | #define DISPC_OVL_MFLAG_THRESHOLD(n) (DISPC_OVL_BASE(n) + \ | 104 | #define DISPC_OVL_MFLAG_THRESHOLD(n) DISPC_MFLAG_THRESHOLD_OFFSET(n) |
105 | DISPC_MFLAG_THRESHOLD_OFFSET(n)) | ||
106 | 105 | ||
107 | /* DISPC up/downsampling FIR filter coefficient structure */ | 106 | /* DISPC up/downsampling FIR filter coefficient structure */ |
108 | struct dispc_coef { | 107 | struct dispc_coef { |
diff --git a/drivers/video/fbdev/omap2/dss/dpi.c b/drivers/video/fbdev/omap2/dss/dpi.c index 9368972d6962..4a3363dae74a 100644 --- a/drivers/video/fbdev/omap2/dss/dpi.c +++ b/drivers/video/fbdev/omap2/dss/dpi.c | |||
@@ -720,6 +720,7 @@ static struct platform_driver omap_dpi_driver = { | |||
720 | .driver = { | 720 | .driver = { |
721 | .name = "omapdss_dpi", | 721 | .name = "omapdss_dpi", |
722 | .owner = THIS_MODULE, | 722 | .owner = THIS_MODULE, |
723 | .suppress_bind_attrs = true, | ||
723 | }, | 724 | }, |
724 | }; | 725 | }; |
725 | 726 | ||
diff --git a/drivers/video/fbdev/omap2/dss/dsi.c b/drivers/video/fbdev/omap2/dss/dsi.c index b6f6ae1d4664..0793bc67a275 100644 --- a/drivers/video/fbdev/omap2/dss/dsi.c +++ b/drivers/video/fbdev/omap2/dss/dsi.c | |||
@@ -1603,7 +1603,7 @@ int dsi_pll_set_clock_div(struct platform_device *dsidev, | |||
1603 | } else if (dss_has_feature(FEAT_DSI_PLL_SELFREQDCO)) { | 1603 | } else if (dss_has_feature(FEAT_DSI_PLL_SELFREQDCO)) { |
1604 | f = cinfo->clkin4ddr < 1000000000 ? 0x2 : 0x4; | 1604 | f = cinfo->clkin4ddr < 1000000000 ? 0x2 : 0x4; |
1605 | 1605 | ||
1606 | l = FLD_MOD(l, f, 4, 1); /* PLL_SELFREQDCO */ | 1606 | l = FLD_MOD(l, f, 3, 1); /* PLL_SELFREQDCO */ |
1607 | } | 1607 | } |
1608 | 1608 | ||
1609 | l = FLD_MOD(l, 1, 13, 13); /* DSI_PLL_REFEN */ | 1609 | l = FLD_MOD(l, 1, 13, 13); /* DSI_PLL_REFEN */ |
@@ -5754,6 +5754,7 @@ static struct platform_driver omap_dsihw_driver = { | |||
5754 | .owner = THIS_MODULE, | 5754 | .owner = THIS_MODULE, |
5755 | .pm = &dsi_pm_ops, | 5755 | .pm = &dsi_pm_ops, |
5756 | .of_match_table = dsi_of_match, | 5756 | .of_match_table = dsi_of_match, |
5757 | .suppress_bind_attrs = true, | ||
5757 | }, | 5758 | }, |
5758 | }; | 5759 | }; |
5759 | 5760 | ||
diff --git a/drivers/video/fbdev/omap2/dss/dss.c b/drivers/video/fbdev/omap2/dss/dss.c index 6daeb7ed44c6..14bcd6c43f72 100644 --- a/drivers/video/fbdev/omap2/dss/dss.c +++ b/drivers/video/fbdev/omap2/dss/dss.c | |||
@@ -966,6 +966,7 @@ static struct platform_driver omap_dsshw_driver = { | |||
966 | .owner = THIS_MODULE, | 966 | .owner = THIS_MODULE, |
967 | .pm = &dss_pm_ops, | 967 | .pm = &dss_pm_ops, |
968 | .of_match_table = dss_of_match, | 968 | .of_match_table = dss_of_match, |
969 | .suppress_bind_attrs = true, | ||
969 | }, | 970 | }, |
970 | }; | 971 | }; |
971 | 972 | ||
diff --git a/drivers/video/fbdev/omap2/dss/hdmi4.c b/drivers/video/fbdev/omap2/dss/hdmi4.c index 6a8550cf43e5..9a8713ca090c 100644 --- a/drivers/video/fbdev/omap2/dss/hdmi4.c +++ b/drivers/video/fbdev/omap2/dss/hdmi4.c | |||
@@ -781,6 +781,7 @@ static struct platform_driver omapdss_hdmihw_driver = { | |||
781 | .owner = THIS_MODULE, | 781 | .owner = THIS_MODULE, |
782 | .pm = &hdmi_pm_ops, | 782 | .pm = &hdmi_pm_ops, |
783 | .of_match_table = hdmi_of_match, | 783 | .of_match_table = hdmi_of_match, |
784 | .suppress_bind_attrs = true, | ||
784 | }, | 785 | }, |
785 | }; | 786 | }; |
786 | 787 | ||
diff --git a/drivers/video/fbdev/omap2/dss/hdmi5.c b/drivers/video/fbdev/omap2/dss/hdmi5.c index 32d02ec34d23..169b764bb9d4 100644 --- a/drivers/video/fbdev/omap2/dss/hdmi5.c +++ b/drivers/video/fbdev/omap2/dss/hdmi5.c | |||
@@ -806,6 +806,7 @@ static struct platform_driver omapdss_hdmihw_driver = { | |||
806 | .owner = THIS_MODULE, | 806 | .owner = THIS_MODULE, |
807 | .pm = &hdmi_pm_ops, | 807 | .pm = &hdmi_pm_ops, |
808 | .of_match_table = hdmi_of_match, | 808 | .of_match_table = hdmi_of_match, |
809 | .suppress_bind_attrs = true, | ||
809 | }, | 810 | }, |
810 | }; | 811 | }; |
811 | 812 | ||
diff --git a/drivers/video/fbdev/omap2/dss/hdmi_pll.c b/drivers/video/fbdev/omap2/dss/hdmi_pll.c index 54df12a8d744..6d92bb32fe51 100644 --- a/drivers/video/fbdev/omap2/dss/hdmi_pll.c +++ b/drivers/video/fbdev/omap2/dss/hdmi_pll.c | |||
@@ -124,16 +124,15 @@ static int hdmi_pll_config(struct hdmi_pll_data *pll) | |||
124 | r = FLD_MOD(r, 0x0, 14, 14); /* PHY_CLKINEN de-assert during locking */ | 124 | r = FLD_MOD(r, 0x0, 14, 14); /* PHY_CLKINEN de-assert during locking */ |
125 | r = FLD_MOD(r, fmt->refsel, 22, 21); /* REFSEL */ | 125 | r = FLD_MOD(r, fmt->refsel, 22, 21); /* REFSEL */ |
126 | 126 | ||
127 | if (fmt->dcofreq) { | 127 | if (fmt->dcofreq) |
128 | /* divider programming for frequency beyond 1000Mhz */ | ||
129 | REG_FLD_MOD(pll->base, PLLCTRL_CFG3, fmt->regsd, 17, 10); | ||
130 | r = FLD_MOD(r, 0x4, 3, 1); /* 1000MHz and 2000MHz */ | 128 | r = FLD_MOD(r, 0x4, 3, 1); /* 1000MHz and 2000MHz */ |
131 | } else { | 129 | else |
132 | r = FLD_MOD(r, 0x2, 3, 1); /* 500MHz and 1000MHz */ | 130 | r = FLD_MOD(r, 0x2, 3, 1); /* 500MHz and 1000MHz */ |
133 | } | ||
134 | 131 | ||
135 | hdmi_write_reg(pll->base, PLLCTRL_CFG2, r); | 132 | hdmi_write_reg(pll->base, PLLCTRL_CFG2, r); |
136 | 133 | ||
134 | REG_FLD_MOD(pll->base, PLLCTRL_CFG3, fmt->regsd, 17, 10); | ||
135 | |||
137 | r = hdmi_read_reg(pll->base, PLLCTRL_CFG4); | 136 | r = hdmi_read_reg(pll->base, PLLCTRL_CFG4); |
138 | r = FLD_MOD(r, fmt->regm2, 24, 18); | 137 | r = FLD_MOD(r, fmt->regm2, 24, 18); |
139 | r = FLD_MOD(r, fmt->regmf, 17, 0); | 138 | r = FLD_MOD(r, fmt->regmf, 17, 0); |
@@ -144,8 +143,8 @@ static int hdmi_pll_config(struct hdmi_pll_data *pll) | |||
144 | 143 | ||
145 | /* wait for bit change */ | 144 | /* wait for bit change */ |
146 | if (hdmi_wait_for_bit_change(pll->base, PLLCTRL_PLL_GO, | 145 | if (hdmi_wait_for_bit_change(pll->base, PLLCTRL_PLL_GO, |
147 | 0, 0, 1) != 1) { | 146 | 0, 0, 0) != 0) { |
148 | DSSERR("PLL GO bit not set\n"); | 147 | DSSERR("PLL GO bit not clearing\n"); |
149 | return -ETIMEDOUT; | 148 | return -ETIMEDOUT; |
150 | } | 149 | } |
151 | 150 | ||
diff --git a/drivers/video/fbdev/omap2/dss/rfbi.c b/drivers/video/fbdev/omap2/dss/rfbi.c index c8a81a2b879c..878273f58839 100644 --- a/drivers/video/fbdev/omap2/dss/rfbi.c +++ b/drivers/video/fbdev/omap2/dss/rfbi.c | |||
@@ -1044,6 +1044,7 @@ static struct platform_driver omap_rfbihw_driver = { | |||
1044 | .name = "omapdss_rfbi", | 1044 | .name = "omapdss_rfbi", |
1045 | .owner = THIS_MODULE, | 1045 | .owner = THIS_MODULE, |
1046 | .pm = &rfbi_pm_ops, | 1046 | .pm = &rfbi_pm_ops, |
1047 | .suppress_bind_attrs = true, | ||
1047 | }, | 1048 | }, |
1048 | }; | 1049 | }; |
1049 | 1050 | ||
diff --git a/drivers/video/fbdev/omap2/dss/sdi.c b/drivers/video/fbdev/omap2/dss/sdi.c index 911dcc9173a6..4c9c46d4ea60 100644 --- a/drivers/video/fbdev/omap2/dss/sdi.c +++ b/drivers/video/fbdev/omap2/dss/sdi.c | |||
@@ -377,6 +377,7 @@ static struct platform_driver omap_sdi_driver = { | |||
377 | .driver = { | 377 | .driver = { |
378 | .name = "omapdss_sdi", | 378 | .name = "omapdss_sdi", |
379 | .owner = THIS_MODULE, | 379 | .owner = THIS_MODULE, |
380 | .suppress_bind_attrs = true, | ||
380 | }, | 381 | }, |
381 | }; | 382 | }; |
382 | 383 | ||
diff --git a/drivers/video/fbdev/omap2/dss/venc.c b/drivers/video/fbdev/omap2/dss/venc.c index 21d81113962b..d077d8a75ddc 100644 --- a/drivers/video/fbdev/omap2/dss/venc.c +++ b/drivers/video/fbdev/omap2/dss/venc.c | |||
@@ -966,6 +966,7 @@ static struct platform_driver omap_venchw_driver = { | |||
966 | .owner = THIS_MODULE, | 966 | .owner = THIS_MODULE, |
967 | .pm = &venc_pm_ops, | 967 | .pm = &venc_pm_ops, |
968 | .of_match_table = venc_of_match, | 968 | .of_match_table = venc_of_match, |
969 | .suppress_bind_attrs = true, | ||
969 | }, | 970 | }, |
970 | }; | 971 | }; |
971 | 972 | ||
diff --git a/drivers/video/fbdev/omap2/omapfb/omapfb-main.c b/drivers/video/fbdev/omap2/omapfb/omapfb-main.c index 15872433e0c6..ce8a70570756 100644 --- a/drivers/video/fbdev/omap2/omapfb/omapfb-main.c +++ b/drivers/video/fbdev/omap2/omapfb/omapfb-main.c | |||
@@ -1833,14 +1833,13 @@ static void omapfb_free_resources(struct omapfb2_device *fbdev) | |||
1833 | if (fbdev == NULL) | 1833 | if (fbdev == NULL) |
1834 | return; | 1834 | return; |
1835 | 1835 | ||
1836 | for (i = 0; i < fbdev->num_fbs; i++) { | 1836 | for (i = 0; i < fbdev->num_overlays; i++) { |
1837 | struct omapfb_info *ofbi = FB2OFB(fbdev->fbs[i]); | 1837 | struct omap_overlay *ovl = fbdev->overlays[i]; |
1838 | int j; | ||
1839 | 1838 | ||
1840 | for (j = 0; j < ofbi->num_overlays; j++) { | 1839 | ovl->disable(ovl); |
1841 | struct omap_overlay *ovl = ofbi->overlays[j]; | 1840 | |
1842 | ovl->disable(ovl); | 1841 | if (ovl->manager) |
1843 | } | 1842 | ovl->unset_manager(ovl); |
1844 | } | 1843 | } |
1845 | 1844 | ||
1846 | for (i = 0; i < fbdev->num_fbs; i++) | 1845 | for (i = 0; i < fbdev->num_fbs; i++) |
@@ -2619,7 +2618,7 @@ err0: | |||
2619 | return r; | 2618 | return r; |
2620 | } | 2619 | } |
2621 | 2620 | ||
2622 | static int __exit omapfb_remove(struct platform_device *pdev) | 2621 | static int omapfb_remove(struct platform_device *pdev) |
2623 | { | 2622 | { |
2624 | struct omapfb2_device *fbdev = platform_get_drvdata(pdev); | 2623 | struct omapfb2_device *fbdev = platform_get_drvdata(pdev); |
2625 | 2624 | ||
@@ -2636,7 +2635,7 @@ static int __exit omapfb_remove(struct platform_device *pdev) | |||
2636 | 2635 | ||
2637 | static struct platform_driver omapfb_driver = { | 2636 | static struct platform_driver omapfb_driver = { |
2638 | .probe = omapfb_probe, | 2637 | .probe = omapfb_probe, |
2639 | .remove = __exit_p(omapfb_remove), | 2638 | .remove = omapfb_remove, |
2640 | .driver = { | 2639 | .driver = { |
2641 | .name = "omapfb", | 2640 | .name = "omapfb", |
2642 | .owner = THIS_MODULE, | 2641 | .owner = THIS_MODULE, |
@@ -2651,6 +2650,7 @@ module_param_named(mirror, def_mirror, bool, 0); | |||
2651 | 2650 | ||
2652 | module_platform_driver(omapfb_driver); | 2651 | module_platform_driver(omapfb_driver); |
2653 | 2652 | ||
2653 | MODULE_ALIAS("platform:omapfb"); | ||
2654 | MODULE_AUTHOR("Tomi Valkeinen <tomi.valkeinen@nokia.com>"); | 2654 | MODULE_AUTHOR("Tomi Valkeinen <tomi.valkeinen@nokia.com>"); |
2655 | MODULE_DESCRIPTION("OMAP2/3 Framebuffer"); | 2655 | MODULE_DESCRIPTION("OMAP2/3 Framebuffer"); |
2656 | MODULE_LICENSE("GPL v2"); | 2656 | MODULE_LICENSE("GPL v2"); |