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
b3ed4bc0
Commit
b3ed4bc0
authored
Oct 28, 2008
by
David S. Miller
Browse files
Options
Browse Files
Download
Plain Diff
Merge branch 'davem-fixes' of master.kernel.org:/pub/scm/linux/kernel/git/jgarzik/netdev-2.6
parents
ea2d8b59
753dcfee
Changes
14
Hide whitespace changes
Inline
Side-by-side
Showing
14 changed files
with
106 additions
and
54 deletions
+106
-54
drivers/net/ehea/ehea.h
drivers/net/ehea/ehea.h
+1
-1
drivers/net/ehea/ehea_qmr.c
drivers/net/ehea/ehea_qmr.c
+52
-5
drivers/net/ehea/ehea_qmr.h
drivers/net/ehea/ehea_qmr.h
+3
-0
drivers/net/ibm_newemac/core.c
drivers/net/ibm_newemac/core.c
+1
-1
drivers/net/mlx4/en_main.c
drivers/net/mlx4/en_main.c
+0
-1
drivers/net/mlx4/fw.c
drivers/net/mlx4/fw.c
+1
-1
drivers/net/tulip/dmfe.c
drivers/net/tulip/dmfe.c
+11
-1
drivers/net/usb/dm9601.c
drivers/net/usb/dm9601.c
+15
-0
drivers/net/via-velocity.c
drivers/net/via-velocity.c
+7
-4
drivers/net/wan/syncppp.c
drivers/net/wan/syncppp.c
+3
-2
drivers/s390/net/qeth_core_main.c
drivers/s390/net/qeth_core_main.c
+2
-1
drivers/s390/net/qeth_l2_main.c
drivers/s390/net/qeth_l2_main.c
+9
-18
drivers/s390/net/qeth_l3_main.c
drivers/s390/net/qeth_l3_main.c
+1
-12
drivers/s390/net/qeth_l3_sys.c
drivers/s390/net/qeth_l3_sys.c
+0
-7
No files found.
drivers/net/ehea/ehea.h
View file @
b3ed4bc0
...
...
@@ -40,7 +40,7 @@
#include <asm/io.h>
#define DRV_NAME "ehea"
#define DRV_VERSION "EHEA_009
4
"
#define DRV_VERSION "EHEA_009
5
"
/* eHEA capability flags */
#define DLPAR_PORT_ADD_REM 1
...
...
drivers/net/ehea/ehea_qmr.c
View file @
b3ed4bc0
...
...
@@ -632,10 +632,13 @@ static void ehea_rebuild_busmap(void)
}
}
static
int
ehea_update_busmap
(
unsigned
long
pfn
,
unsigned
long
pgnum
,
int
add
)
static
int
ehea_update_busmap
(
unsigned
long
pfn
,
unsigned
long
nr_pages
,
int
add
)
{
unsigned
long
i
,
start_section
,
end_section
;
if
(
!
nr_pages
)
return
0
;
if
(
!
ehea_bmap
)
{
ehea_bmap
=
kzalloc
(
sizeof
(
struct
ehea_bmap
),
GFP_KERNEL
);
if
(
!
ehea_bmap
)
...
...
@@ -643,7 +646,7 @@ static int ehea_update_busmap(unsigned long pfn, unsigned long pgnum, int add)
}
start_section
=
(
pfn
*
PAGE_SIZE
)
/
EHEA_SECTSIZE
;
end_section
=
start_section
+
((
pgnum
*
PAGE_SIZE
)
/
EHEA_SECTSIZE
);
end_section
=
start_section
+
((
nr_pages
*
PAGE_SIZE
)
/
EHEA_SECTSIZE
);
/* Mark entries as valid or invalid only; address is assigned later */
for
(
i
=
start_section
;
i
<
end_section
;
i
++
)
{
u64
flag
;
...
...
@@ -692,10 +695,54 @@ int ehea_rem_sect_bmap(unsigned long pfn, unsigned long nr_pages)
return
ret
;
}
static
int
ehea_create_busmap_callback
(
unsigned
long
pfn
,
unsigned
long
nr_pages
,
void
*
arg
)
static
int
ehea_is_hugepage
(
unsigned
long
pfn
)
{
int
page_order
;
if
(
pfn
&
EHEA_HUGEPAGE_PFN_MASK
)
return
0
;
page_order
=
compound_order
(
pfn_to_page
(
pfn
));
if
(
page_order
+
PAGE_SHIFT
!=
EHEA_HUGEPAGESHIFT
)
return
0
;
return
1
;
}
static
int
ehea_create_busmap_callback
(
unsigned
long
initial_pfn
,
unsigned
long
total_nr_pages
,
void
*
arg
)
{
return
ehea_update_busmap
(
pfn
,
nr_pages
,
EHEA_BUSMAP_ADD_SECT
);
int
ret
;
unsigned
long
pfn
,
start_pfn
,
end_pfn
,
nr_pages
;
if
((
total_nr_pages
*
PAGE_SIZE
)
<
EHEA_HUGEPAGE_SIZE
)
return
ehea_update_busmap
(
initial_pfn
,
total_nr_pages
,
EHEA_BUSMAP_ADD_SECT
);
/* Given chunk is >= 16GB -> check for hugepages */
start_pfn
=
initial_pfn
;
end_pfn
=
initial_pfn
+
total_nr_pages
;
pfn
=
start_pfn
;
while
(
pfn
<
end_pfn
)
{
if
(
ehea_is_hugepage
(
pfn
))
{
/* Add mem found in front of the hugepage */
nr_pages
=
pfn
-
start_pfn
;
ret
=
ehea_update_busmap
(
start_pfn
,
nr_pages
,
EHEA_BUSMAP_ADD_SECT
);
if
(
ret
)
return
ret
;
/* Skip the hugepage */
pfn
+=
(
EHEA_HUGEPAGE_SIZE
/
PAGE_SIZE
);
start_pfn
=
pfn
;
}
else
pfn
+=
(
EHEA_SECTSIZE
/
PAGE_SIZE
);
}
/* Add mem found behind the hugepage(s) */
nr_pages
=
pfn
-
start_pfn
;
return
ehea_update_busmap
(
start_pfn
,
nr_pages
,
EHEA_BUSMAP_ADD_SECT
);
}
int
ehea_create_busmap
(
void
)
...
...
drivers/net/ehea/ehea_qmr.h
View file @
b3ed4bc0
...
...
@@ -40,6 +40,9 @@
#define EHEA_PAGESIZE (1UL << EHEA_PAGESHIFT)
#define EHEA_SECTSIZE (1UL << 24)
#define EHEA_PAGES_PER_SECTION (EHEA_SECTSIZE >> EHEA_PAGESHIFT)
#define EHEA_HUGEPAGESHIFT 34
#define EHEA_HUGEPAGE_SIZE (1UL << EHEA_HUGEPAGESHIFT)
#define EHEA_HUGEPAGE_PFN_MASK ((EHEA_HUGEPAGE_SIZE - 1) >> PAGE_SHIFT)
#if ((1UL << SECTION_SIZE_BITS) < EHEA_SECTSIZE)
#error eHEA module cannot work if kernel sectionsize < ehea sectionsize
...
...
drivers/net/ibm_newemac/core.c
View file @
b3ed4bc0
...
...
@@ -2605,7 +2605,7 @@ static int __devinit emac_init_config(struct emac_instance *dev)
of_device_is_compatible
(
np
,
"ibm,emac-440gr"
))
dev
->
features
|=
EMAC_FTR_440EP_PHY_CLK_FIX
;
if
(
of_device_is_compatible
(
np
,
"ibm,emac-405ez"
))
{
#ifdef CONFIG_IBM_NEW_EMAC_NO_FLOW_C
ONTRO
L
#ifdef CONFIG_IBM_NEW_EMAC_NO_FLOW_C
TR
L
dev
->
features
|=
EMAC_FTR_NO_FLOW_CONTROL_40x
;
#else
printk
(
KERN_ERR
"%s: Flow control not disabled!
\n
"
,
...
...
drivers/net/mlx4/en_main.c
View file @
b3ed4bc0
...
...
@@ -35,7 +35,6 @@
#include <linux/module.h>
#include <linux/delay.h>
#include <linux/netdevice.h>
#include <linux/cpumask.h>
#include <linux/mlx4/driver.h>
#include <linux/mlx4/device.h>
...
...
drivers/net/mlx4/fw.c
View file @
b3ed4bc0
...
...
@@ -360,9 +360,9 @@ int mlx4_QUERY_DEV_CAP(struct mlx4_dev *dev, struct mlx4_dev_cap *dev_cap)
#define QUERY_PORT_ETH_MTU_OFFSET 0x02
#define QUERY_PORT_WIDTH_OFFSET 0x06
#define QUERY_PORT_MAX_GID_PKEY_OFFSET 0x07
#define QUERY_PORT_MAC_OFFSET 0x08
#define QUERY_PORT_MAX_MACVLAN_OFFSET 0x0a
#define QUERY_PORT_MAX_VL_OFFSET 0x0b
#define QUERY_PORT_MAC_OFFSET 0x10
for
(
i
=
1
;
i
<=
dev_cap
->
num_ports
;
++
i
)
{
err
=
mlx4_cmd_box
(
dev
,
0
,
mailbox
->
dma
,
i
,
0
,
MLX4_CMD_QUERY_PORT
,
...
...
drivers/net/tulip/dmfe.c
View file @
b3ed4bc0
...
...
@@ -420,9 +420,13 @@ static int __devinit dmfe_init_one (struct pci_dev *pdev,
/* Allocate Tx/Rx descriptor memory */
db
->
desc_pool_ptr
=
pci_alloc_consistent
(
pdev
,
sizeof
(
struct
tx_desc
)
*
DESC_ALL_CNT
+
0x20
,
&
db
->
desc_pool_dma_ptr
);
if
(
!
db
->
desc_pool_ptr
)
goto
err_out_res
;
db
->
buf_pool_ptr
=
pci_alloc_consistent
(
pdev
,
TX_BUF_ALLOC
*
TX_DESC_CNT
+
4
,
&
db
->
buf_pool_dma_ptr
);
if
(
!
db
->
buf_pool_ptr
)
goto
err_out_free_desc
;
db
->
first_tx_desc
=
(
struct
tx_desc
*
)
db
->
desc_pool_ptr
;
db
->
first_tx_desc_dma
=
db
->
desc_pool_dma_ptr
;
...
...
@@ -469,7 +473,7 @@ static int __devinit dmfe_init_one (struct pci_dev *pdev,
err
=
register_netdev
(
dev
);
if
(
err
)
goto
err_out_
res
;
goto
err_out_
free_buf
;
printk
(
KERN_INFO
"%s: Davicom DM%04lx at pci%s, "
"%s, irq %d.
\n
"
,
...
...
@@ -483,6 +487,12 @@ static int __devinit dmfe_init_one (struct pci_dev *pdev,
return
0
;
err_out_free_buf:
pci_free_consistent
(
pdev
,
TX_BUF_ALLOC
*
TX_DESC_CNT
+
4
,
db
->
buf_pool_ptr
,
db
->
buf_pool_dma_ptr
);
err_out_free_desc:
pci_free_consistent
(
pdev
,
sizeof
(
struct
tx_desc
)
*
DESC_ALL_CNT
+
0x20
,
db
->
desc_pool_ptr
,
db
->
desc_pool_dma_ptr
);
err_out_res:
pci_release_regions
(
pdev
);
err_out_disable:
...
...
drivers/net/usb/dm9601.c
View file @
b3ed4bc0
...
...
@@ -396,6 +396,20 @@ static void dm9601_set_multicast(struct net_device *net)
dm_write_reg_async
(
dev
,
DM_RX_CTRL
,
rx_ctl
);
}
static
int
dm9601_set_mac_address
(
struct
net_device
*
net
,
void
*
p
)
{
struct
sockaddr
*
addr
=
p
;
struct
usbnet
*
dev
=
netdev_priv
(
net
);
if
(
!
is_valid_ether_addr
(
addr
->
sa_data
))
return
-
EINVAL
;
memcpy
(
net
->
dev_addr
,
addr
->
sa_data
,
net
->
addr_len
);
dm_write_async
(
dev
,
DM_PHY_ADDR
,
net
->
addr_len
,
net
->
dev_addr
);
return
0
;
}
static
int
dm9601_bind
(
struct
usbnet
*
dev
,
struct
usb_interface
*
intf
)
{
int
ret
;
...
...
@@ -406,6 +420,7 @@ static int dm9601_bind(struct usbnet *dev, struct usb_interface *intf)
dev
->
net
->
do_ioctl
=
dm9601_ioctl
;
dev
->
net
->
set_multicast_list
=
dm9601_set_multicast
;
dev
->
net
->
set_mac_address
=
dm9601_set_mac_address
;
dev
->
net
->
ethtool_ops
=
&
dm9601_ethtool_ops
;
dev
->
net
->
hard_header_len
+=
DM_TX_OVERHEAD
;
dev
->
hard_mtu
=
dev
->
net
->
mtu
+
dev
->
net
->
hard_header_len
;
...
...
drivers/net/via-velocity.c
View file @
b3ed4bc0
...
...
@@ -521,7 +521,7 @@ static void __devexit velocity_remove1(struct pci_dev *pdev)
* we don't duplicate code for each option.
*/
static
void
__devinit
velocity_set_int_opt
(
int
*
opt
,
int
val
,
int
min
,
int
max
,
int
def
,
char
*
name
,
char
*
devname
)
static
void
__devinit
velocity_set_int_opt
(
int
*
opt
,
int
val
,
int
min
,
int
max
,
int
def
,
char
*
name
,
c
onst
c
har
*
devname
)
{
if
(
val
==
-
1
)
*
opt
=
def
;
...
...
@@ -550,7 +550,7 @@ static void __devinit velocity_set_int_opt(int *opt, int val, int min, int max,
* we don't duplicate code for each option.
*/
static
void
__devinit
velocity_set_bool_opt
(
u32
*
opt
,
int
val
,
int
def
,
u32
flag
,
char
*
name
,
char
*
devname
)
static
void
__devinit
velocity_set_bool_opt
(
u32
*
opt
,
int
val
,
int
def
,
u32
flag
,
char
*
name
,
c
onst
c
har
*
devname
)
{
(
*
opt
)
&=
(
~
flag
);
if
(
val
==
-
1
)
...
...
@@ -576,7 +576,7 @@ static void __devinit velocity_set_bool_opt(u32 * opt, int val, int def, u32 fla
* for the current device
*/
static
void
__devinit
velocity_get_options
(
struct
velocity_opt
*
opts
,
int
index
,
char
*
devname
)
static
void
__devinit
velocity_get_options
(
struct
velocity_opt
*
opts
,
int
index
,
c
onst
c
har
*
devname
)
{
velocity_set_int_opt
(
&
opts
->
rx_thresh
,
rx_thresh
[
index
],
RX_THRESH_MIN
,
RX_THRESH_MAX
,
RX_THRESH_DEF
,
"rx_thresh"
,
devname
);
...
...
@@ -863,6 +863,7 @@ static int __devinit velocity_found1(struct pci_dev *pdev, const struct pci_devi
static
int
first
=
1
;
struct
net_device
*
dev
;
int
i
;
const
char
*
drv_string
;
const
struct
velocity_info_tbl
*
info
=
&
chip_info_table
[
ent
->
driver_data
];
struct
velocity_info
*
vptr
;
struct
mac_regs
__iomem
*
regs
;
...
...
@@ -935,7 +936,9 @@ static int __devinit velocity_found1(struct pci_dev *pdev, const struct pci_devi
dev
->
dev_addr
[
i
]
=
readb
(
&
regs
->
PAR
[
i
]);
velocity_get_options
(
&
vptr
->
options
,
velocity_nics
,
dev
->
name
);
drv_string
=
dev_driver_string
(
&
pdev
->
dev
);
velocity_get_options
(
&
vptr
->
options
,
velocity_nics
,
drv_string
);
/*
* Mask out the options cannot be set to the chip
...
...
drivers/net/wan/syncppp.c
View file @
b3ed4bc0
...
...
@@ -756,10 +756,11 @@ static void sppp_cisco_input (struct sppp *sp, struct sk_buff *skb)
case
CISCO_ADDR_REQ
:
/* Stolen from net/ipv4/devinet.c -- SIOCGIFADDR ioctl */
{
struct
in_device
*
in_dev
;
struct
in_ifaddr
*
ifa
;
__be32
addr
=
0
,
mask
=
htonl
(
~
0U
);
/* FIXME: is the mask correct? */
#ifdef CONFIG_INET
struct
in_device
*
in_dev
;
struct
in_ifaddr
*
ifa
;
rcu_read_lock
();
if
((
in_dev
=
__in_dev_get_rcu
(
dev
))
!=
NULL
)
{
...
...
drivers/s390/net/qeth_core_main.c
View file @
b3ed4bc0
...
...
@@ -3025,7 +3025,7 @@ static inline void __qeth_fill_buffer(struct sk_buff *skb,
struct
qdio_buffer
*
buffer
,
int
is_tso
,
int
*
next_element_to_fill
,
int
offset
)
{
int
length
=
skb
->
len
-
offset
;
int
length
=
skb
->
len
;
int
length_here
;
int
element
;
char
*
data
;
...
...
@@ -3037,6 +3037,7 @@ static inline void __qeth_fill_buffer(struct sk_buff *skb,
if
(
offset
>=
0
)
{
data
=
skb
->
data
+
offset
;
length
-=
offset
;
first_lap
=
0
;
}
...
...
drivers/s390/net/qeth_l2_main.c
View file @
b3ed4bc0
...
...
@@ -373,8 +373,6 @@ static int qeth_l2_stop_card(struct qeth_card *card, int recovery_mode)
QETH_DBF_HEX
(
SETUP
,
2
,
&
card
,
sizeof
(
void
*
));
qeth_set_allowed_threads
(
card
,
0
,
1
);
if
(
qeth_wait_for_threads
(
card
,
~
QETH_RECOVER_THREAD
))
return
-
ERESTARTSYS
;
if
(
card
->
read
.
state
==
CH_STATE_UP
&&
card
->
write
.
state
==
CH_STATE_UP
&&
(
card
->
state
==
CARD_STATE_UP
))
{
...
...
@@ -451,12 +449,15 @@ static void qeth_l2_process_inbound_buffer(struct qeth_card *card,
netif_rx
(
skb
);
break
;
case
QETH_HEADER_TYPE_OSN
:
skb_push
(
skb
,
sizeof
(
struct
qeth_hdr
));
skb_copy_to_linear_data
(
skb
,
hdr
,
if
(
card
->
info
.
type
==
QETH_CARD_TYPE_OSN
)
{
skb_push
(
skb
,
sizeof
(
struct
qeth_hdr
));
skb_copy_to_linear_data
(
skb
,
hdr
,
sizeof
(
struct
qeth_hdr
));
len
=
skb
->
len
;
card
->
osn_info
.
data_cb
(
skb
);
break
;
len
=
skb
->
len
;
card
->
osn_info
.
data_cb
(
skb
);
break
;
}
/* else unknown */
default:
dev_kfree_skb_any
(
skb
);
QETH_DBF_TEXT
(
TRACE
,
3
,
"inbunkno"
);
...
...
@@ -975,12 +976,6 @@ static int __qeth_l2_set_online(struct ccwgroup_device *gdev, int recovery_mode)
QETH_DBF_HEX
(
SETUP
,
2
,
&
card
,
sizeof
(
void
*
));
qeth_set_allowed_threads
(
card
,
QETH_RECOVER_THREAD
,
1
);
if
(
qeth_wait_for_threads
(
card
,
~
QETH_RECOVER_THREAD
))
{
PRINT_WARN
(
"set_online of card %s interrupted by user!
\n
"
,
CARD_BUS_ID
(
card
));
return
-
ERESTARTSYS
;
}
recover_flag
=
card
->
state
;
rc
=
ccw_device_set_online
(
CARD_RDEV
(
card
));
if
(
rc
)
{
...
...
@@ -1091,11 +1086,7 @@ static int __qeth_l2_set_offline(struct ccwgroup_device *cgdev,
if
(
card
->
dev
&&
netif_carrier_ok
(
card
->
dev
))
netif_carrier_off
(
card
->
dev
);
recover_flag
=
card
->
state
;
if
(
qeth_l2_stop_card
(
card
,
recovery_mode
)
==
-
ERESTARTSYS
)
{
PRINT_WARN
(
"Stopping card %s interrupted by user!
\n
"
,
CARD_BUS_ID
(
card
));
return
-
ERESTARTSYS
;
}
qeth_l2_stop_card
(
card
,
recovery_mode
);
rc
=
ccw_device_set_offline
(
CARD_DDEV
(
card
));
rc2
=
ccw_device_set_offline
(
CARD_WDEV
(
card
));
rc3
=
ccw_device_set_offline
(
CARD_RDEV
(
card
));
...
...
drivers/s390/net/qeth_l3_main.c
View file @
b3ed4bc0
...
...
@@ -2064,8 +2064,6 @@ static int qeth_l3_stop_card(struct qeth_card *card, int recovery_mode)
QETH_DBF_HEX
(
SETUP
,
2
,
&
card
,
sizeof
(
void
*
));
qeth_set_allowed_threads
(
card
,
0
,
1
);
if
(
qeth_wait_for_threads
(
card
,
~
QETH_RECOVER_THREAD
))
return
-
ERESTARTSYS
;
if
(
card
->
read
.
state
==
CH_STATE_UP
&&
card
->
write
.
state
==
CH_STATE_UP
&&
(
card
->
state
==
CARD_STATE_UP
))
{
...
...
@@ -3049,11 +3047,6 @@ static int __qeth_l3_set_online(struct ccwgroup_device *gdev, int recovery_mode)
QETH_DBF_HEX
(
SETUP
,
2
,
&
card
,
sizeof
(
void
*
));
qeth_set_allowed_threads
(
card
,
QETH_RECOVER_THREAD
,
1
);
if
(
qeth_wait_for_threads
(
card
,
~
QETH_RECOVER_THREAD
))
{
PRINT_WARN
(
"set_online of card %s interrupted by user!
\n
"
,
CARD_BUS_ID
(
card
));
return
-
ERESTARTSYS
;
}
recover_flag
=
card
->
state
;
rc
=
ccw_device_set_online
(
CARD_RDEV
(
card
));
...
...
@@ -3170,11 +3163,7 @@ static int __qeth_l3_set_offline(struct ccwgroup_device *cgdev,
if
(
card
->
dev
&&
netif_carrier_ok
(
card
->
dev
))
netif_carrier_off
(
card
->
dev
);
recover_flag
=
card
->
state
;
if
(
qeth_l3_stop_card
(
card
,
recovery_mode
)
==
-
ERESTARTSYS
)
{
PRINT_WARN
(
"Stopping card %s interrupted by user!
\n
"
,
CARD_BUS_ID
(
card
));
return
-
ERESTARTSYS
;
}
qeth_l3_stop_card
(
card
,
recovery_mode
);
rc
=
ccw_device_set_offline
(
CARD_DDEV
(
card
));
rc2
=
ccw_device_set_offline
(
CARD_WDEV
(
card
));
rc3
=
ccw_device_set_offline
(
CARD_RDEV
(
card
));
...
...
drivers/s390/net/qeth_l3_sys.c
View file @
b3ed4bc0
...
...
@@ -121,9 +121,6 @@ static ssize_t qeth_l3_dev_route6_show(struct device *dev,
if
(
!
card
)
return
-
EINVAL
;
if
(
!
qeth_is_supported
(
card
,
IPA_IPV6
))
return
sprintf
(
buf
,
"%s
\n
"
,
"n/a"
);
return
qeth_l3_dev_route_show
(
card
,
&
card
->
options
.
route6
,
buf
);
}
...
...
@@ -135,10 +132,6 @@ static ssize_t qeth_l3_dev_route6_store(struct device *dev,
if
(
!
card
)
return
-
EINVAL
;
if
(
!
qeth_is_supported
(
card
,
IPA_IPV6
))
{
return
-
EOPNOTSUPP
;
}
return
qeth_l3_dev_route_store
(
card
,
&
card
->
options
.
route6
,
QETH_PROT_IPV6
,
buf
,
count
);
}
...
...
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