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
Kirill Smelkov
linux
Commits
4c8aded7
Commit
4c8aded7
authored
Oct 21, 2004
by
Linus Torvalds
Browse files
Options
Browse Files
Download
Plain Diff
Merge
bk://kernel.bkbits.net/jgarzik/libata-2.6
into ppc970.osdl.org:/home/torvalds/v2.6/linux
parents
f5b8a851
892e9689
Changes
22
Expand all
Show whitespace changes
Inline
Side-by-side
Showing
22 changed files
with
598 additions
and
177 deletions
+598
-177
arch/i386/Kconfig
arch/i386/Kconfig
+4
-0
arch/ppc/kernel/irq.c
arch/ppc/kernel/irq.c
+5
-0
arch/ppc64/boot/main.c
arch/ppc64/boot/main.c
+1
-1
arch/ppc64/kernel/prom_init.c
arch/ppc64/kernel/prom_init.c
+1
-1
arch/ppc64/mm/init.c
arch/ppc64/mm/init.c
+1
-1
arch/x86_64/Kconfig
arch/x86_64/Kconfig
+4
-0
drivers/macintosh/therm_pm72.c
drivers/macintosh/therm_pm72.c
+475
-105
drivers/macintosh/therm_pm72.h
drivers/macintosh/therm_pm72.h
+39
-11
drivers/scsi/aic7xxx_old.c
drivers/scsi/aic7xxx_old.c
+6
-11
drivers/scsi/initio.c
drivers/scsi/initio.c
+5
-5
drivers/scsi/qlogicisp.c
drivers/scsi/qlogicisp.c
+8
-9
drivers/video/aty/aty128fb.c
drivers/video/aty/aty128fb.c
+12
-12
drivers/video/aty/atyfb.h
drivers/video/aty/atyfb.h
+3
-3
drivers/video/aty/atyfb_base.c
drivers/video/aty/atyfb_base.c
+6
-8
drivers/video/aty/mach64_cursor.c
drivers/video/aty/mach64_cursor.c
+5
-4
include/asm-i386/thread_info.h
include/asm-i386/thread_info.h
+1
-1
include/asm-ppc/thread_info.h
include/asm-ppc/thread_info.h
+1
-1
include/asm-ppc64/thread_info.h
include/asm-ppc64/thread_info.h
+1
-1
include/asm-x86_64/thread_info.h
include/asm-x86_64/thread_info.h
+1
-1
include/linux/hardirq.h
include/linux/hardirq.h
+1
-1
include/linux/interrupt.h
include/linux/interrupt.h
+16
-0
kernel/irq/Makefile
kernel/irq/Makefile
+2
-1
No files found.
arch/i386/Kconfig
View file @
4c8aded7
...
@@ -1207,6 +1207,10 @@ config GENERIC_HARDIRQS
...
@@ -1207,6 +1207,10 @@ config GENERIC_HARDIRQS
bool
bool
default y
default y
config GENERIC_IRQ_PROBE
bool
default y
config X86_SMP
config X86_SMP
bool
bool
depends on SMP && !X86_VOYAGER
depends on SMP && !X86_VOYAGER
...
...
arch/ppc/kernel/irq.c
View file @
4c8aded7
...
@@ -71,6 +71,11 @@ unsigned long ppc_cached_irq_mask[NR_MASK_WORDS];
...
@@ -71,6 +71,11 @@ unsigned long ppc_cached_irq_mask[NR_MASK_WORDS];
unsigned
long
ppc_lost_interrupts
[
NR_MASK_WORDS
];
unsigned
long
ppc_lost_interrupts
[
NR_MASK_WORDS
];
atomic_t
ppc_n_lost_interrupts
;
atomic_t
ppc_n_lost_interrupts
;
#ifdef CONFIG_TAU_INT
extern
int
tau_initialized
;
extern
int
tau_interrupts
(
int
);
#endif
int
show_interrupts
(
struct
seq_file
*
p
,
void
*
v
)
int
show_interrupts
(
struct
seq_file
*
p
,
void
*
v
)
{
{
int
i
=
*
(
loff_t
*
)
v
,
j
;
int
i
=
*
(
loff_t
*
)
v
,
j
;
...
...
arch/ppc64/boot/main.c
View file @
4c8aded7
...
@@ -166,7 +166,7 @@ void start(unsigned long a1, unsigned long a2, void *promptr)
...
@@ -166,7 +166,7 @@ void start(unsigned long a1, unsigned long a2, void *promptr)
gunzip
((
void
*
)
vmlinux
.
addr
,
vmlinux
.
size
,
gunzip
((
void
*
)
vmlinux
.
addr
,
vmlinux
.
size
,
(
unsigned
char
*
)
vmlinuz
.
addr
,
&
len
);
(
unsigned
char
*
)
vmlinuz
.
addr
,
&
len
);
printf
(
"done 0x%lx bytes
\n\r
"
,
len
);
printf
(
"done 0x%lx bytes
\n\r
"
,
len
);
printf
(
"0x%x bytes of heap consumed, max in use 0x%
\n\r
"
,
printf
(
"0x%x bytes of heap consumed, max in use 0x%
x
\n\r
"
,
(
unsigned
)(
avail_high
-
begin_avail
),
heap_max
);
(
unsigned
)(
avail_high
-
begin_avail
),
heap_max
);
}
else
{
}
else
{
memmove
((
void
*
)
vmlinux
.
addr
,(
void
*
)
vmlinuz
.
addr
,
vmlinuz
.
size
);
memmove
((
void
*
)
vmlinux
.
addr
,(
void
*
)
vmlinuz
.
addr
,
vmlinuz
.
size
);
...
...
arch/ppc64/kernel/prom_init.c
View file @
4c8aded7
...
@@ -675,7 +675,7 @@ static void __init prom_init_mem(void)
...
@@ -675,7 +675,7 @@ static void __init prom_init_mem(void)
if
(
RELOC
(
of_platform
)
==
PLATFORM_PSERIES_LPAR
)
if
(
RELOC
(
of_platform
)
==
PLATFORM_PSERIES_LPAR
)
RELOC
(
alloc_top
)
=
RELOC
(
rmo_top
);
RELOC
(
alloc_top
)
=
RELOC
(
rmo_top
);
else
else
RELOC
(
alloc_top
)
=
min
(
0x40000000ul
,
RELOC
(
ram_top
));
RELOC
(
alloc_top
)
=
RELOC
(
rmo_top
)
=
min
(
0x40000000ul
,
RELOC
(
ram_top
));
RELOC
(
alloc_bottom
)
=
PAGE_ALIGN
(
RELOC
(
klimit
)
-
offset
+
0x4000
);
RELOC
(
alloc_bottom
)
=
PAGE_ALIGN
(
RELOC
(
klimit
)
-
offset
+
0x4000
);
RELOC
(
alloc_top_high
)
=
RELOC
(
ram_top
);
RELOC
(
alloc_top_high
)
=
RELOC
(
ram_top
);
...
...
arch/ppc64/mm/init.c
View file @
4c8aded7
...
@@ -265,7 +265,7 @@ int __ioremap_explicit(unsigned long pa, unsigned long ea,
...
@@ -265,7 +265,7 @@ int __ioremap_explicit(unsigned long pa, unsigned long ea,
}
else
{
}
else
{
area
=
im_get_area
(
ea
,
size
,
IM_REGION_UNUSED
|
IM_REGION_SUBSET
);
area
=
im_get_area
(
ea
,
size
,
IM_REGION_UNUSED
|
IM_REGION_SUBSET
);
if
(
area
==
NULL
)
{
if
(
area
==
NULL
)
{
printk
(
KERN_ERR
"could not obtain imalloc area for ea 0x%lx
\n
"
,
ea
);
/* Expected when PHB-dlpar is in play */
return
1
;
return
1
;
}
}
if
(
ea
!=
(
unsigned
long
)
area
->
addr
)
{
if
(
ea
!=
(
unsigned
long
)
area
->
addr
)
{
...
...
arch/x86_64/Kconfig
View file @
4c8aded7
...
@@ -346,6 +346,10 @@ config GENERIC_HARDIRQS
...
@@ -346,6 +346,10 @@ config GENERIC_HARDIRQS
bool
bool
default y
default y
config GENERIC_IRQ_PROBE
bool
default y
menu "Power management options"
menu "Power management options"
source kernel/power/Kconfig
source kernel/power/Kconfig
...
...
drivers/macintosh/therm_pm72.c
View file @
4c8aded7
This diff is collapsed.
Click to expand it.
drivers/macintosh/therm_pm72.h
View file @
4c8aded7
...
@@ -119,18 +119,33 @@ static char * critical_overtemp_path = "/sbin/critical_overtemp";
...
@@ -119,18 +119,33 @@ static char * critical_overtemp_path = "/sbin/critical_overtemp";
#define ADC_CPU_CURRENT_SCALE 0x1f40
/* _AD4 */
#define ADC_CPU_CURRENT_SCALE 0x1f40
/* _AD4 */
/*
/*
* PID factors for the U3/Backside fan control loop
* PID factors for the U3/Backside fan control loop. We have 2 sets
* of values here, one set for U3 and one set for U3H
*/
*/
#define BACKSIDE_FAN_PWM_ID 1
#define BACKSIDE_FAN_PWM_DEFAULT_ID 1
#define BACKSIDE_PID_G_d 0x02800000
#define BACKSIDE_FAN_PWM_INDEX 0
#define BACKSIDE_PID_U3_G_d 0x02800000
#define BACKSIDE_PID_U3H_G_d 0x01400000
#define BACKSIDE_PID_G_p 0x00500000
#define BACKSIDE_PID_G_p 0x00500000
#define BACKSIDE_PID_G_r 0x00000000
#define BACKSIDE_PID_G_r 0x00000000
#define BACKSIDE_PID_INPUT_TARGET 0x00410000
#define BACKSIDE_PID_U3_INPUT_TARGET 0x00410000
#define BACKSIDE_PID_U3H_INPUT_TARGET 0x004b0000
#define BACKSIDE_PID_INTERVAL 5
#define BACKSIDE_PID_INTERVAL 5
#define BACKSIDE_PID_OUTPUT_MAX 100
#define BACKSIDE_PID_OUTPUT_MAX 100
#define BACKSIDE_PID_OUTPUT_MIN 20
#define BACKSIDE_PID_U3_OUTPUT_MIN 20
#define BACKSIDE_PID_U3H_OUTPUT_MIN 30
#define BACKSIDE_PID_HISTORY_SIZE 2
#define BACKSIDE_PID_HISTORY_SIZE 2
struct
basckside_pid_params
{
s32
G_d
;
s32
G_p
;
s32
G_r
;
s32
input_target
;
s32
output_min
;
s32
output_max
;
};
struct
backside_pid_state
struct
backside_pid_state
{
{
int
ticks
;
int
ticks
;
...
@@ -146,7 +161,8 @@ struct backside_pid_state
...
@@ -146,7 +161,8 @@ struct backside_pid_state
/*
/*
* PID factors for the Drive Bay fan control loop
* PID factors for the Drive Bay fan control loop
*/
*/
#define DRIVES_FAN_RPM_ID 2
#define DRIVES_FAN_RPM_DEFAULT_ID 2
#define DRIVES_FAN_RPM_INDEX 1
#define DRIVES_PID_G_d 0x01e00000
#define DRIVES_PID_G_d 0x01e00000
#define DRIVES_PID_G_p 0x00500000
#define DRIVES_PID_G_p 0x00500000
#define DRIVES_PID_G_r 0x00000000
#define DRIVES_PID_G_r 0x00000000
...
@@ -168,7 +184,8 @@ struct drives_pid_state
...
@@ -168,7 +184,8 @@ struct drives_pid_state
int
first
;
int
first
;
};
};
#define SLOTS_FAN_PWM_ID 2
#define SLOTS_FAN_PWM_DEFAULT_ID 2
#define SLOTS_FAN_PWM_INDEX 2
#define SLOTS_FAN_DEFAULT_PWM 50
/* Do better here ! */
#define SLOTS_FAN_DEFAULT_PWM 50
/* Do better here ! */
/*
/*
...
@@ -191,10 +208,15 @@ struct drives_pid_state
...
@@ -191,10 +208,15 @@ struct drives_pid_state
* CPU B FAKE POWER 49 (I_V_inputs: 18, 19)
* CPU B FAKE POWER 49 (I_V_inputs: 18, 19)
*/
*/
#define CPUA_INTAKE_FAN_RPM_ID 3
#define CPUA_INTAKE_FAN_RPM_DEFAULT_ID 3
#define CPUA_EXHAUST_FAN_RPM_ID 4
#define CPUA_EXHAUST_FAN_RPM_DEFAULT_ID 4
#define CPUB_INTAKE_FAN_RPM_ID 5
#define CPUB_INTAKE_FAN_RPM_DEFAULT_ID 5
#define CPUB_EXHAUST_FAN_RPM_ID 6
#define CPUB_EXHAUST_FAN_RPM_DEFAULT_ID 6
#define CPUA_INTAKE_FAN_RPM_INDEX 3
#define CPUA_EXHAUST_FAN_RPM_INDEX 4
#define CPUB_INTAKE_FAN_RPM_INDEX 5
#define CPUB_EXHAUST_FAN_RPM_INDEX 6
#define CPU_INTAKE_SCALE 0x0000f852
#define CPU_INTAKE_SCALE 0x0000f852
#define CPU_TEMP_HISTORY_SIZE 2
#define CPU_TEMP_HISTORY_SIZE 2
...
@@ -202,6 +224,11 @@ struct drives_pid_state
...
@@ -202,6 +224,11 @@ struct drives_pid_state
#define CPU_PID_INTERVAL 1
#define CPU_PID_INTERVAL 1
#define CPU_MAX_OVERTEMP 30
#define CPU_MAX_OVERTEMP 30
#define CPUA_PUMP_RPM_INDEX 7
#define CPUB_PUMP_RPM_INDEX 8
#define CPU_PUMP_OUTPUT_MAX 3700
#define CPU_PUMP_OUTPUT_MIN 1000
struct
cpu_pid_state
struct
cpu_pid_state
{
{
int
index
;
int
index
;
...
@@ -219,6 +246,7 @@ struct cpu_pid_state
...
@@ -219,6 +246,7 @@ struct cpu_pid_state
s32
voltage
;
s32
voltage
;
s32
current_a
;
s32
current_a
;
s32
last_temp
;
s32
last_temp
;
s32
last_power
;
int
first
;
int
first
;
u8
adc_config
;
u8
adc_config
;
};
};
...
...
drivers/scsi/aic7xxx_old.c
View file @
4c8aded7
...
@@ -924,7 +924,7 @@ struct aic7xxx_host {
...
@@ -924,7 +924,7 @@ struct aic7xxx_host {
volatile
long
flags
;
volatile
long
flags
;
ahc_feature
features
;
/* chip features */
ahc_feature
features
;
/* chip features */
unsigned
long
base
;
/* card base address */
unsigned
long
base
;
/* card base address */
volatile
unsigned
char
*
maddr
;
/* memory mapped address */
volatile
unsigned
char
__iomem
*
maddr
;
/* memory mapped address */
unsigned
long
isr_count
;
/* Interrupt count */
unsigned
long
isr_count
;
/* Interrupt count */
unsigned
long
spurious_int
;
unsigned
long
spurious_int
;
scb_data_type
*
scb_data
;
scb_data_type
*
scb_data
;
...
@@ -7967,8 +7967,8 @@ aic7xxx_register(Scsi_Host_Template *template, struct aic7xxx_host *p,
...
@@ -7967,8 +7967,8 @@ aic7xxx_register(Scsi_Host_Template *template, struct aic7xxx_host *p,
printk
(
KERN_INFO
"(scsi%d) BIOS %sabled, IO Port 0x%lx, IRQ %d
\n
"
,
printk
(
KERN_INFO
"(scsi%d) BIOS %sabled, IO Port 0x%lx, IRQ %d
\n
"
,
p
->
host_no
,
(
p
->
flags
&
AHC_BIOS_ENABLED
)
?
"en"
:
"dis"
,
p
->
host_no
,
(
p
->
flags
&
AHC_BIOS_ENABLED
)
?
"en"
:
"dis"
,
p
->
base
,
p
->
irq
);
p
->
base
,
p
->
irq
);
printk
(
KERN_INFO
"(scsi%d) IO Memory at 0x%lx, MMAP Memory at
0x%lx
\n
"
,
printk
(
KERN_INFO
"(scsi%d) IO Memory at 0x%lx, MMAP Memory at
%p
\n
"
,
p
->
host_no
,
p
->
mbase
,
(
unsigned
long
)
p
->
maddr
);
p
->
host_no
,
p
->
mbase
,
p
->
maddr
);
}
}
#ifdef CONFIG_PCI
#ifdef CONFIG_PCI
...
@@ -9311,14 +9311,9 @@ aic7xxx_detect(Scsi_Host_Template *template)
...
@@ -9311,14 +9311,9 @@ aic7xxx_detect(Scsi_Host_Template *template)
((
temp_p
->
chip
!=
(
AHC_AIC7870
|
AHC_PCI
))
&&
((
temp_p
->
chip
!=
(
AHC_AIC7870
|
AHC_PCI
))
&&
(
temp_p
->
chip
!=
(
AHC_AIC7880
|
AHC_PCI
)))
)
(
temp_p
->
chip
!=
(
AHC_AIC7880
|
AHC_PCI
)))
)
{
{
unsigned
long
page_offset
,
base
;
temp_p
->
maddr
=
ioremap_nocache
(
temp_p
->
mbase
,
256
);
base
=
temp_p
->
mbase
&
PAGE_MASK
;
page_offset
=
temp_p
->
mbase
-
base
;
temp_p
->
maddr
=
ioremap_nocache
(
base
,
page_offset
+
256
);
if
(
temp_p
->
maddr
)
if
(
temp_p
->
maddr
)
{
{
temp_p
->
maddr
+=
page_offset
;
/*
/*
* We need to check the I/O with the MMAPed address. Some machines
* We need to check the I/O with the MMAPed address. Some machines
* simply fail to work with MMAPed I/O and certain controllers.
* simply fail to work with MMAPed I/O and certain controllers.
...
@@ -9335,7 +9330,7 @@ aic7xxx_detect(Scsi_Host_Template *template)
...
@@ -9335,7 +9330,7 @@ aic7xxx_detect(Scsi_Host_Template *template)
PCI_FUNC
(
temp_p
->
pci_device_fn
));
PCI_FUNC
(
temp_p
->
pci_device_fn
));
printk
(
KERN_INFO
"aic7xxx: MMAPed I/O failed, reverting to "
printk
(
KERN_INFO
"aic7xxx: MMAPed I/O failed, reverting to "
"Programmed I/O.
\n
"
);
"Programmed I/O.
\n
"
);
iounmap
(
(
void
*
)
(((
unsigned
long
)
temp_p
->
maddr
)
&
PAGE_MASK
)
);
iounmap
(
temp_p
->
maddr
);
temp_p
->
maddr
=
NULL
;
temp_p
->
maddr
=
NULL
;
if
(
temp_p
->
base
==
0
)
if
(
temp_p
->
base
==
0
)
{
{
...
@@ -10965,7 +10960,7 @@ aic7xxx_release(struct Scsi_Host *host)
...
@@ -10965,7 +10960,7 @@ aic7xxx_release(struct Scsi_Host *host)
#ifdef MMAPIO
#ifdef MMAPIO
if
(
p
->
maddr
)
if
(
p
->
maddr
)
{
{
iounmap
(
(
void
*
)
(((
unsigned
long
)
p
->
maddr
)
&
PAGE_MASK
)
);
iounmap
(
p
->
maddr
);
}
}
#endif
/* MMAPIO */
#endif
/* MMAPIO */
if
(
!
p
->
pdev
)
if
(
!
p
->
pdev
)
...
...
drivers/scsi/initio.c
View file @
4c8aded7
...
@@ -316,7 +316,7 @@ static void tul_do_pause(unsigned amount)
...
@@ -316,7 +316,7 @@ static void tul_do_pause(unsigned amount)
/*******************************************************************
/*******************************************************************
Use memeory refresh time ~ 15us * 2
Use memeory refresh time ~ 15us * 2
********************************************************************/
********************************************************************/
void
tul_se2_wait
()
void
tul_se2_wait
(
void
)
{
{
#if 1
#if 1
udelay
(
30
);
udelay
(
30
);
...
@@ -815,7 +815,7 @@ void tul_release_scb(HCS * hcsp, SCB * scbp)
...
@@ -815,7 +815,7 @@ void tul_release_scb(HCS * hcsp, SCB * scbp)
printk
(
"Release SCB %lx; "
,
(
ULONG
)
scbp
);
printk
(
"Release SCB %lx; "
,
(
ULONG
)
scbp
);
#endif
#endif
spin_lock_irqsave
(
&
(
hcsp
->
HCS_AvailLock
),
flags
);
spin_lock_irqsave
(
&
(
hcsp
->
HCS_AvailLock
),
flags
);
scbp
->
SCB_Srb
=
0
;
scbp
->
SCB_Srb
=
NULL
;
scbp
->
SCB_Status
=
0
;
scbp
->
SCB_Status
=
0
;
scbp
->
SCB_NxtScb
=
NULL
;
scbp
->
SCB_NxtScb
=
NULL
;
if
(
hcsp
->
HCS_LastAvail
!=
NULL
)
{
if
(
hcsp
->
HCS_LastAvail
!=
NULL
)
{
...
@@ -1231,7 +1231,7 @@ int tul_device_reset(HCS * pCurHcb, struct scsi_cmnd *pSrb,
...
@@ -1231,7 +1231,7 @@ int tul_device_reset(HCS * pCurHcb, struct scsi_cmnd *pSrb,
pScb
->
SCB_Target
=
target
;
pScb
->
SCB_Target
=
target
;
pScb
->
SCB_Mode
=
0
;
pScb
->
SCB_Mode
=
0
;
pScb
->
SCB_Srb
=
0
;
pScb
->
SCB_Srb
=
NULL
;
if
(
ResetFlags
&
SCSI_RESET_SYNCHRONOUS
)
{
if
(
ResetFlags
&
SCSI_RESET_SYNCHRONOUS
)
{
pScb
->
SCB_Srb
=
pSrb
;
pScb
->
SCB_Srb
=
pSrb
;
}
}
...
@@ -2535,8 +2535,8 @@ int tul_post_scsi_rst(HCS * pCurHcb)
...
@@ -2535,8 +2535,8 @@ int tul_post_scsi_rst(HCS * pCurHcb)
TCS
*
pCurTcb
;
TCS
*
pCurTcb
;
int
i
;
int
i
;
pCurHcb
->
HCS_ActScb
=
0
;
pCurHcb
->
HCS_ActScb
=
NULL
;
pCurHcb
->
HCS_ActTcs
=
0
;
pCurHcb
->
HCS_ActTcs
=
NULL
;
pCurHcb
->
HCS_Flags
=
0
;
pCurHcb
->
HCS_Flags
=
0
;
while
((
pCurScb
=
tul_pop_busy_scb
(
pCurHcb
))
!=
NULL
)
{
while
((
pCurScb
=
tul_pop_busy_scb
(
pCurHcb
))
!=
NULL
)
{
...
...
drivers/scsi/qlogicisp.c
View file @
4c8aded7
...
@@ -564,7 +564,7 @@ struct isp_queue_entry {
...
@@ -564,7 +564,7 @@ struct isp_queue_entry {
};
};
struct
isp1020_hostdata
{
struct
isp1020_hostdata
{
u_long
memaddr
;
void
__iomem
*
memaddr
;
u_char
revision
;
u_char
revision
;
struct
host_param
host_param
;
struct
host_param
host_param
;
struct
dev_param
dev_param
[
MAX_TARGETS
];
struct
dev_param
dev_param
[
MAX_TARGETS
];
...
@@ -714,7 +714,7 @@ int isp1020_detect(Scsi_Host_Template *tmpt)
...
@@ -714,7 +714,7 @@ int isp1020_detect(Scsi_Host_Template *tmpt)
continue
;
continue
;
fail_uninit:
fail_uninit:
iounmap
(
(
void
*
)
hostdata
->
memaddr
);
iounmap
(
hostdata
->
memaddr
);
release_region
(
host
->
io_port
,
0xff
);
release_region
(
host
->
io_port
,
0xff
);
fail_and_unregister:
fail_and_unregister:
if
(
hostdata
->
res_cpu
)
if
(
hostdata
->
res_cpu
)
...
@@ -747,7 +747,7 @@ int isp1020_release(struct Scsi_Host *host)
...
@@ -747,7 +747,7 @@ int isp1020_release(struct Scsi_Host *host)
isp_outw
(
0x0
,
host
,
PCI_INTF_CTL
);
isp_outw
(
0x0
,
host
,
PCI_INTF_CTL
);
free_irq
(
host
->
irq
,
host
);
free_irq
(
host
->
irq
,
host
);
iounmap
(
(
void
*
)
hostdata
->
memaddr
);
iounmap
(
hostdata
->
memaddr
);
release_region
(
host
->
io_port
,
0xff
);
release_region
(
host
->
io_port
,
0xff
);
...
@@ -769,7 +769,7 @@ const char *isp1020_info(struct Scsi_Host *host)
...
@@ -769,7 +769,7 @@ const char *isp1020_info(struct Scsi_Host *host)
"QLogic ISP1020 SCSI on PCI bus %02x device %02x irq %d %s base 0x%lx"
,
"QLogic ISP1020 SCSI on PCI bus %02x device %02x irq %d %s base 0x%lx"
,
hostdata
->
pci_dev
->
bus
->
number
,
hostdata
->
pci_dev
->
devfn
,
host
->
irq
,
hostdata
->
pci_dev
->
bus
->
number
,
hostdata
->
pci_dev
->
devfn
,
host
->
irq
,
(
hostdata
->
memaddr
?
"MEM"
:
"I/O"
),
(
hostdata
->
memaddr
?
"MEM"
:
"I/O"
),
(
hostdata
->
memaddr
?
hostdata
->
memaddr
:
host
->
io_port
));
(
hostdata
->
memaddr
?
(
unsigned
long
)
hostdata
->
memaddr
:
host
->
io_port
));
LEAVE
(
"isp1020_info"
);
LEAVE
(
"isp1020_info"
);
...
@@ -1410,18 +1410,17 @@ static int isp1020_init(struct Scsi_Host *sh)
...
@@ -1410,18 +1410,17 @@ static int isp1020_init(struct Scsi_Host *sh)
if
((
command
&
PCI_COMMAND_MEMORY
)
&&
if
((
command
&
PCI_COMMAND_MEMORY
)
&&
((
mem_flags
&
1
)
==
0
))
{
((
mem_flags
&
1
)
==
0
))
{
mem_base
=
(
u_long
)
ioremap
(
mem_base
,
PAGE_SIZE
);
hostdata
->
memaddr
=
ioremap
(
mem_base
,
PAGE_SIZE
);
if
(
!
mem_base
)
{
if
(
!
hostdata
->
memaddr
)
{
printk
(
"qlogicisp : i/o remapping failed.
\n
"
);
printk
(
"qlogicisp : i/o remapping failed.
\n
"
);
goto
out_release
;
goto
out_release
;
}
}
hostdata
->
memaddr
=
mem_base
;
}
else
{
}
else
{
if
(
command
&
PCI_COMMAND_IO
&&
(
io_flags
&
3
)
!=
1
)
{
if
(
command
&
PCI_COMMAND_IO
&&
(
io_flags
&
3
)
!=
1
)
{
printk
(
"qlogicisp : i/o mapping is disabled
\n
"
);
printk
(
"qlogicisp : i/o mapping is disabled
\n
"
);
goto
out_release
;
goto
out_release
;
}
}
hostdata
->
memaddr
=
0
;
/* zero to signify no i/o mapping */
hostdata
->
memaddr
=
NULL
;
/* zero to signify no i/o mapping */
mem_base
=
0
;
mem_base
=
0
;
}
}
...
@@ -1470,7 +1469,7 @@ static int isp1020_init(struct Scsi_Host *sh)
...
@@ -1470,7 +1469,7 @@ static int isp1020_init(struct Scsi_Host *sh)
return
0
;
return
0
;
out_unmap:
out_unmap:
iounmap
(
(
void
*
)
hostdata
->
memaddr
);
iounmap
(
hostdata
->
memaddr
);
out_release:
out_release:
release_region
(
sh
->
io_port
,
0xff
);
release_region
(
sh
->
io_port
,
0xff
);
return
1
;
return
1
;
...
...
drivers/video/aty/aty128fb.c
View file @
4c8aded7
...
@@ -397,7 +397,7 @@ struct aty128fb_par {
...
@@ -397,7 +397,7 @@ struct aty128fb_par {
struct
aty128_ddafifo
fifo_reg
;
struct
aty128_ddafifo
fifo_reg
;
u32
accel_flags
;
u32
accel_flags
;
struct
aty128_constants
constants
;
/* PLL and others */
struct
aty128_constants
constants
;
/* PLL and others */
void
*
regbase
;
/* remapped mmio */
void
__iomem
*
regbase
;
/* remapped mmio */
u32
vram_size
;
/* onboard video ram */
u32
vram_size
;
/* onboard video ram */
int
chip_gen
;
int
chip_gen
;
const
struct
aty128_meminfo
*
mem
;
/* onboard mem info */
const
struct
aty128_meminfo
*
mem
;
/* onboard mem info */
...
@@ -450,9 +450,9 @@ static int aty128_decode_var(struct fb_var_screeninfo *var,
...
@@ -450,9 +450,9 @@ static int aty128_decode_var(struct fb_var_screeninfo *var,
struct
aty128fb_par
*
par
);
struct
aty128fb_par
*
par
);
#if 0
#if 0
static void __init aty128_get_pllinfo(struct aty128fb_par *par,
static void __init aty128_get_pllinfo(struct aty128fb_par *par,
void *bios);
void
__iomem
*bios);
static void __init *aty128_map_ROM(struct pci_dev *pdev, const struct aty128fb_par *par);
static void __init
__iomem
*aty128_map_ROM(struct pci_dev *pdev, const struct aty128fb_par *par);
static void __init aty128_unmap_ROM(struct pci_dev *dev, void * rom);
static void __init aty128_unmap_ROM(struct pci_dev *dev, void
__iomem
* rom);
#endif
#endif
static
void
aty128_timings
(
struct
aty128fb_par
*
par
);
static
void
aty128_timings
(
struct
aty128fb_par
*
par
);
static
void
aty128_init_engine
(
struct
aty128fb_par
*
par
);
static
void
aty128_init_engine
(
struct
aty128fb_par
*
par
);
...
@@ -788,7 +788,7 @@ static u32 depth_to_dst(u32 depth)
...
@@ -788,7 +788,7 @@ static u32 depth_to_dst(u32 depth)
#ifndef __sparc__
#ifndef __sparc__
static
void
__init
aty128_unmap_ROM
(
struct
pci_dev
*
dev
,
void
*
rom
)
static
void
__init
aty128_unmap_ROM
(
struct
pci_dev
*
dev
,
void
__iomem
*
rom
)
{
{
struct
resource
*
r
=
&
dev
->
resource
[
PCI_ROM_RESOURCE
];
struct
resource
*
r
=
&
dev
->
resource
[
PCI_ROM_RESOURCE
];
...
@@ -806,12 +806,12 @@ static void __init aty128_unmap_ROM(struct pci_dev *dev, void * rom)
...
@@ -806,12 +806,12 @@ static void __init aty128_unmap_ROM(struct pci_dev *dev, void * rom)
}
}
static
void
*
__init
aty128_map_ROM
(
const
struct
aty128fb_par
*
par
,
struct
pci_dev
*
dev
)
static
void
__iomem
*
__init
aty128_map_ROM
(
const
struct
aty128fb_par
*
par
,
struct
pci_dev
*
dev
)
{
{
struct
resource
*
r
;
struct
resource
*
r
;
u16
dptr
;
u16
dptr
;
u8
rom_type
;
u8
rom_type
;
void
*
bios
;
void
__iomem
*
bios
;
/* Fix from ATI for problem with Rage128 hardware not leaving ROM enabled */
/* Fix from ATI for problem with Rage128 hardware not leaving ROM enabled */
unsigned
int
temp
;
unsigned
int
temp
;
...
@@ -903,7 +903,7 @@ static void * __init aty128_map_ROM(const struct aty128fb_par *par, struct pci_d
...
@@ -903,7 +903,7 @@ static void * __init aty128_map_ROM(const struct aty128fb_par *par, struct pci_d
return
NULL
;
return
NULL
;
}
}
static
void
__init
aty128_get_pllinfo
(
struct
aty128fb_par
*
par
,
unsigned
char
*
bios
)
static
void
__init
aty128_get_pllinfo
(
struct
aty128fb_par
*
par
,
unsigned
char
__iomem
*
bios
)
{
{
unsigned
int
bios_hdr
;
unsigned
int
bios_hdr
;
unsigned
int
bios_pll
;
unsigned
int
bios_pll
;
...
@@ -925,7 +925,7 @@ static void __init aty128_get_pllinfo(struct aty128fb_par *par, unsigned char *b
...
@@ -925,7 +925,7 @@ static void __init aty128_get_pllinfo(struct aty128fb_par *par, unsigned char *b
}
}
#ifdef CONFIG_X86
#ifdef CONFIG_X86
static
void
*
__devinit
aty128_find_mem_vbios
(
struct
aty128fb_par
*
par
)
static
void
__iomem
*
__devinit
aty128_find_mem_vbios
(
struct
aty128fb_par
*
par
)
{
{
/* I simplified this code as we used to miss the signatures in
/* I simplified this code as we used to miss the signatures in
* a lot of case. It's now closer to XFree, we just don't check
* a lot of case. It's now closer to XFree, we just don't check
...
@@ -933,10 +933,10 @@ static void * __devinit aty128_find_mem_vbios(struct aty128fb_par *par)
...
@@ -933,10 +933,10 @@ static void * __devinit aty128_find_mem_vbios(struct aty128fb_par *par)
* if we end up having conflicts
* if we end up having conflicts
*/
*/
u32
segstart
;
u32
segstart
;
unsigned
char
*
rom_base
=
NULL
;
unsigned
char
__iomem
*
rom_base
=
NULL
;
for
(
segstart
=
0x000c0000
;
segstart
<
0x000f0000
;
segstart
+=
0x00001000
)
{
for
(
segstart
=
0x000c0000
;
segstart
<
0x000f0000
;
segstart
+=
0x00001000
)
{
rom_base
=
(
char
*
)
ioremap
(
segstart
,
0x10000
);
rom_base
=
ioremap
(
segstart
,
0x10000
);
if
(
rom_base
==
NULL
)
if
(
rom_base
==
NULL
)
return
NULL
;
return
NULL
;
if
((
*
rom_base
==
0x55
)
&&
(((
*
(
rom_base
+
1
))
&
0xff
)
==
0xaa
))
if
((
*
rom_base
==
0x55
)
&&
(((
*
(
rom_base
+
1
))
&
0xff
)
==
0xaa
))
...
@@ -1885,7 +1885,7 @@ static int __init aty128_probe(struct pci_dev *pdev, const struct pci_device_id
...
@@ -1885,7 +1885,7 @@ static int __init aty128_probe(struct pci_dev *pdev, const struct pci_device_id
struct
fb_info
*
info
;
struct
fb_info
*
info
;
int
err
;
int
err
;
#ifndef __sparc__
#ifndef __sparc__
void
*
bios
=
NULL
;
void
__iomem
*
bios
=
NULL
;
#endif
#endif
/* Enable device in PCI config */
/* Enable device in PCI config */
...
...
drivers/video/aty/atyfb.h
View file @
4c8aded7
...
@@ -59,15 +59,15 @@ union aty_pll {
...
@@ -59,15 +59,15 @@ union aty_pll {
struct
aty_cursor
{
struct
aty_cursor
{
u8
bits
[
8
][
64
];
u8
bits
[
8
][
64
];
u8
mask
[
8
][
64
];
u8
mask
[
8
][
64
];
u8
*
ram
;
u8
__iomem
*
ram
;
};
};
struct
atyfb_par
{
struct
atyfb_par
{
struct
aty_cmap_regs
*
aty_cmap_regs
;
struct
aty_cmap_regs
__iomem
*
aty_cmap_regs
;
const
struct
aty_dac_ops
*
dac_ops
;
const
struct
aty_dac_ops
*
dac_ops
;
const
struct
aty_pll_ops
*
pll_ops
;
const
struct
aty_pll_ops
*
pll_ops
;
struct
aty_cursor
*
cursor
;
struct
aty_cursor
*
cursor
;
unsigned
long
ati_regbase
;
void
__iomem
*
ati_regbase
;
unsigned
long
clk_wr_offset
;
unsigned
long
clk_wr_offset
;
struct
crtc
crtc
;
struct
crtc
crtc
;
union
aty_pll
pll
;
union
aty_pll
pll
;
...
...
drivers/video/aty/atyfb_base.c
View file @
4c8aded7
...
@@ -1514,7 +1514,7 @@ static int __init aty_init(struct fb_info *info, const char *name)
...
@@ -1514,7 +1514,7 @@ static int __init aty_init(struct fb_info *info, const char *name)
u8
pll_ref_div
;
u8
pll_ref_div
;
par
->
aty_cmap_regs
=
par
->
aty_cmap_regs
=
(
struct
aty_cmap_regs
*
)
(
par
->
ati_regbase
+
0xc0
);
(
struct
aty_cmap_regs
__iomem
*
)
(
par
->
ati_regbase
+
0xc0
);
chip_id
=
aty_ld_le32
(
CONFIG_CHIP_ID
,
par
);
chip_id
=
aty_ld_le32
(
CONFIG_CHIP_ID
,
par
);
type
=
chip_id
&
CFG_CHIP_TYPE
;
type
=
chip_id
&
CFG_CHIP_TYPE
;
rev
=
(
chip_id
&
CFG_CHIP_REV
)
>>
24
;
rev
=
(
chip_id
&
CFG_CHIP_REV
)
>>
24
;
...
@@ -1782,8 +1782,7 @@ static int __init aty_init(struct fb_info *info, const char *name)
...
@@ -1782,8 +1782,7 @@ static int __init aty_init(struct fb_info *info, const char *name)
info
->
fix
.
smem_len
-=
GUI_RESERVE
;
info
->
fix
.
smem_len
-=
GUI_RESERVE
;
/* Clear the video memory */
/* Clear the video memory */
fb_memset
((
void
*
)
info
->
screen_base
,
0
,
fb_memset
(
info
->
screen_base
,
0
,
info
->
fix
.
smem_len
);
info
->
fix
.
smem_len
);
info
->
fbops
=
&
atyfb_ops
;
info
->
fbops
=
&
atyfb_ops
;
info
->
pseudo_palette
=
pseudo_palette
;
info
->
pseudo_palette
=
pseudo_palette
;
...
@@ -2216,7 +2215,7 @@ int __init atyfb_do_init(void)
...
@@ -2216,7 +2215,7 @@ int __init atyfb_do_init(void)
#else
/* __sparc__ */
#else
/* __sparc__ */
info
->
fix
.
mmio_start
=
0x7ff000
+
addr
;
info
->
fix
.
mmio_start
=
0x7ff000
+
addr
;
default_par
->
ati_regbase
=
(
unsigned
long
)
default_par
->
ati_regbase
=
ioremap
(
info
->
fix
.
mmio_start
,
0x1000
);
ioremap
(
info
->
fix
.
mmio_start
,
0x1000
);
if
(
!
default_par
->
ati_regbase
)
{
if
(
!
default_par
->
ati_regbase
)
{
...
@@ -2249,8 +2248,7 @@ int __init atyfb_do_init(void)
...
@@ -2249,8 +2248,7 @@ int __init atyfb_do_init(void)
/* Map in frame buffer */
/* Map in frame buffer */
info
->
fix
.
smem_start
=
addr
;
info
->
fix
.
smem_start
=
addr
;
info
->
screen_base
=
info
->
screen_base
=
ioremap
(
addr
,
0x800000
);
(
char
*
)
ioremap
(
addr
,
0x800000
);
if
(
!
info
->
screen_base
)
{
if
(
!
info
->
screen_base
)
{
#ifdef __sparc__
#ifdef __sparc__
...
@@ -2616,9 +2614,9 @@ void cleanup_module(void)
...
@@ -2616,9 +2614,9 @@ void cleanup_module(void)
#ifndef __sparc__
#ifndef __sparc__
if
(
par
->
ati_regbase
)
if
(
par
->
ati_regbase
)
iounmap
(
(
void
*
)
par
->
ati_regbase
);
iounmap
(
par
->
ati_regbase
);
if
(
info
->
screen_base
)
if
(
info
->
screen_base
)
iounmap
(
(
void
*
)
info
->
screen_base
);
iounmap
(
info
->
screen_base
);
#ifdef __BIG_ENDIAN
#ifdef __BIG_ENDIAN
if
(
par
->
cursor
&&
par
->
cursor
->
ram
)
if
(
par
->
cursor
&&
par
->
cursor
->
ram
)
iounmap
(
par
->
cursor
->
ram
);
iounmap
(
par
->
cursor
->
ram
);
...
...
drivers/video/aty/mach64_cursor.c
View file @
4c8aded7
...
@@ -73,7 +73,8 @@ void aty_set_cursor_shape(struct fb_info *info)
...
@@ -73,7 +73,8 @@ void aty_set_cursor_shape(struct fb_info *info)
struct
atyfb_par
*
par
=
(
struct
atyfb_par
*
)
info
->
par
;
struct
atyfb_par
*
par
=
(
struct
atyfb_par
*
)
info
->
par
;
struct
fb_cursor
*
cursor
=
&
info
->
cursor
;
struct
fb_cursor
*
cursor
=
&
info
->
cursor
;
struct
aty_cursor
*
c
=
par
->
cursor
;
struct
aty_cursor
*
c
=
par
->
cursor
;
u8
*
ram
,
m
,
b
;
u8
m
,
b
;
u8
__iomem
*
ram
;
int
x
,
y
;
int
x
,
y
;
if
(
!
c
)
if
(
!
c
)
...
@@ -178,7 +179,7 @@ int atyfb_cursor(struct fb_info *info, struct fb_cursor *cursor)
...
@@ -178,7 +179,7 @@ int atyfb_cursor(struct fb_info *info, struct fb_cursor *cursor)
struct
aty_cursor
*
__init
aty_init_cursor
(
struct
fb_info
*
info
)
struct
aty_cursor
*
__init
aty_init_cursor
(
struct
fb_info
*
info
)
{
{
struct
aty_cursor
*
cursor
;
struct
aty_cursor
*
cursor
;
unsigned
long
addr
;
void
__iomem
*
addr
;
cursor
=
kmalloc
(
sizeof
(
struct
aty_cursor
),
GFP_ATOMIC
);
cursor
=
kmalloc
(
sizeof
(
struct
aty_cursor
),
GFP_ATOMIC
);
if
(
!
cursor
)
if
(
!
cursor
)
...
@@ -195,8 +196,8 @@ struct aty_cursor *__init aty_init_cursor(struct fb_info *info)
...
@@ -195,8 +196,8 @@ struct aty_cursor *__init aty_init_cursor(struct fb_info *info)
addr
=
info
->
fix
.
smem_start
-
0x800000
+
info
->
fix
.
smem_len
;
addr
=
info
->
fix
.
smem_start
-
0x800000
+
info
->
fix
.
smem_len
;
cursor
->
ram
=
(
u8
*
)
ioremap
(
addr
,
1024
);
cursor
->
ram
=
(
u8
*
)
ioremap
(
addr
,
1024
);
#else
#else
addr
=
(
unsigned
long
)
info
->
screen_base
+
info
->
fix
.
smem_len
;
addr
=
info
->
screen_base
+
info
->
fix
.
smem_len
;
cursor
->
ram
=
(
u8
*
)
addr
;
cursor
->
ram
=
addr
;
#endif
#endif
#endif
#endif
if
(
!
cursor
->
ram
)
{
if
(
!
cursor
->
ram
)
{
...
...
include/asm-i386/thread_info.h
View file @
4c8aded7
...
@@ -51,7 +51,7 @@ struct thread_info {
...
@@ -51,7 +51,7 @@ struct thread_info {
#endif
#endif
#define PREEMPT_ACTIVE 0x
4
000000
#define PREEMPT_ACTIVE 0x
10
000000
#ifdef CONFIG_4KSTACKS
#ifdef CONFIG_4KSTACKS
#define THREAD_SIZE (4096)
#define THREAD_SIZE (4096)
#else
#else
...
...
include/asm-ppc/thread_info.h
View file @
4c8aded7
...
@@ -65,7 +65,7 @@ static inline struct thread_info *current_thread_info(void)
...
@@ -65,7 +65,7 @@ static inline struct thread_info *current_thread_info(void)
*/
*/
#define THREAD_SIZE 8192
/* 2 pages */
#define THREAD_SIZE 8192
/* 2 pages */
#define PREEMPT_ACTIVE 0x
4
000000
#define PREEMPT_ACTIVE 0x
10
000000
/*
/*
* thread information flag bit numbers
* thread information flag bit numbers
...
...
include/asm-ppc64/thread_info.h
View file @
4c8aded7
...
@@ -82,7 +82,7 @@ static inline struct thread_info *current_thread_info(void)
...
@@ -82,7 +82,7 @@ static inline struct thread_info *current_thread_info(void)
#endif
/* __ASSEMBLY__ */
#endif
/* __ASSEMBLY__ */
#define PREEMPT_ACTIVE 0x
4
000000
#define PREEMPT_ACTIVE 0x
10
000000
/*
/*
* thread information flag bit numbers
* thread information flag bit numbers
...
...
include/asm-x86_64/thread_info.h
View file @
4c8aded7
...
@@ -125,7 +125,7 @@ static inline struct thread_info *stack_thread_info(void)
...
@@ -125,7 +125,7 @@ static inline struct thread_info *stack_thread_info(void)
/* work to do on any return to user space */
/* work to do on any return to user space */
#define _TIF_ALLWORK_MASK 0x0000FFFF
#define _TIF_ALLWORK_MASK 0x0000FFFF
#define PREEMPT_ACTIVE 0x
4
000000
#define PREEMPT_ACTIVE 0x
10
000000
/*
/*
* Thread-synchronous status.
* Thread-synchronous status.
...
...
include/linux/hardirq.h
View file @
4c8aded7
...
@@ -14,7 +14,7 @@
...
@@ -14,7 +14,7 @@
* - bits 8-15 are the softirq count (max # of softirqs: 256)
* - bits 8-15 are the softirq count (max # of softirqs: 256)
* - bits 16-27 are the hardirq count (max # of hardirqs: 4096)
* - bits 16-27 are the hardirq count (max # of hardirqs: 4096)
*
*
* - ( bit 2
6
is the PREEMPT_ACTIVE flag. )
* - ( bit 2
8
is the PREEMPT_ACTIVE flag. )
*
*
* PREEMPT_MASK: 0x000000ff
* PREEMPT_MASK: 0x000000ff
* SOFTIRQ_MASK: 0x0000ff00
* SOFTIRQ_MASK: 0x0000ff00
...
...
include/linux/interrupt.h
View file @
4c8aded7
...
@@ -252,8 +252,24 @@ extern void tasklet_init(struct tasklet_struct *t,
...
@@ -252,8 +252,24 @@ extern void tasklet_init(struct tasklet_struct *t,
* or zero if none occurred, or a negative irq number
* or zero if none occurred, or a negative irq number
* if more than one irq occurred.
* if more than one irq occurred.
*/
*/
#if defined(CONFIG_GENERIC_HARDIRQS) && !defined(CONFIG_GENERIC_IRQ_PROBE)
static
inline
unsigned
long
probe_irq_on
(
void
)
{
return
0
;
}
static
inline
int
probe_irq_off
(
unsigned
long
val
)
{
return
0
;
}
static
inline
unsigned
int
probe_irq_mask
(
unsigned
long
val
)
{
return
0
;
}
#else
extern
unsigned
long
probe_irq_on
(
void
);
/* returns 0 on failure */
extern
unsigned
long
probe_irq_on
(
void
);
/* returns 0 on failure */
extern
int
probe_irq_off
(
unsigned
long
);
/* returns 0 or negative on failure */
extern
int
probe_irq_off
(
unsigned
long
);
/* returns 0 or negative on failure */
extern
unsigned
int
probe_irq_mask
(
unsigned
long
);
/* returns mask of ISA interrupts */
extern
unsigned
int
probe_irq_mask
(
unsigned
long
);
/* returns mask of ISA interrupts */
#endif
#endif
#endif
kernel/irq/Makefile
View file @
4c8aded7
obj-y
:=
autoprobe.o handle.o manage.o spurious.o
obj-y
:=
handle.o manage.o spurious.o
obj-$(CONFIG_GENERIC_IRQ_PROBE)
+=
autoprobe.o
obj-$(CONFIG_PROC_FS)
+=
proc.o
obj-$(CONFIG_PROC_FS)
+=
proc.o
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