Commit 5d937e96 authored by Maciej Patelczyk's avatar Maciej Patelczyk Committed by Dan Williams

isci: Removed sci_base_object from scic_sds_remote_device.

The 'struct sci_base_object' was removed from the struct
scic_sds_remote_device.
Signed-off-by: default avatarMaciej Patelczyk <maciej.patelczyk@intel.com>
[cleaned up sci_dev_to_idev]
Signed-off-by: default avatarDan Williams <dan.j.williams@intel.com>
parent 115bd1f9
...@@ -1101,9 +1101,8 @@ static const struct scic_sds_remote_device_state_handler scic_sds_remote_device_ ...@@ -1101,9 +1101,8 @@ static const struct scic_sds_remote_device_state_handler scic_sds_remote_device_
static void scic_sds_remote_device_initial_state_enter(void *object) static void scic_sds_remote_device_initial_state_enter(void *object)
{ {
struct scic_sds_remote_device *sci_dev = (struct scic_sds_remote_device *)object; struct scic_sds_remote_device *sci_dev = object;
sci_dev = container_of(object, typeof(*sci_dev), parent);
SET_STATE_HANDLER(sci_dev, scic_sds_remote_device_state_handler_table, SET_STATE_HANDLER(sci_dev, scic_sds_remote_device_state_handler_table,
SCI_BASE_REMOTE_DEVICE_STATE_INITIAL); SCI_BASE_REMOTE_DEVICE_STATE_INITIAL);
...@@ -1203,16 +1202,15 @@ static void isci_remote_device_stop_complete(struct isci_host *ihost, ...@@ -1203,16 +1202,15 @@ static void isci_remote_device_stop_complete(struct isci_host *ihost,
static void scic_sds_remote_device_stopped_state_enter(void *object) static void scic_sds_remote_device_stopped_state_enter(void *object)
{ {
struct scic_sds_remote_device *sci_dev; struct scic_sds_remote_device *sci_dev = object;
struct scic_sds_controller *scic; struct scic_sds_controller *scic;
struct isci_remote_device *idev; struct isci_remote_device *idev;
struct isci_host *ihost; struct isci_host *ihost;
u32 prev_state; u32 prev_state;
sci_dev = container_of(object, typeof(*sci_dev), parent);
scic = scic_sds_remote_device_get_controller(sci_dev); scic = scic_sds_remote_device_get_controller(sci_dev);
ihost = scic->ihost; ihost = scic->ihost;
idev = sci_object_get_association(sci_dev); idev = sci_dev_to_idev(sci_dev);
SET_STATE_HANDLER(sci_dev, scic_sds_remote_device_state_handler_table, SET_STATE_HANDLER(sci_dev, scic_sds_remote_device_state_handler_table,
SCI_BASE_REMOTE_DEVICE_STATE_STOPPED); SCI_BASE_REMOTE_DEVICE_STATE_STOPPED);
...@@ -1229,11 +1227,10 @@ static void scic_sds_remote_device_stopped_state_enter(void *object) ...@@ -1229,11 +1227,10 @@ static void scic_sds_remote_device_stopped_state_enter(void *object)
static void scic_sds_remote_device_starting_state_enter(void *object) static void scic_sds_remote_device_starting_state_enter(void *object)
{ {
struct scic_sds_remote_device *sci_dev = container_of(object, typeof(*sci_dev), struct scic_sds_remote_device *sci_dev = object;
parent);
struct scic_sds_controller *scic = scic_sds_remote_device_get_controller(sci_dev); struct scic_sds_controller *scic = scic_sds_remote_device_get_controller(sci_dev);
struct isci_host *ihost = scic->ihost; struct isci_host *ihost = scic->ihost;
struct isci_remote_device *idev = sci_object_get_association(sci_dev); struct isci_remote_device *idev = sci_dev_to_idev(sci_dev);
SET_STATE_HANDLER(sci_dev, scic_sds_remote_device_state_handler_table, SET_STATE_HANDLER(sci_dev, scic_sds_remote_device_state_handler_table,
SCI_BASE_REMOTE_DEVICE_STATE_STARTING); SCI_BASE_REMOTE_DEVICE_STATE_STARTING);
...@@ -1244,11 +1241,10 @@ static void scic_sds_remote_device_starting_state_enter(void *object) ...@@ -1244,11 +1241,10 @@ static void scic_sds_remote_device_starting_state_enter(void *object)
static void scic_sds_remote_device_ready_state_enter(void *object) static void scic_sds_remote_device_ready_state_enter(void *object)
{ {
struct scic_sds_remote_device *sci_dev = container_of(object, typeof(*sci_dev), struct scic_sds_remote_device *sci_dev = object;
parent);
struct scic_sds_controller *scic = scic_sds_remote_device_get_controller(sci_dev); struct scic_sds_controller *scic = scic_sds_remote_device_get_controller(sci_dev);
struct isci_host *ihost = scic->ihost; struct isci_host *ihost = scic->ihost;
struct isci_remote_device *idev = sci_object_get_association(sci_dev); struct isci_remote_device *idev = sci_dev_to_idev(sci_dev);
SET_STATE_HANDLER(sci_dev, SET_STATE_HANDLER(sci_dev,
scic_sds_remote_device_state_handler_table, scic_sds_remote_device_state_handler_table,
...@@ -1264,14 +1260,13 @@ static void scic_sds_remote_device_ready_state_enter(void *object) ...@@ -1264,14 +1260,13 @@ static void scic_sds_remote_device_ready_state_enter(void *object)
static void scic_sds_remote_device_ready_state_exit(void *object) static void scic_sds_remote_device_ready_state_exit(void *object)
{ {
struct scic_sds_remote_device *sci_dev = container_of(object, typeof(*sci_dev), struct scic_sds_remote_device *sci_dev = object;
parent);
if (sci_dev->has_ready_substate_machine) if (sci_dev->has_ready_substate_machine)
sci_base_state_machine_stop(&sci_dev->ready_substate_machine); sci_base_state_machine_stop(&sci_dev->ready_substate_machine);
else { else {
struct scic_sds_controller *scic = scic_sds_remote_device_get_controller(sci_dev); struct scic_sds_controller *scic = scic_sds_remote_device_get_controller(sci_dev);
struct isci_host *ihost = scic->ihost; struct isci_host *ihost = scic->ihost;
struct isci_remote_device *idev = sci_object_get_association(sci_dev); struct isci_remote_device *idev = sci_dev_to_idev(sci_dev);
isci_remote_device_not_ready(ihost, idev, isci_remote_device_not_ready(ihost, idev,
SCIC_REMOTE_DEVICE_NOT_READY_STOP_REQUESTED); SCIC_REMOTE_DEVICE_NOT_READY_STOP_REQUESTED);
...@@ -1280,7 +1275,7 @@ static void scic_sds_remote_device_ready_state_exit(void *object) ...@@ -1280,7 +1275,7 @@ static void scic_sds_remote_device_ready_state_exit(void *object)
static void scic_sds_remote_device_stopping_state_enter(void *object) static void scic_sds_remote_device_stopping_state_enter(void *object)
{ {
struct scic_sds_remote_device *sci_dev = (struct scic_sds_remote_device *)object; struct scic_sds_remote_device *sci_dev = object;
SET_STATE_HANDLER( SET_STATE_HANDLER(
sci_dev, sci_dev,
...@@ -1291,7 +1286,7 @@ static void scic_sds_remote_device_stopping_state_enter(void *object) ...@@ -1291,7 +1286,7 @@ static void scic_sds_remote_device_stopping_state_enter(void *object)
static void scic_sds_remote_device_failed_state_enter(void *object) static void scic_sds_remote_device_failed_state_enter(void *object)
{ {
struct scic_sds_remote_device *sci_dev = (struct scic_sds_remote_device *)object; struct scic_sds_remote_device *sci_dev = object;
SET_STATE_HANDLER( SET_STATE_HANDLER(
sci_dev, sci_dev,
...@@ -1302,7 +1297,7 @@ static void scic_sds_remote_device_failed_state_enter(void *object) ...@@ -1302,7 +1297,7 @@ static void scic_sds_remote_device_failed_state_enter(void *object)
static void scic_sds_remote_device_resetting_state_enter(void *object) static void scic_sds_remote_device_resetting_state_enter(void *object)
{ {
struct scic_sds_remote_device *sci_dev = (struct scic_sds_remote_device *)object; struct scic_sds_remote_device *sci_dev = object;
SET_STATE_HANDLER( SET_STATE_HANDLER(
sci_dev, sci_dev,
...@@ -1316,14 +1311,14 @@ static void scic_sds_remote_device_resetting_state_enter(void *object) ...@@ -1316,14 +1311,14 @@ static void scic_sds_remote_device_resetting_state_enter(void *object)
static void scic_sds_remote_device_resetting_state_exit(void *object) static void scic_sds_remote_device_resetting_state_exit(void *object)
{ {
struct scic_sds_remote_device *sci_dev = (struct scic_sds_remote_device *)object; struct scic_sds_remote_device *sci_dev = object;
scic_sds_remote_node_context_resume(&sci_dev->rnc, NULL, NULL); scic_sds_remote_node_context_resume(&sci_dev->rnc, NULL, NULL);
} }
static void scic_sds_remote_device_final_state_enter(void *object) static void scic_sds_remote_device_final_state_enter(void *object)
{ {
struct scic_sds_remote_device *sci_dev = (struct scic_sds_remote_device *)object; struct scic_sds_remote_device *sci_dev = object;
SET_STATE_HANDLER( SET_STATE_HANDLER(
sci_dev, sci_dev,
...@@ -1377,11 +1372,10 @@ static void scic_remote_device_construct(struct scic_sds_port *sci_port, ...@@ -1377,11 +1372,10 @@ static void scic_remote_device_construct(struct scic_sds_port *sci_port,
{ {
sci_dev->owning_port = sci_port; sci_dev->owning_port = sci_port;
sci_dev->started_request_count = 0; sci_dev->started_request_count = 0;
sci_dev->parent.private = NULL;
sci_base_state_machine_construct( sci_base_state_machine_construct(
&sci_dev->state_machine, &sci_dev->state_machine,
&sci_dev->parent, sci_dev,
scic_sds_remote_device_state_table, scic_sds_remote_device_state_table,
SCI_BASE_REMOTE_DEVICE_STATE_INITIAL SCI_BASE_REMOTE_DEVICE_STATE_INITIAL
); );
...@@ -1440,7 +1434,7 @@ static enum sci_status scic_remote_device_da_construct(struct scic_sds_port *sci ...@@ -1440,7 +1434,7 @@ static enum sci_status scic_remote_device_da_construct(struct scic_sds_port *sci
sci_base_state_machine_construct( sci_base_state_machine_construct(
&sci_dev->ready_substate_machine, &sci_dev->ready_substate_machine,
&sci_dev->parent, sci_dev,
scic_sds_stp_remote_device_ready_substate_table, scic_sds_stp_remote_device_ready_substate_table,
SCIC_SDS_STP_REMOTE_DEVICE_READY_SUBSTATE_IDLE); SCIC_SDS_STP_REMOTE_DEVICE_READY_SUBSTATE_IDLE);
} else if (dev_is_expander(dev)) { } else if (dev_is_expander(dev)) {
...@@ -1449,7 +1443,7 @@ static enum sci_status scic_remote_device_da_construct(struct scic_sds_port *sci ...@@ -1449,7 +1443,7 @@ static enum sci_status scic_remote_device_da_construct(struct scic_sds_port *sci
/* add the SMP ready substate machine construction here */ /* add the SMP ready substate machine construction here */
sci_base_state_machine_construct( sci_base_state_machine_construct(
&sci_dev->ready_substate_machine, &sci_dev->ready_substate_machine,
&sci_dev->parent, sci_dev,
scic_sds_smp_remote_device_ready_substate_table, scic_sds_smp_remote_device_ready_substate_table,
SCIC_SDS_SMP_REMOTE_DEVICE_READY_SUBSTATE_IDLE); SCIC_SDS_SMP_REMOTE_DEVICE_READY_SUBSTATE_IDLE);
} else } else
...@@ -1497,7 +1491,7 @@ static enum sci_status scic_remote_device_ea_construct(struct scic_sds_port *sci ...@@ -1497,7 +1491,7 @@ static enum sci_status scic_remote_device_ea_construct(struct scic_sds_port *sci
/* add the SMP ready substate machine construction here */ /* add the SMP ready substate machine construction here */
sci_base_state_machine_construct( sci_base_state_machine_construct(
&sci_dev->ready_substate_machine, &sci_dev->ready_substate_machine,
&sci_dev->parent, sci_dev,
scic_sds_smp_remote_device_ready_substate_table, scic_sds_smp_remote_device_ready_substate_table,
SCIC_SDS_SMP_REMOTE_DEVICE_READY_SUBSTATE_IDLE); SCIC_SDS_SMP_REMOTE_DEVICE_READY_SUBSTATE_IDLE);
} else if (dev->dev_type == SATA_DEV || (dev->tproto & SAS_PROTOCOL_STP)) { } else if (dev->dev_type == SATA_DEV || (dev->tproto & SAS_PROTOCOL_STP)) {
...@@ -1505,7 +1499,7 @@ static enum sci_status scic_remote_device_ea_construct(struct scic_sds_port *sci ...@@ -1505,7 +1499,7 @@ static enum sci_status scic_remote_device_ea_construct(struct scic_sds_port *sci
sci_base_state_machine_construct( sci_base_state_machine_construct(
&sci_dev->ready_substate_machine, &sci_dev->ready_substate_machine,
&sci_dev->parent, sci_dev,
scic_sds_stp_remote_device_ready_substate_table, scic_sds_stp_remote_device_ready_substate_table,
SCIC_SDS_STP_REMOTE_DEVICE_READY_SUBSTATE_IDLE); SCIC_SDS_STP_REMOTE_DEVICE_READY_SUBSTATE_IDLE);
} }
...@@ -1565,9 +1559,6 @@ static enum sci_status isci_remote_device_construct(struct isci_port *iport, ...@@ -1565,9 +1559,6 @@ static enum sci_status isci_remote_device_construct(struct isci_port *iport,
return status; return status;
} }
/* XXX will be killed with sci_base_object removal */
sci_object_set_association(&idev->sci, idev);
/* start the device. */ /* start the device. */
status = scic_remote_device_start(&idev->sci, ISCI_REMOTE_DEVICE_START_TIMEOUT); status = scic_remote_device_start(&idev->sci, ISCI_REMOTE_DEVICE_START_TIMEOUT);
......
...@@ -74,12 +74,6 @@ enum scic_remote_device_not_ready_reason_code { ...@@ -74,12 +74,6 @@ enum scic_remote_device_not_ready_reason_code {
}; };
struct scic_sds_remote_device { struct scic_sds_remote_device {
/**
* The field specifies that the parent object for the base remote
* device is the base object itself.
*/
struct sci_base_object parent;
/** /**
* This field contains the information for the base remote device state * This field contains the information for the base remote device state
* machine. * machine.
...@@ -417,11 +411,16 @@ static inline struct scic_sds_remote_device *rnc_to_dev(struct scic_sds_remote_n ...@@ -417,11 +411,16 @@ static inline struct scic_sds_remote_device *rnc_to_dev(struct scic_sds_remote_n
return sci_dev; return sci_dev;
} }
static inline struct domain_device *sci_dev_to_domain(struct scic_sds_remote_device *sci_dev) static inline struct isci_remote_device *sci_dev_to_idev(struct scic_sds_remote_device *sci_dev)
{ {
struct isci_remote_device *idev = container_of(sci_dev, typeof(*idev), sci); struct isci_remote_device *idev = container_of(sci_dev, typeof(*idev), sci);
return idev->domain_dev; return idev;
}
static inline struct domain_device *sci_dev_to_domain(struct scic_sds_remote_device *sci_dev)
{
return sci_dev_to_idev(sci_dev)->domain_dev;
} }
static inline bool dev_is_expander(struct domain_device *dev) static inline bool dev_is_expander(struct domain_device *dev)
......
...@@ -59,7 +59,6 @@ ...@@ -59,7 +59,6 @@
#include "isci.h" #include "isci.h"
#include "core/scic_sds_controller.h" #include "core/scic_sds_controller.h"
struct scic_sds_remote_device;
static inline struct device *scic_to_dev(struct scic_sds_controller *scic) static inline struct device *scic_to_dev(struct scic_sds_controller *scic)
{ {
...@@ -88,9 +87,11 @@ static inline struct device *sciport_to_dev(struct scic_sds_port *sci_port) ...@@ -88,9 +87,11 @@ static inline struct device *sciport_to_dev(struct scic_sds_port *sci_port)
return &iport->isci_host->pdev->dev; return &iport->isci_host->pdev->dev;
} }
static inline struct device *scirdev_to_dev(struct scic_sds_remote_device *sci_dev) static inline struct device *scirdev_to_dev(
struct scic_sds_remote_device *sci_dev)
{ {
struct isci_remote_device *idev = sci_object_get_association(sci_dev); struct isci_remote_device *idev =
container_of(sci_dev, typeof(*idev), sci);
if (!idev || !idev->isci_port || !idev->isci_port->isci_host) if (!idev || !idev->isci_port || !idev->isci_port->isci_host)
return NULL; return NULL;
......
...@@ -246,11 +246,10 @@ static const struct scic_sds_remote_device_state_handler scic_sds_smp_remote_dev ...@@ -246,11 +246,10 @@ static const struct scic_sds_remote_device_state_handler scic_sds_smp_remote_dev
*/ */
static void scic_sds_smp_remote_device_ready_idle_substate_enter(void *object) static void scic_sds_smp_remote_device_ready_idle_substate_enter(void *object)
{ {
struct scic_sds_remote_device *sci_dev = container_of(object, typeof(*sci_dev), struct scic_sds_remote_device *sci_dev = object;
parent);
struct scic_sds_controller *scic = scic_sds_remote_device_get_controller(sci_dev); struct scic_sds_controller *scic = scic_sds_remote_device_get_controller(sci_dev);
struct isci_host *ihost = scic->ihost; struct isci_host *ihost = scic->ihost;
struct isci_remote_device *idev = sci_object_get_association(sci_dev); struct isci_remote_device *idev = sci_dev_to_idev(sci_dev);
SET_STATE_HANDLER(sci_dev, SET_STATE_HANDLER(sci_dev,
scic_sds_smp_remote_device_ready_substate_handler_table, scic_sds_smp_remote_device_ready_substate_handler_table,
...@@ -270,11 +269,10 @@ static void scic_sds_smp_remote_device_ready_idle_substate_enter(void *object) ...@@ -270,11 +269,10 @@ static void scic_sds_smp_remote_device_ready_idle_substate_enter(void *object)
*/ */
static void scic_sds_smp_remote_device_ready_cmd_substate_enter(void *object) static void scic_sds_smp_remote_device_ready_cmd_substate_enter(void *object)
{ {
struct scic_sds_remote_device *sci_dev = container_of(object, typeof(*sci_dev), struct scic_sds_remote_device *sci_dev = object;
parent);
struct scic_sds_controller *scic = scic_sds_remote_device_get_controller(sci_dev); struct scic_sds_controller *scic = scic_sds_remote_device_get_controller(sci_dev);
struct isci_host *ihost = scic->ihost; struct isci_host *ihost = scic->ihost;
struct isci_remote_device *idev = sci_object_get_association(sci_dev); struct isci_remote_device *idev = sci_dev_to_idev(sci_dev);
BUG_ON(sci_dev->working_request == NULL); BUG_ON(sci_dev->working_request == NULL);
...@@ -295,8 +293,7 @@ static void scic_sds_smp_remote_device_ready_cmd_substate_enter(void *object) ...@@ -295,8 +293,7 @@ static void scic_sds_smp_remote_device_ready_cmd_substate_enter(void *object)
*/ */
static void scic_sds_smp_remote_device_ready_cmd_substate_exit(void *object) static void scic_sds_smp_remote_device_ready_cmd_substate_exit(void *object)
{ {
struct scic_sds_remote_device *sci_dev = container_of(object, typeof(*sci_dev), struct scic_sds_remote_device *sci_dev = object;
parent);
sci_dev->working_request = NULL; sci_dev->working_request = NULL;
} }
......
...@@ -580,7 +580,7 @@ static void ...@@ -580,7 +580,7 @@ static void
scic_sds_stp_remote_device_ready_idle_substate_resume_complete_handler(void *user_cookie) scic_sds_stp_remote_device_ready_idle_substate_resume_complete_handler(void *user_cookie)
{ {
struct scic_sds_remote_device *sci_dev = user_cookie; struct scic_sds_remote_device *sci_dev = user_cookie;
struct isci_remote_device *idev = sci_object_get_association(sci_dev); struct isci_remote_device *idev = sci_dev_to_idev(sci_dev);
struct scic_sds_controller *scic = scic_sds_remote_device_get_controller(sci_dev); struct scic_sds_controller *scic = scic_sds_remote_device_get_controller(sci_dev);
struct isci_host *ihost = scic->ihost; struct isci_host *ihost = scic->ihost;
...@@ -607,9 +607,7 @@ scic_sds_stp_remote_device_ready_idle_substate_resume_complete_handler(void *use ...@@ -607,9 +607,7 @@ scic_sds_stp_remote_device_ready_idle_substate_resume_complete_handler(void *use
*/ */
static void scic_sds_stp_remote_device_ready_idle_substate_enter(void *device) static void scic_sds_stp_remote_device_ready_idle_substate_enter(void *device)
{ {
struct scic_sds_remote_device *sci_dev; struct scic_sds_remote_device *sci_dev = device;
sci_dev = (struct scic_sds_remote_device *)device;
SET_STATE_HANDLER( SET_STATE_HANDLER(
sci_dev, sci_dev,
...@@ -636,11 +634,10 @@ static void scic_sds_stp_remote_device_ready_idle_substate_enter(void *device) ...@@ -636,11 +634,10 @@ static void scic_sds_stp_remote_device_ready_idle_substate_enter(void *device)
static void scic_sds_stp_remote_device_ready_cmd_substate_enter(void *object) static void scic_sds_stp_remote_device_ready_cmd_substate_enter(void *object)
{ {
struct scic_sds_remote_device *sci_dev = container_of(object, typeof(*sci_dev), struct scic_sds_remote_device *sci_dev = object;
parent);
struct scic_sds_controller *scic = scic_sds_remote_device_get_controller(sci_dev); struct scic_sds_controller *scic = scic_sds_remote_device_get_controller(sci_dev);
struct isci_host *ihost = scic->ihost; struct isci_host *ihost = scic->ihost;
struct isci_remote_device *idev = sci_object_get_association(sci_dev); struct isci_remote_device *idev = sci_dev_to_idev(sci_dev);
BUG_ON(sci_dev->working_request == NULL); BUG_ON(sci_dev->working_request == NULL);
...@@ -654,8 +651,7 @@ static void scic_sds_stp_remote_device_ready_cmd_substate_enter(void *object) ...@@ -654,8 +651,7 @@ static void scic_sds_stp_remote_device_ready_cmd_substate_enter(void *object)
static void scic_sds_stp_remote_device_ready_ncq_substate_enter(void *object) static void scic_sds_stp_remote_device_ready_ncq_substate_enter(void *object)
{ {
struct scic_sds_remote_device *sci_dev = container_of(object, typeof(*sci_dev), struct scic_sds_remote_device *sci_dev = object;
parent);
SET_STATE_HANDLER(sci_dev, SET_STATE_HANDLER(sci_dev,
scic_sds_stp_remote_device_ready_substate_handler_table, scic_sds_stp_remote_device_ready_substate_handler_table,
SCIC_SDS_STP_REMOTE_DEVICE_READY_SUBSTATE_NCQ); SCIC_SDS_STP_REMOTE_DEVICE_READY_SUBSTATE_NCQ);
...@@ -664,11 +660,10 @@ static void scic_sds_stp_remote_device_ready_ncq_substate_enter(void *object) ...@@ -664,11 +660,10 @@ static void scic_sds_stp_remote_device_ready_ncq_substate_enter(void *object)
static void scic_sds_stp_remote_device_ready_ncq_error_substate_enter( static void scic_sds_stp_remote_device_ready_ncq_error_substate_enter(
void *object) void *object)
{ {
struct scic_sds_remote_device *sci_dev = container_of(object, typeof(*sci_dev), struct scic_sds_remote_device *sci_dev = object;
parent);
struct scic_sds_controller *scic = scic_sds_remote_device_get_controller(sci_dev); struct scic_sds_controller *scic = scic_sds_remote_device_get_controller(sci_dev);
struct isci_host *ihost = scic->ihost; struct isci_host *ihost = scic->ihost;
struct isci_remote_device *idev = sci_object_get_association(sci_dev); struct isci_remote_device *idev = sci_dev_to_idev(sci_dev);
SET_STATE_HANDLER(sci_dev, SET_STATE_HANDLER(sci_dev,
scic_sds_stp_remote_device_ready_substate_handler_table, scic_sds_stp_remote_device_ready_substate_handler_table,
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment