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
408bb25b
Commit
408bb25b
authored
Mar 31, 2013
by
Al Viro
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
switch wd33c93 to ->show_info()
Signed-off-by:
Al Viro
<
viro@zeniv.linux.org.uk
>
parent
cab29b99
Changes
6
Hide whitespace changes
Inline
Side-by-side
Showing
6 changed files
with
94 additions
and
115 deletions
+94
-115
drivers/scsi/a2091.c
drivers/scsi/a2091.c
+2
-1
drivers/scsi/a3000.c
drivers/scsi/a3000.c
+2
-1
drivers/scsi/gvp11.c
drivers/scsi/gvp11.c
+2
-1
drivers/scsi/mvme147.c
drivers/scsi/mvme147.c
+2
-1
drivers/scsi/wd33c93.c
drivers/scsi/wd33c93.c
+84
-110
drivers/scsi/wd33c93.h
drivers/scsi/wd33c93.h
+2
-1
No files found.
drivers/scsi/a2091.c
View file @
408bb25b
...
@@ -166,7 +166,8 @@ static int a2091_bus_reset(struct scsi_cmnd *cmd)
...
@@ -166,7 +166,8 @@ static int a2091_bus_reset(struct scsi_cmnd *cmd)
static
struct
scsi_host_template
a2091_scsi_template
=
{
static
struct
scsi_host_template
a2091_scsi_template
=
{
.
module
=
THIS_MODULE
,
.
module
=
THIS_MODULE
,
.
name
=
"Commodore A2091/A590 SCSI"
,
.
name
=
"Commodore A2091/A590 SCSI"
,
.
proc_info
=
wd33c93_proc_info
,
.
show_info
=
wd33c93_show_info
,
.
write_info
=
wd33c93_write_info
,
.
proc_name
=
"A2901"
,
.
proc_name
=
"A2901"
,
.
queuecommand
=
wd33c93_queuecommand
,
.
queuecommand
=
wd33c93_queuecommand
,
.
eh_abort_handler
=
wd33c93_abort
,
.
eh_abort_handler
=
wd33c93_abort
,
...
...
drivers/scsi/a3000.c
View file @
408bb25b
...
@@ -181,7 +181,8 @@ static int a3000_bus_reset(struct scsi_cmnd *cmd)
...
@@ -181,7 +181,8 @@ static int a3000_bus_reset(struct scsi_cmnd *cmd)
static
struct
scsi_host_template
amiga_a3000_scsi_template
=
{
static
struct
scsi_host_template
amiga_a3000_scsi_template
=
{
.
module
=
THIS_MODULE
,
.
module
=
THIS_MODULE
,
.
name
=
"Amiga 3000 built-in SCSI"
,
.
name
=
"Amiga 3000 built-in SCSI"
,
.
proc_info
=
wd33c93_proc_info
,
.
show_info
=
wd33c93_show_info
,
.
write_info
=
wd33c93_write_info
,
.
proc_name
=
"A3000"
,
.
proc_name
=
"A3000"
,
.
queuecommand
=
wd33c93_queuecommand
,
.
queuecommand
=
wd33c93_queuecommand
,
.
eh_abort_handler
=
wd33c93_abort
,
.
eh_abort_handler
=
wd33c93_abort
,
...
...
drivers/scsi/gvp11.c
View file @
408bb25b
...
@@ -191,7 +191,8 @@ static int gvp11_bus_reset(struct scsi_cmnd *cmd)
...
@@ -191,7 +191,8 @@ static int gvp11_bus_reset(struct scsi_cmnd *cmd)
static
struct
scsi_host_template
gvp11_scsi_template
=
{
static
struct
scsi_host_template
gvp11_scsi_template
=
{
.
module
=
THIS_MODULE
,
.
module
=
THIS_MODULE
,
.
name
=
"GVP Series II SCSI"
,
.
name
=
"GVP Series II SCSI"
,
.
proc_info
=
wd33c93_proc_info
,
.
show_info
=
wd33c93_show_info
,
.
write_info
=
wd33c93_write_info
,
.
proc_name
=
"GVP11"
,
.
proc_name
=
"GVP11"
,
.
queuecommand
=
wd33c93_queuecommand
,
.
queuecommand
=
wd33c93_queuecommand
,
.
eh_abort_handler
=
wd33c93_abort
,
.
eh_abort_handler
=
wd33c93_abort
,
...
...
drivers/scsi/mvme147.c
View file @
408bb25b
...
@@ -76,7 +76,8 @@ int mvme147_detect(struct scsi_host_template *tpnt)
...
@@ -76,7 +76,8 @@ int mvme147_detect(struct scsi_host_template *tpnt)
called
++
;
called
++
;
tpnt
->
proc_name
=
"MVME147"
;
tpnt
->
proc_name
=
"MVME147"
;
tpnt
->
proc_info
=
&
wd33c93_proc_info
;
tpnt
->
show_info
=
wd33c93_show_info
,
tpnt
->
write_info
=
wd33c93_write_info
,
instance
=
scsi_register
(
tpnt
,
sizeof
(
struct
WD33C93_hostdata
));
instance
=
scsi_register
(
tpnt
,
sizeof
(
struct
WD33C93_hostdata
));
if
(
!
instance
)
if
(
!
instance
)
...
...
drivers/scsi/wd33c93.c
View file @
408bb25b
...
@@ -2054,22 +2054,16 @@ wd33c93_init(struct Scsi_Host *instance, const wd33c93_regs regs,
...
@@ -2054,22 +2054,16 @@ wd33c93_init(struct Scsi_Host *instance, const wd33c93_regs regs,
printk
(
" Version %s - %s
\n
"
,
WD33C93_VERSION
,
WD33C93_DATE
);
printk
(
" Version %s - %s
\n
"
,
WD33C93_VERSION
,
WD33C93_DATE
);
}
}
int
int
wd33c93_write_info
(
struct
Scsi_Host
*
instance
,
char
*
buf
,
int
len
)
wd33c93_proc_info
(
struct
Scsi_Host
*
instance
,
char
*
buf
,
char
**
start
,
off_t
off
,
int
len
,
int
in
)
{
{
#ifdef PROC_INTERFACE
#ifdef PROC_INTERFACE
char
*
bp
;
char
*
bp
;
char
tbuf
[
128
];
struct
WD33C93_hostdata
*
hd
;
struct
WD33C93_hostdata
*
hd
;
struct
scsi_cmnd
*
cmd
;
int
x
;
int
x
;
static
int
stop
=
0
;
hd
=
(
struct
WD33C93_hostdata
*
)
instance
->
hostdata
;
hd
=
(
struct
WD33C93_hostdata
*
)
instance
->
hostdata
;
/*
If 'in' is TRUE we need to _read_ the proc file.
We accept the following
/* We accept the following
* keywords (same format as command-line, but arguments are not optional):
* keywords (same format as command-line, but arguments are not optional):
* debug
* debug
* disconnect
* disconnect
...
@@ -2083,145 +2077,124 @@ wd33c93_proc_info(struct Scsi_Host *instance, char *buf, char **start, off_t off
...
@@ -2083,145 +2077,124 @@ wd33c93_proc_info(struct Scsi_Host *instance, char *buf, char **start, off_t off
* nosync
* nosync
*/
*/
if
(
in
)
{
buf
[
len
]
=
'\0'
;
buf
[
len
]
=
'\0'
;
for
(
bp
=
buf
;
*
bp
;
)
{
for
(
bp
=
buf
;
*
bp
;
)
{
while
(
','
==
*
bp
||
' '
==
*
bp
)
while
(
','
==
*
bp
||
' '
==
*
bp
)
++
bp
;
++
bp
;
if
(
!
strncmp
(
bp
,
"debug:"
,
6
))
{
if
(
!
strncmp
(
bp
,
"debug:"
,
6
))
{
hd
->
args
=
simple_strtoul
(
bp
+
6
,
&
bp
,
0
)
&
DB_MASK
;
hd
->
args
=
simple_strtoul
(
bp
+
6
,
&
bp
,
0
)
&
DB_MASK
;
}
else
if
(
!
strncmp
(
bp
,
"disconnect:"
,
11
))
{
}
else
if
(
!
strncmp
(
bp
,
"disconnect:"
,
11
))
{
x
=
simple_strtoul
(
bp
+
11
,
&
bp
,
0
);
x
=
simple_strtoul
(
bp
+
11
,
&
bp
,
0
);
if
(
x
<
DIS_NEVER
||
x
>
DIS_ALWAYS
)
if
(
x
<
DIS_NEVER
||
x
>
DIS_ALWAYS
)
x
=
DIS_ADAPTIVE
;
x
=
DIS_ADAPTIVE
;
hd
->
disconnect
=
x
;
hd
->
disconnect
=
x
;
}
else
if
(
!
strncmp
(
bp
,
"period:"
,
7
))
{
}
else
if
(
!
strncmp
(
bp
,
"period:"
,
7
))
{
x
=
simple_strtoul
(
bp
+
7
,
&
bp
,
0
);
hd
->
default_sx_per
=
hd
->
sx_table
[
round_period
((
unsigned
int
)
x
,
hd
->
sx_table
)].
period_ns
;
}
else
if
(
!
strncmp
(
bp
,
"resync:"
,
7
))
{
set_resync
(
hd
,
(
int
)
simple_strtoul
(
bp
+
7
,
&
bp
,
0
));
}
else
if
(
!
strncmp
(
bp
,
"proc:"
,
5
))
{
hd
->
proc
=
simple_strtoul
(
bp
+
5
,
&
bp
,
0
);
}
else
if
(
!
strncmp
(
bp
,
"nodma:"
,
6
))
{
hd
->
no_dma
=
simple_strtoul
(
bp
+
6
,
&
bp
,
0
);
}
else
if
(
!
strncmp
(
bp
,
"level2:"
,
7
))
{
hd
->
level2
=
simple_strtoul
(
bp
+
7
,
&
bp
,
0
);
}
else
if
(
!
strncmp
(
bp
,
"burst:"
,
6
))
{
hd
->
dma_mode
=
simple_strtol
(
bp
+
6
,
&
bp
,
0
)
?
CTRL_BURST
:
CTRL_DMA
;
}
else
if
(
!
strncmp
(
bp
,
"fast:"
,
5
))
{
x
=
!!
simple_strtol
(
bp
+
5
,
&
bp
,
0
);
if
(
x
!=
hd
->
fast
)
set_resync
(
hd
,
0xff
);
hd
->
fast
=
x
;
}
else
if
(
!
strncmp
(
bp
,
"nosync:"
,
7
))
{
x
=
simple_strtoul
(
bp
+
7
,
&
bp
,
0
);
x
=
simple_strtoul
(
bp
+
7
,
&
bp
,
0
);
hd
->
default_sx_per
=
set_resync
(
hd
,
x
^
hd
->
no_sync
);
hd
->
sx_table
[
round_period
((
unsigned
int
)
x
,
hd
->
no_sync
=
x
;
hd
->
sx_table
)].
period_ns
;
}
else
{
}
else
if
(
!
strncmp
(
bp
,
"resync:"
,
7
))
{
break
;
/* unknown keyword,syntax-error,... */
set_resync
(
hd
,
(
int
)
simple_strtoul
(
bp
+
7
,
&
bp
,
0
));
}
else
if
(
!
strncmp
(
bp
,
"proc:"
,
5
))
{
hd
->
proc
=
simple_strtoul
(
bp
+
5
,
&
bp
,
0
);
}
else
if
(
!
strncmp
(
bp
,
"nodma:"
,
6
))
{
hd
->
no_dma
=
simple_strtoul
(
bp
+
6
,
&
bp
,
0
);
}
else
if
(
!
strncmp
(
bp
,
"level2:"
,
7
))
{
hd
->
level2
=
simple_strtoul
(
bp
+
7
,
&
bp
,
0
);
}
else
if
(
!
strncmp
(
bp
,
"burst:"
,
6
))
{
hd
->
dma_mode
=
simple_strtol
(
bp
+
6
,
&
bp
,
0
)
?
CTRL_BURST
:
CTRL_DMA
;
}
else
if
(
!
strncmp
(
bp
,
"fast:"
,
5
))
{
x
=
!!
simple_strtol
(
bp
+
5
,
&
bp
,
0
);
if
(
x
!=
hd
->
fast
)
set_resync
(
hd
,
0xff
);
hd
->
fast
=
x
;
}
else
if
(
!
strncmp
(
bp
,
"nosync:"
,
7
))
{
x
=
simple_strtoul
(
bp
+
7
,
&
bp
,
0
);
set_resync
(
hd
,
x
^
hd
->
no_sync
);
hd
->
no_sync
=
x
;
}
else
{
break
;
/* unknown keyword,syntax-error,... */
}
}
}
return
len
;
}
}
return
len
;
#else
return
0
;
#endif
}
int
wd33c93_show_info
(
struct
seq_file
*
m
,
struct
Scsi_Host
*
instance
)
{
#ifdef PROC_INTERFACE
struct
WD33C93_hostdata
*
hd
;
struct
scsi_cmnd
*
cmd
;
int
x
;
hd
=
(
struct
WD33C93_hostdata
*
)
instance
->
hostdata
;
spin_lock_irq
(
&
hd
->
lock
);
spin_lock_irq
(
&
hd
->
lock
);
bp
=
buf
;
if
(
hd
->
proc
&
PR_VERSION
)
*
bp
=
'\0'
;
seq_printf
(
m
,
"
\n
Version %s - %s."
,
if
(
hd
->
proc
&
PR_VERSION
)
{
sprintf
(
tbuf
,
"
\n
Version %s - %s."
,
WD33C93_VERSION
,
WD33C93_DATE
);
WD33C93_VERSION
,
WD33C93_DATE
);
strcat
(
bp
,
tbuf
);
}
if
(
hd
->
proc
&
PR_INFO
)
{
if
(
hd
->
proc
&
PR_INFO
)
{
s
printf
(
tbuf
,
"
\n
clock_freq=%02x no_sync=%02x no_dma=%d"
s
eq_printf
(
m
,
"
\n
clock_freq=%02x no_sync=%02x no_dma=%d"
" dma_mode=%02x fast=%d"
,
" dma_mode=%02x fast=%d"
,
hd
->
clock_freq
,
hd
->
no_sync
,
hd
->
no_dma
,
hd
->
dma_mode
,
hd
->
fast
);
hd
->
clock_freq
,
hd
->
no_sync
,
hd
->
no_dma
,
hd
->
dma_mode
,
hd
->
fast
);
strcat
(
bp
,
tbuf
);
seq_printf
(
m
,
"
\n
sync_xfer[] = "
);
strcat
(
bp
,
"
\n
sync_xfer[] = "
);
for
(
x
=
0
;
x
<
7
;
x
++
)
for
(
x
=
0
;
x
<
7
;
x
++
)
{
seq_printf
(
m
,
"
\t
%02x"
,
hd
->
sync_xfer
[
x
]);
sprintf
(
tbuf
,
"
\t
%02x"
,
hd
->
sync_xfer
[
x
]);
seq_printf
(
m
,
"
\n
sync_stat[] = "
);
strcat
(
bp
,
tbuf
);
for
(
x
=
0
;
x
<
7
;
x
++
)
}
seq_printf
(
m
,
"
\t
%02x"
,
hd
->
sync_stat
[
x
]);
strcat
(
bp
,
"
\n
sync_stat[] = "
);
for
(
x
=
0
;
x
<
7
;
x
++
)
{
sprintf
(
tbuf
,
"
\t
%02x"
,
hd
->
sync_stat
[
x
]);
strcat
(
bp
,
tbuf
);
}
}
}
#ifdef PROC_STATISTICS
#ifdef PROC_STATISTICS
if
(
hd
->
proc
&
PR_STATISTICS
)
{
if
(
hd
->
proc
&
PR_STATISTICS
)
{
strcat
(
bp
,
"
\n
commands issued: "
);
seq_printf
(
m
,
"
\n
commands issued: "
);
for
(
x
=
0
;
x
<
7
;
x
++
)
{
for
(
x
=
0
;
x
<
7
;
x
++
)
sprintf
(
tbuf
,
"
\t
%ld"
,
hd
->
cmd_cnt
[
x
]);
seq_printf
(
m
,
"
\t
%ld"
,
hd
->
cmd_cnt
[
x
]);
strcat
(
bp
,
tbuf
);
seq_printf
(
m
,
"
\n
disconnects allowed:"
);
}
for
(
x
=
0
;
x
<
7
;
x
++
)
strcat
(
bp
,
"
\n
disconnects allowed:"
);
seq_printf
(
m
,
"
\t
%ld"
,
hd
->
disc_allowed_cnt
[
x
]);
for
(
x
=
0
;
x
<
7
;
x
++
)
{
seq_printf
(
m
,
"
\n
disconnects done: "
);
sprintf
(
tbuf
,
"
\t
%ld"
,
hd
->
disc_allowed_cnt
[
x
]);
for
(
x
=
0
;
x
<
7
;
x
++
)
strcat
(
bp
,
tbuf
);
seq_printf
(
m
,
"
\t
%ld"
,
hd
->
disc_done_cnt
[
x
]);
}
seq_printf
(
m
,
strcat
(
bp
,
"
\n
disconnects done: "
);
for
(
x
=
0
;
x
<
7
;
x
++
)
{
sprintf
(
tbuf
,
"
\t
%ld"
,
hd
->
disc_done_cnt
[
x
]);
strcat
(
bp
,
tbuf
);
}
sprintf
(
tbuf
,
"
\n
interrupts: %ld, DATA_PHASE ints: %ld DMA, %ld PIO"
,
"
\n
interrupts: %ld, DATA_PHASE ints: %ld DMA, %ld PIO"
,
hd
->
int_cnt
,
hd
->
dma_cnt
,
hd
->
pio_cnt
);
hd
->
int_cnt
,
hd
->
dma_cnt
,
hd
->
pio_cnt
);
strcat
(
bp
,
tbuf
);
}
}
#endif
#endif
if
(
hd
->
proc
&
PR_CONNECTED
)
{
if
(
hd
->
proc
&
PR_CONNECTED
)
{
s
trcat
(
bp
,
"
\n
connected: "
);
s
eq_printf
(
m
,
"
\n
connected: "
);
if
(
hd
->
connected
)
{
if
(
hd
->
connected
)
{
cmd
=
(
struct
scsi_cmnd
*
)
hd
->
connected
;
cmd
=
(
struct
scsi_cmnd
*
)
hd
->
connected
;
s
printf
(
tbuf
,
" %d:%d(%02x)"
,
s
eq_printf
(
m
,
" %d:%d(%02x)"
,
cmd
->
device
->
id
,
cmd
->
device
->
lun
,
cmd
->
cmnd
[
0
]);
cmd
->
device
->
id
,
cmd
->
device
->
lun
,
cmd
->
cmnd
[
0
]);
strcat
(
bp
,
tbuf
);
}
}
}
}
if
(
hd
->
proc
&
PR_INPUTQ
)
{
if
(
hd
->
proc
&
PR_INPUTQ
)
{
s
trcat
(
bp
,
"
\n
input_Q: "
);
s
eq_printf
(
m
,
"
\n
input_Q: "
);
cmd
=
(
struct
scsi_cmnd
*
)
hd
->
input_Q
;
cmd
=
(
struct
scsi_cmnd
*
)
hd
->
input_Q
;
while
(
cmd
)
{
while
(
cmd
)
{
s
printf
(
tbuf
,
" %d:%d(%02x)"
,
s
eq_printf
(
m
,
" %d:%d(%02x)"
,
cmd
->
device
->
id
,
cmd
->
device
->
lun
,
cmd
->
cmnd
[
0
]);
cmd
->
device
->
id
,
cmd
->
device
->
lun
,
cmd
->
cmnd
[
0
]);
strcat
(
bp
,
tbuf
);
cmd
=
(
struct
scsi_cmnd
*
)
cmd
->
host_scribble
;
cmd
=
(
struct
scsi_cmnd
*
)
cmd
->
host_scribble
;
}
}
}
}
if
(
hd
->
proc
&
PR_DISCQ
)
{
if
(
hd
->
proc
&
PR_DISCQ
)
{
s
trcat
(
bp
,
"
\n
disconnected_Q:"
);
s
eq_printf
(
m
,
"
\n
disconnected_Q:"
);
cmd
=
(
struct
scsi_cmnd
*
)
hd
->
disconnected_Q
;
cmd
=
(
struct
scsi_cmnd
*
)
hd
->
disconnected_Q
;
while
(
cmd
)
{
while
(
cmd
)
{
s
printf
(
tbuf
,
" %d:%d(%02x)"
,
s
eq_printf
(
m
,
" %d:%d(%02x)"
,
cmd
->
device
->
id
,
cmd
->
device
->
lun
,
cmd
->
cmnd
[
0
]);
cmd
->
device
->
id
,
cmd
->
device
->
lun
,
cmd
->
cmnd
[
0
]);
strcat
(
bp
,
tbuf
);
cmd
=
(
struct
scsi_cmnd
*
)
cmd
->
host_scribble
;
cmd
=
(
struct
scsi_cmnd
*
)
cmd
->
host_scribble
;
}
}
}
}
s
trcat
(
bp
,
"
\n
"
);
s
eq_printf
(
m
,
"
\n
"
);
spin_unlock_irq
(
&
hd
->
lock
);
spin_unlock_irq
(
&
hd
->
lock
);
*
start
=
buf
;
if
(
stop
)
{
stop
=
0
;
return
0
;
}
if
(
off
>
0x40000
)
/* ALWAYS stop after 256k bytes have been read */
stop
=
1
;
if
(
hd
->
proc
&
PR_STOP
)
/* stop every other time */
stop
=
1
;
return
strlen
(
bp
);
#else
/* PROC_INTERFACE */
return
0
;
#endif
/* PROC_INTERFACE */
#endif
/* PROC_INTERFACE */
return
0
;
}
}
EXPORT_SYMBOL
(
wd33c93_host_reset
);
EXPORT_SYMBOL
(
wd33c93_host_reset
);
...
@@ -2229,4 +2202,5 @@ EXPORT_SYMBOL(wd33c93_init);
...
@@ -2229,4 +2202,5 @@ EXPORT_SYMBOL(wd33c93_init);
EXPORT_SYMBOL
(
wd33c93_abort
);
EXPORT_SYMBOL
(
wd33c93_abort
);
EXPORT_SYMBOL
(
wd33c93_queuecommand
);
EXPORT_SYMBOL
(
wd33c93_queuecommand
);
EXPORT_SYMBOL
(
wd33c93_intr
);
EXPORT_SYMBOL
(
wd33c93_intr
);
EXPORT_SYMBOL
(
wd33c93_proc_info
);
EXPORT_SYMBOL
(
wd33c93_show_info
);
EXPORT_SYMBOL
(
wd33c93_write_info
);
drivers/scsi/wd33c93.h
View file @
408bb25b
...
@@ -345,7 +345,8 @@ void wd33c93_init (struct Scsi_Host *instance, const wd33c93_regs regs,
...
@@ -345,7 +345,8 @@ void wd33c93_init (struct Scsi_Host *instance, const wd33c93_regs regs,
int
wd33c93_abort
(
struct
scsi_cmnd
*
cmd
);
int
wd33c93_abort
(
struct
scsi_cmnd
*
cmd
);
int
wd33c93_queuecommand
(
struct
Scsi_Host
*
h
,
struct
scsi_cmnd
*
cmd
);
int
wd33c93_queuecommand
(
struct
Scsi_Host
*
h
,
struct
scsi_cmnd
*
cmd
);
void
wd33c93_intr
(
struct
Scsi_Host
*
instance
);
void
wd33c93_intr
(
struct
Scsi_Host
*
instance
);
int
wd33c93_proc_info
(
struct
Scsi_Host
*
,
char
*
,
char
**
,
off_t
,
int
,
int
);
int
wd33c93_show_info
(
struct
seq_file
*
,
struct
Scsi_Host
*
);
int
wd33c93_write_info
(
struct
Scsi_Host
*
,
char
*
,
int
);
int
wd33c93_host_reset
(
struct
scsi_cmnd
*
);
int
wd33c93_host_reset
(
struct
scsi_cmnd
*
);
#endif
/* WD33C93_H */
#endif
/* WD33C93_H */
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