aboutsummaryrefslogtreecommitdiff
path: root/platform
diff options
context:
space:
mode:
authorIvan Khoronzhuk <ivan.khoronzhuk@linaro.org>2016-01-14 11:43:55 +0200
committerIvan Khoronzhuk <ivan.khoronzhuk@linaro.org>2016-01-15 14:07:10 +0200
commit4ee0e8cfd06518b0e16ec0d85bc5c6bd91adf2a4 (patch)
treeebdb89ee3430dbd2b9b4dfea2032919aa2a0491b /platform
parentb5cb2f358fee347e70ea3ab1b1864e1cf74990f2 (diff)
linux-ks2: pktio: don't allow to start/stop pktio twice
Also don't send and receive packets if it's not allowed. Signed-off-by: Ivan Khoronzhuk <ivan.khoronzhuk@linaro.org>
Diffstat (limited to 'platform')
-rw-r--r--platform/linux-keystone2/odp_packet_io.c61
1 files changed, 41 insertions, 20 deletions
diff --git a/platform/linux-keystone2/odp_packet_io.c b/platform/linux-keystone2/odp_packet_io.c
index a0d943f7..9f04e2e2 100644
--- a/platform/linux-keystone2/odp_packet_io.c
+++ b/platform/linux-keystone2/odp_packet_io.c
@@ -61,7 +61,7 @@ typedef struct pktio_entry_s {
char name[ODP_PKTIO_NAME_LEN];
_odp_if_mac_t mac;
odp_pmr_t pmr_default;
- odp_pktio_param_t *param;
+ odp_pktio_param_t param;
struct list_head pmr_out;
uint8_t pmr_out_cnt;
@@ -229,7 +229,7 @@ static int pktio_free_cb(void *data)
return 0;
}
-static int pktio_inq_setdef_locked(odp_pktio_t pktio, odp_queue_t queue)
+static int pktio_inq_setdef_nolock(odp_pktio_t pktio, odp_queue_t queue)
{
pktio_entry_t *entry = _odp_pktio_entry(pktio);
queue_entry_t *queue_entry = _odp_queue_to_qentry(queue);
@@ -263,9 +263,10 @@ static int pktio_inq_setdef_locked(odp_pktio_t pktio, odp_queue_t queue)
return 0;
}
-static int odp_pktio_inq_setdef_raw(odp_pktio_t pktio, odp_queue_t queue)
+static int odp_pktio_inq_setdef_raw(pktio_entry_t *pktio_entry,
+ odp_queue_t queue)
{
- if (pktio == ODP_PKTIO_INVALID || queue == ODP_QUEUE_INVALID) {
+ if (queue == ODP_QUEUE_INVALID) {
ODP_ERR("Invalid input parameters\n");
return -1;
}
@@ -275,16 +276,12 @@ static int odp_pktio_inq_setdef_raw(odp_pktio_t pktio, odp_queue_t queue)
return -1;
}
- pktio_entry_t *entry = _odp_pktio_entry(pktio);
-
- shres_lock(entry);
- if (pktio_inq_setdef_locked(pktio, queue) < 0)
+ if (pktio_inq_setdef_nolock(
+ _odp_pktio_from_entry(pktio_entry), queue) < 0)
goto err;
- shres_unlock(entry);
return 0;
err:
- shres_unlock(entry);
_queue_put(queue);
ODP_ERR("Cannot assign default queue\n");
return -1;
@@ -292,6 +289,7 @@ err:
int odp_pktio_start(odp_pktio_t id)
{
+ int ret = 0;
pktio_entry_t *entry;
char name[ODP_QUEUE_NAME_LEN];
odp_queue_t in_queue;
@@ -303,6 +301,12 @@ int odp_pktio_start(odp_pktio_t id)
entry = _odp_pktio_entry(id);
+ shres_lock(entry);
+ if (entry->flags.start) {
+ shres_unlock(entry);
+ return -1;
+ }
+
/* When pktio is starting and input_queue is not assigned
* then create hidden inp_quue to receive packets with
* odp_pktio_recv(). If inp_queue or cos_def will be set
@@ -311,19 +315,18 @@ int odp_pktio_start(odp_pktio_t id)
if (!entry->flags.inp_queue) {
snprintf(name, sizeof(name), "%s-pktio_inq", entry->name);
in_queue = odp_queue_create(name, ODP_QUEUE_TYPE_PKTIN, NULL);
- odp_pktio_inq_setdef_raw(id, in_queue);
+ ret = odp_pktio_inq_setdef_raw(entry, in_queue);
}
- shres_lock(entry);
entry->flags.start = 1;
shres_unlock(entry);
- return 0;
+ return ret;
}
int odp_pktio_stop(odp_pktio_t id)
{
- int ret;
+ int ret = 0;
pktio_entry_t *entry;
if (id == ODP_PKTIO_INVALID) {
@@ -332,8 +335,13 @@ int odp_pktio_stop(odp_pktio_t id)
}
entry = _odp_pktio_entry(id);
-
shres_lock(entry);
+
+ if (!entry->flags.start) {
+ shres_unlock(entry);
+ return -1;
+ }
+
if (!entry->flags.inp_queue &&
entry->inq_default != ODP_QUEUE_INVALID)
ret = pktio_inq_remdef(entry);
@@ -345,7 +353,7 @@ int odp_pktio_stop(odp_pktio_t id)
}
odp_pktio_t odp_pktio_open(const char *dev, odp_pool_t pool,
- ODP_UNUSED const odp_pktio_param_t *param)
+ const odp_pktio_param_t *param)
{
odp_pktio_t pktio;
pktio_entry_t *entry;
@@ -396,6 +404,7 @@ odp_pktio_t odp_pktio_open(const char *dev, odp_pool_t pool,
pktio = _odp_pktio_from_entry(entry);
entry->inq_default = ODP_QUEUE_INVALID;
entry->outq_default = ODP_QUEUE_INVALID;
+ entry->param = *param;
entry->port = port;
entry->pmr_default = ODP_PMR_INVAL;
entry->mac = (loopback) ? loopback_mac(_odp_pktio_id(pktio)) :
@@ -545,6 +554,9 @@ int odp_pktio_recv(odp_pktio_t pktio, odp_packet_t pkt_table[], int len)
pktio_entry_t *entry = _odp_pktio_entry(pktio);
+ if (entry->param.in_mode != ODP_PKTIN_MODE_RECV)
+ return -1;
+
if (entry->inq_default == ODP_QUEUE_INVALID) {
ODP_ERR("inq_default is not set for pktio\n");
return -1;
@@ -584,6 +596,12 @@ int odp_pktio_send(odp_pktio_t pktio, odp_packet_t pkt_table[], int len)
pktio_entry_t *entry = _odp_pktio_entry(pktio);
+ if (!entry->flags.start)
+ return 0;
+
+ if (entry->param.out_mode != ODP_PKTOUT_MODE_SEND)
+ return -1;
+
for (pkts = 0; pkts < len; pkts++) {
size = _cppi_desc_pkt_len(
_odp_pkt_to_cppi_desc(pkt_table[pkts]));
@@ -607,12 +625,15 @@ int odp_pktio_inq_setdef(odp_pktio_t pktio, odp_queue_t queue)
int ret;
pktio_entry_t *entry;
- ret = odp_pktio_inq_setdef_raw(pktio, queue);
- if (ret)
- return ret;
-
entry = _odp_pktio_entry(pktio);
shres_lock(entry);
+
+ ret = odp_pktio_inq_setdef_raw(entry, queue);
+ if (ret) {
+ shres_unlock(entry);
+ return ret;
+ }
+
entry->flags.inp_queue = 1;
shres_unlock(entry);