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
5d64e2aa
Commit
5d64e2aa
authored
Jun 29, 2003
by
James Morris
Browse files
Options
Browse Files
Download
Plain Diff
Merge kernel.bkbits.net:/home/torvalds/linux-2.5
into kernel.bkbits.net:/home/jmorris/net-2.5
parents
cc621e11
947af82f
Changes
3
Show whitespace changes
Inline
Side-by-side
Showing
3 changed files
with
41 additions
and
49 deletions
+41
-49
drivers/ieee1394/eth1394.c
drivers/ieee1394/eth1394.c
+33
-41
drivers/ieee1394/nodemgr.c
drivers/ieee1394/nodemgr.c
+6
-5
drivers/ieee1394/ohci1394.c
drivers/ieee1394/ohci1394.c
+2
-3
No files found.
drivers/ieee1394/eth1394.c
View file @
5d64e2aa
/*
/*
* eth1394.c -- Ethernet driver for Linux IEEE-1394 Subsystem
* eth1394.c -- Ethernet driver for Linux IEEE-1394 Subsystem
*
*
* Copyright (C) 2001 Ben Collins <bcollins@debian.org>
* Copyright (C) 2001
-2003
Ben Collins <bcollins@debian.org>
* 2000 Bonin Franck <boninf@free.fr>
* 2000 Bonin Franck <boninf@free.fr>
* 2003 Steve Kinneberg <kinnebergsteve@acmsystems.com>
* 2003 Steve Kinneberg <kinnebergsteve@acmsystems.com>
*
*
...
@@ -33,7 +33,7 @@
...
@@ -33,7 +33,7 @@
* - Add MCAP. Limited Multicast exists only to 224.0.0.1 and 224.0.0.2.
* - Add MCAP. Limited Multicast exists only to 224.0.0.1 and 224.0.0.2.
*
*
* Non-RFC 2734 related:
* Non-RFC 2734 related:
* -
Fix bug related to fragmented broadcast datagrams
* -
Handle fragmented skb's coming from the networking layer.
* - Move generic GASP reception to core 1394 code
* - Move generic GASP reception to core 1394 code
* - Convert kmalloc/kfree for link fragments to use kmem_cache_* instead
* - Convert kmalloc/kfree for link fragments to use kmem_cache_* instead
* - Stability improvements
* - Stability improvements
...
@@ -89,7 +89,7 @@
...
@@ -89,7 +89,7 @@
#define TRACE() printk(KERN_ERR "%s:%s[%d] ---- TRACE\n", driver_name, __FUNCTION__, __LINE__)
#define TRACE() printk(KERN_ERR "%s:%s[%d] ---- TRACE\n", driver_name, __FUNCTION__, __LINE__)
static
char
version
[]
__devinitdata
=
static
char
version
[]
__devinitdata
=
"$Rev: 9
71
$ Ben Collins <bcollins@debian.org>"
;
"$Rev: 9
86
$ Ben Collins <bcollins@debian.org>"
;
struct
fragment_info
{
struct
fragment_info
{
struct
list_head
list
;
struct
list_head
list
;
...
@@ -122,6 +122,12 @@ static const int hdr_type_len[] = {
...
@@ -122,6 +122,12 @@ static const int hdr_type_len[] = {
sizeof
(
struct
eth1394_sf_hdr
)
sizeof
(
struct
eth1394_sf_hdr
)
};
};
/* Change this to IEEE1394_SPEED_S100 to make testing easier */
#define ETH1394_SPEED_DEF IEEE1394_SPEED_MAX
/* For now, this needs to be 1500, so that XP works with us */
#define ETH1394_DATA_LEN ETH_DATA_LEN
static
const
u16
eth1394_speedto_maxpayload
[]
=
{
static
const
u16
eth1394_speedto_maxpayload
[]
=
{
/* S100, S200, S400, S800, S1600, S3200 */
/* S100, S200, S400, S800, S1600, S3200 */
512
,
1024
,
2048
,
4096
,
8192
,
16384
512
,
1024
,
2048
,
4096
,
8192
,
16384
...
@@ -167,6 +173,7 @@ static void eth1394_iso_shutdown(struct eth1394_priv *priv)
...
@@ -167,6 +173,7 @@ static void eth1394_iso_shutdown(struct eth1394_priv *priv)
priv
->
bc_state
=
ETHER1394_BC_CLOSED
;
priv
->
bc_state
=
ETHER1394_BC_CLOSED
;
if
(
priv
->
iso
!=
NULL
)
{
if
(
priv
->
iso
!=
NULL
)
{
if
(
!
in_interrupt
())
hpsb_iso_shutdown
(
priv
->
iso
);
hpsb_iso_shutdown
(
priv
->
iso
);
priv
->
iso
=
NULL
;
priv
->
iso
=
NULL
;
}
}
...
@@ -192,7 +199,6 @@ static int ether1394_init_bc(struct net_device *dev)
...
@@ -192,7 +199,6 @@ static int ether1394_init_bc(struct net_device *dev)
"Error BROADCAST_CHANNEL register valid "
"Error BROADCAST_CHANNEL register valid "
"bit not set, can't send IP traffic
\n
"
);
"bit not set, can't send IP traffic
\n
"
);
if
(
!
in_interrupt
())
eth1394_iso_shutdown
(
priv
);
eth1394_iso_shutdown
(
priv
);
return
-
EAGAIN
;
return
-
EAGAIN
;
...
@@ -202,11 +208,11 @@ static int ether1394_init_bc(struct net_device *dev)
...
@@ -202,11 +208,11 @@ static int ether1394_init_bc(struct net_device *dev)
* the IEEE 1394 spec changes regarding broadcast
* the IEEE 1394 spec changes regarding broadcast
* channels in the future. */
* channels in the future. */
eth1394_iso_shutdown
(
priv
);
if
(
in_interrupt
())
if
(
in_interrupt
())
return
-
EAGAIN
;
return
-
EAGAIN
;
eth1394_iso_shutdown
(
priv
);
priv
->
broadcast_channel
=
bc
&
0x3f
;
priv
->
broadcast_channel
=
bc
&
0x3f
;
ETH1394_PRINT
(
KERN_INFO
,
dev
->
name
,
ETH1394_PRINT
(
KERN_INFO
,
dev
->
name
,
"Changing to broadcast channel %d...
\n
"
,
"Changing to broadcast channel %d...
\n
"
,
...
@@ -226,7 +232,6 @@ static int ether1394_init_bc(struct net_device *dev)
...
@@ -226,7 +232,6 @@ static int ether1394_init_bc(struct net_device *dev)
ETH1394_PRINT
(
KERN_ERR
,
dev
->
name
,
ETH1394_PRINT
(
KERN_ERR
,
dev
->
name
,
"Could not start data stream reception
\n
"
);
"Could not start data stream reception
\n
"
);
if
(
!
in_interrupt
())
eth1394_iso_shutdown
(
priv
);
eth1394_iso_shutdown
(
priv
);
return
-
EAGAIN
;
return
-
EAGAIN
;
...
@@ -244,8 +249,10 @@ static int ether1394_open (struct net_device *dev)
...
@@ -244,8 +249,10 @@ static int ether1394_open (struct net_device *dev)
unsigned
long
flags
;
unsigned
long
flags
;
int
ret
;
int
ret
;
/* Set the spinlock before grabbing IRQ! */
/* Something bad happened, don't even try */
priv
->
lock
=
SPIN_LOCK_UNLOCKED
;
if
(
priv
->
bc_state
==
ETHER1394_BC_CLOSED
)
return
-
EAGAIN
;
spin_lock_irqsave
(
&
priv
->
lock
,
flags
);
spin_lock_irqsave
(
&
priv
->
lock
,
flags
);
ret
=
ether1394_init_bc
(
dev
);
ret
=
ether1394_init_bc
(
dev
);
spin_unlock_irqrestore
(
&
priv
->
lock
,
flags
);
spin_unlock_irqrestore
(
&
priv
->
lock
,
flags
);
...
@@ -287,9 +294,8 @@ static int ether1394_change_mtu(struct net_device *dev, int new_mtu)
...
@@ -287,9 +294,8 @@ static int ether1394_change_mtu(struct net_device *dev, int new_mtu)
struct
eth1394_priv
*
priv
=
(
struct
eth1394_priv
*
)
dev
->
priv
;
struct
eth1394_priv
*
priv
=
(
struct
eth1394_priv
*
)
dev
->
priv
;
int
phy_id
=
NODEID_TO_NODE
(
priv
->
host
->
node_id
);
int
phy_id
=
NODEID_TO_NODE
(
priv
->
host
->
node_id
);
if
((
new_mtu
<
68
)
||
(
new_mtu
>
MIN
(
ETH_DATA_LEN
,
(
priv
->
maxpayload
[
phy_id
]
-
if
((
new_mtu
<
68
)
||
(
new_mtu
>
min
(
ETH1394_DATA_LEN
,
(
int
)(
priv
->
maxpayload
[
phy_id
]
-
(
sizeof
(
union
eth1394_hdr
)
+
(
sizeof
(
union
eth1394_hdr
)
+
ETHER1394_GASP_OVERHEAD
)))))
ETHER1394_GASP_OVERHEAD
)))))
return
-
EINVAL
;
return
-
EINVAL
;
dev
->
mtu
=
new_mtu
;
dev
->
mtu
=
new_mtu
;
return
0
;
return
0
;
...
@@ -322,8 +328,7 @@ static void ether1394_reset_priv (struct net_device *dev, int set_mtu)
...
@@ -322,8 +328,7 @@ static void ether1394_reset_priv (struct net_device *dev, int set_mtu)
struct
eth1394_priv
*
priv
=
(
struct
eth1394_priv
*
)
dev
->
priv
;
struct
eth1394_priv
*
priv
=
(
struct
eth1394_priv
*
)
dev
->
priv
;
struct
hpsb_host
*
host
=
priv
->
host
;
struct
hpsb_host
*
host
=
priv
->
host
;
int
phy_id
=
NODEID_TO_NODE
(
host
->
node_id
);
int
phy_id
=
NODEID_TO_NODE
(
host
->
node_id
);
u64
guid
=
(
u64
)(((
u64
)
be32_to_cpu
(
host
->
csr
.
rom
[
3
])
<<
32
)
|
u64
guid
=
*
((
u64
*
)
&
(
host
->
csr
.
rom
[
3
]));
be32_to_cpu
(
host
->
csr
.
rom
[
4
]));
u16
maxpayload
=
1
<<
(((
be32_to_cpu
(
host
->
csr
.
rom
[
2
])
>>
12
)
&
0xf
)
+
1
);
u16
maxpayload
=
1
<<
(((
be32_to_cpu
(
host
->
csr
.
rom
[
2
])
>>
12
)
&
0xf
)
+
1
);
spin_lock_irqsave
(
&
priv
->
lock
,
flags
);
spin_lock_irqsave
(
&
priv
->
lock
,
flags
);
...
@@ -333,15 +338,8 @@ static void ether1394_reset_priv (struct net_device *dev, int set_mtu)
...
@@ -333,15 +338,8 @@ static void ether1394_reset_priv (struct net_device *dev, int set_mtu)
memset
(
priv
->
sspd
,
0
,
sizeof
(
priv
->
sspd
));
memset
(
priv
->
sspd
,
0
,
sizeof
(
priv
->
sspd
));
memset
(
priv
->
fifo
,
0
,
sizeof
(
priv
->
fifo
));
memset
(
priv
->
fifo
,
0
,
sizeof
(
priv
->
fifo
));
#if 1
priv
->
sspd
[
ALL_NODES
]
=
ETH1394_SPEED_DEF
;
/* Compile this out to make testing of fragmented broadcast datagrams
priv
->
maxpayload
[
ALL_NODES
]
=
eth1394_speedto_maxpayload
[
priv
->
sspd
[
ALL_NODES
]];
* easier. */
priv
->
sspd
[
ALL_NODES
]
=
IEEE1394_SPEED_MAX
;
priv
->
maxpayload
[
ALL_NODES
]
=
eth1394_speedto_maxpayload
[
IEEE1394_SPEED_MAX
];
#else
priv
->
sspd
[
ALL_NODES
]
=
IEEE1394_SPEED_100
;
priv
->
maxpayload
[
ALL_NODES
]
=
eth1394_speedto_maxpayload
[
IEEE1394_SPEED_100
];
#endif
priv
->
bc_state
=
ETHER1394_BC_CHECK
;
priv
->
bc_state
=
ETHER1394_BC_CHECK
;
...
@@ -352,9 +350,8 @@ static void ether1394_reset_priv (struct net_device *dev, int set_mtu)
...
@@ -352,9 +350,8 @@ static void ether1394_reset_priv (struct net_device *dev, int set_mtu)
/* We'll use our maxpayload as the default mtu */
/* We'll use our maxpayload as the default mtu */
if
(
set_mtu
)
{
if
(
set_mtu
)
{
dev
->
mtu
=
MIN
(
ETH_DATA_LEN
,
priv
->
maxpayload
[
phy_id
]
-
dev
->
mtu
=
min
(
ETH1394_DATA_LEN
,
(
int
)(
priv
->
maxpayload
[
phy_id
]
-
(
sizeof
(
union
eth1394_hdr
)
+
(
sizeof
(
union
eth1394_hdr
)
+
ETHER1394_GASP_OVERHEAD
)));
ETHER1394_GASP_OVERHEAD
));
/* Set our hardware address while we're at it */
/* Set our hardware address while we're at it */
*
(
u64
*
)
dev
->
dev_addr
=
guid
;
*
(
u64
*
)
dev
->
dev_addr
=
guid
;
...
@@ -444,8 +441,8 @@ static void ether1394_add_host (struct hpsb_host *host)
...
@@ -444,8 +441,8 @@ static void ether1394_add_host (struct hpsb_host *host)
priv
=
(
struct
eth1394_priv
*
)
dev
->
priv
;
priv
=
(
struct
eth1394_priv
*
)
dev
->
priv
;
priv
->
host
=
host
;
spin_lock_init
(
&
priv
->
lock
);
spin_lock_init
(
&
priv
->
lock
);
priv
->
host
=
host
;
for
(
i
=
0
;
i
<
ALL_NODES
;
i
++
)
{
for
(
i
=
0
;
i
<
ALL_NODES
;
i
++
)
{
spin_lock_init
(
&
priv
->
pdg
[
i
].
lock
);
spin_lock_init
(
&
priv
->
pdg
[
i
].
lock
);
...
@@ -501,7 +498,6 @@ static void ether1394_remove_host (struct hpsb_host *host)
...
@@ -501,7 +498,6 @@ static void ether1394_remove_host (struct hpsb_host *host)
if
(
hi
!=
NULL
)
{
if
(
hi
!=
NULL
)
{
struct
eth1394_priv
*
priv
=
(
struct
eth1394_priv
*
)
hi
->
dev
->
priv
;
struct
eth1394_priv
*
priv
=
(
struct
eth1394_priv
*
)
hi
->
dev
->
priv
;
priv
->
bc_state
=
ETHER1394_BC_CLOSED
;
eth1394_iso_shutdown
(
priv
);
eth1394_iso_shutdown
(
priv
);
if
(
hi
->
dev
)
{
if
(
hi
->
dev
)
{
...
@@ -1380,17 +1376,15 @@ static inline void ether1394_dg_complete(struct packet_task *ptask, int fail)
...
@@ -1380,17 +1376,15 @@ static inline void ether1394_dg_complete(struct packet_task *ptask, int fail)
unsigned
long
flags
;
unsigned
long
flags
;
/* Statistics */
/* Statistics */
if
(
fail
)
{
spin_lock_irqsave
(
&
priv
->
lock
,
flags
);
spin_lock_irqsave
(
&
priv
->
lock
,
flags
);
if
(
fail
)
{
priv
->
stats
.
tx_dropped
++
;
priv
->
stats
.
tx_dropped
++
;
priv
->
stats
.
tx_errors
++
;
priv
->
stats
.
tx_errors
++
;
spin_unlock_irqrestore
(
&
priv
->
lock
,
flags
);
}
else
{
}
else
{
spin_lock_irqsave
(
&
priv
->
lock
,
flags
);
priv
->
stats
.
tx_bytes
+=
skb
->
len
;
priv
->
stats
.
tx_bytes
+=
skb
->
len
;
priv
->
stats
.
tx_packets
++
;
priv
->
stats
.
tx_packets
++
;
spin_unlock_irqrestore
(
&
priv
->
lock
,
flags
);
}
}
spin_unlock_irqrestore
(
&
priv
->
lock
,
flags
);
dev_kfree_skb_any
(
skb
);
dev_kfree_skb_any
(
skb
);
kmem_cache_free
(
packet_task_cache
,
ptask
);
kmem_cache_free
(
packet_task_cache
,
ptask
);
...
@@ -1460,12 +1454,10 @@ static int ether1394_tx (struct sk_buff *skb, struct net_device *dev)
...
@@ -1460,12 +1454,10 @@ static int ether1394_tx (struct sk_buff *skb, struct net_device *dev)
goto
fail
;
goto
fail
;
}
}
if
(
priv
->
bc_state
==
ETHER1394_BC_CHECK
)
{
if
((
ret
=
ether1394_init_bc
(
dev
)))
{
if
(
ether1394_init_bc
(
dev
))
{
spin_unlock_irqrestore
(
&
priv
->
lock
,
flags
);
spin_unlock_irqrestore
(
&
priv
->
lock
,
flags
);
goto
fail
;
goto
fail
;
}
}
}
spin_unlock_irqrestore
(
&
priv
->
lock
,
flags
);
spin_unlock_irqrestore
(
&
priv
->
lock
,
flags
);
...
@@ -1608,7 +1600,7 @@ static int ether1394_ethtool_ioctl(struct net_device *dev, void *useraddr)
...
@@ -1608,7 +1600,7 @@ static int ether1394_ethtool_ioctl(struct net_device *dev, void *useraddr)
case
ETHTOOL_GDRVINFO
:
{
case
ETHTOOL_GDRVINFO
:
{
struct
ethtool_drvinfo
info
=
{
ETHTOOL_GDRVINFO
};
struct
ethtool_drvinfo
info
=
{
ETHTOOL_GDRVINFO
};
strcpy
(
info
.
driver
,
driver_name
);
strcpy
(
info
.
driver
,
driver_name
);
strcpy
(
info
.
version
,
"$Rev: 9
71
$"
);
strcpy
(
info
.
version
,
"$Rev: 9
86
$"
);
/* FIXME XXX provide sane businfo */
/* FIXME XXX provide sane businfo */
strcpy
(
info
.
bus_info
,
"ieee1394"
);
strcpy
(
info
.
bus_info
,
"ieee1394"
);
if
(
copy_to_user
(
useraddr
,
&
info
,
sizeof
(
info
)))
if
(
copy_to_user
(
useraddr
,
&
info
,
sizeof
(
info
)))
...
...
drivers/ieee1394/nodemgr.c
View file @
5d64e2aa
...
@@ -1303,8 +1303,9 @@ static void nodemgr_update_node(struct node_entry *ne, quadlet_t busoptions,
...
@@ -1303,8 +1303,9 @@ static void nodemgr_update_node(struct node_entry *ne, quadlet_t busoptions,
snprintf
(
ne
->
device
.
name
,
DEVICE_NAME_SIZE
,
snprintf
(
ne
->
device
.
name
,
DEVICE_NAME_SIZE
,
"IEEE-1394 device %d-"
NODE_BUS_FMT
,
"IEEE-1394 device %d-"
NODE_BUS_FMT
,
hi
->
host
->
id
,
NODE_BUS_ARGS
(
ne
->
nodeid
));
hi
->
host
->
id
,
NODE_BUS_ARGS
(
ne
->
nodeid
));
HPSB_DEBUG
(
"Node "
NODE_BUS_FMT
" changed to "
NODE_BUS_FMT
,
HPSB_DEBUG
(
"Node changed: %d-"
NODE_BUS_FMT
" -> %d-"
NODE_BUS_FMT
,
NODE_BUS_ARGS
(
ne
->
nodeid
),
NODE_BUS_ARGS
(
nodeid
));
ne
->
host
->
id
,
NODE_BUS_ARGS
(
ne
->
nodeid
),
ne
->
host
->
id
,
NODE_BUS_ARGS
(
nodeid
));
ne
->
nodeid
=
nodeid
;
ne
->
nodeid
=
nodeid
;
update_ud_names
++
;
update_ud_names
++
;
...
@@ -1507,8 +1508,8 @@ static void nodemgr_node_probe(struct host_info *hi, int generation)
...
@@ -1507,8 +1508,8 @@ static void nodemgr_node_probe(struct host_info *hi, int generation)
nodemgr_remove_node
))
{
nodemgr_remove_node
))
{
struct
node_entry
*
ne
=
cleanup
.
ne
;
struct
node_entry
*
ne
=
cleanup
.
ne
;
HPSB_DEBUG
(
"
Device removed: ID:BUS[
"
NODE_BUS_FMT
"] GUID[%016Lx]"
,
HPSB_DEBUG
(
"
Node removed: ID:BUS[%d-
"
NODE_BUS_FMT
"] GUID[%016Lx]"
,
NODE_BUS_ARGS
(
ne
->
nodeid
),
(
unsigned
long
long
)
ne
->
guid
);
host
->
id
,
NODE_BUS_ARGS
(
ne
->
nodeid
),
(
unsigned
long
long
)
ne
->
guid
);
nodemgr_remove_ne
(
ne
);
nodemgr_remove_ne
(
ne
);
}
}
...
@@ -1782,7 +1783,7 @@ static void nodemgr_host_reset(struct hpsb_host *host)
...
@@ -1782,7 +1783,7 @@ static void nodemgr_host_reset(struct hpsb_host *host)
if
(
hi
!=
NULL
)
{
if
(
hi
!=
NULL
)
{
#ifdef CONFIG_IEEE1394_VERBOSEDEBUG
#ifdef CONFIG_IEEE1394_VERBOSEDEBUG
HPSB_DEBUG
(
"NodeMgr: Processing host reset for %s"
,
h
ost
->
driver
->
name
);
HPSB_DEBUG
(
"NodeMgr: Processing host reset for %s"
,
h
i
->
daemon_
name
);
#endif
#endif
up
(
&
hi
->
reset_sem
);
up
(
&
hi
->
reset_sem
);
}
else
}
else
...
...
drivers/ieee1394/ohci1394.c
View file @
5d64e2aa
...
@@ -164,7 +164,7 @@ printk(level "%s: " fmt "\n" , OHCI1394_DRIVER_NAME , ## args)
...
@@ -164,7 +164,7 @@ printk(level "%s: " fmt "\n" , OHCI1394_DRIVER_NAME , ## args)
printk(level "%s_%d: " fmt "\n" , OHCI1394_DRIVER_NAME, card , ## args)
printk(level "%s_%d: " fmt "\n" , OHCI1394_DRIVER_NAME, card , ## args)
static
char
version
[]
__devinitdata
=
static
char
version
[]
__devinitdata
=
"$Rev: 9
52
$ Ben Collins <bcollins@debian.org>"
;
"$Rev: 9
86
$ Ben Collins <bcollins@debian.org>"
;
/* Module Parameters */
/* Module Parameters */
static
int
phys_dma
=
1
;
static
int
phys_dma
=
1
;
...
@@ -810,8 +810,7 @@ static int dma_trm_flush(struct ti_ohci *ohci, struct dma_trm_ctx *d)
...
@@ -810,8 +810,7 @@ static int dma_trm_flush(struct ti_ohci *ohci, struct dma_trm_ctx *d)
}
}
if
(
d
->
free_prgs
==
0
)
if
(
d
->
free_prgs
==
0
)
PRINT
(
KERN_INFO
,
ohci
->
id
,
DBGMSG
(
ohci
->
id
,
"Transmit DMA FIFO ctx=%d is full... waiting"
,
d
->
ctx
);
"Transmit DMA FIFO ctx=%d is full... waiting"
,
d
->
ctx
);
/* Is the context running ? (should be unless it is
/* Is the context running ? (should be unless it is
the first packet to be sent in this context) */
the first packet to be sent in this context) */
...
...
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