diff options
author | Linus Torvalds <torvalds@linux-foundation.org> | 2009-11-09 12:28:42 -0500 |
---|---|---|
committer | Linus Torvalds <torvalds@linux-foundation.org> | 2009-11-09 12:28:42 -0500 |
commit | f0ede3f36188237d124b457d6735941d8e2cf981 (patch) | |
tree | 00beda250c6e7016f84a75f18b28f9294cbb62a2 /drivers | |
parent | 7c9abfb884b8737f0afdc8a88bcea77526f0da87 (diff) | |
parent | 43758dd88fdf1e5b3897c7a04dfae0afb8313dea (diff) |
Merge branch 'release' of git://git.kernel.org/pub/scm/linux/kernel/git/lenb/linux-acpi-2.6
* 'release' of git://git.kernel.org/pub/scm/linux/kernel/git/lenb/linux-acpi-2.6:
ACPI: sleep: another HP/Compaq DMI entries for init_set_sci_en_on_resume
ACPI: add DMI entry for SCI_EN resume quirk on HP dv4
thermal: sysfs-api.txt - document passive attribute for thermal zones
thermal: sysfs-api.txt - reformat for improved readability
acpi: thermal: Add EOL to the trip_point_N_type strings
ACPI: Move dereference after NULL test
ACPICA: avoid "Info: mapping multiple BARs. Your kernel is fine."
ACPI: add __cpuinit to acpi_processor_add()
acpi-power-meter: Don't leak ACPI error codes to userspace
eeepc-laptop: don't enable camera at startup if it's already on.
Revert "eeepc-laptop: Prevent a panic when disabling RT2860 wireless when associated"
ACPI: clean up video.c boundary checks and types
Diffstat (limited to 'drivers')
-rw-r--r-- | drivers/acpi/acpica/acconfig.h | 4 | ||||
-rw-r--r-- | drivers/acpi/acpica/exregion.c | 35 | ||||
-rw-r--r-- | drivers/acpi/power_meter.c | 6 | ||||
-rw-r--r-- | drivers/acpi/proc.c | 2 | ||||
-rw-r--r-- | drivers/acpi/processor_core.c | 2 | ||||
-rw-r--r-- | drivers/acpi/processor_throttling.c | 6 | ||||
-rw-r--r-- | drivers/acpi/sleep.c | 24 | ||||
-rw-r--r-- | drivers/acpi/video.c | 8 | ||||
-rw-r--r-- | drivers/platform/x86/eeepc-laptop.c | 30 | ||||
-rw-r--r-- | drivers/thermal/thermal_sys.c | 10 |
10 files changed, 80 insertions, 47 deletions
diff --git a/drivers/acpi/acpica/acconfig.h b/drivers/acpi/acpica/acconfig.h index 8e679ef5b231..a4471e3d3853 100644 --- a/drivers/acpi/acpica/acconfig.h +++ b/drivers/acpi/acpica/acconfig.h | |||
@@ -103,9 +103,9 @@ | |||
103 | 103 | ||
104 | #define ACPI_MAX_REFERENCE_COUNT 0x1000 | 104 | #define ACPI_MAX_REFERENCE_COUNT 0x1000 |
105 | 105 | ||
106 | /* Size of cached memory mapping for system memory operation region */ | 106 | /* Default page size for use in mapping memory for operation regions */ |
107 | 107 | ||
108 | #define ACPI_SYSMEM_REGION_WINDOW_SIZE 4096 | 108 | #define ACPI_DEFAULT_PAGE_SIZE 4096 /* Must be power of 2 */ |
109 | 109 | ||
110 | /* owner_id tracking. 8 entries allows for 255 owner_ids */ | 110 | /* owner_id tracking. 8 entries allows for 255 owner_ids */ |
111 | 111 | ||
diff --git a/drivers/acpi/acpica/exregion.c b/drivers/acpi/acpica/exregion.c index 3a54b737d2da..2bd83ac57c3a 100644 --- a/drivers/acpi/acpica/exregion.c +++ b/drivers/acpi/acpica/exregion.c | |||
@@ -77,7 +77,8 @@ acpi_ex_system_memory_space_handler(u32 function, | |||
77 | void *logical_addr_ptr = NULL; | 77 | void *logical_addr_ptr = NULL; |
78 | struct acpi_mem_space_context *mem_info = region_context; | 78 | struct acpi_mem_space_context *mem_info = region_context; |
79 | u32 length; | 79 | u32 length; |
80 | acpi_size window_size; | 80 | acpi_size map_length; |
81 | acpi_size page_boundary_map_length; | ||
81 | #ifdef ACPI_MISALIGNMENT_NOT_SUPPORTED | 82 | #ifdef ACPI_MISALIGNMENT_NOT_SUPPORTED |
82 | u32 remainder; | 83 | u32 remainder; |
83 | #endif | 84 | #endif |
@@ -144,25 +145,39 @@ acpi_ex_system_memory_space_handler(u32 function, | |||
144 | } | 145 | } |
145 | 146 | ||
146 | /* | 147 | /* |
147 | * Don't attempt to map memory beyond the end of the region, and | 148 | * Attempt to map from the requested address to the end of the region. |
148 | * constrain the maximum mapping size to something reasonable. | 149 | * However, we will never map more than one page, nor will we cross |
150 | * a page boundary. | ||
149 | */ | 151 | */ |
150 | window_size = (acpi_size) | 152 | map_length = (acpi_size) |
151 | ((mem_info->address + mem_info->length) - address); | 153 | ((mem_info->address + mem_info->length) - address); |
152 | 154 | ||
153 | if (window_size > ACPI_SYSMEM_REGION_WINDOW_SIZE) { | 155 | /* |
154 | window_size = ACPI_SYSMEM_REGION_WINDOW_SIZE; | 156 | * If mapping the entire remaining portion of the region will cross |
157 | * a page boundary, just map up to the page boundary, do not cross. | ||
158 | * On some systems, crossing a page boundary while mapping regions | ||
159 | * can cause warnings if the pages have different attributes | ||
160 | * due to resource management | ||
161 | */ | ||
162 | page_boundary_map_length = | ||
163 | ACPI_ROUND_UP(address, ACPI_DEFAULT_PAGE_SIZE) - address; | ||
164 | |||
165 | if (!page_boundary_map_length) { | ||
166 | page_boundary_map_length = ACPI_DEFAULT_PAGE_SIZE; | ||
167 | } | ||
168 | |||
169 | if (map_length > page_boundary_map_length) { | ||
170 | map_length = page_boundary_map_length; | ||
155 | } | 171 | } |
156 | 172 | ||
157 | /* Create a new mapping starting at the address given */ | 173 | /* Create a new mapping starting at the address given */ |
158 | 174 | ||
159 | mem_info->mapped_logical_address = | 175 | mem_info->mapped_logical_address = acpi_os_map_memory((acpi_physical_address) address, map_length); |
160 | acpi_os_map_memory((acpi_physical_address) address, window_size); | ||
161 | if (!mem_info->mapped_logical_address) { | 176 | if (!mem_info->mapped_logical_address) { |
162 | ACPI_ERROR((AE_INFO, | 177 | ACPI_ERROR((AE_INFO, |
163 | "Could not map memory at %8.8X%8.8X, size %X", | 178 | "Could not map memory at %8.8X%8.8X, size %X", |
164 | ACPI_FORMAT_NATIVE_UINT(address), | 179 | ACPI_FORMAT_NATIVE_UINT(address), |
165 | (u32) window_size)); | 180 | (u32) map_length)); |
166 | mem_info->mapped_length = 0; | 181 | mem_info->mapped_length = 0; |
167 | return_ACPI_STATUS(AE_NO_MEMORY); | 182 | return_ACPI_STATUS(AE_NO_MEMORY); |
168 | } | 183 | } |
@@ -170,7 +185,7 @@ acpi_ex_system_memory_space_handler(u32 function, | |||
170 | /* Save the physical address and mapping size */ | 185 | /* Save the physical address and mapping size */ |
171 | 186 | ||
172 | mem_info->mapped_physical_address = address; | 187 | mem_info->mapped_physical_address = address; |
173 | mem_info->mapped_length = window_size; | 188 | mem_info->mapped_length = map_length; |
174 | } | 189 | } |
175 | 190 | ||
176 | /* | 191 | /* |
diff --git a/drivers/acpi/power_meter.c b/drivers/acpi/power_meter.c index e6bfd77986b8..2ef7030a0c28 100644 --- a/drivers/acpi/power_meter.c +++ b/drivers/acpi/power_meter.c | |||
@@ -294,7 +294,11 @@ static int set_acpi_trip(struct acpi_power_meter_resource *resource) | |||
294 | return -EINVAL; | 294 | return -EINVAL; |
295 | } | 295 | } |
296 | 296 | ||
297 | return data; | 297 | /* _PTP returns 0 on success, nonzero otherwise */ |
298 | if (data) | ||
299 | return -EINVAL; | ||
300 | |||
301 | return 0; | ||
298 | } | 302 | } |
299 | 303 | ||
300 | static ssize_t set_trip(struct device *dev, struct device_attribute *devattr, | 304 | static ssize_t set_trip(struct device *dev, struct device_attribute *devattr, |
diff --git a/drivers/acpi/proc.c b/drivers/acpi/proc.c index f8b6f555ba52..d0d25e2e1ced 100644 --- a/drivers/acpi/proc.c +++ b/drivers/acpi/proc.c | |||
@@ -393,7 +393,7 @@ acpi_system_write_wakeup_device(struct file *file, | |||
393 | struct list_head *node, *next; | 393 | struct list_head *node, *next; |
394 | char strbuf[5]; | 394 | char strbuf[5]; |
395 | char str[5] = ""; | 395 | char str[5] = ""; |
396 | int len = count; | 396 | unsigned int len = count; |
397 | struct acpi_device *found_dev = NULL; | 397 | struct acpi_device *found_dev = NULL; |
398 | 398 | ||
399 | if (len > 4) | 399 | if (len > 4) |
diff --git a/drivers/acpi/processor_core.c b/drivers/acpi/processor_core.c index c567b46dfa0f..ec742a4e5635 100644 --- a/drivers/acpi/processor_core.c +++ b/drivers/acpi/processor_core.c | |||
@@ -770,7 +770,7 @@ static struct notifier_block acpi_cpu_notifier = | |||
770 | .notifier_call = acpi_cpu_soft_notify, | 770 | .notifier_call = acpi_cpu_soft_notify, |
771 | }; | 771 | }; |
772 | 772 | ||
773 | static int acpi_processor_add(struct acpi_device *device) | 773 | static int __cpuinit acpi_processor_add(struct acpi_device *device) |
774 | { | 774 | { |
775 | struct acpi_processor *pr = NULL; | 775 | struct acpi_processor *pr = NULL; |
776 | int result = 0; | 776 | int result = 0; |
diff --git a/drivers/acpi/processor_throttling.c b/drivers/acpi/processor_throttling.c index 4c6c14c1e307..1c5d7a8b2fdf 100644 --- a/drivers/acpi/processor_throttling.c +++ b/drivers/acpi/processor_throttling.c | |||
@@ -1133,15 +1133,15 @@ int acpi_processor_get_throttling_info(struct acpi_processor *pr) | |||
1133 | int result = 0; | 1133 | int result = 0; |
1134 | struct acpi_processor_throttling *pthrottling; | 1134 | struct acpi_processor_throttling *pthrottling; |
1135 | 1135 | ||
1136 | if (!pr) | ||
1137 | return -EINVAL; | ||
1138 | |||
1136 | ACPI_DEBUG_PRINT((ACPI_DB_INFO, | 1139 | ACPI_DEBUG_PRINT((ACPI_DB_INFO, |
1137 | "pblk_address[0x%08x] duty_offset[%d] duty_width[%d]\n", | 1140 | "pblk_address[0x%08x] duty_offset[%d] duty_width[%d]\n", |
1138 | pr->throttling.address, | 1141 | pr->throttling.address, |
1139 | pr->throttling.duty_offset, | 1142 | pr->throttling.duty_offset, |
1140 | pr->throttling.duty_width)); | 1143 | pr->throttling.duty_width)); |
1141 | 1144 | ||
1142 | if (!pr) | ||
1143 | return -EINVAL; | ||
1144 | |||
1145 | /* | 1145 | /* |
1146 | * Evaluate _PTC, _TSS and _TPC | 1146 | * Evaluate _PTC, _TSS and _TPC |
1147 | * They must all be present or none of them can be used. | 1147 | * They must all be present or none of them can be used. |
diff --git a/drivers/acpi/sleep.c b/drivers/acpi/sleep.c index a90afcc723ab..4cc1b8116e76 100644 --- a/drivers/acpi/sleep.c +++ b/drivers/acpi/sleep.c | |||
@@ -413,6 +413,30 @@ static struct dmi_system_id __initdata acpisleep_dmi_table[] = { | |||
413 | }, | 413 | }, |
414 | }, | 414 | }, |
415 | { | 415 | { |
416 | .callback = init_set_sci_en_on_resume, | ||
417 | .ident = "Hewlett-Packard Pavilion dv4", | ||
418 | .matches = { | ||
419 | DMI_MATCH(DMI_SYS_VENDOR, "Hewlett-Packard"), | ||
420 | DMI_MATCH(DMI_PRODUCT_NAME, "HP Pavilion dv4"), | ||
421 | }, | ||
422 | }, | ||
423 | { | ||
424 | .callback = init_set_sci_en_on_resume, | ||
425 | .ident = "Hewlett-Packard Pavilion dv7", | ||
426 | .matches = { | ||
427 | DMI_MATCH(DMI_SYS_VENDOR, "Hewlett-Packard"), | ||
428 | DMI_MATCH(DMI_PRODUCT_NAME, "HP Pavilion dv7"), | ||
429 | }, | ||
430 | }, | ||
431 | { | ||
432 | .callback = init_set_sci_en_on_resume, | ||
433 | .ident = "Hewlett-Packard Compaq Presario CQ40 Notebook PC", | ||
434 | .matches = { | ||
435 | DMI_MATCH(DMI_SYS_VENDOR, "Hewlett-Packard"), | ||
436 | DMI_MATCH(DMI_PRODUCT_NAME, "Compaq Presario CQ40 Notebook PC"), | ||
437 | }, | ||
438 | }, | ||
439 | { | ||
416 | .callback = init_old_suspend_ordering, | 440 | .callback = init_old_suspend_ordering, |
417 | .ident = "Panasonic CF51-2L", | 441 | .ident = "Panasonic CF51-2L", |
418 | .matches = { | 442 | .matches = { |
diff --git a/drivers/acpi/video.c b/drivers/acpi/video.c index 64e3c581b7a9..05dff631591c 100644 --- a/drivers/acpi/video.c +++ b/drivers/acpi/video.c | |||
@@ -1223,7 +1223,7 @@ acpi_video_device_write_state(struct file *file, | |||
1223 | u32 state = 0; | 1223 | u32 state = 0; |
1224 | 1224 | ||
1225 | 1225 | ||
1226 | if (!dev || count + 1 > sizeof str) | 1226 | if (!dev || count >= sizeof(str)) |
1227 | return -EINVAL; | 1227 | return -EINVAL; |
1228 | 1228 | ||
1229 | if (copy_from_user(str, buffer, count)) | 1229 | if (copy_from_user(str, buffer, count)) |
@@ -1280,7 +1280,7 @@ acpi_video_device_write_brightness(struct file *file, | |||
1280 | int i; | 1280 | int i; |
1281 | 1281 | ||
1282 | 1282 | ||
1283 | if (!dev || !dev->brightness || count + 1 > sizeof str) | 1283 | if (!dev || !dev->brightness || count >= sizeof(str)) |
1284 | return -EINVAL; | 1284 | return -EINVAL; |
1285 | 1285 | ||
1286 | if (copy_from_user(str, buffer, count)) | 1286 | if (copy_from_user(str, buffer, count)) |
@@ -1562,7 +1562,7 @@ acpi_video_bus_write_POST(struct file *file, | |||
1562 | unsigned long long opt, options; | 1562 | unsigned long long opt, options; |
1563 | 1563 | ||
1564 | 1564 | ||
1565 | if (!video || count + 1 > sizeof str) | 1565 | if (!video || count >= sizeof(str)) |
1566 | return -EINVAL; | 1566 | return -EINVAL; |
1567 | 1567 | ||
1568 | status = acpi_video_bus_POST_options(video, &options); | 1568 | status = acpi_video_bus_POST_options(video, &options); |
@@ -1602,7 +1602,7 @@ acpi_video_bus_write_DOS(struct file *file, | |||
1602 | unsigned long opt; | 1602 | unsigned long opt; |
1603 | 1603 | ||
1604 | 1604 | ||
1605 | if (!video || count + 1 > sizeof str) | 1605 | if (!video || count >= sizeof(str)) |
1606 | return -EINVAL; | 1606 | return -EINVAL; |
1607 | 1607 | ||
1608 | if (copy_from_user(str, buffer, count)) | 1608 | if (copy_from_user(str, buffer, count)) |
diff --git a/drivers/platform/x86/eeepc-laptop.c b/drivers/platform/x86/eeepc-laptop.c index d379e74a05d0..4226e5352738 100644 --- a/drivers/platform/x86/eeepc-laptop.c +++ b/drivers/platform/x86/eeepc-laptop.c | |||
@@ -150,8 +150,6 @@ struct eeepc_hotk { | |||
150 | /* The actual device the driver binds to */ | 150 | /* The actual device the driver binds to */ |
151 | static struct eeepc_hotk *ehotk; | 151 | static struct eeepc_hotk *ehotk; |
152 | 152 | ||
153 | static void eeepc_rfkill_hotplug(bool real); | ||
154 | |||
155 | /* Platform device/driver */ | 153 | /* Platform device/driver */ |
156 | static int eeepc_hotk_thaw(struct device *device); | 154 | static int eeepc_hotk_thaw(struct device *device); |
157 | static int eeepc_hotk_restore(struct device *device); | 155 | static int eeepc_hotk_restore(struct device *device); |
@@ -345,16 +343,7 @@ static bool eeepc_wlan_rfkill_blocked(void) | |||
345 | static int eeepc_rfkill_set(void *data, bool blocked) | 343 | static int eeepc_rfkill_set(void *data, bool blocked) |
346 | { | 344 | { |
347 | unsigned long asl = (unsigned long)data; | 345 | unsigned long asl = (unsigned long)data; |
348 | int ret; | 346 | return set_acpi(asl, !blocked); |
349 | |||
350 | if (asl != CM_ASL_WLAN) | ||
351 | return set_acpi(asl, !blocked); | ||
352 | |||
353 | /* hack to avoid panic with rt2860sta */ | ||
354 | if (blocked) | ||
355 | eeepc_rfkill_hotplug(false); | ||
356 | ret = set_acpi(asl, !blocked); | ||
357 | return ret; | ||
358 | } | 347 | } |
359 | 348 | ||
360 | static const struct rfkill_ops eeepc_rfkill_ops = { | 349 | static const struct rfkill_ops eeepc_rfkill_ops = { |
@@ -367,7 +356,8 @@ static void __devinit eeepc_enable_camera(void) | |||
367 | * If the following call to set_acpi() fails, it's because there's no | 356 | * If the following call to set_acpi() fails, it's because there's no |
368 | * camera so we can ignore the error. | 357 | * camera so we can ignore the error. |
369 | */ | 358 | */ |
370 | set_acpi(CM_ASL_CAMERA, 1); | 359 | if (get_acpi(CM_ASL_CAMERA) == 0) |
360 | set_acpi(CM_ASL_CAMERA, 1); | ||
371 | } | 361 | } |
372 | 362 | ||
373 | /* | 363 | /* |
@@ -654,13 +644,13 @@ static int eeepc_get_adapter_status(struct hotplug_slot *hotplug_slot, | |||
654 | return 0; | 644 | return 0; |
655 | } | 645 | } |
656 | 646 | ||
657 | static void eeepc_rfkill_hotplug(bool real) | 647 | static void eeepc_rfkill_hotplug(void) |
658 | { | 648 | { |
659 | struct pci_dev *dev; | 649 | struct pci_dev *dev; |
660 | struct pci_bus *bus; | 650 | struct pci_bus *bus; |
661 | bool blocked = real ? eeepc_wlan_rfkill_blocked() : true; | 651 | bool blocked = eeepc_wlan_rfkill_blocked(); |
662 | 652 | ||
663 | if (real && ehotk->wlan_rfkill) | 653 | if (ehotk->wlan_rfkill) |
664 | rfkill_set_sw_state(ehotk->wlan_rfkill, blocked); | 654 | rfkill_set_sw_state(ehotk->wlan_rfkill, blocked); |
665 | 655 | ||
666 | mutex_lock(&ehotk->hotplug_lock); | 656 | mutex_lock(&ehotk->hotplug_lock); |
@@ -703,7 +693,7 @@ static void eeepc_rfkill_notify(acpi_handle handle, u32 event, void *data) | |||
703 | if (event != ACPI_NOTIFY_BUS_CHECK) | 693 | if (event != ACPI_NOTIFY_BUS_CHECK) |
704 | return; | 694 | return; |
705 | 695 | ||
706 | eeepc_rfkill_hotplug(true); | 696 | eeepc_rfkill_hotplug(); |
707 | } | 697 | } |
708 | 698 | ||
709 | static void eeepc_hotk_notify(struct acpi_device *device, u32 event) | 699 | static void eeepc_hotk_notify(struct acpi_device *device, u32 event) |
@@ -861,7 +851,7 @@ static int eeepc_hotk_restore(struct device *device) | |||
861 | { | 851 | { |
862 | /* Refresh both wlan rfkill state and pci hotplug */ | 852 | /* Refresh both wlan rfkill state and pci hotplug */ |
863 | if (ehotk->wlan_rfkill) | 853 | if (ehotk->wlan_rfkill) |
864 | eeepc_rfkill_hotplug(true); | 854 | eeepc_rfkill_hotplug(); |
865 | 855 | ||
866 | if (ehotk->bluetooth_rfkill) | 856 | if (ehotk->bluetooth_rfkill) |
867 | rfkill_set_sw_state(ehotk->bluetooth_rfkill, | 857 | rfkill_set_sw_state(ehotk->bluetooth_rfkill, |
@@ -1004,7 +994,7 @@ static void eeepc_rfkill_exit(void) | |||
1004 | * Refresh pci hotplug in case the rfkill state was changed after | 994 | * Refresh pci hotplug in case the rfkill state was changed after |
1005 | * eeepc_unregister_rfkill_notifier() | 995 | * eeepc_unregister_rfkill_notifier() |
1006 | */ | 996 | */ |
1007 | eeepc_rfkill_hotplug(true); | 997 | eeepc_rfkill_hotplug(); |
1008 | if (ehotk->hotplug_slot) | 998 | if (ehotk->hotplug_slot) |
1009 | pci_hp_deregister(ehotk->hotplug_slot); | 999 | pci_hp_deregister(ehotk->hotplug_slot); |
1010 | 1000 | ||
@@ -1120,7 +1110,7 @@ static int eeepc_rfkill_init(struct device *dev) | |||
1120 | * Refresh pci hotplug in case the rfkill state was changed during | 1110 | * Refresh pci hotplug in case the rfkill state was changed during |
1121 | * setup. | 1111 | * setup. |
1122 | */ | 1112 | */ |
1123 | eeepc_rfkill_hotplug(true); | 1113 | eeepc_rfkill_hotplug(); |
1124 | 1114 | ||
1125 | exit: | 1115 | exit: |
1126 | if (result && result != -ENODEV) | 1116 | if (result && result != -ENODEV) |
diff --git a/drivers/thermal/thermal_sys.c b/drivers/thermal/thermal_sys.c index 4e83c297ec9e..6f8d8f971212 100644 --- a/drivers/thermal/thermal_sys.c +++ b/drivers/thermal/thermal_sys.c | |||
@@ -180,15 +180,15 @@ trip_point_type_show(struct device *dev, struct device_attribute *attr, | |||
180 | 180 | ||
181 | switch (type) { | 181 | switch (type) { |
182 | case THERMAL_TRIP_CRITICAL: | 182 | case THERMAL_TRIP_CRITICAL: |
183 | return sprintf(buf, "critical"); | 183 | return sprintf(buf, "critical\n"); |
184 | case THERMAL_TRIP_HOT: | 184 | case THERMAL_TRIP_HOT: |
185 | return sprintf(buf, "hot"); | 185 | return sprintf(buf, "hot\n"); |
186 | case THERMAL_TRIP_PASSIVE: | 186 | case THERMAL_TRIP_PASSIVE: |
187 | return sprintf(buf, "passive"); | 187 | return sprintf(buf, "passive\n"); |
188 | case THERMAL_TRIP_ACTIVE: | 188 | case THERMAL_TRIP_ACTIVE: |
189 | return sprintf(buf, "active"); | 189 | return sprintf(buf, "active\n"); |
190 | default: | 190 | default: |
191 | return sprintf(buf, "unknown"); | 191 | return sprintf(buf, "unknown\n"); |
192 | } | 192 | } |
193 | } | 193 | } |
194 | 194 | ||