Skip to content
Projects
Groups
Snippets
Help
Loading...
Help
Support
Keyboard shortcuts
?
Submit feedback
Contribute to GitLab
Sign in / Register
Toggle navigation
L
linux
Project overview
Project overview
Details
Activity
Releases
Repository
Repository
Files
Commits
Branches
Tags
Contributors
Graph
Compare
Issues
0
Issues
0
List
Boards
Labels
Milestones
Merge Requests
0
Merge Requests
0
Analytics
Analytics
Repository
Value Stream
Wiki
Wiki
Snippets
Snippets
Members
Members
Collapse sidebar
Close sidebar
Activity
Graph
Create a new issue
Commits
Issue Boards
Open sidebar
nexedi
linux
Commits
06b42ec7
Commit
06b42ec7
authored
Sep 01, 2004
by
Len Brown
Browse files
Options
Browse Files
Download
Plain Diff
Merge intel.com:/home/lenb/src/26-stable-dev
into intel.com:/home/lenb/src/26-latest-dev
parents
6ff46bbc
66f57430
Changes
13
Hide whitespace changes
Inline
Side-by-side
Showing
13 changed files
with
221 additions
and
129 deletions
+221
-129
Documentation/kernel-parameters.txt
Documentation/kernel-parameters.txt
+14
-0
arch/i386/kernel/acpi/boot.c
arch/i386/kernel/acpi/boot.c
+9
-3
arch/i386/kernel/dmi_scan.c
arch/i386/kernel/dmi_scan.c
+2
-37
arch/i386/kernel/io_apic.c
arch/i386/kernel/io_apic.c
+1
-9
arch/x86_64/kernel/io_apic.c
arch/x86_64/kernel/io_apic.c
+1
-9
drivers/acpi/Kconfig
drivers/acpi/Kconfig
+27
-0
drivers/acpi/blacklist.c
drivers/acpi/blacklist.c
+44
-0
drivers/acpi/bus.c
drivers/acpi/bus.c
+4
-4
drivers/acpi/debug.c
drivers/acpi/debug.c
+103
-2
drivers/acpi/osl.c
drivers/acpi/osl.c
+10
-0
drivers/acpi/utilities/utglobal.c
drivers/acpi/utilities/utglobal.c
+2
-7
include/acpi/acpi_drivers.h
include/acpi/acpi_drivers.h
+0
-55
include/linux/acpi.h
include/linux/acpi.h
+4
-3
No files found.
Documentation/kernel-parameters.txt
View file @
06b42ec7
...
...
@@ -138,6 +138,20 @@ running once the system is up.
Recognize and ignore IRQ0/pin2 Interrupt Override.
For broken nForce2 BIOS resulting in XT-PIC timer.
acpi_dbg_layer= [HW,ACPI]
Format: <int>
Each bit of the <int> indicates an acpi debug layer,
1: enable, 0: disable. It is useful for boot time
debugging. After system has booted up, it can be set
via /proc/acpi/debug_layer.
acpi_dbg_level= [HW,ACPI]
Format: <int>
Each bit of the <int> indicates an acpi debug level,
1: enable, 0: disable. It is useful for boot time
debugging. After system has booted up, it can be set
via /proc/acpi/debug_level.
ad1816= [HW,OSS]
Format: <io>,<irq>,<dma>,<dma2>
See also Documentation/sound/oss/AD1816.
...
...
arch/i386/kernel/acpi/boot.c
View file @
06b42ec7
...
...
@@ -830,9 +830,15 @@ acpi_boot_init (void)
*/
error
=
acpi_blacklisted
();
if
(
error
)
{
printk
(
KERN_WARNING
PREFIX
"BIOS listed in blacklist, disabling ACPI support
\n
"
);
disable_acpi
();
return
error
;
extern
int
acpi_force
;
if
(
acpi_force
)
{
printk
(
KERN_WARNING
PREFIX
"acpi=force override
\n
"
);
}
else
{
printk
(
KERN_WARNING
PREFIX
"Disabling ACPI support
\n
"
);
disable_acpi
();
return
error
;
}
}
/*
...
...
arch/i386/kernel/dmi_scan.c
View file @
06b42ec7
...
...
@@ -4,7 +4,7 @@
#include <linux/init.h>
#include <linux/module.h>
#include <linux/slab.h>
#include <
asm
/acpi.h>
#include <
linux
/acpi.h>
#include <asm/io.h>
#include <linux/pm.h>
#include <asm/system.h>
...
...
@@ -443,41 +443,6 @@ static __initdata struct dmi_blacklist dmi_blacklist[]={
{
NULL
,
}
};
/*
* Walk the blacklist table running matching functions until someone
* returns 1 or we hit the end.
*/
static
__init
void
dmi_check_blacklist
(
void
)
{
#ifdef CONFIG_ACPI_BOOT
#define ACPI_BLACKLIST_CUTOFF_YEAR 2001
if
(
dmi_ident
[
DMI_BIOS_DATE
])
{
char
*
s
=
strrchr
(
dmi_ident
[
DMI_BIOS_DATE
],
'/'
);
if
(
s
)
{
int
year
,
disable
=
0
;
s
++
;
year
=
simple_strtoul
(
s
,
NULL
,
0
);
if
(
year
>=
1000
)
disable
=
year
<
ACPI_BLACKLIST_CUTOFF_YEAR
;
else
if
(
year
<
1
||
(
year
>
90
&&
year
<=
99
))
disable
=
1
;
if
(
disable
&&
!
acpi_force
)
{
printk
(
KERN_NOTICE
"ACPI disabled because your bios is from %s and too old
\n
"
,
s
);
printk
(
KERN_NOTICE
"You can enable it with acpi=force
\n
"
);
disable_acpi
();
}
}
}
#endif
dmi_check_system
(
dmi_blacklist
);
}
/*
* Process a DMI table entry. Right now all we care about are the BIOS
...
...
@@ -535,7 +500,7 @@ void __init dmi_scan_machine(void)
{
int
err
=
dmi_iterate
(
dmi_decode
);
if
(
err
==
0
)
dmi_check_blacklist
(
);
dmi_check_system
(
dmi_blacklist
);
else
printk
(
KERN_INFO
"DMI not present.
\n
"
);
}
...
...
arch/i386/kernel/io_apic.c
View file @
06b42ec7
...
...
@@ -2520,15 +2520,7 @@ int io_apic_set_pci_routing (int ioapic, int pin, int irq, int edge_level, int a
mp_ioapics
[
ioapic
].
mpc_apicid
,
pin
,
entry
.
vector
,
irq
,
edge_level
,
active_high_low
);
if
(
use_pci_vector
()
&&
!
platform_legacy_irq
(
irq
))
irq
=
IO_APIC_VECTOR
(
irq
);
if
(
edge_level
)
{
irq_desc
[
irq
].
handler
=
&
ioapic_level_type
;
}
else
{
irq_desc
[
irq
].
handler
=
&
ioapic_edge_type
;
}
set_intr_gate
(
entry
.
vector
,
interrupt
[
irq
]);
ioapic_register_intr
(
irq
,
entry
.
vector
,
edge_level
);
if
(
!
ioapic
&&
(
irq
<
16
))
disable_8259A_irq
(
irq
);
...
...
arch/x86_64/kernel/io_apic.c
View file @
06b42ec7
...
...
@@ -1926,15 +1926,7 @@ int io_apic_set_pci_routing (int ioapic, int pin, int irq, int edge_level, int a
mp_ioapics
[
ioapic
].
mpc_apicid
,
pin
,
entry
.
vector
,
irq
,
edge_level
,
active_high_low
);
if
(
use_pci_vector
()
&&
!
platform_legacy_irq
(
irq
))
irq
=
IO_APIC_VECTOR
(
irq
);
if
(
edge_level
)
{
irq_desc
[
irq
].
handler
=
&
ioapic_level_type
;
}
else
{
irq_desc
[
irq
].
handler
=
&
ioapic_edge_type
;
}
set_intr_gate
(
entry
.
vector
,
interrupt
[
irq
]);
ioapic_register_intr
(
irq
,
entry
.
vector
,
edge_level
);
if
(
!
ioapic
&&
(
irq
<
16
))
disable_8259A_irq
(
irq
);
...
...
drivers/acpi/Kconfig
View file @
06b42ec7
...
...
@@ -204,6 +204,33 @@ config ACPI_TOSHIBA
If you have a legacy free Toshiba laptop (such as the Libretto L1
series), say Y.
config ACPI_CUSTOM_DSDT
bool "Include Custom DSDT"
depends on X86
depends on ACPI_INTERPRETER
default n
help
Thist option is to load a custom ACPI DSDT
If you don't know what that is, say N.
config ACPI_CUSTOM_DSDT_FILE
string "Custom DSDT Table file to include"
depends on ACPI_CUSTOM_DSDT
default ""
help
Enter the full path name to the file wich includes the AmlCode declaration.
config ACPI_BLACKLIST_YEAR
int "Disable ACPI for systems before Jan 1st this year"
default 0
help
enter a 4-digit year, eg. 2001 to disable ACPI by default
on platforms with DMI BIOS date before January 1st that year.
"acpi=force" can be used to override this mechanism.
Enter 0 to disable this mechanism and allow ACPI to
run by default no matter what the year. (default)
config ACPI_DEBUG
bool "Debug Statements"
depends on ACPI_INTERPRETER
...
...
drivers/acpi/blacklist.c
View file @
06b42ec7
...
...
@@ -2,7 +2,9 @@
* blacklist.c
*
* Check to see if the given machine has a known bad ACPI BIOS
* or if the BIOS is too old.
*
* Copyright (C) 2004 Len Brown <len.brown@intel.com>
* Copyright (C) 2002 Andy Grover <andrew.grover@intel.com>
*
* ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
...
...
@@ -30,6 +32,7 @@
#include <linux/init.h>
#include <linux/acpi.h>
#include <acpi/acpi_bus.h>
#include <linux/dmi.h>
enum
acpi_blacklist_predicates
{
...
...
@@ -70,6 +73,45 @@ static struct acpi_blacklist_item acpi_blacklist[] __initdata =
};
#if CONFIG_ACPI_BLACKLIST_YEAR
static
int
__init
blacklist_by_year
(
void
)
{
int
year
;
char
*
s
=
dmi_get_system_info
(
DMI_BIOS_DATE
);
if
(
!
s
)
return
0
;
if
(
!*
s
)
return
0
;
s
=
strrchr
(
s
,
'/'
);
if
(
!
s
)
return
0
;
s
+=
1
;
year
=
simple_strtoul
(
s
,
NULL
,
0
);
if
(
year
<
100
)
{
/* 2-digit year */
year
+=
1900
;
if
(
year
<
1996
)
/* no dates < spec 1.0 */
year
+=
100
;
}
if
(
year
<
CONFIG_ACPI_BLACKLIST_YEAR
)
{
printk
(
KERN_ERR
PREFIX
"BIOS age (%d) fails cutoff (%d), "
"acpi=force is required to enable ACPI
\n
"
,
year
,
CONFIG_ACPI_BLACKLIST_YEAR
);
return
1
;
}
return
0
;
}
#else
static
inline
int
blacklist_by_year
(
void
)
{
return
0
;
}
#endif
int
__init
acpi_blacklisted
(
void
)
{
...
...
@@ -120,6 +162,8 @@ acpi_blacklisted(void)
}
}
blacklisted
+=
blacklist_by_year
();
return
blacklisted
;
}
drivers/acpi/bus.c
View file @
06b42ec7
...
...
@@ -596,7 +596,10 @@ acpi_early_init (void)
acpi_status
status
=
AE_OK
;
struct
acpi_buffer
buffer
=
{
sizeof
(
acpi_fadt
),
&
acpi_fadt
};
ACPI_FUNCTION_TRACE
(
"acpi_bus_init"
);
ACPI_FUNCTION_TRACE
(
"acpi_early_init"
);
if
(
acpi_disabled
)
return
;
/* enable workarounds, unless strict ACPI spec. compliance */
if
(
!
acpi_strict
)
...
...
@@ -738,9 +741,6 @@ static int __init acpi_init (void)
printk
(
KERN_INFO
PREFIX
"Subsystem revision %08x
\n
"
,
ACPI_CA_VERSION
);
/* Initial core debug level excludes drivers, so include them now */
acpi_set_debug
(
ACPI_DEBUG_LOW
);
if
(
acpi_disabled
)
{
printk
(
KERN_INFO
PREFIX
"Interpreter disabled.
\n
"
);
return
-
ENODEV
;
...
...
drivers/acpi/debug.c
View file @
06b42ec7
...
...
@@ -4,6 +4,7 @@
#include <linux/proc_fs.h>
#include <linux/init.h>
#include <linux/moduleparam.h>
#include <asm/uaccess.h>
#include <acpi/acpi_drivers.h>
...
...
@@ -13,6 +14,81 @@ ACPI_MODULE_NAME ("debug")
#define ACPI_SYSTEM_FILE_DEBUG_LAYER "debug_layer"
#define ACPI_SYSTEM_FILE_DEBUG_LEVEL "debug_level"
#ifdef MODULE_PARAM_PREFIX
#undef MODULE_PARAM_PREFIX
#endif
#define MODULE_PARAM_PREFIX
module_param
(
acpi_dbg_layer
,
uint
,
0400
);
module_param
(
acpi_dbg_level
,
uint
,
0400
);
struct
acpi_dlayer
{
const
char
*
name
;
unsigned
long
value
;
};
struct
acpi_dlevel
{
const
char
*
name
;
unsigned
long
value
;
};
#define ACPI_DEBUG_INIT(v) { .name = #v, .value = v }
const
struct
acpi_dlayer
acpi_debug_layers
[]
=
{
ACPI_DEBUG_INIT
(
ACPI_UTILITIES
),
ACPI_DEBUG_INIT
(
ACPI_HARDWARE
),
ACPI_DEBUG_INIT
(
ACPI_EVENTS
),
ACPI_DEBUG_INIT
(
ACPI_TABLES
),
ACPI_DEBUG_INIT
(
ACPI_NAMESPACE
),
ACPI_DEBUG_INIT
(
ACPI_PARSER
),
ACPI_DEBUG_INIT
(
ACPI_DISPATCHER
),
ACPI_DEBUG_INIT
(
ACPI_EXECUTER
),
ACPI_DEBUG_INIT
(
ACPI_RESOURCES
),
ACPI_DEBUG_INIT
(
ACPI_CA_DEBUGGER
),
ACPI_DEBUG_INIT
(
ACPI_OS_SERVICES
),
ACPI_DEBUG_INIT
(
ACPI_CA_DISASSEMBLER
),
ACPI_DEBUG_INIT
(
ACPI_COMPILER
),
ACPI_DEBUG_INIT
(
ACPI_TOOLS
),
};
const
struct
acpi_dlevel
acpi_debug_levels
[]
=
{
ACPI_DEBUG_INIT
(
ACPI_LV_ERROR
),
ACPI_DEBUG_INIT
(
ACPI_LV_WARN
),
ACPI_DEBUG_INIT
(
ACPI_LV_INIT
),
ACPI_DEBUG_INIT
(
ACPI_LV_DEBUG_OBJECT
),
ACPI_DEBUG_INIT
(
ACPI_LV_INFO
),
ACPI_DEBUG_INIT
(
ACPI_LV_INIT_NAMES
),
ACPI_DEBUG_INIT
(
ACPI_LV_PARSE
),
ACPI_DEBUG_INIT
(
ACPI_LV_LOAD
),
ACPI_DEBUG_INIT
(
ACPI_LV_DISPATCH
),
ACPI_DEBUG_INIT
(
ACPI_LV_EXEC
),
ACPI_DEBUG_INIT
(
ACPI_LV_NAMES
),
ACPI_DEBUG_INIT
(
ACPI_LV_OPREGION
),
ACPI_DEBUG_INIT
(
ACPI_LV_BFIELD
),
ACPI_DEBUG_INIT
(
ACPI_LV_TABLES
),
ACPI_DEBUG_INIT
(
ACPI_LV_VALUES
),
ACPI_DEBUG_INIT
(
ACPI_LV_OBJECTS
),
ACPI_DEBUG_INIT
(
ACPI_LV_RESOURCES
),
ACPI_DEBUG_INIT
(
ACPI_LV_USER_REQUESTS
),
ACPI_DEBUG_INIT
(
ACPI_LV_PACKAGE
),
ACPI_DEBUG_INIT
(
ACPI_LV_ALLOCATIONS
),
ACPI_DEBUG_INIT
(
ACPI_LV_FUNCTIONS
),
ACPI_DEBUG_INIT
(
ACPI_LV_OPTIMIZATIONS
),
ACPI_DEBUG_INIT
(
ACPI_LV_MUTEX
),
ACPI_DEBUG_INIT
(
ACPI_LV_THREADS
),
ACPI_DEBUG_INIT
(
ACPI_LV_IO
),
ACPI_DEBUG_INIT
(
ACPI_LV_INTERRUPTS
),
ACPI_DEBUG_INIT
(
ACPI_LV_AML_DISASSEMBLE
),
ACPI_DEBUG_INIT
(
ACPI_LV_VERBOSE_INFO
),
ACPI_DEBUG_INIT
(
ACPI_LV_FULL_TABLES
),
ACPI_DEBUG_INIT
(
ACPI_LV_EVENTS
),
};
#define NUM_OF(v) ( sizeof(v)/sizeof(v[0]) )
static
int
acpi_system_read_debug
(
char
*
page
,
...
...
@@ -24,16 +100,41 @@ acpi_system_read_debug (
{
char
*
p
=
page
;
int
size
=
0
;
int
i
;
if
(
off
!=
0
)
goto
end
;
p
+=
sprintf
(
p
,
"%-25s
\t
Hex SET
\n
"
,
"Description"
);
switch
((
unsigned
long
)
data
)
{
case
0
:
p
+=
sprintf
(
p
,
"0x%08x
\n
"
,
acpi_dbg_layer
);
for
(
i
=
0
;
i
<
NUM_OF
(
acpi_debug_layers
);
i
++
)
{
p
+=
sprintf
(
p
,
"%-25s
\t
0x%08lX [%c]
\n
"
,
acpi_debug_layers
[
i
].
name
,
acpi_debug_layers
[
i
].
value
,
(
acpi_dbg_layer
&
acpi_debug_layers
[
i
].
value
)
?
'*'
:
' '
);
}
p
+=
sprintf
(
p
,
"%-25s
\t
0x%08X [%c]
\n
"
,
"ACPI_ALL_DRIVERS"
,
ACPI_ALL_DRIVERS
,
(
acpi_dbg_layer
&
ACPI_ALL_DRIVERS
)
==
ACPI_ALL_DRIVERS
?
'*'
:
(
acpi_dbg_layer
&
ACPI_ALL_DRIVERS
)
==
0
?
' '
:
'-'
);
p
+=
sprintf
(
p
,
"--
\n
debug_layer = 0x%08X (* = enabled, - = partial)
\n
"
,
acpi_dbg_layer
);
break
;
case
1
:
p
+=
sprintf
(
p
,
"0x%08x
\n
"
,
acpi_dbg_level
);
for
(
i
=
0
;
i
<
NUM_OF
(
acpi_debug_levels
);
i
++
)
{
p
+=
sprintf
(
p
,
"%-25s
\t
0x%08lX [%c]
\n
"
,
acpi_debug_levels
[
i
].
name
,
acpi_debug_levels
[
i
].
value
,
(
acpi_dbg_level
&
acpi_debug_levels
[
i
].
value
)
?
'*'
:
' '
);
}
p
+=
sprintf
(
p
,
"--
\n
debug_level = 0x%08X (* = enabled)
\n
"
,
acpi_dbg_level
);
break
;
default:
p
+=
sprintf
(
p
,
"Invalid debug option
\n
"
);
...
...
drivers/acpi/osl.c
View file @
06b42ec7
...
...
@@ -55,6 +55,9 @@ struct acpi_os_dpc
void
*
context
;
};
#ifdef CONFIG_ACPI_CUSTOM_DSDT
#include CONFIG_ACPI_CUSTOM_DSDT_FILE
#endif
#ifdef ENABLE_DEBUGGER
#include <linux/kdb.h>
...
...
@@ -241,7 +244,14 @@ acpi_os_table_override (struct acpi_table_header *existing_table,
if
(
!
existing_table
||
!
new_table
)
return
AE_BAD_PARAMETER
;
#ifdef CONFIG_ACPI_CUSTOM_DSDT
if
(
strncmp
(
existing_table
->
signature
,
"DSDT"
,
4
)
==
0
)
*
new_table
=
(
struct
acpi_table_header
*
)
AmlCode
;
else
*
new_table
=
NULL
;
#else
*
new_table
=
NULL
;
#endif
return
AE_OK
;
}
...
...
drivers/acpi/utilities/utglobal.c
View file @
06b42ec7
...
...
@@ -142,16 +142,11 @@ acpi_format_exception (
*/
/* Debug switch - level and trace mask */
#ifdef ACPI_DEBUG_OUTPUT
u32
acpi_dbg_level
=
ACPI_DEBUG_DEFAULT
;
#else
u32
acpi_dbg_level
=
ACPI_NORMAL_DEFAULT
;
#endif
u32
acpi_dbg_level
=
0
;
/* Debug switch - layer (component) mask */
u32
acpi_dbg_layer
=
ACPI_COMPONENT_DEFAULT
;
u32
acpi_dbg_layer
=
0
;
u32
acpi_gbl_nesting_level
=
0
;
...
...
include/acpi/acpi_drivers.h
View file @
06b42ec7
...
...
@@ -106,59 +106,4 @@ int acpi_ec_ecdt_probe (void);
int
acpi_processor_set_thermal_limit
(
acpi_handle
handle
,
int
type
);
/* --------------------------------------------------------------------------
Debug Support
-------------------------------------------------------------------------- */
#define ACPI_DEBUG_RESTORE 0
#define ACPI_DEBUG_LOW 1
#define ACPI_DEBUG_MEDIUM 2
#define ACPI_DEBUG_HIGH 3
#define ACPI_DEBUG_DRIVERS 4
extern
u32
acpi_dbg_level
;
extern
u32
acpi_dbg_layer
;
static
inline
void
acpi_set_debug
(
u32
flag
)
{
static
u32
layer_save
;
static
u32
level_save
;
switch
(
flag
)
{
case
ACPI_DEBUG_RESTORE
:
acpi_dbg_layer
=
layer_save
;
acpi_dbg_level
=
level_save
;
break
;
case
ACPI_DEBUG_LOW
:
case
ACPI_DEBUG_MEDIUM
:
case
ACPI_DEBUG_HIGH
:
case
ACPI_DEBUG_DRIVERS
:
layer_save
=
acpi_dbg_layer
;
level_save
=
acpi_dbg_level
;
break
;
}
switch
(
flag
)
{
case
ACPI_DEBUG_LOW
:
acpi_dbg_layer
=
ACPI_COMPONENT_DEFAULT
|
ACPI_ALL_DRIVERS
;
acpi_dbg_level
=
ACPI_DEBUG_DEFAULT
;
break
;
case
ACPI_DEBUG_MEDIUM
:
acpi_dbg_layer
=
ACPI_COMPONENT_DEFAULT
|
ACPI_ALL_DRIVERS
;
acpi_dbg_level
=
ACPI_LV_FUNCTIONS
|
ACPI_LV_ALL_EXCEPTIONS
;
break
;
case
ACPI_DEBUG_HIGH
:
acpi_dbg_layer
=
0xFFFFFFFF
;
acpi_dbg_level
=
0xFFFFFFFF
;
break
;
case
ACPI_DEBUG_DRIVERS
:
acpi_dbg_layer
=
ACPI_ALL_DRIVERS
;
acpi_dbg_level
=
0xFFFFFFFF
;
break
;
}
}
#endif
/*__ACPI_DRIVERS_H__*/
include/linux/acpi.h
View file @
06b42ec7
...
...
@@ -453,14 +453,15 @@ void acpi_pci_unregister_driver(struct acpi_pci_driver *driver);
#ifdef CONFIG_ACPI_EC
int
ec_read
(
u8
addr
,
u8
*
val
);
int
ec_write
(
u8
addr
,
u8
val
);
extern
int
ec_read
(
u8
addr
,
u8
*
val
);
extern
int
ec_write
(
u8
addr
,
u8
val
);
#endif
/*CONFIG_ACPI_EC*/
#ifdef CONFIG_ACPI_INTERPRETER
int
acpi_blacklisted
(
void
);
extern
int
acpi_blacklisted
(
void
);
extern
void
acpi_bios_year
(
char
*
s
);
#else
/*!CONFIG_ACPI_INTERPRETER*/
...
...
Write
Preview
Markdown
is supported
0%
Try again
or
attach a new file
Attach a file
Cancel
You are about to add
0
people
to the discussion. Proceed with caution.
Finish editing this message first!
Cancel
Please
register
or
sign in
to comment