[dpdk-dev] [PATCH] net/i40e: fix FPK VF overwrite PF RSS LUT

2019-01-14 Thread Yanglong Wu
i40e_aq_set_rss_lut should set rigister according
to the vsi->type. if not, VF may overwrite the rigister
of PF

Fixes: d0a349409bd7 ("i40e: support AQ based RSS config")
Cc: sta...@dpdk.org

Signed-off-by: Wu Yanglong 
---
 drivers/net/i40e/i40e_ethdev.c | 9 +++--
 1 file changed, 7 insertions(+), 2 deletions(-)

diff --git a/drivers/net/i40e/i40e_ethdev.c b/drivers/net/i40e/i40e_ethdev.c
index a6b97e164..d4d99edcd 100644
--- a/drivers/net/i40e/i40e_ethdev.c
+++ b/drivers/net/i40e/i40e_ethdev.c
@@ -4183,8 +4183,13 @@ i40e_get_rss_lut(struct i40e_vsi *vsi, uint8_t *lut, 
uint16_t lut_size)
return -EINVAL;
 
if (pf->flags & I40E_FLAG_RSS_AQ_CAPABLE) {
-   ret = i40e_aq_get_rss_lut(hw, vsi->vsi_id, TRUE,
- lut, lut_size);
+   if (vsi->type == I40E_VSI_SRIOV) {
+   ret = i40e_aq_get_rss_lut(hw, vsi->vsi_id, FALSE,
+ lut, lut_size);
+   } else {
+   ret = i40e_aq_get_rss_lut(hw, vsi->vsi_id, TRUE,
+ lut, lut_size);
+   }
if (ret) {
PMD_DRV_LOG(ERR, "Failed to get RSS lookup table");
return ret;
-- 
2.11.0



[dpdk-dev] [PATCH v2] net/i40e: fix FPK VF overwrite PF RSS LUT

2019-01-14 Thread Yanglong Wu
i40e_aq_set_rss_lut should set rigister according
to the vsi->type. if not, VF may overwrite the rigister
of PF

Fixes: d0a349409bd7 ("i40e: support AQ based RSS config")
Cc: sta...@dpdk.org

Signed-off-by: Yanglong Wu 
---
 drivers/net/i40e/i40e_ethdev.c | 6 --
 1 file changed, 4 insertions(+), 2 deletions(-)

diff --git a/drivers/net/i40e/i40e_ethdev.c b/drivers/net/i40e/i40e_ethdev.c
index a6b97e164..f97cd5348 100644
--- a/drivers/net/i40e/i40e_ethdev.c
+++ b/drivers/net/i40e/i40e_ethdev.c
@@ -4183,7 +4183,8 @@ i40e_get_rss_lut(struct i40e_vsi *vsi, uint8_t *lut, 
uint16_t lut_size)
return -EINVAL;
 
if (pf->flags & I40E_FLAG_RSS_AQ_CAPABLE) {
-   ret = i40e_aq_get_rss_lut(hw, vsi->vsi_id, TRUE,
+   ret = i40e_aq_get_rss_lut(hw, vsi->vsi_id,
+ vsi->type != I40E_VSI_SRIOV,
  lut, lut_size);
if (ret) {
PMD_DRV_LOG(ERR, "Failed to get RSS lookup table");
@@ -4222,7 +4223,8 @@ i40e_set_rss_lut(struct i40e_vsi *vsi, uint8_t *lut, 
uint16_t lut_size)
hw = I40E_VSI_TO_HW(vsi);
 
if (pf->flags & I40E_FLAG_RSS_AQ_CAPABLE) {
-   ret = i40e_aq_set_rss_lut(hw, vsi->vsi_id, TRUE,
+   ret = i40e_aq_set_rss_lut(hw, vsi->vsi_id,
+ vsi->type != I40E_VSI_SRIOV,
  lut, lut_size);
if (ret) {
PMD_DRV_LOG(ERR, "Failed to set RSS lookup table");
-- 
2.11.0



[dpdk-dev] [PATCH v2] net/ixgbe: fix ixgbevf link status

2018-11-12 Thread Yanglong Wu
For ixgbevf kernel driver, link status changes from down to up
will trigger vf kernel driver send IXGBE_VF_RESET message to pf
kernel driver, after this, vf kernel driver will disable and enable
it self. By these series operations, the vf kernel driver report
link up. Besides, all these operations handles in kernel thread.
For DPDK user space driver, it only gets link status changes from
down to up, but miss IXGBE_VF_RESET message sending and reset itself.
If we will add fully implementation of link status change for DPDK
user space driver, we need take much more modification. We have
aligned that for link status changes from down to up we only notify
link is up, users need to reset vf port.

Fixes: dc66e5fd01b9 ("net/ixgbe: improve link state check on VF")

Signed-off-by: Rosen Xu 
Signed-off-by: Yanglong Wu 
---
v2
change as comments
---
 drivers/net/ixgbe/ixgbe_ethdev.c | 15 +--
 1 file changed, 1 insertion(+), 14 deletions(-)

diff --git a/drivers/net/ixgbe/ixgbe_ethdev.c b/drivers/net/ixgbe/ixgbe_ethdev.c
index 8148577f5..91ba6201d 100644
--- a/drivers/net/ixgbe/ixgbe_ethdev.c
+++ b/drivers/net/ixgbe/ixgbe_ethdev.c
@@ -3880,11 +3880,6 @@ static int
 ixgbevf_check_link(struct ixgbe_hw *hw, ixgbe_link_speed *speed,
   int *link_up, int wait_to_complete)
 {
-   /**
-* for a quick link status checking, wait_to_compelet == 0,
-* skip PF link status checking
-*/
-   bool no_pflink_check = wait_to_complete == 0;
struct ixgbe_mbx_info *mbx = &hw->mbx;
struct ixgbe_mac_info *mac = &hw->mac;
uint32_t links_reg, in_msg;
@@ -3945,14 +3940,6 @@ ixgbevf_check_link(struct ixgbe_hw *hw, ixgbe_link_speed 
*speed,
*speed = IXGBE_LINK_SPEED_UNKNOWN;
}
 
-   if (no_pflink_check) {
-   if (*speed == IXGBE_LINK_SPEED_UNKNOWN)
-   mac->get_link_status = true;
-   else
-   mac->get_link_status = false;
-
-   goto out;
-   }
/* if the read failed it could just be a mailbox collision, best wait
 * until we are called again and don't report an error
 */
@@ -3962,7 +3949,7 @@ ixgbevf_check_link(struct ixgbe_hw *hw, ixgbe_link_speed 
*speed,
if (!(in_msg & IXGBE_VT_MSGTYPE_CTS)) {
/* msg is not CTS and is NACK we must have lost CTS status */
if (in_msg & IXGBE_VT_MSGTYPE_NACK)
-   ret_val = -1;
+   mac->get_link_status = false;
goto out;
}
 
-- 
2.11.0



[dpdk-dev] [PATCH] net/ixgbe: fix TDH register setting issue

2018-11-15 Thread Yanglong Wu
The only time that software should write to the TDH register
is after a reset (hardware reset or CTRL.RST) and
before enabling the transmit function (TXDCTL.ENABLE).
If software were to write to this register while the transmit
function was enabled, the on-chip descriptor buffers might
be invalidated and the hardware could become confused.

Fixes: a8cdaf0964f7 ("net/ixgbe: remove redundant queue id checks")
Signed-off-by: Yanglong Wu 
---
 drivers/net/ixgbe/ixgbe_rxtx.c | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/drivers/net/ixgbe/ixgbe_rxtx.c b/drivers/net/ixgbe/ixgbe_rxtx.c
index 2f0262ae1..ddc7efa87 100644
--- a/drivers/net/ixgbe/ixgbe_rxtx.c
+++ b/drivers/net/ixgbe/ixgbe_rxtx.c
@@ -5264,6 +5264,7 @@ ixgbe_dev_tx_queue_start(struct rte_eth_dev *dev, 
uint16_t tx_queue_id)
hw = IXGBE_DEV_PRIVATE_TO_HW(dev->data->dev_private);
 
txq = dev->data->tx_queues[tx_queue_id];
+   IXGBE_WRITE_REG(hw, IXGBE_TDH(txq->reg_idx), 0);
txdctl = IXGBE_READ_REG(hw, IXGBE_TXDCTL(txq->reg_idx));
txdctl |= IXGBE_TXDCTL_ENABLE;
IXGBE_WRITE_REG(hw, IXGBE_TXDCTL(txq->reg_idx), txdctl);
@@ -5281,7 +5282,6 @@ ixgbe_dev_tx_queue_start(struct rte_eth_dev *dev, 
uint16_t tx_queue_id)
tx_queue_id);
}
rte_wmb();
-   IXGBE_WRITE_REG(hw, IXGBE_TDH(txq->reg_idx), 0);
IXGBE_WRITE_REG(hw, IXGBE_TDT(txq->reg_idx), 0);
dev->data->tx_queue_state[tx_queue_id] = RTE_ETH_QUEUE_STATE_STARTED;
 
-- 
2.11.0



[dpdk-dev] [PATCH v2] net/ixgbe: fix TDH register setting issue

2018-11-19 Thread Yanglong Wu
The only time that software should write to the TDH register
is after a reset (hardware reset or CTRL.RST) and
before enabling the transmit function (TXDCTL.ENABLE).
If software were to write to this register while the transmit
function was enabled, the on-chip descriptor buffers might
be invalidated and the hardware could become confused.

cc sta...@dpdk.org
Signed-off-by: Yanglong Wu 
---
v2:
change fix commit
---
 drivers/net/ixgbe/ixgbe_rxtx.c | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/drivers/net/ixgbe/ixgbe_rxtx.c b/drivers/net/ixgbe/ixgbe_rxtx.c
index 2f0262ae1..ddc7efa87 100644
--- a/drivers/net/ixgbe/ixgbe_rxtx.c
+++ b/drivers/net/ixgbe/ixgbe_rxtx.c
@@ -5264,6 +5264,7 @@ ixgbe_dev_tx_queue_start(struct rte_eth_dev *dev, 
uint16_t tx_queue_id)
hw = IXGBE_DEV_PRIVATE_TO_HW(dev->data->dev_private);
 
txq = dev->data->tx_queues[tx_queue_id];
+   IXGBE_WRITE_REG(hw, IXGBE_TDH(txq->reg_idx), 0);
txdctl = IXGBE_READ_REG(hw, IXGBE_TXDCTL(txq->reg_idx));
txdctl |= IXGBE_TXDCTL_ENABLE;
IXGBE_WRITE_REG(hw, IXGBE_TXDCTL(txq->reg_idx), txdctl);
@@ -5281,7 +5282,6 @@ ixgbe_dev_tx_queue_start(struct rte_eth_dev *dev, 
uint16_t tx_queue_id)
tx_queue_id);
}
rte_wmb();
-   IXGBE_WRITE_REG(hw, IXGBE_TDH(txq->reg_idx), 0);
IXGBE_WRITE_REG(hw, IXGBE_TDT(txq->reg_idx), 0);
dev->data->tx_queue_state[tx_queue_id] = RTE_ETH_QUEUE_STATE_STARTED;
 
-- 
2.11.0



[dpdk-dev] [PATCH] net/ixgbe: fix link status when link is NACK

2018-07-22 Thread Yanglong Wu
Link status should be set as down when link is NACK.

Fixes: dc66e5fd01b9 ("net/ixgbe: improve link state check on VF")

Signed-off-by: Yanglong Wu 
---
 drivers/net/ixgbe/ixgbe_ethdev.c | 9 -
 1 file changed, 4 insertions(+), 5 deletions(-)

diff --git a/drivers/net/ixgbe/ixgbe_ethdev.c b/drivers/net/ixgbe/ixgbe_ethdev.c
index 997683d3b..378ead4b4 100644
--- a/drivers/net/ixgbe/ixgbe_ethdev.c
+++ b/drivers/net/ixgbe/ixgbe_ethdev.c
@@ -3933,12 +3933,10 @@ ixgbevf_check_link(struct ixgbe_hw *hw, 
ixgbe_link_speed *speed,
}
 
if (no_pflink_check) {
-   if (*speed == IXGBE_LINK_SPEED_UNKNOWN)
+   if (*speed == IXGBE_LINK_SPEED_UNKNOWN) {
mac->get_link_status = true;
-   else
-   mac->get_link_status = false;
-
-   goto out;
+   goto out;
+   }
}
/* if the read failed it could just be a mailbox collision, best wait
 * until we are called again and don't report an error
@@ -4013,6 +4011,7 @@ ixgbe_dev_link_update_share(struct rte_eth_dev *dev,
if (diag != 0) {
link.link_speed = ETH_SPEED_NUM_100M;
link.link_duplex = ETH_LINK_FULL_DUPLEX;
+   link.link_status = ETH_LINK_DOWN;
return rte_eth_linkstatus_set(dev, &link);
}
 
-- 
2.11.0



[dpdk-dev] [PATCH v2] net/ixgbe: fix link status when link is NACK

2018-07-24 Thread Yanglong Wu
Link status should be set as down when link is NACK.

Fixes: dc66e5fd01b9 ("net/ixgbe: improve link state check on VF")

Signed-off-by: Yanglong Wu 

---
v2:
no need to set link status again
---
 drivers/net/ixgbe/ixgbe_ethdev.c | 8 +++-
 1 file changed, 3 insertions(+), 5 deletions(-)

diff --git a/drivers/net/ixgbe/ixgbe_ethdev.c b/drivers/net/ixgbe/ixgbe_ethdev.c
index 997683d3b..3ffc72b40 100644
--- a/drivers/net/ixgbe/ixgbe_ethdev.c
+++ b/drivers/net/ixgbe/ixgbe_ethdev.c
@@ -3933,12 +3933,10 @@ ixgbevf_check_link(struct ixgbe_hw *hw, 
ixgbe_link_speed *speed,
}
 
if (no_pflink_check) {
-   if (*speed == IXGBE_LINK_SPEED_UNKNOWN)
+   if (*speed == IXGBE_LINK_SPEED_UNKNOWN) {
mac->get_link_status = true;
-   else
-   mac->get_link_status = false;
-
-   goto out;
+   goto out;
+   }
}
/* if the read failed it could just be a mailbox collision, best wait
 * until we are called again and don't report an error
-- 
2.11.0



[dpdk-dev] [PATCH v3] net/ixgbe: fix ixgbevf link status

2018-07-25 Thread Yanglong Wu
ixgbevf can't get right link status unless
it check PF link status in wait mode.

Fixes: dc66e5fd01b9 ("net/ixgbe: improve link state check on VF")

Signed-off-by: Yanglong Wu 
---
v3:
change to wait mode in ixgbevf
---
v2:
no need to set link status again
---
 drivers/net/ixgbe/ixgbe_ethdev.c | 3 ++-
 1 file changed, 2 insertions(+), 1 deletion(-)

diff --git a/drivers/net/ixgbe/ixgbe_ethdev.c b/drivers/net/ixgbe/ixgbe_ethdev.c
index 26b192737..b90b352e3 100644
--- a/drivers/net/ixgbe/ixgbe_ethdev.c
+++ b/drivers/net/ixgbe/ixgbe_ethdev.c
@@ -4006,7 +4006,8 @@ ixgbe_dev_link_update_share(struct rte_eth_dev *dev,
wait = 0;
 
if (vf)
-   diag = ixgbevf_check_link(hw, &link_speed, &link_up, wait);
+   /* ixgbevf need to wait to get link status */
+   diag = ixgbevf_check_link(hw, &link_speed, &link_up, 1);
else
diag = ixgbe_check_link(hw, &link_speed, &link_up, wait);
 
-- 
2.11.0



[dpdk-dev] [PATCH] net/i40e: fix max frame size checking

2018-07-25 Thread Yanglong Wu
No need to check max frame size in TX, the checking
should be done in up layer protocal. This checking will
lead to fail for TSO or other application cases.

Fixes: bfeed0262b0c ("net/i40e: check illegal packets")

Signed-off-by: Yanglong Wu 
---
 drivers/net/i40e/i40e_rxtx.c | 3 +--
 1 file changed, 1 insertion(+), 2 deletions(-)

diff --git a/drivers/net/i40e/i40e_rxtx.c b/drivers/net/i40e/i40e_rxtx.c
index 3be87fe6a..baad433a7 100644
--- a/drivers/net/i40e/i40e_rxtx.c
+++ b/drivers/net/i40e/i40e_rxtx.c
@@ -1459,8 +1459,7 @@ i40e_prep_pkts(__rte_unused void *tx_queue, struct 
rte_mbuf **tx_pkts,
}
 
/* check the size of packet */
-   if (m->pkt_len > I40E_FRAME_SIZE_MAX ||
-   m->pkt_len < I40E_TX_MIN_PKT_LEN) {
+   if (m->pkt_len < I40E_TX_MIN_PKT_LEN) {
rte_errno = -EINVAL;
return i;
}
-- 
2.11.0



[dpdk-dev] [PATCH v2] net/i40e: fix max frame size checking

2018-07-26 Thread Yanglong Wu
Check patcket size according to TSO or no-TSO.

Fixes: bfeed0262b0c ("net/i40e: check illegal packets")

Signed-off-by: Yanglong Wu 
---
v2:
change as comments.
---
 drivers/net/i40e/i40e_ethdev.h | 1 +
 drivers/net/i40e/i40e_rxtx.c   | 9 +
 2 files changed, 6 insertions(+), 4 deletions(-)

diff --git a/drivers/net/i40e/i40e_ethdev.h b/drivers/net/i40e/i40e_ethdev.h
index cb5e5b5d8..3fffe5a55 100644
--- a/drivers/net/i40e/i40e_ethdev.h
+++ b/drivers/net/i40e/i40e_ethdev.h
@@ -28,6 +28,7 @@
 #define I40E_NUM_DESC_ALIGN   32
 #define I40E_BUF_SIZE_MIN 1024
 #define I40E_FRAME_SIZE_MAX   9728
+#define I40E_TSO_FRAME_SIZE_MAX   262144
 #define I40E_QUEUE_BASE_ADDR_UNIT 128
 /* number of VSIs and queue default setting */
 #define I40E_MAX_QP_NUM_PER_VF16
diff --git a/drivers/net/i40e/i40e_rxtx.c b/drivers/net/i40e/i40e_rxtx.c
index 3be87fe6a..1bbc0340b 100644
--- a/drivers/net/i40e/i40e_rxtx.c
+++ b/drivers/net/i40e/i40e_rxtx.c
@@ -1439,13 +1439,15 @@ i40e_prep_pkts(__rte_unused void *tx_queue, struct 
rte_mbuf **tx_pkts,
 
/* Check for m->nb_segs to not exceed the limits. */
if (!(ol_flags & PKT_TX_TCP_SEG)) {
-   if (m->nb_segs > I40E_TX_MAX_MTU_SEG) {
+   if (m->nb_segs > I40E_TX_MAX_MTU_SEG ||
+   m->pkt_len > I40E_FRAME_SIZE_MAX) {
rte_errno = -EINVAL;
return i;
}
} else if (m->nb_segs > I40E_TX_MAX_SEG ||
   m->tso_segsz < I40E_MIN_TSO_MSS ||
-  m->tso_segsz > I40E_MAX_TSO_MSS) {
+  m->tso_segsz > I40E_MAX_TSO_MSS ||
+  m->pkt_len > I40E_TSO_FRAME_SIZE_MAX) {
/* MSS outside the range (256B - 9674B) are considered
 * malicious
 */
@@ -1459,8 +1461,7 @@ i40e_prep_pkts(__rte_unused void *tx_queue, struct 
rte_mbuf **tx_pkts,
}
 
/* check the size of packet */
-   if (m->pkt_len > I40E_FRAME_SIZE_MAX ||
-   m->pkt_len < I40E_TX_MIN_PKT_LEN) {
+   if (m->pkt_len < I40E_TX_MIN_PKT_LEN) {
rte_errno = -EINVAL;
return i;
}
-- 
2.11.0



[dpdk-dev] [PATCH] net/ixgbe: fix ixgbevf link status

2018-08-10 Thread Yanglong Wu
For ixgbevf kernel driver, link status changes from down to up
will trigger vf kernel driver send IXGBE_VF_RESET message to pf
kernel driver, after this, vf kernel driver will disable and enable
it self. By these series operations, the vf kernel driver report
link up. Besides, all these operations handles in kernel thread.
For DPDK user space driver, it only gets link status changes from
down to up, but miss IXGBE_VF_RESET message sending and reset itself.
If we will add fully implementation of link status change for DPDK
user space driver, we need take much more modification. We have
aligned that for link status changes from down to up we only notify
link is up, users need to reset vf port.

Fixes: dc66e5fd01b9 ("net/ixgbe: improve link state check on VF")

Signed-off-by: Rosen Xu 
Signed-off-by: Yanglong Wu 
---
 drivers/net/ixgbe/ixgbe_ethdev.c | 14 ++
 1 file changed, 2 insertions(+), 12 deletions(-)

diff --git a/drivers/net/ixgbe/ixgbe_ethdev.c b/drivers/net/ixgbe/ixgbe_ethdev.c
index 26b192737..4d5f4441b 100644
--- a/drivers/net/ixgbe/ixgbe_ethdev.c
+++ b/drivers/net/ixgbe/ixgbe_ethdev.c
@@ -3865,13 +3865,12 @@ ixgbevf_dev_info_get(struct rte_eth_dev *dev,
 
 static int
 ixgbevf_check_link(struct ixgbe_hw *hw, ixgbe_link_speed *speed,
-  int *link_up, int wait_to_complete)
+  int *link_up, __attribute__((unused)) int wait_to_complete)
 {
/**
 * for a quick link status checking, wait_to_compelet == 0,
 * skip PF link status checking
 */
-   bool no_pflink_check = wait_to_complete == 0;
struct ixgbe_mbx_info *mbx = &hw->mbx;
struct ixgbe_mac_info *mac = &hw->mac;
uint32_t links_reg, in_msg;
@@ -3931,15 +3930,6 @@ ixgbevf_check_link(struct ixgbe_hw *hw, ixgbe_link_speed 
*speed,
default:
*speed = IXGBE_LINK_SPEED_UNKNOWN;
}
-
-   if (no_pflink_check) {
-   if (*speed == IXGBE_LINK_SPEED_UNKNOWN)
-   mac->get_link_status = true;
-   else
-   mac->get_link_status = false;
-
-   goto out;
-   }
/* if the read failed it could just be a mailbox collision, best wait
 * until we are called again and don't report an error
 */
@@ -3949,7 +3939,7 @@ ixgbevf_check_link(struct ixgbe_hw *hw, ixgbe_link_speed 
*speed,
if (!(in_msg & IXGBE_VT_MSGTYPE_CTS)) {
/* msg is not CTS and is NACK we must have lost CTS status */
if (in_msg & IXGBE_VT_MSGTYPE_NACK)
-   ret_val = -1;
+   mac->get_link_status = false;
goto out;
}
 
-- 
2.11.0



[dpdk-dev] [PATCH v2] net/i40e: fix checking offloading fail for Tx

2018-04-26 Thread Yanglong Wu
Missing "return -ENOTSUP" will alays leads to
illegal offload passing through offload checking.

Fixes: b43290f1ade2 ("net/i40e: convert to new Tx offloads API")
Signed-off-by: Yanglong Wu 
---
v2:
rework fix line 
---
 drivers/net/i40e/i40e_rxtx.c | 4 +++-
 1 file changed, 3 insertions(+), 1 deletion(-)

diff --git a/drivers/net/i40e/i40e_rxtx.c b/drivers/net/i40e/i40e_rxtx.c
index bc660596b..2ce930827 100644
--- a/drivers/net/i40e/i40e_rxtx.c
+++ b/drivers/net/i40e/i40e_rxtx.c
@@ -2038,7 +2038,9 @@ i40e_dev_tx_queue_setup(struct rte_eth_dev *dev,
" or supported offloads 0x%" PRIx64,
(void *)dev, tx_conf->offloads,
dev->data->dev_conf.txmode.offloads,
-   dev_info.tx_offload_capa); }
+   dev_info.tx_offload_capa);
+   return -ENOTSUP;
+   }
 
if (hw->mac.type == I40E_MAC_VF || hw->mac.type == I40E_MAC_X722_VF) {
vf = I40EVF_DEV_PRIVATE_TO_VF(dev->data->dev_private);
-- 
2.11.0



[dpdk-dev] [PATCH v2] net/i40e: fix missing some offload capabilities

2018-04-26 Thread Yanglong Wu
MULTI_SEGS and JUMBO_FRAME offload capability
should be exposed both VF and PF since i40e
does support it.

Fixes: fbf959fe61e7 ("net/i40e: convert to new Rx offloads API")
Fixes: b43290f1ade2 ("net/i40e: convert to new Tx offloads API")
Signed-off-by: Yanglong Wu 
---
v2:
rework fix line
---
 drivers/net/i40e/i40e_ethdev.c| 3 ++-
 drivers/net/i40e/i40e_ethdev_vf.c | 6 --
 2 files changed, 6 insertions(+), 3 deletions(-)

diff --git a/drivers/net/i40e/i40e_ethdev.c b/drivers/net/i40e/i40e_ethdev.c
index c3bd254ae..d069a3ebe 100644
--- a/drivers/net/i40e/i40e_ethdev.c
+++ b/drivers/net/i40e/i40e_ethdev.c
@@ -3244,7 +3244,8 @@ i40e_dev_info_get(struct rte_eth_dev *dev, struct 
rte_eth_dev_info *dev_info)
DEV_TX_OFFLOAD_VXLAN_TNL_TSO |
DEV_TX_OFFLOAD_GRE_TNL_TSO |
DEV_TX_OFFLOAD_IPIP_TNL_TSO |
-   DEV_TX_OFFLOAD_GENEVE_TNL_TSO;
+   DEV_TX_OFFLOAD_GENEVE_TNL_TSO |
+   DEV_TX_OFFLOAD_MULTI_SEGS;
dev_info->hash_key_size = (I40E_PFQF_HKEY_MAX_INDEX + 1) *
sizeof(uint32_t);
dev_info->reta_size = pf->hash_lut_size;
diff --git a/drivers/net/i40e/i40e_ethdev_vf.c 
b/drivers/net/i40e/i40e_ethdev_vf.c
index 031c70680..bf9e14ee3 100644
--- a/drivers/net/i40e/i40e_ethdev_vf.c
+++ b/drivers/net/i40e/i40e_ethdev_vf.c
@@ -2200,7 +2200,8 @@ i40evf_dev_info_get(struct rte_eth_dev *dev, struct 
rte_eth_dev_info *dev_info)
DEV_RX_OFFLOAD_TCP_CKSUM |
DEV_RX_OFFLOAD_OUTER_IPV4_CKSUM |
DEV_RX_OFFLOAD_CRC_STRIP |
-   DEV_RX_OFFLOAD_SCATTER;
+   DEV_RX_OFFLOAD_SCATTER |
+   DEV_RX_OFFLOAD_JUMBO_FRAME;
 
dev_info->tx_queue_offload_capa = 0;
dev_info->tx_offload_capa =
@@ -2215,7 +2216,8 @@ i40evf_dev_info_get(struct rte_eth_dev *dev, struct 
rte_eth_dev_info *dev_info)
DEV_TX_OFFLOAD_VXLAN_TNL_TSO |
DEV_TX_OFFLOAD_GRE_TNL_TSO |
DEV_TX_OFFLOAD_IPIP_TNL_TSO |
-   DEV_TX_OFFLOAD_GENEVE_TNL_TSO;
+   DEV_TX_OFFLOAD_GENEVE_TNL_TSO |
+   DEV_TX_OFFLOAD_MULTI_SEGS;
 
dev_info->default_rxconf = (struct rte_eth_rxconf) {
.rx_thresh = {
-- 
2.11.0



[dpdk-dev] [PATCH v2] net/i40e: fix checking offloading fail for Tx

2018-04-26 Thread Yanglong Wu
Missing "return -ENOTSUP" will alays leads to
illegal offload passing through offload checking.

Fixes: b43290f1ade2 ("net/i40e: convert to new Tx offloads API")
Signed-off-by: Yanglong Wu 
---
v2:
rework fix line 
---
 drivers/net/i40e/i40e_rxtx.c | 4 +++-
 1 file changed, 3 insertions(+), 1 deletion(-)

diff --git a/drivers/net/i40e/i40e_rxtx.c b/drivers/net/i40e/i40e_rxtx.c
index bc660596b..2ce930827 100644
--- a/drivers/net/i40e/i40e_rxtx.c
+++ b/drivers/net/i40e/i40e_rxtx.c
@@ -2038,7 +2038,9 @@ i40e_dev_tx_queue_setup(struct rte_eth_dev *dev,
" or supported offloads 0x%" PRIx64,
(void *)dev, tx_conf->offloads,
dev->data->dev_conf.txmode.offloads,
-   dev_info.tx_offload_capa); }
+   dev_info.tx_offload_capa);
+   return -ENOTSUP;
+   }
 
if (hw->mac.type == I40E_MAC_VF || hw->mac.type == I40E_MAC_X722_VF) {
vf = I40EVF_DEV_PRIVATE_TO_VF(dev->data->dev_private);
-- 
2.11.0



[dpdk-dev] [PATCH v2] net/i40e: fix missing some offload capabilities

2018-04-26 Thread Yanglong Wu
MULTI_SEGS and JUMBO_FRAME offload capability
should be exposed both VF and PF since i40e
does support it.

Fixes: fbf959fe61e7 ("net/i40e: convert to new Rx offloads API")
Fixes: b43290f1ade2 ("net/i40e: convert to new Tx offloads API")
Signed-off-by: Yanglong Wu 
---
v2:
rework fix line
---
 drivers/net/i40e/i40e_ethdev.c| 3 ++-
 drivers/net/i40e/i40e_ethdev_vf.c | 6 --
 2 files changed, 6 insertions(+), 3 deletions(-)

diff --git a/drivers/net/i40e/i40e_ethdev.c b/drivers/net/i40e/i40e_ethdev.c
index c3bd254ae..d069a3ebe 100644
--- a/drivers/net/i40e/i40e_ethdev.c
+++ b/drivers/net/i40e/i40e_ethdev.c
@@ -3244,7 +3244,8 @@ i40e_dev_info_get(struct rte_eth_dev *dev, struct 
rte_eth_dev_info *dev_info)
DEV_TX_OFFLOAD_VXLAN_TNL_TSO |
DEV_TX_OFFLOAD_GRE_TNL_TSO |
DEV_TX_OFFLOAD_IPIP_TNL_TSO |
-   DEV_TX_OFFLOAD_GENEVE_TNL_TSO;
+   DEV_TX_OFFLOAD_GENEVE_TNL_TSO |
+   DEV_TX_OFFLOAD_MULTI_SEGS;
dev_info->hash_key_size = (I40E_PFQF_HKEY_MAX_INDEX + 1) *
sizeof(uint32_t);
dev_info->reta_size = pf->hash_lut_size;
diff --git a/drivers/net/i40e/i40e_ethdev_vf.c 
b/drivers/net/i40e/i40e_ethdev_vf.c
index 031c70680..bf9e14ee3 100644
--- a/drivers/net/i40e/i40e_ethdev_vf.c
+++ b/drivers/net/i40e/i40e_ethdev_vf.c
@@ -2200,7 +2200,8 @@ i40evf_dev_info_get(struct rte_eth_dev *dev, struct 
rte_eth_dev_info *dev_info)
DEV_RX_OFFLOAD_TCP_CKSUM |
DEV_RX_OFFLOAD_OUTER_IPV4_CKSUM |
DEV_RX_OFFLOAD_CRC_STRIP |
-   DEV_RX_OFFLOAD_SCATTER;
+   DEV_RX_OFFLOAD_SCATTER |
+   DEV_RX_OFFLOAD_JUMBO_FRAME;
 
dev_info->tx_queue_offload_capa = 0;
dev_info->tx_offload_capa =
@@ -2215,7 +2216,8 @@ i40evf_dev_info_get(struct rte_eth_dev *dev, struct 
rte_eth_dev_info *dev_info)
DEV_TX_OFFLOAD_VXLAN_TNL_TSO |
DEV_TX_OFFLOAD_GRE_TNL_TSO |
DEV_TX_OFFLOAD_IPIP_TNL_TSO |
-   DEV_TX_OFFLOAD_GENEVE_TNL_TSO;
+   DEV_TX_OFFLOAD_GENEVE_TNL_TSO |
+   DEV_TX_OFFLOAD_MULTI_SEGS;
 
dev_info->default_rxconf = (struct rte_eth_rxconf) {
.rx_thresh = {
-- 
2.11.0



[dpdk-dev] [PATCH v2] net/i40e: fix checking offloading fail for Tx

2018-04-27 Thread Yanglong Wu
Missing "return -ENOTSUP" will alays leads to
illegal offload passing through offload checking.

Fixes: 7497d3e2f777 ("net/i40e: convert to new Tx offloads API")
Signed-off-by: Yanglong Wu 
---
v2:
rework fix line 
---
 drivers/net/i40e/i40e_rxtx.c | 4 +++-
 1 file changed, 3 insertions(+), 1 deletion(-)

diff --git a/drivers/net/i40e/i40e_rxtx.c b/drivers/net/i40e/i40e_rxtx.c
index bc660596b..2ce930827 100644
--- a/drivers/net/i40e/i40e_rxtx.c
+++ b/drivers/net/i40e/i40e_rxtx.c
@@ -2038,7 +2038,9 @@ i40e_dev_tx_queue_setup(struct rte_eth_dev *dev,
" or supported offloads 0x%" PRIx64,
(void *)dev, tx_conf->offloads,
dev->data->dev_conf.txmode.offloads,
-   dev_info.tx_offload_capa); }
+   dev_info.tx_offload_capa);
+   return -ENOTSUP;
+   }
 
if (hw->mac.type == I40E_MAC_VF || hw->mac.type == I40E_MAC_X722_VF) {
vf = I40EVF_DEV_PRIVATE_TO_VF(dev->data->dev_private);
-- 
2.11.0



[dpdk-dev] [PATCH v2] net/i40e: fix missing some offload capabilities

2018-04-27 Thread Yanglong Wu
MULTI_SEGS and JUMBO_FRAME offload capability
should be exposed both VF and PF since i40e
does support it.

Fixes: c3ac7c5b0b8a ("net/i40e: convert to new Rx offloads API")
Fixes: 7497d3e2f777 ("net/i40e: convert to new Tx offloads API")
Signed-off-by: Yanglong Wu 
---
v2:
rework fix line
---
 drivers/net/i40e/i40e_ethdev.c| 3 ++-
 drivers/net/i40e/i40e_ethdev_vf.c | 6 --
 2 files changed, 6 insertions(+), 3 deletions(-)

diff --git a/drivers/net/i40e/i40e_ethdev.c b/drivers/net/i40e/i40e_ethdev.c
index c3bd254ae..d069a3ebe 100644
--- a/drivers/net/i40e/i40e_ethdev.c
+++ b/drivers/net/i40e/i40e_ethdev.c
@@ -3244,7 +3244,8 @@ i40e_dev_info_get(struct rte_eth_dev *dev, struct 
rte_eth_dev_info *dev_info)
DEV_TX_OFFLOAD_VXLAN_TNL_TSO |
DEV_TX_OFFLOAD_GRE_TNL_TSO |
DEV_TX_OFFLOAD_IPIP_TNL_TSO |
-   DEV_TX_OFFLOAD_GENEVE_TNL_TSO;
+   DEV_TX_OFFLOAD_GENEVE_TNL_TSO |
+   DEV_TX_OFFLOAD_MULTI_SEGS;
dev_info->hash_key_size = (I40E_PFQF_HKEY_MAX_INDEX + 1) *
sizeof(uint32_t);
dev_info->reta_size = pf->hash_lut_size;
diff --git a/drivers/net/i40e/i40e_ethdev_vf.c 
b/drivers/net/i40e/i40e_ethdev_vf.c
index 031c70680..bf9e14ee3 100644
--- a/drivers/net/i40e/i40e_ethdev_vf.c
+++ b/drivers/net/i40e/i40e_ethdev_vf.c
@@ -2200,7 +2200,8 @@ i40evf_dev_info_get(struct rte_eth_dev *dev, struct 
rte_eth_dev_info *dev_info)
DEV_RX_OFFLOAD_TCP_CKSUM |
DEV_RX_OFFLOAD_OUTER_IPV4_CKSUM |
DEV_RX_OFFLOAD_CRC_STRIP |
-   DEV_RX_OFFLOAD_SCATTER;
+   DEV_RX_OFFLOAD_SCATTER |
+   DEV_RX_OFFLOAD_JUMBO_FRAME;
 
dev_info->tx_queue_offload_capa = 0;
dev_info->tx_offload_capa =
@@ -2215,7 +2216,8 @@ i40evf_dev_info_get(struct rte_eth_dev *dev, struct 
rte_eth_dev_info *dev_info)
DEV_TX_OFFLOAD_VXLAN_TNL_TSO |
DEV_TX_OFFLOAD_GRE_TNL_TSO |
DEV_TX_OFFLOAD_IPIP_TNL_TSO |
-   DEV_TX_OFFLOAD_GENEVE_TNL_TSO;
+   DEV_TX_OFFLOAD_GENEVE_TNL_TSO |
+   DEV_TX_OFFLOAD_MULTI_SEGS;
 
dev_info->default_rxconf = (struct rte_eth_rxconf) {
.rx_thresh = {
-- 
2.11.0



[dpdk-dev] [PATCH v2] net/i40e: fix missing some offload capabilities

2018-04-28 Thread Yanglong Wu
MULTI_SEGS and JUMBO_FRAME offload capability
should be exposed both VF and PF since i40e
does support it.

Fixes: c3ac7c5b0b8a ("net/i40e: convert to new Rx offloads API")
Fixes: 7497d3e2f777 ("net/i40e: convert to new Tx offloads API")
Signed-off-by: Yanglong Wu 
---
v2:
rework fix line
---
 drivers/net/i40e/i40e_ethdev.c| 3 ++-
 drivers/net/i40e/i40e_ethdev_vf.c | 6 --
 2 files changed, 6 insertions(+), 3 deletions(-)

diff --git a/drivers/net/i40e/i40e_ethdev.c b/drivers/net/i40e/i40e_ethdev.c
index d869add95..2e454566a 100644
--- a/drivers/net/i40e/i40e_ethdev.c
+++ b/drivers/net/i40e/i40e_ethdev.c
@@ -3316,7 +3316,8 @@ i40e_dev_info_get(struct rte_eth_dev *dev, struct 
rte_eth_dev_info *dev_info)
DEV_TX_OFFLOAD_VXLAN_TNL_TSO |
DEV_TX_OFFLOAD_GRE_TNL_TSO |
DEV_TX_OFFLOAD_IPIP_TNL_TSO |
-   DEV_TX_OFFLOAD_GENEVE_TNL_TSO;
+   DEV_TX_OFFLOAD_GENEVE_TNL_TSO |
+   DEV_TX_OFFLOAD_MULTI_SEGS;
dev_info->dev_capa =
RTE_ETH_DEV_CAPA_RUNTIME_RX_QUEUE_SETUP |
RTE_ETH_DEV_CAPA_RUNTIME_TX_QUEUE_SETUP;
diff --git a/drivers/net/i40e/i40e_ethdev_vf.c 
b/drivers/net/i40e/i40e_ethdev_vf.c
index 48e7ac21e..dba28bb90 100644
--- a/drivers/net/i40e/i40e_ethdev_vf.c
+++ b/drivers/net/i40e/i40e_ethdev_vf.c
@@ -2200,7 +2200,8 @@ i40evf_dev_info_get(struct rte_eth_dev *dev, struct 
rte_eth_dev_info *dev_info)
DEV_RX_OFFLOAD_TCP_CKSUM |
DEV_RX_OFFLOAD_OUTER_IPV4_CKSUM |
DEV_RX_OFFLOAD_CRC_STRIP |
-   DEV_RX_OFFLOAD_SCATTER;
+   DEV_RX_OFFLOAD_SCATTER |
+   DEV_RX_OFFLOAD_JUMBO_FRAME;
 
dev_info->tx_queue_offload_capa = 0;
dev_info->tx_offload_capa =
@@ -2215,7 +2216,8 @@ i40evf_dev_info_get(struct rte_eth_dev *dev, struct 
rte_eth_dev_info *dev_info)
DEV_TX_OFFLOAD_VXLAN_TNL_TSO |
DEV_TX_OFFLOAD_GRE_TNL_TSO |
DEV_TX_OFFLOAD_IPIP_TNL_TSO |
-   DEV_TX_OFFLOAD_GENEVE_TNL_TSO;
+   DEV_TX_OFFLOAD_GENEVE_TNL_TSO |
+   DEV_TX_OFFLOAD_MULTI_SEGS;
 
dev_info->default_rxconf = (struct rte_eth_rxconf) {
.rx_thresh = {
-- 
2.11.0



[dpdk-dev] [PATCH] net/i40e: fix missing VLAN offload capability

2018-05-09 Thread Yanglong Wu
VLAN offload capability should be exposed both
VF and PF since i40e does support it.

Fixes: c3ac7c5b0b8a ("net/i40e: convert to new Rx offloads API")
Signed-off-by: Yanglong Wu 
---
 drivers/net/i40e/i40e_ethdev.c | 4 +++-
 1 file changed, 3 insertions(+), 1 deletion(-)

diff --git a/drivers/net/i40e/i40e_ethdev.c b/drivers/net/i40e/i40e_ethdev.c
index 894505f98..ad377f440 100644
--- a/drivers/net/i40e/i40e_ethdev.c
+++ b/drivers/net/i40e/i40e_ethdev.c
@@ -3299,7 +3299,9 @@ i40e_dev_info_get(struct rte_eth_dev *dev, struct 
rte_eth_dev_info *dev_info)
DEV_RX_OFFLOAD_CRC_STRIP |
DEV_RX_OFFLOAD_VLAN_EXTEND |
DEV_RX_OFFLOAD_VLAN_FILTER |
-   DEV_RX_OFFLOAD_JUMBO_FRAME;
+   DEV_RX_OFFLOAD_JUMBO_FRAME |
+   DEV_RX_OFFLOAD_VLAN_FILTER |
+   DEV_RX_OFFLOAD_VLAN_EXTEND;
 
dev_info->tx_queue_offload_capa = DEV_TX_OFFLOAD_MBUF_FAST_FREE;
dev_info->tx_offload_capa =
-- 
2.11.0



[dpdk-dev] [PATCH v2] net/i40e: fix missing VLAN offload capability

2018-05-09 Thread Yanglong Wu
VLAN offload capability should be exposed in VF
since i40e does support it.

Fixes: c3ac7c5b0b8a ("net/i40e: convert to new Rx offloads API")
Signed-off-by: Yanglong Wu 
---
v2:
rework as comments required
---
 drivers/net/i40e/i40e_ethdev_vf.c | 4 +++-
 1 file changed, 3 insertions(+), 1 deletion(-)

diff --git a/drivers/net/i40e/i40e_ethdev_vf.c 
b/drivers/net/i40e/i40e_ethdev_vf.c
index b9dea2e5b..33beded37 100644
--- a/drivers/net/i40e/i40e_ethdev_vf.c
+++ b/drivers/net/i40e/i40e_ethdev_vf.c
@@ -2200,7 +2200,9 @@ i40evf_dev_info_get(struct rte_eth_dev *dev, struct 
rte_eth_dev_info *dev_info)
DEV_RX_OFFLOAD_TCP_CKSUM |
DEV_RX_OFFLOAD_OUTER_IPV4_CKSUM |
DEV_RX_OFFLOAD_CRC_STRIP |
-   DEV_RX_OFFLOAD_SCATTER;
+   DEV_RX_OFFLOAD_SCATTER |
+   DEV_RX_OFFLOAD_VLAN_FILTER |
+   DEV_RX_OFFLOAD_VLAN_EXTEND;
 
dev_info->tx_queue_offload_capa = 0;
dev_info->tx_offload_capa =
-- 
2.11.0



[dpdk-dev] [PATCH v2] net/i40e: fix missing VLAN offload capability

2018-05-09 Thread Yanglong Wu
VLAN offload capability should be exposed in VF
since i40e does support it.

Fixes: c3ac7c5b0b8a ("net/i40e: convert to new Rx offloads API")
Signed-off-by: Yanglong Wu 
---
v2:
rework as comments required
---
 drivers/net/i40e/i40e_ethdev_vf.c | 3 ++-
 1 file changed, 2 insertions(+), 1 deletion(-)

diff --git a/drivers/net/i40e/i40e_ethdev_vf.c 
b/drivers/net/i40e/i40e_ethdev_vf.c
index b9dea2e5b..2a37b31b2 100644
--- a/drivers/net/i40e/i40e_ethdev_vf.c
+++ b/drivers/net/i40e/i40e_ethdev_vf.c
@@ -2200,7 +2200,8 @@ i40evf_dev_info_get(struct rte_eth_dev *dev, struct 
rte_eth_dev_info *dev_info)
DEV_RX_OFFLOAD_TCP_CKSUM |
DEV_RX_OFFLOAD_OUTER_IPV4_CKSUM |
DEV_RX_OFFLOAD_CRC_STRIP |
-   DEV_RX_OFFLOAD_SCATTER;
+   DEV_RX_OFFLOAD_SCATTER |
+   DEV_RX_OFFLOAD_VLAN_FILTER;
 
dev_info->tx_queue_offload_capa = 0;
dev_info->tx_offload_capa =
-- 
2.11.0



[dpdk-dev] [PATCH] ethdev: fix checking Rx/Tx queue status

2018-05-11 Thread Yanglong Wu
Relax the check for queue setup, since some device
may not update queue states during dev_stop.

Fixes: cac923cfea47 ("ethdev: support runtime queue setup")
Signed-off-by: Yanglong Wu 
---
 lib/librte_ethdev/rte_ethdev.c | 10 ++
 1 file changed, 6 insertions(+), 4 deletions(-)

diff --git a/lib/librte_ethdev/rte_ethdev.c b/lib/librte_ethdev/rte_ethdev.c
index a357ee09f..34379642a 100644
--- a/lib/librte_ethdev/rte_ethdev.c
+++ b/lib/librte_ethdev/rte_ethdev.c
@@ -1479,8 +1479,9 @@ rte_eth_rx_queue_setup(uint16_t port_id, uint16_t 
rx_queue_id,
RTE_ETH_DEV_CAPA_RUNTIME_RX_QUEUE_SETUP))
return -EBUSY;
 
-   if (dev->data->rx_queue_state[rx_queue_id] !=
-   RTE_ETH_QUEUE_STATE_STOPPED)
+   if (dev->data->dev_started &&
+   (dev->data->rx_queue_state[rx_queue_id] !=
+   RTE_ETH_QUEUE_STATE_STOPPED))
return -EBUSY;
 
rxq = dev->data->rx_queues;
@@ -1611,8 +1612,9 @@ rte_eth_tx_queue_setup(uint16_t port_id, uint16_t 
tx_queue_id,
RTE_ETH_DEV_CAPA_RUNTIME_TX_QUEUE_SETUP))
return -EBUSY;
 
-   if (dev->data->tx_queue_state[tx_queue_id] !=
-   RTE_ETH_QUEUE_STATE_STOPPED)
+   if (dev->data->dev_started &&
+   (dev->data->tx_queue_state[tx_queue_id] !=
+   RTE_ETH_QUEUE_STATE_STOPPED))
return -EBUSY;
 
txq = dev->data->tx_queues;
-- 
2.11.0



[dpdk-dev] [PATCH] net/ixgbe: fix VLAN strip setting fail for per port

2018-05-16 Thread Yanglong Wu
VLAN-strip should be set by both per port and per queue

Fixes: 860a94d3c692 ("net/ixgbe: support VLAN strip per queue offloading in VF")
Signed-off-by: Yanglong Wu 
---
 drivers/net/ixgbe/ixgbe_ethdev.c | 4 +++-
 1 file changed, 3 insertions(+), 1 deletion(-)

diff --git a/drivers/net/ixgbe/ixgbe_ethdev.c b/drivers/net/ixgbe/ixgbe_ethdev.c
index f5006bc94..f27e777fe 100644
--- a/drivers/net/ixgbe/ixgbe_ethdev.c
+++ b/drivers/net/ixgbe/ixgbe_ethdev.c
@@ -5228,9 +5228,11 @@ ixgbevf_vlan_offload_set(struct rte_eth_dev *dev, int 
mask)
 
/* VF function only support hw strip feature, others are not support */
if (mask & ETH_VLAN_STRIP_MASK) {
+   on = !!(dev->data->dev_conf.rxmode.offloads &
+   DEV_RX_OFFLOAD_VLAN_STRIP);
for (i = 0; i < dev->data->nb_rx_queues; i++) {
rxq = dev->data->rx_queues[i];
-   on = !!(rxq->offloads & DEV_RX_OFFLOAD_VLAN_STRIP);
+   on |= !!(rxq->offloads & DEV_RX_OFFLOAD_VLAN_STRIP);
ixgbevf_vlan_strip_queue_set(dev, i, on);
}
}
-- 
2.11.0



[dpdk-dev] [DPDK] net/ixgbe: fix VLAN strip setting fail for per port

2018-05-18 Thread Yanglong Wu
rxq->offload should synchronize with dev_conf

Fixes: 860a94d3c692 ("net/ixgbe: support VLAN strip per queue offloading in VF")
Signed-off-by: Yanglong Wu 
---
V2:
rework as comments
---
 drivers/net/ixgbe/ixgbe_ethdev.c | 16 
 1 file changed, 16 insertions(+)

diff --git a/drivers/net/ixgbe/ixgbe_ethdev.c b/drivers/net/ixgbe/ixgbe_ethdev.c
index f5006bc94..94d28878a 100644
--- a/drivers/net/ixgbe/ixgbe_ethdev.c
+++ b/drivers/net/ixgbe/ixgbe_ethdev.c
@@ -2114,6 +2114,14 @@ ixgbe_vlan_hw_strip_config(struct rte_eth_dev *dev)
for (i = 0; i < dev->data->nb_rx_queues; i++) {
rxq = dev->data->rx_queues[i];
ctrl = IXGBE_READ_REG(hw, IXGBE_RXDCTL(rxq->reg_idx));
+
+   /* rxq->offload should synchronize with dev_conf*/
+   if (dev->data->dev_conf.rxmode.offloads &
+   DEV_RX_OFFLOAD_VLAN_STRIP)
+   rxq->offloads |= DEV_RX_OFFLOAD_VLAN_STRIP;
+   else
+   rxq->offloads &= ~DEV_RX_OFFLOAD_VLAN_STRIP;
+
if (rxq->offloads & DEV_RX_OFFLOAD_VLAN_STRIP) {
ctrl |= IXGBE_RXDCTL_VME;
on = TRUE;
@@ -5230,6 +5238,14 @@ ixgbevf_vlan_offload_set(struct rte_eth_dev *dev, int 
mask)
if (mask & ETH_VLAN_STRIP_MASK) {
for (i = 0; i < dev->data->nb_rx_queues; i++) {
rxq = dev->data->rx_queues[i];
+
+   /* rxq->offload should synchronize with dev_conf*/
+   if (dev->data->dev_conf.rxmode.offloads &
+   DEV_RX_OFFLOAD_VLAN_STRIP)
+   rxq->offloads |= DEV_RX_OFFLOAD_VLAN_STRIP;
+   else
+   rxq->offloads &= ~DEV_RX_OFFLOAD_VLAN_STRIP;
+
on = !!(rxq->offloads & DEV_RX_OFFLOAD_VLAN_STRIP);
ixgbevf_vlan_strip_queue_set(dev, i, on);
}
-- 
2.11.0



[dpdk-dev] [PATCH v2] net/ixgbe: fix VLAN strip setting fail for per port

2018-05-18 Thread Yanglong Wu
rxq->offload should synchronize with dev_conf

Fixes: 860a94d3c692 ("net/ixgbe: support VLAN strip per queue offloading in VF")
Signed-off-by: Yanglong Wu 
---
v2:
rework as comments asked
---
 drivers/net/ixgbe/ixgbe_ethdev.c | 16 
 1 file changed, 16 insertions(+)

diff --git a/drivers/net/ixgbe/ixgbe_ethdev.c b/drivers/net/ixgbe/ixgbe_ethdev.c
index f5006bc94..94d28878a 100644
--- a/drivers/net/ixgbe/ixgbe_ethdev.c
+++ b/drivers/net/ixgbe/ixgbe_ethdev.c
@@ -2114,6 +2114,14 @@ ixgbe_vlan_hw_strip_config(struct rte_eth_dev *dev)
for (i = 0; i < dev->data->nb_rx_queues; i++) {
rxq = dev->data->rx_queues[i];
ctrl = IXGBE_READ_REG(hw, IXGBE_RXDCTL(rxq->reg_idx));
+
+   /* rxq->offload should synchronize with dev_conf*/
+   if (dev->data->dev_conf.rxmode.offloads &
+   DEV_RX_OFFLOAD_VLAN_STRIP)
+   rxq->offloads |= DEV_RX_OFFLOAD_VLAN_STRIP;
+   else
+   rxq->offloads &= ~DEV_RX_OFFLOAD_VLAN_STRIP;
+
if (rxq->offloads & DEV_RX_OFFLOAD_VLAN_STRIP) {
ctrl |= IXGBE_RXDCTL_VME;
on = TRUE;
@@ -5230,6 +5238,14 @@ ixgbevf_vlan_offload_set(struct rte_eth_dev *dev, int 
mask)
if (mask & ETH_VLAN_STRIP_MASK) {
for (i = 0; i < dev->data->nb_rx_queues; i++) {
rxq = dev->data->rx_queues[i];
+
+   /* rxq->offload should synchronize with dev_conf*/
+   if (dev->data->dev_conf.rxmode.offloads &
+   DEV_RX_OFFLOAD_VLAN_STRIP)
+   rxq->offloads |= DEV_RX_OFFLOAD_VLAN_STRIP;
+   else
+   rxq->offloads &= ~DEV_RX_OFFLOAD_VLAN_STRIP;
+
on = !!(rxq->offloads & DEV_RX_OFFLOAD_VLAN_STRIP);
ixgbevf_vlan_strip_queue_set(dev, i, on);
}
-- 
2.11.0



[dpdk-dev] [PATCH] net/i40e: illagel pactket checking

2018-06-07 Thread Yanglong Wu
Some illegal packets will lead to TX/RX hang and
can't recover automatically. This pacth check those
illegal packets and protect TX/RX from hanging.

Signed-off-by: Yanglong Wu 
---
 drivers/net/i40e/i40e_rxtx.c | 10 ++
 drivers/net/i40e/i40e_rxtx.h |  2 ++
 2 files changed, 12 insertions(+)

diff --git a/drivers/net/i40e/i40e_rxtx.c b/drivers/net/i40e/i40e_rxtx.c
index 6032d5541..be00b898e 100644
--- a/drivers/net/i40e/i40e_rxtx.c
+++ b/drivers/net/i40e/i40e_rxtx.c
@@ -1458,6 +1458,16 @@ i40e_prep_pkts(__rte_unused void *tx_queue, struct 
rte_mbuf **tx_pkts,
return i;
}
 
+   /*check the size of pkt len*/
+   if (m->pkt_len > ETHER_MAX_LEN || m->pkt_len < 
I40E_TX_MIN_PKT_LEN){
+   rte_errno = -EINVAL;
+   return i;}
+
+   /*check the number of mbuf segments*/
+   if(m->nb_segs > I40E_TX_MAX_MTU_SEG){
+   rte_errno = -EINVAL;
+   return i;}
+
 #ifdef RTE_LIBRTE_ETHDEV_DEBUG
ret = rte_validate_tx_offload(m);
if (ret != 0) {
diff --git a/drivers/net/i40e/i40e_rxtx.h b/drivers/net/i40e/i40e_rxtx.h
index ea73a8a1b..3fc619af9 100644
--- a/drivers/net/i40e/i40e_rxtx.h
+++ b/drivers/net/i40e/i40e_rxtx.h
@@ -30,6 +30,8 @@
 #define I40E_TX_MAX_SEG UINT8_MAX
 #define I40E_TX_MAX_MTU_SEG 8
 
+#define I40E_TX_MIN_PKT_LEN 17
+
 #undef container_of
 #define container_of(ptr, type, member) ({ \
typeof(((type *)0)->member)(*__mptr) = (ptr); \
-- 
2.11.0



[dpdk-dev] [PATCH v2] net/i40e: illagel pactket checking

2018-06-07 Thread Yanglong Wu
Some illegal packets will lead to TX/RX hang and
can't recover automatically. This pacth check those
illegal packets and protect TX/RX from hanging.

Signed-off-by: Yanglong Wu 
---
v2:
fix coding style issue and error
---
 drivers/net/i40e/i40e_rxtx.c | 11 +++
 drivers/net/i40e/i40e_rxtx.h |  2 ++
 2 files changed, 13 insertions(+)

diff --git a/drivers/net/i40e/i40e_rxtx.c b/drivers/net/i40e/i40e_rxtx.c
index 6032d5541..05cf3956c 100644
--- a/drivers/net/i40e/i40e_rxtx.c
+++ b/drivers/net/i40e/i40e_rxtx.c
@@ -1458,6 +1458,17 @@ i40e_prep_pkts(__rte_unused void *tx_queue, struct 
rte_mbuf **tx_pkts,
return i;
}
 
+   /*check the size of pkt len*/
+   if (m->pkt_len > I40E_FRAME_SIZE_MAX ||
+   m->pkt_len < I40E_TX_MIN_PKT_LEN) {
+   rte_errno = -EINVAL;
+   return i; }
+
+   /*check the number of mbuf segments*/
+   if (m->nb_segs > I40E_TX_MAX_MTU_SEG) {
+   rte_errno = -EINVAL;
+   return i; }
+
 #ifdef RTE_LIBRTE_ETHDEV_DEBUG
ret = rte_validate_tx_offload(m);
if (ret != 0) {
diff --git a/drivers/net/i40e/i40e_rxtx.h b/drivers/net/i40e/i40e_rxtx.h
index ea73a8a1b..3fc619af9 100644
--- a/drivers/net/i40e/i40e_rxtx.h
+++ b/drivers/net/i40e/i40e_rxtx.h
@@ -30,6 +30,8 @@
 #define I40E_TX_MAX_SEG UINT8_MAX
 #define I40E_TX_MAX_MTU_SEG 8
 
+#define I40E_TX_MIN_PKT_LEN 17
+
 #undef container_of
 #define container_of(ptr, type, member) ({ \
typeof(((type *)0)->member)(*__mptr) = (ptr); \
-- 
2.11.0



[dpdk-dev] [PATCH v3] net/i40e: illagel pactket checking

2018-06-14 Thread Yanglong Wu
Some illegal packets will lead to TX/RX hang and
can't recover automatically. This pacth check those
illegal packets and protect TX/RX from hanging.

Signed-off-by: Yanglong Wu 
---
v2:
fix coding style issue and error
---
v3:
rework as comments
---
 drivers/net/i40e/i40e_rxtx.c | 15 +++
 drivers/net/i40e/i40e_rxtx.h |  2 ++
 2 files changed, 13 insertions(+), 4 deletions(-)

diff --git a/drivers/net/i40e/i40e_rxtx.c b/drivers/net/i40e/i40e_rxtx.c
index 6032d5541..42b08f1f0 100644
--- a/drivers/net/i40e/i40e_rxtx.c
+++ b/drivers/net/i40e/i40e_rxtx.c
@@ -1439,13 +1439,13 @@ i40e_prep_pkts(__rte_unused void *tx_queue, struct 
rte_mbuf **tx_pkts,
 
/* Check for m->nb_segs to not exceed the limits. */
if (!(ol_flags & PKT_TX_TCP_SEG)) {
-   if (m->nb_segs > I40E_TX_MAX_SEG ||
-   m->nb_segs > I40E_TX_MAX_MTU_SEG) {
+   if (m->nb_segs > I40E_TX_MAX_MTU_SEG) {
rte_errno = -EINVAL;
return i;
}
-   } else if ((m->tso_segsz < I40E_MIN_TSO_MSS) ||
-   (m->tso_segsz > I40E_MAX_TSO_MSS)) {
+   } else if (m->nb_segs > I40E_TX_MAX_SEG ||
+  m->tso_segsz < I40E_MIN_TSO_MSS ||
+  m->tso_segsz > I40E_MAX_TSO_MSS) {
/* MSS outside the range (256B - 9674B) are considered
 * malicious
 */
@@ -1458,6 +1458,13 @@ i40e_prep_pkts(__rte_unused void *tx_queue, struct 
rte_mbuf **tx_pkts,
return i;
}
 
+   /* check the size of pkt len */
+   if (m->pkt_len > I40E_FRAME_SIZE_MAX ||
+   m->pkt_len < I40E_TX_MIN_PKT_LEN) {
+   rte_errno = -EINVAL;
+   return i;
+   }
+
 #ifdef RTE_LIBRTE_ETHDEV_DEBUG
ret = rte_validate_tx_offload(m);
if (ret != 0) {
diff --git a/drivers/net/i40e/i40e_rxtx.h b/drivers/net/i40e/i40e_rxtx.h
index ea73a8a1b..3fc619af9 100644
--- a/drivers/net/i40e/i40e_rxtx.h
+++ b/drivers/net/i40e/i40e_rxtx.h
@@ -30,6 +30,8 @@
 #define I40E_TX_MAX_SEG UINT8_MAX
 #define I40E_TX_MAX_MTU_SEG 8
 
+#define I40E_TX_MIN_PKT_LEN 17
+
 #undef container_of
 #define container_of(ptr, type, member) ({ \
typeof(((type *)0)->member)(*__mptr) = (ptr); \
-- 
2.11.0



[dpdk-dev] [PATCH v3] net/i40e: illegal pactket checking

2018-06-19 Thread Yanglong Wu
Some illegal packets will lead to TX/RX hang and
can't recover automatically. This patch check those
illegal packets and protect TX/RX from hanging.

Signed-off-by: Yanglong Wu 
---
v2:
fix coding style issue and error
---
v3:
rework as comments
---
 drivers/net/i40e/i40e_rxtx.c | 15 +++
 drivers/net/i40e/i40e_rxtx.h |  2 ++
 2 files changed, 13 insertions(+), 4 deletions(-)

diff --git a/drivers/net/i40e/i40e_rxtx.c b/drivers/net/i40e/i40e_rxtx.c
index 6032d5541..42b08f1f0 100644
--- a/drivers/net/i40e/i40e_rxtx.c
+++ b/drivers/net/i40e/i40e_rxtx.c
@@ -1439,13 +1439,13 @@ i40e_prep_pkts(__rte_unused void *tx_queue, struct 
rte_mbuf **tx_pkts,
 
/* Check for m->nb_segs to not exceed the limits. */
if (!(ol_flags & PKT_TX_TCP_SEG)) {
-   if (m->nb_segs > I40E_TX_MAX_SEG ||
-   m->nb_segs > I40E_TX_MAX_MTU_SEG) {
+   if (m->nb_segs > I40E_TX_MAX_MTU_SEG) {
rte_errno = -EINVAL;
return i;
}
-   } else if ((m->tso_segsz < I40E_MIN_TSO_MSS) ||
-   (m->tso_segsz > I40E_MAX_TSO_MSS)) {
+   } else if (m->nb_segs > I40E_TX_MAX_SEG ||
+  m->tso_segsz < I40E_MIN_TSO_MSS ||
+  m->tso_segsz > I40E_MAX_TSO_MSS) {
/* MSS outside the range (256B - 9674B) are considered
 * malicious
 */
@@ -1458,6 +1458,13 @@ i40e_prep_pkts(__rte_unused void *tx_queue, struct 
rte_mbuf **tx_pkts,
return i;
}
 
+   /* check the size of pkt len */
+   if (m->pkt_len > I40E_FRAME_SIZE_MAX ||
+   m->pkt_len < I40E_TX_MIN_PKT_LEN) {
+   rte_errno = -EINVAL;
+   return i;
+   }
+
 #ifdef RTE_LIBRTE_ETHDEV_DEBUG
ret = rte_validate_tx_offload(m);
if (ret != 0) {
diff --git a/drivers/net/i40e/i40e_rxtx.h b/drivers/net/i40e/i40e_rxtx.h
index ea73a8a1b..3fc619af9 100644
--- a/drivers/net/i40e/i40e_rxtx.h
+++ b/drivers/net/i40e/i40e_rxtx.h
@@ -30,6 +30,8 @@
 #define I40E_TX_MAX_SEG UINT8_MAX
 #define I40E_TX_MAX_MTU_SEG 8
 
+#define I40E_TX_MIN_PKT_LEN 17
+
 #undef container_of
 #define container_of(ptr, type, member) ({ \
typeof(((type *)0)->member)(*__mptr) = (ptr); \
-- 
2.11.0



[dpdk-dev] [PATCH] net/i40e: illegal pactket checking

2018-06-19 Thread Yanglong Wu
Some illegal packets will lead to TX/RX hang and
can't recover automatically. This patch check those
illegal packets and protect TX/RX from hanging.

Signed-off-by: Yanglong Wu 
---
v2:
fix coding style issue and spelling error
---
v3:
rework as comments
---
 drivers/net/i40e/i40e_rxtx.c | 15 +++
 drivers/net/i40e/i40e_rxtx.h |  2 ++
 2 files changed, 13 insertions(+), 4 deletions(-)

diff --git a/drivers/net/i40e/i40e_rxtx.c b/drivers/net/i40e/i40e_rxtx.c
index 6032d5541..42b08f1f0 100644
--- a/drivers/net/i40e/i40e_rxtx.c
+++ b/drivers/net/i40e/i40e_rxtx.c
@@ -1439,13 +1439,13 @@ i40e_prep_pkts(__rte_unused void *tx_queue, struct 
rte_mbuf **tx_pkts,
 
/* Check for m->nb_segs to not exceed the limits. */
if (!(ol_flags & PKT_TX_TCP_SEG)) {
-   if (m->nb_segs > I40E_TX_MAX_SEG ||
-   m->nb_segs > I40E_TX_MAX_MTU_SEG) {
+   if (m->nb_segs > I40E_TX_MAX_MTU_SEG) {
rte_errno = -EINVAL;
return i;
}
-   } else if ((m->tso_segsz < I40E_MIN_TSO_MSS) ||
-   (m->tso_segsz > I40E_MAX_TSO_MSS)) {
+   } else if (m->nb_segs > I40E_TX_MAX_SEG ||
+  m->tso_segsz < I40E_MIN_TSO_MSS ||
+  m->tso_segsz > I40E_MAX_TSO_MSS) {
/* MSS outside the range (256B - 9674B) are considered
 * malicious
 */
@@ -1458,6 +1458,13 @@ i40e_prep_pkts(__rte_unused void *tx_queue, struct 
rte_mbuf **tx_pkts,
return i;
}
 
+   /* check the size of pkt len */
+   if (m->pkt_len > I40E_FRAME_SIZE_MAX ||
+   m->pkt_len < I40E_TX_MIN_PKT_LEN) {
+   rte_errno = -EINVAL;
+   return i;
+   }
+
 #ifdef RTE_LIBRTE_ETHDEV_DEBUG
ret = rte_validate_tx_offload(m);
if (ret != 0) {
diff --git a/drivers/net/i40e/i40e_rxtx.h b/drivers/net/i40e/i40e_rxtx.h
index ea73a8a1b..3fc619af9 100644
--- a/drivers/net/i40e/i40e_rxtx.h
+++ b/drivers/net/i40e/i40e_rxtx.h
@@ -30,6 +30,8 @@
 #define I40E_TX_MAX_SEG UINT8_MAX
 #define I40E_TX_MAX_MTU_SEG 8
 
+#define I40E_TX_MIN_PKT_LEN 17
+
 #undef container_of
 #define container_of(ptr, type, member) ({ \
typeof(((type *)0)->member)(*__mptr) = (ptr); \
-- 
2.11.0



[dpdk-dev] [PATCH] net/i40e: illegal pactket checking

2018-06-19 Thread Yanglong Wu
Some illegal packets will lead to TX/RX hang and
can't recover automatically. This patch check those
illegal packets and protect TX/RX from hanging.

Signed-off-by: Yanglong Wu 
---
v2:
fix coding style issue and spelling error
---
v3:
rework as comments
---
 drivers/net/i40e/i40e_rxtx.c | 15 +++
 drivers/net/i40e/i40e_rxtx.h |  2 ++
 2 files changed, 13 insertions(+), 4 deletions(-)

diff --git a/drivers/net/i40e/i40e_rxtx.c b/drivers/net/i40e/i40e_rxtx.c
index 6032d5541..e7916f99c 100644
--- a/drivers/net/i40e/i40e_rxtx.c
+++ b/drivers/net/i40e/i40e_rxtx.c
@@ -1439,13 +1439,13 @@ i40e_prep_pkts(__rte_unused void *tx_queue, struct 
rte_mbuf **tx_pkts,
 
/* Check for m->nb_segs to not exceed the limits. */
if (!(ol_flags & PKT_TX_TCP_SEG)) {
-   if (m->nb_segs > I40E_TX_MAX_SEG ||
-   m->nb_segs > I40E_TX_MAX_MTU_SEG) {
+   if (m->nb_segs > I40E_TX_MAX_MTU_SEG) {
rte_errno = -EINVAL;
return i;
}
-   } else if ((m->tso_segsz < I40E_MIN_TSO_MSS) ||
-   (m->tso_segsz > I40E_MAX_TSO_MSS)) {
+   } else if (m->nb_segs > I40E_TX_MAX_SEG ||
+  m->tso_segsz < I40E_MIN_TSO_MSS ||
+  m->tso_segsz > I40E_MAX_TSO_MSS) {
/* MSS outside the range (256B - 9674B) are considered
 * malicious
 */
@@ -1458,6 +1458,13 @@ i40e_prep_pkts(__rte_unused void *tx_queue, struct 
rte_mbuf **tx_pkts,
return i;
}
 
+   /* check the size of packet */
+   if (m->pkt_len > I40E_FRAME_SIZE_MAX ||
+   m->pkt_len < I40E_TX_MIN_PKT_LEN) {
+   rte_errno = -EINVAL;
+   return i;
+   }
+
 #ifdef RTE_LIBRTE_ETHDEV_DEBUG
ret = rte_validate_tx_offload(m);
if (ret != 0) {
diff --git a/drivers/net/i40e/i40e_rxtx.h b/drivers/net/i40e/i40e_rxtx.h
index ea73a8a1b..3fc619af9 100644
--- a/drivers/net/i40e/i40e_rxtx.h
+++ b/drivers/net/i40e/i40e_rxtx.h
@@ -30,6 +30,8 @@
 #define I40E_TX_MAX_SEG UINT8_MAX
 #define I40E_TX_MAX_MTU_SEG 8
 
+#define I40E_TX_MIN_PKT_LEN 17
+
 #undef container_of
 #define container_of(ptr, type, member) ({ \
typeof(((type *)0)->member)(*__mptr) = (ptr); \
-- 
2.11.0



[dpdk-dev] [PATCH v3] net/i40e: illegal pactket checking

2018-06-19 Thread Yanglong Wu
Some illegal packets will lead to TX/RX hang and
can't recover automatically. This patch check those
illegal packets and protect TX/RX from hanging.

Signed-off-by: Yanglong Wu 
---
v2:
fix coding style issue and spelling error
---
v3:
rework as comments
---
 drivers/net/i40e/i40e_rxtx.c | 15 +++
 drivers/net/i40e/i40e_rxtx.h |  2 ++
 2 files changed, 13 insertions(+), 4 deletions(-)

diff --git a/drivers/net/i40e/i40e_rxtx.c b/drivers/net/i40e/i40e_rxtx.c
index 6032d5541..e7916f99c 100644
--- a/drivers/net/i40e/i40e_rxtx.c
+++ b/drivers/net/i40e/i40e_rxtx.c
@@ -1439,13 +1439,13 @@ i40e_prep_pkts(__rte_unused void *tx_queue, struct 
rte_mbuf **tx_pkts,
 
/* Check for m->nb_segs to not exceed the limits. */
if (!(ol_flags & PKT_TX_TCP_SEG)) {
-   if (m->nb_segs > I40E_TX_MAX_SEG ||
-   m->nb_segs > I40E_TX_MAX_MTU_SEG) {
+   if (m->nb_segs > I40E_TX_MAX_MTU_SEG) {
rte_errno = -EINVAL;
return i;
}
-   } else if ((m->tso_segsz < I40E_MIN_TSO_MSS) ||
-   (m->tso_segsz > I40E_MAX_TSO_MSS)) {
+   } else if (m->nb_segs > I40E_TX_MAX_SEG ||
+  m->tso_segsz < I40E_MIN_TSO_MSS ||
+  m->tso_segsz > I40E_MAX_TSO_MSS) {
/* MSS outside the range (256B - 9674B) are considered
 * malicious
 */
@@ -1458,6 +1458,13 @@ i40e_prep_pkts(__rte_unused void *tx_queue, struct 
rte_mbuf **tx_pkts,
return i;
}
 
+   /* check the size of packet */
+   if (m->pkt_len > I40E_FRAME_SIZE_MAX ||
+   m->pkt_len < I40E_TX_MIN_PKT_LEN) {
+   rte_errno = -EINVAL;
+   return i;
+   }
+
 #ifdef RTE_LIBRTE_ETHDEV_DEBUG
ret = rte_validate_tx_offload(m);
if (ret != 0) {
diff --git a/drivers/net/i40e/i40e_rxtx.h b/drivers/net/i40e/i40e_rxtx.h
index ea73a8a1b..3fc619af9 100644
--- a/drivers/net/i40e/i40e_rxtx.h
+++ b/drivers/net/i40e/i40e_rxtx.h
@@ -30,6 +30,8 @@
 #define I40E_TX_MAX_SEG UINT8_MAX
 #define I40E_TX_MAX_MTU_SEG 8
 
+#define I40E_TX_MIN_PKT_LEN 17
+
 #undef container_of
 #define container_of(ptr, type, member) ({ \
typeof(((type *)0)->member)(*__mptr) = (ptr); \
-- 
2.11.0



[dpdk-dev] [PATCH v4] net/i40e: illegal packet checking

2018-06-19 Thread Yanglong Wu
Some illegal packets will lead to TX/RX hang and
can't recover automatically. This patch check those
illegal packets and protect TX/RX from hanging.

Signed-off-by: Yanglong Wu 
---
v2:
fix coding style issue and spelling error
---
v3:
rework as comments
---
v4:
fix spelling error
---
 drivers/net/i40e/i40e_rxtx.c | 15 +++
 drivers/net/i40e/i40e_rxtx.h |  2 ++
 2 files changed, 13 insertions(+), 4 deletions(-)

diff --git a/drivers/net/i40e/i40e_rxtx.c b/drivers/net/i40e/i40e_rxtx.c
index 6032d5541..e7916f99c 100644
--- a/drivers/net/i40e/i40e_rxtx.c
+++ b/drivers/net/i40e/i40e_rxtx.c
@@ -1439,13 +1439,13 @@ i40e_prep_pkts(__rte_unused void *tx_queue, struct 
rte_mbuf **tx_pkts,
 
/* Check for m->nb_segs to not exceed the limits. */
if (!(ol_flags & PKT_TX_TCP_SEG)) {
-   if (m->nb_segs > I40E_TX_MAX_SEG ||
-   m->nb_segs > I40E_TX_MAX_MTU_SEG) {
+   if (m->nb_segs > I40E_TX_MAX_MTU_SEG) {
rte_errno = -EINVAL;
return i;
}
-   } else if ((m->tso_segsz < I40E_MIN_TSO_MSS) ||
-   (m->tso_segsz > I40E_MAX_TSO_MSS)) {
+   } else if (m->nb_segs > I40E_TX_MAX_SEG ||
+  m->tso_segsz < I40E_MIN_TSO_MSS ||
+  m->tso_segsz > I40E_MAX_TSO_MSS) {
/* MSS outside the range (256B - 9674B) are considered
 * malicious
 */
@@ -1458,6 +1458,13 @@ i40e_prep_pkts(__rte_unused void *tx_queue, struct 
rte_mbuf **tx_pkts,
return i;
}
 
+   /* check the size of packet */
+   if (m->pkt_len > I40E_FRAME_SIZE_MAX ||
+   m->pkt_len < I40E_TX_MIN_PKT_LEN) {
+   rte_errno = -EINVAL;
+   return i;
+   }
+
 #ifdef RTE_LIBRTE_ETHDEV_DEBUG
ret = rte_validate_tx_offload(m);
if (ret != 0) {
diff --git a/drivers/net/i40e/i40e_rxtx.h b/drivers/net/i40e/i40e_rxtx.h
index ea73a8a1b..3fc619af9 100644
--- a/drivers/net/i40e/i40e_rxtx.h
+++ b/drivers/net/i40e/i40e_rxtx.h
@@ -30,6 +30,8 @@
 #define I40E_TX_MAX_SEG UINT8_MAX
 #define I40E_TX_MAX_MTU_SEG 8
 
+#define I40E_TX_MIN_PKT_LEN 17
+
 #undef container_of
 #define container_of(ptr, type, member) ({ \
typeof(((type *)0)->member)(*__mptr) = (ptr); \
-- 
2.11.0



[dpdk-dev] [PATCH] app/testpmd:vlan filter fail

2018-01-31 Thread Yanglong Wu
And-operartion with a constant will
always lead to fail for vlan filter.

fix:0074d02fc(convert to new Rx offloads API)
Signed-off-by: Yanglong Wu 
---
 lib/librte_ether/rte_ethdev.c | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/lib/librte_ether/rte_ethdev.c b/lib/librte_ether/rte_ethdev.c
index f285ba278..d468bb4a1 100644
--- a/lib/librte_ether/rte_ethdev.c
+++ b/lib/librte_ether/rte_ethdev.c
@@ -2288,7 +2288,7 @@ rte_eth_dev_vlan_filter(uint16_t port_id, uint16_t 
vlan_id, int on)
 
RTE_ETH_VALID_PORTID_OR_ERR_RET(port_id, -ENODEV);
dev = &rte_eth_devices[port_id];
-   if (!(dev->data->dev_conf.rxmode.offloads &
+   if (!(dev->data->dev_conf.rxmode.offloads ||
  DEV_RX_OFFLOAD_VLAN_FILTER)) {
RTE_PMD_DEBUG_TRACE("port %d: vlan-filtering disabled\n", 
port_id);
return -ENOSYS;
-- 
2.11.0



[dpdk-dev] [PATCH] net/i40e:fix VSI stats error

2018-01-31 Thread Yanglong Wu
In VF, the number of ibytes read from register
have been stripped out CRC already, but in stats, it
subtracts CRC bytes again. So it lead to RX
bytes is smaller than TX bytes.

Fixes: 98abce23(fix VF statistics)
Signed-off-by: Yanglong Wu 
---
 drivers/net/i40e/i40e_ethdev.c | 4 
 1 file changed, 4 deletions(-)

diff --git a/drivers/net/i40e/i40e_ethdev.c b/drivers/net/i40e/i40e_ethdev.c
index c4df65df0..84e82889a 100644
--- a/drivers/net/i40e/i40e_ethdev.c
+++ b/drivers/net/i40e/i40e_ethdev.c
@@ -2440,10 +2440,6 @@ i40e_update_vsi_stats(struct i40e_vsi *vsi)
i40e_stat_update_48(hw, I40E_GLV_BPRCH(idx), I40E_GLV_BPRCL(idx),
vsi->offset_loaded, &oes->rx_broadcast,
&nes->rx_broadcast);
-   /* exclude CRC bytes */
-   nes->rx_bytes -= (nes->rx_unicast + nes->rx_multicast +
-   nes->rx_broadcast) * ETHER_CRC_LEN;
-
i40e_stat_update_32(hw, I40E_GLV_RDPC(idx), vsi->offset_loaded,
&oes->rx_discards, &nes->rx_discards);
/* GLV_REPC not supported */
-- 
2.11.0



[dpdk-dev] [PATCH] app/testpmd:vlan filter fail

2018-02-01 Thread Yanglong Wu
Removing out port_conf.rxmode.hw_vlan_filter = 1
will let it equal to 0 and port_conf.rxmode.offloads
is assigned as 0 again if hw_vlan_filter = 1. So it
will always lead to fail for vlan filter setting

Fix:0074d02fc(convert to new Rx offloads API)
Signed-off-by: Yanglong Wu 
---
 app/test-pmd/testpmd.c | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/app/test-pmd/testpmd.c b/app/test-pmd/testpmd.c
index 5dc8ccac5..0751e573c 100644
--- a/app/test-pmd/testpmd.c
+++ b/app/test-pmd/testpmd.c
@@ -2328,7 +2328,7 @@ init_port_dcb_config(portid_t pid,
retval = get_eth_dcb_conf(&port_conf, dcb_mode, num_tcs, pfc_en);
if (retval < 0)
return retval;
-   port_conf.rxmode.offloads |= DEV_RX_OFFLOAD_VLAN_FILTER;
+   port_conf.rxmode.hw_vlan_filter = 1;
 
/**
 * Write the configuration into the device.
-- 
2.11.0



[dpdk-dev] [PATCH] net/i40e: fix I40e start failing for missing JUMBO_FRAME offload

2018-04-17 Thread Yanglong Wu
JUMBO_FRAME offload should be set as default,
missing it will lead to start failing for I40e.

Signed-off-by: Yanglong Wu 
---
 drivers/net/i40e/i40e_ethdev.c | 3 ++-
 1 file changed, 2 insertions(+), 1 deletion(-)

diff --git a/drivers/net/i40e/i40e_ethdev.c b/drivers/net/i40e/i40e_ethdev.c
index 180ac7449..c3bd254ae 100644
--- a/drivers/net/i40e/i40e_ethdev.c
+++ b/drivers/net/i40e/i40e_ethdev.c
@@ -3228,7 +3228,8 @@ i40e_dev_info_get(struct rte_eth_dev *dev, struct 
rte_eth_dev_info *dev_info)
DEV_RX_OFFLOAD_OUTER_IPV4_CKSUM |
DEV_RX_OFFLOAD_CRC_STRIP |
DEV_RX_OFFLOAD_VLAN_EXTEND |
-   DEV_RX_OFFLOAD_VLAN_FILTER;
+   DEV_RX_OFFLOAD_VLAN_FILTER |
+   DEV_RX_OFFLOAD_JUMBO_FRAME;
 
dev_info->tx_queue_offload_capa = 0;
dev_info->tx_offload_capa =
-- 
2.11.0



[dpdk-dev] [PATCH v2] net/i40e: fix I40e start failing for missing JUMBO_FRAME offload

2018-04-17 Thread Yanglong Wu
JUMBO_FRAME offload should be set as default,
missing it will lead to start failing for I40e.

Fixes: fbf959fe61e7 ("net/i40e: convert to new Rx offloads API")
Signed-off-by: Yanglong Wu 
---
v2:
add fix commit
---
 drivers/net/i40e/i40e_ethdev.c | 3 ++-
 1 file changed, 2 insertions(+), 1 deletion(-)

diff --git a/drivers/net/i40e/i40e_ethdev.c b/drivers/net/i40e/i40e_ethdev.c
index 180ac7449..c3bd254ae 100644
--- a/drivers/net/i40e/i40e_ethdev.c
+++ b/drivers/net/i40e/i40e_ethdev.c
@@ -3228,7 +3228,8 @@ i40e_dev_info_get(struct rte_eth_dev *dev, struct 
rte_eth_dev_info *dev_info)
DEV_RX_OFFLOAD_OUTER_IPV4_CKSUM |
DEV_RX_OFFLOAD_CRC_STRIP |
DEV_RX_OFFLOAD_VLAN_EXTEND |
-   DEV_RX_OFFLOAD_VLAN_FILTER;
+   DEV_RX_OFFLOAD_VLAN_FILTER |
+   DEV_RX_OFFLOAD_JUMBO_FRAME;
 
dev_info->tx_queue_offload_capa = 0;
dev_info->tx_offload_capa =
-- 
2.11.0



[dpdk-dev] [PATCH] net/i40e: fix I40e start failing for missing JUMBO_FRAME offload

2018-04-18 Thread Yanglong Wu
JUMBO_FRAME offload should be set as default,
missing it will lead to start failing for I40e.

Fixes: fbf959fe61e7 ("net/i40e: convert to new Rx offloads API")
Signed-off-by: Yanglong Wu 
---
v2:
add fix commit
---
 drivers/net/i40e/i40e_ethdev.c | 3 ++-
 1 file changed, 2 insertions(+), 1 deletion(-)

diff --git a/drivers/net/i40e/i40e_ethdev.c b/drivers/net/i40e/i40e_ethdev.c
index 180ac7449..c3bd254ae 100644
--- a/drivers/net/i40e/i40e_ethdev.c
+++ b/drivers/net/i40e/i40e_ethdev.c
@@ -3228,7 +3228,8 @@ i40e_dev_info_get(struct rte_eth_dev *dev, struct 
rte_eth_dev_info *dev_info)
DEV_RX_OFFLOAD_OUTER_IPV4_CKSUM |
DEV_RX_OFFLOAD_CRC_STRIP |
DEV_RX_OFFLOAD_VLAN_EXTEND |
-   DEV_RX_OFFLOAD_VLAN_FILTER;
+   DEV_RX_OFFLOAD_VLAN_FILTER |
+   DEV_RX_OFFLOAD_JUMBO_FRAME;
 
dev_info->tx_queue_offload_capa = 0;
dev_info->tx_offload_capa =
-- 
2.11.0



[dpdk-dev] [PATCH v3] net/i40e:fix missing jumbo frame offload capability

2018-04-18 Thread Yanglong Wu
JUMBO_FRAME offload capability should
be exposed since i40e does support it.

Fixes: fbf959fe61e7 ("net/i40e: convert to new Rx offloads API")
Signed-off-by: Yanglong Wu 
Acked-by: Qi Zhang 
---
v2:
add fix commit
---
v3:
rework commit log
---
 drivers/net/i40e/i40e_ethdev.c | 3 ++-
 1 file changed, 2 insertions(+), 1 deletion(-)

diff --git a/drivers/net/i40e/i40e_ethdev.c b/drivers/net/i40e/i40e_ethdev.c
index 180ac7449..c3bd254ae 100644
--- a/drivers/net/i40e/i40e_ethdev.c
+++ b/drivers/net/i40e/i40e_ethdev.c
@@ -3228,7 +3228,8 @@ i40e_dev_info_get(struct rte_eth_dev *dev, struct 
rte_eth_dev_info *dev_info)
DEV_RX_OFFLOAD_OUTER_IPV4_CKSUM |
DEV_RX_OFFLOAD_CRC_STRIP |
DEV_RX_OFFLOAD_VLAN_EXTEND |
-   DEV_RX_OFFLOAD_VLAN_FILTER;
+   DEV_RX_OFFLOAD_VLAN_FILTER |
+   DEV_RX_OFFLOAD_JUMBO_FRAME;
 
dev_info->tx_queue_offload_capa = 0;
dev_info->tx_offload_capa =
-- 
2.11.0



[dpdk-dev] [PATCH] net/i40e:fix missing some offload capabilities

2018-04-18 Thread Yanglong Wu
MULTI_SEGS and JUMBO_FRAME offload capability
should be exposed both VF and PF since i40e
does support it.

Fixes: fbf959fe61e7 ("net/i40e: convert to new Rx offloads API")
Signed-off-by: Yanglong Wu 
---
 drivers/net/i40e/i40e_ethdev.c| 3 ++-
 drivers/net/i40e/i40e_ethdev_vf.c | 6 --
 2 files changed, 6 insertions(+), 3 deletions(-)

diff --git a/drivers/net/i40e/i40e_ethdev.c b/drivers/net/i40e/i40e_ethdev.c
index c3bd254ae..d069a3ebe 100644
--- a/drivers/net/i40e/i40e_ethdev.c
+++ b/drivers/net/i40e/i40e_ethdev.c
@@ -3244,7 +3244,8 @@ i40e_dev_info_get(struct rte_eth_dev *dev, struct 
rte_eth_dev_info *dev_info)
DEV_TX_OFFLOAD_VXLAN_TNL_TSO |
DEV_TX_OFFLOAD_GRE_TNL_TSO |
DEV_TX_OFFLOAD_IPIP_TNL_TSO |
-   DEV_TX_OFFLOAD_GENEVE_TNL_TSO;
+   DEV_TX_OFFLOAD_GENEVE_TNL_TSO |
+   DEV_TX_OFFLOAD_MULTI_SEGS;
dev_info->hash_key_size = (I40E_PFQF_HKEY_MAX_INDEX + 1) *
sizeof(uint32_t);
dev_info->reta_size = pf->hash_lut_size;
diff --git a/drivers/net/i40e/i40e_ethdev_vf.c 
b/drivers/net/i40e/i40e_ethdev_vf.c
index 031c70680..bf9e14ee3 100644
--- a/drivers/net/i40e/i40e_ethdev_vf.c
+++ b/drivers/net/i40e/i40e_ethdev_vf.c
@@ -2200,7 +2200,8 @@ i40evf_dev_info_get(struct rte_eth_dev *dev, struct 
rte_eth_dev_info *dev_info)
DEV_RX_OFFLOAD_TCP_CKSUM |
DEV_RX_OFFLOAD_OUTER_IPV4_CKSUM |
DEV_RX_OFFLOAD_CRC_STRIP |
-   DEV_RX_OFFLOAD_SCATTER;
+   DEV_RX_OFFLOAD_SCATTER |
+   DEV_RX_OFFLOAD_JUMBO_FRAME;
 
dev_info->tx_queue_offload_capa = 0;
dev_info->tx_offload_capa =
@@ -2215,7 +2216,8 @@ i40evf_dev_info_get(struct rte_eth_dev *dev, struct 
rte_eth_dev_info *dev_info)
DEV_TX_OFFLOAD_VXLAN_TNL_TSO |
DEV_TX_OFFLOAD_GRE_TNL_TSO |
DEV_TX_OFFLOAD_IPIP_TNL_TSO |
-   DEV_TX_OFFLOAD_GENEVE_TNL_TSO;
+   DEV_TX_OFFLOAD_GENEVE_TNL_TSO |
+   DEV_TX_OFFLOAD_MULTI_SEGS;
 
dev_info->default_rxconf = (struct rte_eth_rxconf) {
.rx_thresh = {
-- 
2.11.0



[dpdk-dev] [PATCH] net/i40e:fix checking offloading fail for Tx

2018-04-18 Thread Yanglong Wu
Missing "return -ENOTSUP" will alays leads to
illegal offload passing through offload checking.

Fixes: b43290f1ade2 ("net/i40e: convert to new Tx offloads API")
Signed-off-by: Yanglong Wu 
---
 drivers/net/i40e/i40e_rxtx.c | 4 +++-
 1 file changed, 3 insertions(+), 1 deletion(-)

diff --git a/drivers/net/i40e/i40e_rxtx.c b/drivers/net/i40e/i40e_rxtx.c
index bc660596b..2ce930827 100644
--- a/drivers/net/i40e/i40e_rxtx.c
+++ b/drivers/net/i40e/i40e_rxtx.c
@@ -2038,7 +2038,9 @@ i40e_dev_tx_queue_setup(struct rte_eth_dev *dev,
" or supported offloads 0x%" PRIx64,
(void *)dev, tx_conf->offloads,
dev->data->dev_conf.txmode.offloads,
-   dev_info.tx_offload_capa); }
+   dev_info.tx_offload_capa);
+   return -ENOTSUP;
+   }
 
if (hw->mac.type == I40E_MAC_VF || hw->mac.type == I40E_MAC_X722_VF) {
vf = I40EVF_DEV_PRIVATE_TO_VF(dev->data->dev_private);
-- 
2.11.0



[dpdk-dev] [PATCH v2 1/2] net/i40e: convert to new Rx offloads API

2018-03-27 Thread Yanglong Wu
Ethdev Rx offloads API has changed since:
commit cba7f53b717d ("ethdev: introduce Rx queue offloads API")
This commit support the new Rx offloads API.

Signed-off-by: Yanglong Wu 
---
 drivers/net/i40e/i40e_ethdev.c| 27 +++
 drivers/net/i40e/i40e_ethdev_vf.c | 21 +
 drivers/net/i40e/i40e_flow.c  |  3 ++-
 drivers/net/i40e/i40e_rxtx.c  | 33 ++---
 drivers/net/i40e/i40e_rxtx.h  |  1 +
 5 files changed, 65 insertions(+), 20 deletions(-)

diff --git a/drivers/net/i40e/i40e_ethdev.c b/drivers/net/i40e/i40e_ethdev.c
index dc473d701..06f11dd23 100644
--- a/drivers/net/i40e/i40e_ethdev.c
+++ b/drivers/net/i40e/i40e_ethdev.c
@@ -3219,6 +3219,7 @@ i40e_dev_info_get(struct rte_eth_dev *dev, struct 
rte_eth_dev_info *dev_info)
dev_info->max_rx_pktlen = I40E_FRAME_SIZE_MAX;
dev_info->max_mac_addrs = vsi->max_macaddrs;
dev_info->max_vfs = pci_dev->max_vfs;
+   dev_info->rx_queue_offload_capa = 0;
dev_info->rx_offload_capa =
DEV_RX_OFFLOAD_VLAN_STRIP |
DEV_RX_OFFLOAD_QINQ_STRIP |
@@ -3226,7 +3227,10 @@ i40e_dev_info_get(struct rte_eth_dev *dev, struct 
rte_eth_dev_info *dev_info)
DEV_RX_OFFLOAD_UDP_CKSUM |
DEV_RX_OFFLOAD_TCP_CKSUM |
DEV_RX_OFFLOAD_OUTER_IPV4_CKSUM |
-   DEV_RX_OFFLOAD_CRC_STRIP;
+   DEV_RX_OFFLOAD_CRC_STRIP |
+   DEV_RX_OFFLOAD_VLAN_EXTEND |
+   DEV_RX_OFFLOAD_VLAN_FILTER;
+
dev_info->tx_offload_capa =
DEV_TX_OFFLOAD_VLAN_INSERT |
DEV_TX_OFFLOAD_QINQ_INSERT |
@@ -3253,6 +3257,7 @@ i40e_dev_info_get(struct rte_eth_dev *dev, struct 
rte_eth_dev_info *dev_info)
},
.rx_free_thresh = I40E_DEFAULT_RX_FREE_THRESH,
.rx_drop_en = 0,
+   .offloads = 0,
};
 
dev_info->default_txconf = (struct rte_eth_txconf) {
@@ -3372,7 +3377,8 @@ i40e_vlan_tpid_set(struct rte_eth_dev *dev,
 {
struct i40e_hw *hw = I40E_DEV_PRIVATE_TO_HW(dev->data->dev_private);
struct i40e_pf *pf = I40E_DEV_PRIVATE_TO_PF(dev->data->dev_private);
-   int qinq = dev->data->dev_conf.rxmode.hw_vlan_extend;
+   int qinq = dev->data->dev_conf.rxmode.offloads &
+  DEV_RX_OFFLOAD_VLAN_EXTEND;
int ret = 0;
 
if ((vlan_type != ETH_VLAN_TYPE_INNER &&
@@ -3420,9 +3426,11 @@ i40e_vlan_offload_set(struct rte_eth_dev *dev, int mask)
 {
struct i40e_pf *pf = I40E_DEV_PRIVATE_TO_PF(dev->data->dev_private);
struct i40e_vsi *vsi = pf->main_vsi;
+   struct rte_eth_rxmode *rxmode;
 
+   rxmode = &dev->data->dev_conf.rxmode;
if (mask & ETH_VLAN_FILTER_MASK) {
-   if (dev->data->dev_conf.rxmode.hw_vlan_filter)
+   if (rxmode->offloads & DEV_RX_OFFLOAD_VLAN_FILTER)
i40e_vsi_config_vlan_filter(vsi, TRUE);
else
i40e_vsi_config_vlan_filter(vsi, FALSE);
@@ -3430,14 +3438,14 @@ i40e_vlan_offload_set(struct rte_eth_dev *dev, int mask)
 
if (mask & ETH_VLAN_STRIP_MASK) {
/* Enable or disable VLAN stripping */
-   if (dev->data->dev_conf.rxmode.hw_vlan_strip)
+   if (rxmode->offloads & DEV_RX_OFFLOAD_VLAN_STRIP)
i40e_vsi_config_vlan_stripping(vsi, TRUE);
else
i40e_vsi_config_vlan_stripping(vsi, FALSE);
}
 
if (mask & ETH_VLAN_EXTEND_MASK) {
-   if (dev->data->dev_conf.rxmode.hw_vlan_extend) {
+   if (rxmode->offloads & DEV_RX_OFFLOAD_VLAN_EXTEND) {
i40e_vsi_config_double_vlan(vsi, TRUE);
/* Set global registers with default ethertype. */
i40e_vlan_tpid_set(dev, ETH_VLAN_TYPE_OUTER,
@@ -3684,6 +3692,7 @@ i40e_macaddr_add(struct rte_eth_dev *dev,
struct i40e_pf *pf = I40E_DEV_PRIVATE_TO_PF(dev->data->dev_private);
struct i40e_mac_filter_info mac_filter;
struct i40e_vsi *vsi;
+   struct rte_eth_rxmode *rxmode = &dev->data->dev_conf.rxmode;
int ret;
 
/* If VMDQ not enabled or configured, return */
@@ -3702,7 +3711,7 @@ i40e_macaddr_add(struct rte_eth_dev *dev,
}
 
rte_memcpy(&mac_filter.mac_addr, mac_addr, ETHER_ADDR_LEN);
-   if (dev->data->dev_conf.rxmode.hw_vlan_filter)
+   if (rxmode->offloads & DEV_RX_OFFLOAD_VLAN_FILTER)
mac_filter.filter_type = RTE_MACVLAN_PERFECT_MATCH;
else
mac_filter.filter_type = RTE_MAC_PERFECT_MATCH;
@@ -11354,9 +11363,11 @@ i40e_dev_mtu_set(struct rte_eth_dev *dev, uint16_t mtu)
}
 
if (frame_size >

[dpdk-dev] [PATCH v2 1/2] net/i40e: convert to new Rx offloads API

2018-03-27 Thread Yanglong Wu
Ethdev Rx offloads API has changed since:
commit cba7f53b717d ("ethdev: introduce Rx queue offloads API")
This commit support the new Rx offloads API.

Signed-off-by: Yanglong Wu 
---
 drivers/net/i40e/i40e_ethdev.c| 27 +++
 drivers/net/i40e/i40e_ethdev_vf.c | 21 +
 drivers/net/i40e/i40e_flow.c  |  3 ++-
 drivers/net/i40e/i40e_rxtx.c  | 33 ++---
 drivers/net/i40e/i40e_rxtx.h  |  1 +
 5 files changed, 65 insertions(+), 20 deletions(-)
---
v2:
Adding offload requests checking and
reworking patch according to review comments
---
diff --git a/drivers/net/i40e/i40e_ethdev.c b/drivers/net/i40e/i40e_ethdev.c
index dc473d701..06f11dd23 100644
--- a/drivers/net/i40e/i40e_ethdev.c
+++ b/drivers/net/i40e/i40e_ethdev.c
@@ -3219,6 +3219,7 @@ i40e_dev_info_get(struct rte_eth_dev *dev, struct 
rte_eth_dev_info *dev_info)
dev_info->max_rx_pktlen = I40E_FRAME_SIZE_MAX;
dev_info->max_mac_addrs = vsi->max_macaddrs;
dev_info->max_vfs = pci_dev->max_vfs;
+   dev_info->rx_queue_offload_capa = 0;
dev_info->rx_offload_capa =
DEV_RX_OFFLOAD_VLAN_STRIP |
DEV_RX_OFFLOAD_QINQ_STRIP |
@@ -3226,7 +3227,10 @@ i40e_dev_info_get(struct rte_eth_dev *dev, struct 
rte_eth_dev_info *dev_info)
DEV_RX_OFFLOAD_UDP_CKSUM |
DEV_RX_OFFLOAD_TCP_CKSUM |
DEV_RX_OFFLOAD_OUTER_IPV4_CKSUM |
-   DEV_RX_OFFLOAD_CRC_STRIP;
+   DEV_RX_OFFLOAD_CRC_STRIP |
+   DEV_RX_OFFLOAD_VLAN_EXTEND |
+   DEV_RX_OFFLOAD_VLAN_FILTER;
+
dev_info->tx_offload_capa =
DEV_TX_OFFLOAD_VLAN_INSERT |
DEV_TX_OFFLOAD_QINQ_INSERT |
@@ -3253,6 +3257,7 @@ i40e_dev_info_get(struct rte_eth_dev *dev, struct 
rte_eth_dev_info *dev_info)
},
.rx_free_thresh = I40E_DEFAULT_RX_FREE_THRESH,
.rx_drop_en = 0,
+   .offloads = 0,
};
 
dev_info->default_txconf = (struct rte_eth_txconf) {
@@ -3372,7 +3377,8 @@ i40e_vlan_tpid_set(struct rte_eth_dev *dev,
 {
struct i40e_hw *hw = I40E_DEV_PRIVATE_TO_HW(dev->data->dev_private);
struct i40e_pf *pf = I40E_DEV_PRIVATE_TO_PF(dev->data->dev_private);
-   int qinq = dev->data->dev_conf.rxmode.hw_vlan_extend;
+   int qinq = dev->data->dev_conf.rxmode.offloads &
+  DEV_RX_OFFLOAD_VLAN_EXTEND;
int ret = 0;
 
if ((vlan_type != ETH_VLAN_TYPE_INNER &&
@@ -3420,9 +3426,11 @@ i40e_vlan_offload_set(struct rte_eth_dev *dev, int mask)
 {
struct i40e_pf *pf = I40E_DEV_PRIVATE_TO_PF(dev->data->dev_private);
struct i40e_vsi *vsi = pf->main_vsi;
+   struct rte_eth_rxmode *rxmode;
 
+   rxmode = &dev->data->dev_conf.rxmode;
if (mask & ETH_VLAN_FILTER_MASK) {
-   if (dev->data->dev_conf.rxmode.hw_vlan_filter)
+   if (rxmode->offloads & DEV_RX_OFFLOAD_VLAN_FILTER)
i40e_vsi_config_vlan_filter(vsi, TRUE);
else
i40e_vsi_config_vlan_filter(vsi, FALSE);
@@ -3430,14 +3438,14 @@ i40e_vlan_offload_set(struct rte_eth_dev *dev, int mask)
 
if (mask & ETH_VLAN_STRIP_MASK) {
/* Enable or disable VLAN stripping */
-   if (dev->data->dev_conf.rxmode.hw_vlan_strip)
+   if (rxmode->offloads & DEV_RX_OFFLOAD_VLAN_STRIP)
i40e_vsi_config_vlan_stripping(vsi, TRUE);
else
i40e_vsi_config_vlan_stripping(vsi, FALSE);
}
 
if (mask & ETH_VLAN_EXTEND_MASK) {
-   if (dev->data->dev_conf.rxmode.hw_vlan_extend) {
+   if (rxmode->offloads & DEV_RX_OFFLOAD_VLAN_EXTEND) {
i40e_vsi_config_double_vlan(vsi, TRUE);
/* Set global registers with default ethertype. */
i40e_vlan_tpid_set(dev, ETH_VLAN_TYPE_OUTER,
@@ -3684,6 +3692,7 @@ i40e_macaddr_add(struct rte_eth_dev *dev,
struct i40e_pf *pf = I40E_DEV_PRIVATE_TO_PF(dev->data->dev_private);
struct i40e_mac_filter_info mac_filter;
struct i40e_vsi *vsi;
+   struct rte_eth_rxmode *rxmode = &dev->data->dev_conf.rxmode;
int ret;
 
/* If VMDQ not enabled or configured, return */
@@ -3702,7 +3711,7 @@ i40e_macaddr_add(struct rte_eth_dev *dev,
}
 
rte_memcpy(&mac_filter.mac_addr, mac_addr, ETHER_ADDR_LEN);
-   if (dev->data->dev_conf.rxmode.hw_vlan_filter)
+   if (rxmode->offloads & DEV_RX_OFFLOAD_VLAN_FILTER)
mac_filter.filter_type = RTE_MACVLAN_PERFECT_MATCH;
else
mac_filter.filter_type = RTE_MAC_PERFECT_MATCH;
@@ -11354,9 +1

[dpdk-dev] [PATCH v2 2/2] net/i40e: convert to new Tx offloads API

2018-03-27 Thread Yanglong Wu
Ethdev Tx offloads API has changed since:
commit cba7f53b717d ("ethdev: introduce Tx queue offloads API")
This commit support the new Tx offloads API.

Signed-off-by: Yanglong Wu 
---
 drivers/net/i40e/i40e_ethdev.c|  1 +
 drivers/net/i40e/i40e_ethdev_vf.c |  1 +
 drivers/net/i40e/i40e_rxtx.c  | 24 
 drivers/net/i40e/i40e_rxtx.h  |  1 +
 4 files changed, 27 insertions(+)
---
v2:
Adding offload requests checking and
reworking patch according to review comments
---
diff --git a/drivers/net/i40e/i40e_ethdev.c b/drivers/net/i40e/i40e_ethdev.c
index 06f11dd23..5f520d2bc 100644
--- a/drivers/net/i40e/i40e_ethdev.c
+++ b/drivers/net/i40e/i40e_ethdev.c
@@ -3231,6 +3231,7 @@ i40e_dev_info_get(struct rte_eth_dev *dev, struct 
rte_eth_dev_info *dev_info)
DEV_RX_OFFLOAD_VLAN_EXTEND |
DEV_RX_OFFLOAD_VLAN_FILTER;
 
+   dev_info->tx_queue_offload_capa = 0;
dev_info->tx_offload_capa =
DEV_TX_OFFLOAD_VLAN_INSERT |
DEV_TX_OFFLOAD_QINQ_INSERT |
diff --git a/drivers/net/i40e/i40e_ethdev_vf.c 
b/drivers/net/i40e/i40e_ethdev_vf.c
index cb338def9..d04cd28ae 100644
--- a/drivers/net/i40e/i40e_ethdev_vf.c
+++ b/drivers/net/i40e/i40e_ethdev_vf.c
@@ -2185,6 +2185,7 @@ i40evf_dev_info_get(struct rte_eth_dev *dev, struct 
rte_eth_dev_info *dev_info)
DEV_RX_OFFLOAD_CRC_STRIP |
DEV_RX_OFFLOAD_SCATTER;
 
+   dev_info->tx_queue_offload_capa = 0;
dev_info->tx_offload_capa =
DEV_TX_OFFLOAD_VLAN_INSERT |
DEV_TX_OFFLOAD_QINQ_INSERT |
diff --git a/drivers/net/i40e/i40e_rxtx.c b/drivers/net/i40e/i40e_rxtx.c
index 60cbb4d9c..a68be4ab1 100644
--- a/drivers/net/i40e/i40e_rxtx.c
+++ b/drivers/net/i40e/i40e_rxtx.c
@@ -1998,6 +1998,20 @@ i40e_dev_tx_descriptor_status(void *tx_queue, uint16_t 
offset)
return RTE_ETH_TX_DESC_FULL;
 }
 
+static int
+i40e_check_tx_queue_offloads(struct rte_eth_dev *dev, uint64_t requested)
+{
+   struct rte_eth_dev_info dev_info;
+   uint64_t mandatory = dev->data->dev_conf.txmode.offloads;
+   uint64_t supported; /* All per port offloads */
+
+   dev->dev_ops->dev_infos_get(dev, &dev_info);
+   supported = dev_info.tx_offload_capa ^ dev_info.tx_queue_offload_capa;
+   if ((requested & dev_info.tx_queue_offload_capa) != requested)
+   return 0;
+   return !((mandatory ^ requested) & supported);
+}
+
 int
 i40e_dev_tx_queue_setup(struct rte_eth_dev *dev,
uint16_t queue_idx,
@@ -2015,6 +2029,16 @@ i40e_dev_tx_queue_setup(struct rte_eth_dev *dev,
uint16_t tx_rs_thresh, tx_free_thresh;
uint16_t reg_idx, i, base, bsf, tc_mapping;
int q_offset;
+   struct rte_eth_dev_info dev_info;
+
+   if (!i40e_check_tx_queue_offloads(dev, tx_conf->offloads)) {
+   dev->dev_ops->dev_infos_get(dev, &dev_info);
+   PMD_INIT_LOG(ERR, "%p: Tx queue offloads 0x%" PRIx64
+   " don't match port  offloads 0x%" PRIx64
+   " or supported offloads 0x%" PRIx64,
+   (void *)dev, tx_conf->offloads,
+   dev->data->dev_conf.txmode.offloads,
+   dev_info.tx_offload_capa);
 
if (hw->mac.type == I40E_MAC_VF || hw->mac.type == I40E_MAC_X722_VF) {
vf = I40EVF_DEV_PRIVATE_TO_VF(dev->data->dev_private);
diff --git a/drivers/net/i40e/i40e_rxtx.h b/drivers/net/i40e/i40e_rxtx.h
index cb5f8c714..10feec4a2 100644
--- a/drivers/net/i40e/i40e_rxtx.h
+++ b/drivers/net/i40e/i40e_rxtx.h
@@ -149,6 +149,7 @@ struct i40e_tx_queue {
bool q_set; /**< indicate if tx queue has been configured */
bool tx_deferred_start; /**< don't start this queue in dev start */
uint8_t dcb_tc; /**< Traffic class of tx queue */
+   uint64_t offloads; /**< Tx offload flags of DEV_RX_OFFLOAD_* */
 };
 
 /** Offload features */
-- 
2.11.0



[dpdk-dev] [PATCH v2 1/2] net/i40e: convert to new Rx offloads API

2018-03-27 Thread Yanglong Wu
Ethdev Rx offloads API has changed since:
commit cba7f53b717d ("ethdev: introduce Rx queue offloads API")
This commit support the new Rx offloads API.

Signed-off-by: Yanglong Wu 
---
 drivers/net/i40e/i40e_ethdev.c| 27 +++
 drivers/net/i40e/i40e_ethdev_vf.c | 21 +
 drivers/net/i40e/i40e_flow.c  |  3 ++-
 drivers/net/i40e/i40e_rxtx.c  | 33 ++---
 drivers/net/i40e/i40e_rxtx.h  |  1 +
 5 files changed, 65 insertions(+), 20 deletions(-)
---
v2:
Adding offload requests checking and
reworking patch according to review comments
---
diff --git a/drivers/net/i40e/i40e_ethdev.c b/drivers/net/i40e/i40e_ethdev.c
index dc473d701..06f11dd23 100644
--- a/drivers/net/i40e/i40e_ethdev.c
+++ b/drivers/net/i40e/i40e_ethdev.c
@@ -3219,6 +3219,7 @@ i40e_dev_info_get(struct rte_eth_dev *dev, struct 
rte_eth_dev_info *dev_info)
dev_info->max_rx_pktlen = I40E_FRAME_SIZE_MAX;
dev_info->max_mac_addrs = vsi->max_macaddrs;
dev_info->max_vfs = pci_dev->max_vfs;
+   dev_info->rx_queue_offload_capa = 0;
dev_info->rx_offload_capa =
DEV_RX_OFFLOAD_VLAN_STRIP |
DEV_RX_OFFLOAD_QINQ_STRIP |
@@ -3226,7 +3227,10 @@ i40e_dev_info_get(struct rte_eth_dev *dev, struct 
rte_eth_dev_info *dev_info)
DEV_RX_OFFLOAD_UDP_CKSUM |
DEV_RX_OFFLOAD_TCP_CKSUM |
DEV_RX_OFFLOAD_OUTER_IPV4_CKSUM |
-   DEV_RX_OFFLOAD_CRC_STRIP;
+   DEV_RX_OFFLOAD_CRC_STRIP |
+   DEV_RX_OFFLOAD_VLAN_EXTEND |
+   DEV_RX_OFFLOAD_VLAN_FILTER;
+
dev_info->tx_offload_capa =
DEV_TX_OFFLOAD_VLAN_INSERT |
DEV_TX_OFFLOAD_QINQ_INSERT |
@@ -3253,6 +3257,7 @@ i40e_dev_info_get(struct rte_eth_dev *dev, struct 
rte_eth_dev_info *dev_info)
},
.rx_free_thresh = I40E_DEFAULT_RX_FREE_THRESH,
.rx_drop_en = 0,
+   .offloads = 0,
};
 
dev_info->default_txconf = (struct rte_eth_txconf) {
@@ -3372,7 +3377,8 @@ i40e_vlan_tpid_set(struct rte_eth_dev *dev,
 {
struct i40e_hw *hw = I40E_DEV_PRIVATE_TO_HW(dev->data->dev_private);
struct i40e_pf *pf = I40E_DEV_PRIVATE_TO_PF(dev->data->dev_private);
-   int qinq = dev->data->dev_conf.rxmode.hw_vlan_extend;
+   int qinq = dev->data->dev_conf.rxmode.offloads &
+  DEV_RX_OFFLOAD_VLAN_EXTEND;
int ret = 0;
 
if ((vlan_type != ETH_VLAN_TYPE_INNER &&
@@ -3420,9 +3426,11 @@ i40e_vlan_offload_set(struct rte_eth_dev *dev, int mask)
 {
struct i40e_pf *pf = I40E_DEV_PRIVATE_TO_PF(dev->data->dev_private);
struct i40e_vsi *vsi = pf->main_vsi;
+   struct rte_eth_rxmode *rxmode;
 
+   rxmode = &dev->data->dev_conf.rxmode;
if (mask & ETH_VLAN_FILTER_MASK) {
-   if (dev->data->dev_conf.rxmode.hw_vlan_filter)
+   if (rxmode->offloads & DEV_RX_OFFLOAD_VLAN_FILTER)
i40e_vsi_config_vlan_filter(vsi, TRUE);
else
i40e_vsi_config_vlan_filter(vsi, FALSE);
@@ -3430,14 +3438,14 @@ i40e_vlan_offload_set(struct rte_eth_dev *dev, int mask)
 
if (mask & ETH_VLAN_STRIP_MASK) {
/* Enable or disable VLAN stripping */
-   if (dev->data->dev_conf.rxmode.hw_vlan_strip)
+   if (rxmode->offloads & DEV_RX_OFFLOAD_VLAN_STRIP)
i40e_vsi_config_vlan_stripping(vsi, TRUE);
else
i40e_vsi_config_vlan_stripping(vsi, FALSE);
}
 
if (mask & ETH_VLAN_EXTEND_MASK) {
-   if (dev->data->dev_conf.rxmode.hw_vlan_extend) {
+   if (rxmode->offloads & DEV_RX_OFFLOAD_VLAN_EXTEND) {
i40e_vsi_config_double_vlan(vsi, TRUE);
/* Set global registers with default ethertype. */
i40e_vlan_tpid_set(dev, ETH_VLAN_TYPE_OUTER,
@@ -3684,6 +3692,7 @@ i40e_macaddr_add(struct rte_eth_dev *dev,
struct i40e_pf *pf = I40E_DEV_PRIVATE_TO_PF(dev->data->dev_private);
struct i40e_mac_filter_info mac_filter;
struct i40e_vsi *vsi;
+   struct rte_eth_rxmode *rxmode = &dev->data->dev_conf.rxmode;
int ret;
 
/* If VMDQ not enabled or configured, return */
@@ -3702,7 +3711,7 @@ i40e_macaddr_add(struct rte_eth_dev *dev,
}
 
rte_memcpy(&mac_filter.mac_addr, mac_addr, ETHER_ADDR_LEN);
-   if (dev->data->dev_conf.rxmode.hw_vlan_filter)
+   if (rxmode->offloads & DEV_RX_OFFLOAD_VLAN_FILTER)
mac_filter.filter_type = RTE_MACVLAN_PERFECT_MATCH;
else
mac_filter.filter_type = RTE_MAC_PERFECT_MATCH;
@@ -11354,9 +1

[dpdk-dev] [PATCH v2 2/2] net/i40e: convert to new Tx offloads API

2018-03-27 Thread Yanglong Wu
Ethdev Tx offloads API has changed since:
commit cba7f53b717d ("ethdev: introduce Tx queue offloads API")
This commit support the new Tx offloads API.

Signed-off-by: Yanglong Wu 
---
 drivers/net/i40e/i40e_ethdev.c|  1 +
 drivers/net/i40e/i40e_ethdev_vf.c |  1 +
 drivers/net/i40e/i40e_rxtx.c  | 24 
 drivers/net/i40e/i40e_rxtx.h  |  1 +
 4 files changed, 27 insertions(+)
---
v2:
Adding offload requests checking and
reworking patch according to review comments
---
diff --git a/drivers/net/i40e/i40e_ethdev.c b/drivers/net/i40e/i40e_ethdev.c
index 06f11dd23..5f520d2bc 100644
--- a/drivers/net/i40e/i40e_ethdev.c
+++ b/drivers/net/i40e/i40e_ethdev.c
@@ -3231,6 +3231,7 @@ i40e_dev_info_get(struct rte_eth_dev *dev, struct 
rte_eth_dev_info *dev_info)
DEV_RX_OFFLOAD_VLAN_EXTEND |
DEV_RX_OFFLOAD_VLAN_FILTER;
 
+   dev_info->tx_queue_offload_capa = 0;
dev_info->tx_offload_capa =
DEV_TX_OFFLOAD_VLAN_INSERT |
DEV_TX_OFFLOAD_QINQ_INSERT |
diff --git a/drivers/net/i40e/i40e_ethdev_vf.c 
b/drivers/net/i40e/i40e_ethdev_vf.c
index cb338def9..d04cd28ae 100644
--- a/drivers/net/i40e/i40e_ethdev_vf.c
+++ b/drivers/net/i40e/i40e_ethdev_vf.c
@@ -2185,6 +2185,7 @@ i40evf_dev_info_get(struct rte_eth_dev *dev, struct 
rte_eth_dev_info *dev_info)
DEV_RX_OFFLOAD_CRC_STRIP |
DEV_RX_OFFLOAD_SCATTER;
 
+   dev_info->tx_queue_offload_capa = 0;
dev_info->tx_offload_capa =
DEV_TX_OFFLOAD_VLAN_INSERT |
DEV_TX_OFFLOAD_QINQ_INSERT |
diff --git a/drivers/net/i40e/i40e_rxtx.c b/drivers/net/i40e/i40e_rxtx.c
index 60cbb4d9c..a68be4ab1 100644
--- a/drivers/net/i40e/i40e_rxtx.c
+++ b/drivers/net/i40e/i40e_rxtx.c
@@ -1998,6 +1998,20 @@ i40e_dev_tx_descriptor_status(void *tx_queue, uint16_t 
offset)
return RTE_ETH_TX_DESC_FULL;
 }
 
+static int
+i40e_check_tx_queue_offloads(struct rte_eth_dev *dev, uint64_t requested)
+{
+   struct rte_eth_dev_info dev_info;
+   uint64_t mandatory = dev->data->dev_conf.txmode.offloads;
+   uint64_t supported; /* All per port offloads */
+
+   dev->dev_ops->dev_infos_get(dev, &dev_info);
+   supported = dev_info.tx_offload_capa ^ dev_info.tx_queue_offload_capa;
+   if ((requested & dev_info.tx_offload_capa) != requested)
+   return 0; /* requested range check */
+   return !((mandatory ^ requested) & supported);
+}
+
 int
 i40e_dev_tx_queue_setup(struct rte_eth_dev *dev,
uint16_t queue_idx,
@@ -2015,6 +2029,16 @@ i40e_dev_tx_queue_setup(struct rte_eth_dev *dev,
uint16_t tx_rs_thresh, tx_free_thresh;
uint16_t reg_idx, i, base, bsf, tc_mapping;
int q_offset;
+   struct rte_eth_dev_info dev_info;
+
+   if (!i40e_check_tx_queue_offloads(dev, tx_conf->offloads)) {
+   dev->dev_ops->dev_infos_get(dev, &dev_info);
+   PMD_INIT_LOG(ERR, "%p: Tx queue offloads 0x%" PRIx64
+   " don't match port  offloads 0x%" PRIx64
+   " or supported offloads 0x%" PRIx64,
+   (void *)dev, tx_conf->offloads,
+   dev->data->dev_conf.txmode.offloads,
+   dev_info.tx_offload_capa);
 
if (hw->mac.type == I40E_MAC_VF || hw->mac.type == I40E_MAC_X722_VF) {
vf = I40EVF_DEV_PRIVATE_TO_VF(dev->data->dev_private);
diff --git a/drivers/net/i40e/i40e_rxtx.h b/drivers/net/i40e/i40e_rxtx.h
index cb5f8c714..10feec4a2 100644
--- a/drivers/net/i40e/i40e_rxtx.h
+++ b/drivers/net/i40e/i40e_rxtx.h
@@ -149,6 +149,7 @@ struct i40e_tx_queue {
bool q_set; /**< indicate if tx queue has been configured */
bool tx_deferred_start; /**< don't start this queue in dev start */
uint8_t dcb_tc; /**< Traffic class of tx queue */
+   uint64_t offloads; /**< Tx offload flags of DEV_RX_OFFLOAD_* */
 };
 
 /** Offload features */
-- 
2.11.0



[dpdk-dev] [PATCH v2 2/2] net/i40e: convert to new Tx offloads API

2018-03-28 Thread Yanglong Wu
Ethdev Tx offloads API has changed since:
commit cba7f53b717d ("ethdev: introduce Tx queue offloads API")
This commit support the new Tx offloads API.

Signed-off-by: Yanglong Wu 
---
 drivers/net/i40e/i40e_ethdev.c|  1 +
 drivers/net/i40e/i40e_ethdev_vf.c |  1 +
 drivers/net/i40e/i40e_rxtx.c  | 24 
 drivers/net/i40e/i40e_rxtx.h  |  1 +
 4 files changed, 27 insertions(+)

diff --git a/drivers/net/i40e/i40e_ethdev.c b/drivers/net/i40e/i40e_ethdev.c
index 06f11dd23..5f520d2bc 100644
--- a/drivers/net/i40e/i40e_ethdev.c
+++ b/drivers/net/i40e/i40e_ethdev.c
@@ -3231,6 +3231,7 @@ i40e_dev_info_get(struct rte_eth_dev *dev, struct 
rte_eth_dev_info *dev_info)
DEV_RX_OFFLOAD_VLAN_EXTEND |
DEV_RX_OFFLOAD_VLAN_FILTER;
 
+   dev_info->tx_queue_offload_capa = 0;
dev_info->tx_offload_capa =
DEV_TX_OFFLOAD_VLAN_INSERT |
DEV_TX_OFFLOAD_QINQ_INSERT |
diff --git a/drivers/net/i40e/i40e_ethdev_vf.c 
b/drivers/net/i40e/i40e_ethdev_vf.c
index cb338def9..d04cd28ae 100644
--- a/drivers/net/i40e/i40e_ethdev_vf.c
+++ b/drivers/net/i40e/i40e_ethdev_vf.c
@@ -2185,6 +2185,7 @@ i40evf_dev_info_get(struct rte_eth_dev *dev, struct 
rte_eth_dev_info *dev_info)
DEV_RX_OFFLOAD_CRC_STRIP |
DEV_RX_OFFLOAD_SCATTER;
 
+   dev_info->tx_queue_offload_capa = 0;
dev_info->tx_offload_capa =
DEV_TX_OFFLOAD_VLAN_INSERT |
DEV_TX_OFFLOAD_QINQ_INSERT |
diff --git a/drivers/net/i40e/i40e_rxtx.c b/drivers/net/i40e/i40e_rxtx.c
index 60cbb4d9c..d96810a9b 100644
--- a/drivers/net/i40e/i40e_rxtx.c
+++ b/drivers/net/i40e/i40e_rxtx.c
@@ -1998,6 +1998,20 @@ i40e_dev_tx_descriptor_status(void *tx_queue, uint16_t 
offset)
return RTE_ETH_TX_DESC_FULL;
 }
 
+static int
+i40e_check_tx_queue_offloads(struct rte_eth_dev *dev, uint64_t requested)
+{
+   struct rte_eth_dev_info dev_info;
+   uint64_t mandatory = dev->data->dev_conf.txmode.offloads;
+   uint64_t supported; /* All per port offloads */
+
+   dev->dev_ops->dev_infos_get(dev, &dev_info);
+   supported = dev_info.tx_offload_capa ^ dev_info.tx_queue_offload_capa;
+   if ((requested & dev_info.tx_queue_offload_capa) != requested)
+   return 0; /* requested range check */
+   return !((mandatory ^ requested) & supported);
+}
+
 int
 i40e_dev_tx_queue_setup(struct rte_eth_dev *dev,
uint16_t queue_idx,
@@ -2015,6 +2029,16 @@ i40e_dev_tx_queue_setup(struct rte_eth_dev *dev,
uint16_t tx_rs_thresh, tx_free_thresh;
uint16_t reg_idx, i, base, bsf, tc_mapping;
int q_offset;
+   struct rte_eth_dev_info dev_info;
+
+   if (!i40e_check_tx_queue_offloads(dev, tx_conf->offloads)) {
+   dev->dev_ops->dev_infos_get(dev, &dev_info);
+   PMD_INIT_LOG(ERR, "%p: Tx queue offloads 0x%" PRIx64
+   " don't match port  offloads 0x%" PRIx64
+   " or supported offloads 0x%" PRIx64,
+   (void *)dev, tx_conf->offloads,
+   dev->data->dev_conf.txmode.offloads,
+   dev_info.tx_offload_capa);}
 
if (hw->mac.type == I40E_MAC_VF || hw->mac.type == I40E_MAC_X722_VF) {
vf = I40EVF_DEV_PRIVATE_TO_VF(dev->data->dev_private);
diff --git a/drivers/net/i40e/i40e_rxtx.h b/drivers/net/i40e/i40e_rxtx.h
index cb5f8c714..10feec4a2 100644
--- a/drivers/net/i40e/i40e_rxtx.h
+++ b/drivers/net/i40e/i40e_rxtx.h
@@ -149,6 +149,7 @@ struct i40e_tx_queue {
bool q_set; /**< indicate if tx queue has been configured */
bool tx_deferred_start; /**< don't start this queue in dev start */
uint8_t dcb_tc; /**< Traffic class of tx queue */
+   uint64_t offloads; /**< Tx offload flags of DEV_RX_OFFLOAD_* */
 };
 
 /** Offload features */
-- 
2.11.0



[dpdk-dev] [PATCH v2 2/2] net/i40e: convert to new Tx offloads API

2018-03-28 Thread Yanglong Wu
Ethdev Tx offloads API has changed since:
commit cba7f53b717d ("ethdev: introduce Tx queue offloads API")
This commit support the new Tx offloads API.

Signed-off-by: Yanglong Wu 
---
 drivers/net/i40e/i40e_ethdev.c|  1 +
 drivers/net/i40e/i40e_ethdev_vf.c |  1 +
 drivers/net/i40e/i40e_rxtx.c  | 24 
 drivers/net/i40e/i40e_rxtx.h  |  1 +
 4 files changed, 27 insertions(+)

diff --git a/drivers/net/i40e/i40e_ethdev.c b/drivers/net/i40e/i40e_ethdev.c
index 06f11dd23..5f520d2bc 100644
--- a/drivers/net/i40e/i40e_ethdev.c
+++ b/drivers/net/i40e/i40e_ethdev.c
@@ -3231,6 +3231,7 @@ i40e_dev_info_get(struct rte_eth_dev *dev, struct 
rte_eth_dev_info *dev_info)
DEV_RX_OFFLOAD_VLAN_EXTEND |
DEV_RX_OFFLOAD_VLAN_FILTER;
 
+   dev_info->tx_queue_offload_capa = 0;
dev_info->tx_offload_capa =
DEV_TX_OFFLOAD_VLAN_INSERT |
DEV_TX_OFFLOAD_QINQ_INSERT |
diff --git a/drivers/net/i40e/i40e_ethdev_vf.c 
b/drivers/net/i40e/i40e_ethdev_vf.c
index cb338def9..d04cd28ae 100644
--- a/drivers/net/i40e/i40e_ethdev_vf.c
+++ b/drivers/net/i40e/i40e_ethdev_vf.c
@@ -2185,6 +2185,7 @@ i40evf_dev_info_get(struct rte_eth_dev *dev, struct 
rte_eth_dev_info *dev_info)
DEV_RX_OFFLOAD_CRC_STRIP |
DEV_RX_OFFLOAD_SCATTER;
 
+   dev_info->tx_queue_offload_capa = 0;
dev_info->tx_offload_capa =
DEV_TX_OFFLOAD_VLAN_INSERT |
DEV_TX_OFFLOAD_QINQ_INSERT |
diff --git a/drivers/net/i40e/i40e_rxtx.c b/drivers/net/i40e/i40e_rxtx.c
index 60cbb4d9c..d96810a9b 100644
--- a/drivers/net/i40e/i40e_rxtx.c
+++ b/drivers/net/i40e/i40e_rxtx.c
@@ -1998,6 +1998,20 @@ i40e_dev_tx_descriptor_status(void *tx_queue, uint16_t 
offset)
return RTE_ETH_TX_DESC_FULL;
 }
 
+static int
+i40e_check_tx_queue_offloads(struct rte_eth_dev *dev, uint64_t requested)
+{
+   struct rte_eth_dev_info dev_info;
+   uint64_t mandatory = dev->data->dev_conf.txmode.offloads;
+   uint64_t supported; /* All per port offloads */
+
+   dev->dev_ops->dev_infos_get(dev, &dev_info);
+   supported = dev_info.tx_offload_capa ^ dev_info.tx_queue_offload_capa;
+   if ((requested & dev_info.tx_queue_offload_capa) != requested)
+   return 0; /* requested range check */
+   return !((mandatory ^ requested) & supported);
+}
+
 int
 i40e_dev_tx_queue_setup(struct rte_eth_dev *dev,
uint16_t queue_idx,
@@ -2015,6 +2029,16 @@ i40e_dev_tx_queue_setup(struct rte_eth_dev *dev,
uint16_t tx_rs_thresh, tx_free_thresh;
uint16_t reg_idx, i, base, bsf, tc_mapping;
int q_offset;
+   struct rte_eth_dev_info dev_info;
+
+   if (!i40e_check_tx_queue_offloads(dev, tx_conf->offloads)) {
+   dev->dev_ops->dev_infos_get(dev, &dev_info);
+   PMD_INIT_LOG(ERR, "%p: Tx queue offloads 0x%" PRIx64
+   " don't match port  offloads 0x%" PRIx64
+   " or supported offloads 0x%" PRIx64,
+   (void *)dev, tx_conf->offloads,
+   dev->data->dev_conf.txmode.offloads,
+   dev_info.tx_offload_capa); }
 
if (hw->mac.type == I40E_MAC_VF || hw->mac.type == I40E_MAC_X722_VF) {
vf = I40EVF_DEV_PRIVATE_TO_VF(dev->data->dev_private);
diff --git a/drivers/net/i40e/i40e_rxtx.h b/drivers/net/i40e/i40e_rxtx.h
index cb5f8c714..10feec4a2 100644
--- a/drivers/net/i40e/i40e_rxtx.h
+++ b/drivers/net/i40e/i40e_rxtx.h
@@ -149,6 +149,7 @@ struct i40e_tx_queue {
bool q_set; /**< indicate if tx queue has been configured */
bool tx_deferred_start; /**< don't start this queue in dev start */
uint8_t dcb_tc; /**< Traffic class of tx queue */
+   uint64_t offloads; /**< Tx offload flags of DEV_RX_OFFLOAD_* */
 };
 
 /** Offload features */
-- 
2.11.0



[dpdk-dev] [PATCH v3 1/2] net/i40e: convert to new Rx offloads API

2018-03-29 Thread Yanglong Wu
Ethdev Rx offloads API has changed since:
commit cba7f53b717d ("ethdev: introduce Rx queue offloads API")
This commit support the new Rx offloads API.

Signed-off-by: Yanglong Wu 
---
v2:
Adding offload requests checking and
reworking patch according to review comments
---
v3:
fix error
---
 drivers/net/i40e/i40e_ethdev.c| 27 +++
 drivers/net/i40e/i40e_ethdev_vf.c | 21 +
 drivers/net/i40e/i40e_flow.c  |  3 ++-
 drivers/net/i40e/i40e_rxtx.c  | 33 ++---
 drivers/net/i40e/i40e_rxtx.h  |  1 +
 5 files changed, 65 insertions(+), 20 deletions(-)

diff --git a/drivers/net/i40e/i40e_ethdev.c b/drivers/net/i40e/i40e_ethdev.c
index dc473d701..06f11dd23 100644
--- a/drivers/net/i40e/i40e_ethdev.c
+++ b/drivers/net/i40e/i40e_ethdev.c
@@ -3219,6 +3219,7 @@ i40e_dev_info_get(struct rte_eth_dev *dev, struct 
rte_eth_dev_info *dev_info)
dev_info->max_rx_pktlen = I40E_FRAME_SIZE_MAX;
dev_info->max_mac_addrs = vsi->max_macaddrs;
dev_info->max_vfs = pci_dev->max_vfs;
+   dev_info->rx_queue_offload_capa = 0;
dev_info->rx_offload_capa =
DEV_RX_OFFLOAD_VLAN_STRIP |
DEV_RX_OFFLOAD_QINQ_STRIP |
@@ -3226,7 +3227,10 @@ i40e_dev_info_get(struct rte_eth_dev *dev, struct 
rte_eth_dev_info *dev_info)
DEV_RX_OFFLOAD_UDP_CKSUM |
DEV_RX_OFFLOAD_TCP_CKSUM |
DEV_RX_OFFLOAD_OUTER_IPV4_CKSUM |
-   DEV_RX_OFFLOAD_CRC_STRIP;
+   DEV_RX_OFFLOAD_CRC_STRIP |
+   DEV_RX_OFFLOAD_VLAN_EXTEND |
+   DEV_RX_OFFLOAD_VLAN_FILTER;
+
dev_info->tx_offload_capa =
DEV_TX_OFFLOAD_VLAN_INSERT |
DEV_TX_OFFLOAD_QINQ_INSERT |
@@ -3253,6 +3257,7 @@ i40e_dev_info_get(struct rte_eth_dev *dev, struct 
rte_eth_dev_info *dev_info)
},
.rx_free_thresh = I40E_DEFAULT_RX_FREE_THRESH,
.rx_drop_en = 0,
+   .offloads = 0,
};
 
dev_info->default_txconf = (struct rte_eth_txconf) {
@@ -3372,7 +3377,8 @@ i40e_vlan_tpid_set(struct rte_eth_dev *dev,
 {
struct i40e_hw *hw = I40E_DEV_PRIVATE_TO_HW(dev->data->dev_private);
struct i40e_pf *pf = I40E_DEV_PRIVATE_TO_PF(dev->data->dev_private);
-   int qinq = dev->data->dev_conf.rxmode.hw_vlan_extend;
+   int qinq = dev->data->dev_conf.rxmode.offloads &
+  DEV_RX_OFFLOAD_VLAN_EXTEND;
int ret = 0;
 
if ((vlan_type != ETH_VLAN_TYPE_INNER &&
@@ -3420,9 +3426,11 @@ i40e_vlan_offload_set(struct rte_eth_dev *dev, int mask)
 {
struct i40e_pf *pf = I40E_DEV_PRIVATE_TO_PF(dev->data->dev_private);
struct i40e_vsi *vsi = pf->main_vsi;
+   struct rte_eth_rxmode *rxmode;
 
+   rxmode = &dev->data->dev_conf.rxmode;
if (mask & ETH_VLAN_FILTER_MASK) {
-   if (dev->data->dev_conf.rxmode.hw_vlan_filter)
+   if (rxmode->offloads & DEV_RX_OFFLOAD_VLAN_FILTER)
i40e_vsi_config_vlan_filter(vsi, TRUE);
else
i40e_vsi_config_vlan_filter(vsi, FALSE);
@@ -3430,14 +3438,14 @@ i40e_vlan_offload_set(struct rte_eth_dev *dev, int mask)
 
if (mask & ETH_VLAN_STRIP_MASK) {
/* Enable or disable VLAN stripping */
-   if (dev->data->dev_conf.rxmode.hw_vlan_strip)
+   if (rxmode->offloads & DEV_RX_OFFLOAD_VLAN_STRIP)
i40e_vsi_config_vlan_stripping(vsi, TRUE);
else
i40e_vsi_config_vlan_stripping(vsi, FALSE);
}
 
if (mask & ETH_VLAN_EXTEND_MASK) {
-   if (dev->data->dev_conf.rxmode.hw_vlan_extend) {
+   if (rxmode->offloads & DEV_RX_OFFLOAD_VLAN_EXTEND) {
i40e_vsi_config_double_vlan(vsi, TRUE);
/* Set global registers with default ethertype. */
i40e_vlan_tpid_set(dev, ETH_VLAN_TYPE_OUTER,
@@ -3684,6 +3692,7 @@ i40e_macaddr_add(struct rte_eth_dev *dev,
struct i40e_pf *pf = I40E_DEV_PRIVATE_TO_PF(dev->data->dev_private);
struct i40e_mac_filter_info mac_filter;
struct i40e_vsi *vsi;
+   struct rte_eth_rxmode *rxmode = &dev->data->dev_conf.rxmode;
int ret;
 
/* If VMDQ not enabled or configured, return */
@@ -3702,7 +3711,7 @@ i40e_macaddr_add(struct rte_eth_dev *dev,
}
 
rte_memcpy(&mac_filter.mac_addr, mac_addr, ETHER_ADDR_LEN);
-   if (dev->data->dev_conf.rxmode.hw_vlan_filter)
+   if (rxmode->offloads & DEV_RX_OFFLOAD_VLAN_FILTER)
mac_filter.filter_type = RTE_MACVLAN_PERFECT_MATCH;
else
mac_filter.filter_type = RTE_MAC_PERFECT_MATCH;
@@ -11354,9 +1

[dpdk-dev] [PATCH v3 2/2] net/i40e: convert to new Tx offloads API

2018-03-29 Thread Yanglong Wu
Ethdev Tx offloads API has changed since:
commit cba7f53b717d ("ethdev: introduce Tx queue offloads API")
This commit support the new Tx offloads API.

Signed-off-by: Yanglong Wu 
---
v2:
Adding offload requests checking and
reworking patch according to review comments
---
v3:
fix error
---
 drivers/net/i40e/i40e_ethdev.c|  1 +
 drivers/net/i40e/i40e_ethdev_vf.c |  1 +
 drivers/net/i40e/i40e_rxtx.c  | 24 
 drivers/net/i40e/i40e_rxtx.h  |  1 +
 4 files changed, 27 insertions(+)

diff --git a/drivers/net/i40e/i40e_ethdev.c b/drivers/net/i40e/i40e_ethdev.c
index 06f11dd23..5f520d2bc 100644
--- a/drivers/net/i40e/i40e_ethdev.c
+++ b/drivers/net/i40e/i40e_ethdev.c
@@ -3231,6 +3231,7 @@ i40e_dev_info_get(struct rte_eth_dev *dev, struct 
rte_eth_dev_info *dev_info)
DEV_RX_OFFLOAD_VLAN_EXTEND |
DEV_RX_OFFLOAD_VLAN_FILTER;
 
+   dev_info->tx_queue_offload_capa = 0;
dev_info->tx_offload_capa =
DEV_TX_OFFLOAD_VLAN_INSERT |
DEV_TX_OFFLOAD_QINQ_INSERT |
diff --git a/drivers/net/i40e/i40e_ethdev_vf.c 
b/drivers/net/i40e/i40e_ethdev_vf.c
index cb338def9..d04cd28ae 100644
--- a/drivers/net/i40e/i40e_ethdev_vf.c
+++ b/drivers/net/i40e/i40e_ethdev_vf.c
@@ -2185,6 +2185,7 @@ i40evf_dev_info_get(struct rte_eth_dev *dev, struct 
rte_eth_dev_info *dev_info)
DEV_RX_OFFLOAD_CRC_STRIP |
DEV_RX_OFFLOAD_SCATTER;
 
+   dev_info->tx_queue_offload_capa = 0;
dev_info->tx_offload_capa =
DEV_TX_OFFLOAD_VLAN_INSERT |
DEV_TX_OFFLOAD_QINQ_INSERT |
diff --git a/drivers/net/i40e/i40e_rxtx.c b/drivers/net/i40e/i40e_rxtx.c
index 4fdef69c1..b72b81350 100644
--- a/drivers/net/i40e/i40e_rxtx.c
+++ b/drivers/net/i40e/i40e_rxtx.c
@@ -1998,6 +1998,20 @@ i40e_dev_tx_descriptor_status(void *tx_queue, uint16_t 
offset)
return RTE_ETH_TX_DESC_FULL;
 }
 
+static int
+i40e_check_tx_queue_offloads(struct rte_eth_dev *dev, uint64_t requested)
+{
+   struct rte_eth_dev_info dev_info;
+   uint64_t mandatory = dev->data->dev_conf.txmode.offloads;
+   uint64_t supported; /* All per port offloads */
+
+   dev->dev_ops->dev_infos_get(dev, &dev_info);
+   supported = dev_info.tx_offload_capa ^ dev_info.tx_queue_offload_capa;
+   if ((requested & dev_info.tx_offload_capa) != requested)
+   return 0; /* requested range check */
+   return !((mandatory ^ requested) & supported);
+}
+
 int
 i40e_dev_tx_queue_setup(struct rte_eth_dev *dev,
uint16_t queue_idx,
@@ -2015,6 +2029,16 @@ i40e_dev_tx_queue_setup(struct rte_eth_dev *dev,
uint16_t tx_rs_thresh, tx_free_thresh;
uint16_t reg_idx, i, base, bsf, tc_mapping;
int q_offset;
+   struct rte_eth_dev_info dev_info;
+
+   if (!i40e_check_tx_queue_offloads(dev, tx_conf->offloads)) {
+   dev->dev_ops->dev_infos_get(dev, &dev_info);
+   PMD_INIT_LOG(ERR, "%p: Tx queue offloads 0x%" PRIx64
+   " don't match port  offloads 0x%" PRIx64
+   " or supported offloads 0x%" PRIx64,
+   (void *)dev, tx_conf->offloads,
+   dev->data->dev_conf.txmode.offloads,
+   dev_info.tx_offload_capa); }
 
if (hw->mac.type == I40E_MAC_VF || hw->mac.type == I40E_MAC_X722_VF) {
vf = I40EVF_DEV_PRIVATE_TO_VF(dev->data->dev_private);
diff --git a/drivers/net/i40e/i40e_rxtx.h b/drivers/net/i40e/i40e_rxtx.h
index cb5f8c714..10feec4a2 100644
--- a/drivers/net/i40e/i40e_rxtx.h
+++ b/drivers/net/i40e/i40e_rxtx.h
@@ -149,6 +149,7 @@ struct i40e_tx_queue {
bool q_set; /**< indicate if tx queue has been configured */
bool tx_deferred_start; /**< don't start this queue in dev start */
uint8_t dcb_tc; /**< Traffic class of tx queue */
+   uint64_t offloads; /**< Tx offload flags of DEV_RX_OFFLOAD_* */
 };
 
 /** Offload features */
-- 
2.11.0



[dpdk-dev] [PATCH v3 0/2] net/i40e: convert to new Rx/Tx offloads API

2018-03-29 Thread Yanglong Wu
This patch support new offloads API in i40e PF and VF.

Yanglong Wu (2):
  net/i40e: convert to new Rx offloads API
  net/i40e: convert to new Tx offloads API

 drivers/net/i40e/i40e_ethdev.c| 28 +--
 drivers/net/i40e/i40e_ethdev_vf.c | 22 +--
 drivers/net/i40e/i40e_flow.c  |  3 ++-
 drivers/net/i40e/i40e_rxtx.c  | 57 ---
 drivers/net/i40e/i40e_rxtx.h  |  2 ++
 5 files changed, 92 insertions(+), 20 deletions(-)

-- 
2.11.0



[dpdk-dev] [PATCH v3 1/2] net/i40e: convert to new Rx offloads API

2018-03-29 Thread Yanglong Wu
Ethdev Rx offloads API has changed since:
commit cba7f53b717d ("ethdev: introduce Rx queue offloads API")
This commit support the new Rx offloads API.

Signed-off-by: Yanglong Wu 
---
v2:
Adding offload requests checking and
reworking patch according to review comments
---
v3:
fix error
---
---
 drivers/net/i40e/i40e_ethdev.c| 27 +++
 drivers/net/i40e/i40e_ethdev_vf.c | 21 +
 drivers/net/i40e/i40e_flow.c  |  3 ++-
 drivers/net/i40e/i40e_rxtx.c  | 33 ++---
 drivers/net/i40e/i40e_rxtx.h  |  1 +
 5 files changed, 65 insertions(+), 20 deletions(-)

diff --git a/drivers/net/i40e/i40e_ethdev.c b/drivers/net/i40e/i40e_ethdev.c
index dc473d701..06f11dd23 100644
--- a/drivers/net/i40e/i40e_ethdev.c
+++ b/drivers/net/i40e/i40e_ethdev.c
@@ -3219,6 +3219,7 @@ i40e_dev_info_get(struct rte_eth_dev *dev, struct 
rte_eth_dev_info *dev_info)
dev_info->max_rx_pktlen = I40E_FRAME_SIZE_MAX;
dev_info->max_mac_addrs = vsi->max_macaddrs;
dev_info->max_vfs = pci_dev->max_vfs;
+   dev_info->rx_queue_offload_capa = 0;
dev_info->rx_offload_capa =
DEV_RX_OFFLOAD_VLAN_STRIP |
DEV_RX_OFFLOAD_QINQ_STRIP |
@@ -3226,7 +3227,10 @@ i40e_dev_info_get(struct rte_eth_dev *dev, struct 
rte_eth_dev_info *dev_info)
DEV_RX_OFFLOAD_UDP_CKSUM |
DEV_RX_OFFLOAD_TCP_CKSUM |
DEV_RX_OFFLOAD_OUTER_IPV4_CKSUM |
-   DEV_RX_OFFLOAD_CRC_STRIP;
+   DEV_RX_OFFLOAD_CRC_STRIP |
+   DEV_RX_OFFLOAD_VLAN_EXTEND |
+   DEV_RX_OFFLOAD_VLAN_FILTER;
+
dev_info->tx_offload_capa =
DEV_TX_OFFLOAD_VLAN_INSERT |
DEV_TX_OFFLOAD_QINQ_INSERT |
@@ -3253,6 +3257,7 @@ i40e_dev_info_get(struct rte_eth_dev *dev, struct 
rte_eth_dev_info *dev_info)
},
.rx_free_thresh = I40E_DEFAULT_RX_FREE_THRESH,
.rx_drop_en = 0,
+   .offloads = 0,
};
 
dev_info->default_txconf = (struct rte_eth_txconf) {
@@ -3372,7 +3377,8 @@ i40e_vlan_tpid_set(struct rte_eth_dev *dev,
 {
struct i40e_hw *hw = I40E_DEV_PRIVATE_TO_HW(dev->data->dev_private);
struct i40e_pf *pf = I40E_DEV_PRIVATE_TO_PF(dev->data->dev_private);
-   int qinq = dev->data->dev_conf.rxmode.hw_vlan_extend;
+   int qinq = dev->data->dev_conf.rxmode.offloads &
+  DEV_RX_OFFLOAD_VLAN_EXTEND;
int ret = 0;
 
if ((vlan_type != ETH_VLAN_TYPE_INNER &&
@@ -3420,9 +3426,11 @@ i40e_vlan_offload_set(struct rte_eth_dev *dev, int mask)
 {
struct i40e_pf *pf = I40E_DEV_PRIVATE_TO_PF(dev->data->dev_private);
struct i40e_vsi *vsi = pf->main_vsi;
+   struct rte_eth_rxmode *rxmode;
 
+   rxmode = &dev->data->dev_conf.rxmode;
if (mask & ETH_VLAN_FILTER_MASK) {
-   if (dev->data->dev_conf.rxmode.hw_vlan_filter)
+   if (rxmode->offloads & DEV_RX_OFFLOAD_VLAN_FILTER)
i40e_vsi_config_vlan_filter(vsi, TRUE);
else
i40e_vsi_config_vlan_filter(vsi, FALSE);
@@ -3430,14 +3438,14 @@ i40e_vlan_offload_set(struct rte_eth_dev *dev, int mask)
 
if (mask & ETH_VLAN_STRIP_MASK) {
/* Enable or disable VLAN stripping */
-   if (dev->data->dev_conf.rxmode.hw_vlan_strip)
+   if (rxmode->offloads & DEV_RX_OFFLOAD_VLAN_STRIP)
i40e_vsi_config_vlan_stripping(vsi, TRUE);
else
i40e_vsi_config_vlan_stripping(vsi, FALSE);
}
 
if (mask & ETH_VLAN_EXTEND_MASK) {
-   if (dev->data->dev_conf.rxmode.hw_vlan_extend) {
+   if (rxmode->offloads & DEV_RX_OFFLOAD_VLAN_EXTEND) {
i40e_vsi_config_double_vlan(vsi, TRUE);
/* Set global registers with default ethertype. */
i40e_vlan_tpid_set(dev, ETH_VLAN_TYPE_OUTER,
@@ -3684,6 +3692,7 @@ i40e_macaddr_add(struct rte_eth_dev *dev,
struct i40e_pf *pf = I40E_DEV_PRIVATE_TO_PF(dev->data->dev_private);
struct i40e_mac_filter_info mac_filter;
struct i40e_vsi *vsi;
+   struct rte_eth_rxmode *rxmode = &dev->data->dev_conf.rxmode;
int ret;
 
/* If VMDQ not enabled or configured, return */
@@ -3702,7 +3711,7 @@ i40e_macaddr_add(struct rte_eth_dev *dev,
}
 
rte_memcpy(&mac_filter.mac_addr, mac_addr, ETHER_ADDR_LEN);
-   if (dev->data->dev_conf.rxmode.hw_vlan_filter)
+   if (rxmode->offloads & DEV_RX_OFFLOAD_VLAN_FILTER)
mac_filter.filter_type = RTE_MACVLAN_PERFECT_MATCH;
else
mac_filter.filter_type = RTE_MAC_PERFECT_MATCH;
@@ -11354,

[dpdk-dev] [PATCH v3 2/2] net/i40e: convert to new Tx offloads API

2018-03-29 Thread Yanglong Wu
Ethdev Tx offloads API has changed since:
commit cba7f53b717d ("ethdev: introduce Tx queue offloads API")
This commit support the new Tx offloads API.

Signed-off-by: Yanglong Wu 
---
v2:
Adding offload requests checking and
reworking patch according to review comments
---
v3:
fix error
---
---
 drivers/net/i40e/i40e_ethdev.c|  1 +
 drivers/net/i40e/i40e_ethdev_vf.c |  1 +
 drivers/net/i40e/i40e_rxtx.c  | 24 
 drivers/net/i40e/i40e_rxtx.h  |  1 +
 4 files changed, 27 insertions(+)

diff --git a/drivers/net/i40e/i40e_ethdev.c b/drivers/net/i40e/i40e_ethdev.c
index 06f11dd23..5f520d2bc 100644
--- a/drivers/net/i40e/i40e_ethdev.c
+++ b/drivers/net/i40e/i40e_ethdev.c
@@ -3231,6 +3231,7 @@ i40e_dev_info_get(struct rte_eth_dev *dev, struct 
rte_eth_dev_info *dev_info)
DEV_RX_OFFLOAD_VLAN_EXTEND |
DEV_RX_OFFLOAD_VLAN_FILTER;
 
+   dev_info->tx_queue_offload_capa = 0;
dev_info->tx_offload_capa =
DEV_TX_OFFLOAD_VLAN_INSERT |
DEV_TX_OFFLOAD_QINQ_INSERT |
diff --git a/drivers/net/i40e/i40e_ethdev_vf.c 
b/drivers/net/i40e/i40e_ethdev_vf.c
index cb338def9..d04cd28ae 100644
--- a/drivers/net/i40e/i40e_ethdev_vf.c
+++ b/drivers/net/i40e/i40e_ethdev_vf.c
@@ -2185,6 +2185,7 @@ i40evf_dev_info_get(struct rte_eth_dev *dev, struct 
rte_eth_dev_info *dev_info)
DEV_RX_OFFLOAD_CRC_STRIP |
DEV_RX_OFFLOAD_SCATTER;
 
+   dev_info->tx_queue_offload_capa = 0;
dev_info->tx_offload_capa =
DEV_TX_OFFLOAD_VLAN_INSERT |
DEV_TX_OFFLOAD_QINQ_INSERT |
diff --git a/drivers/net/i40e/i40e_rxtx.c b/drivers/net/i40e/i40e_rxtx.c
index 4fdef69c1..b72b81350 100644
--- a/drivers/net/i40e/i40e_rxtx.c
+++ b/drivers/net/i40e/i40e_rxtx.c
@@ -1998,6 +1998,20 @@ i40e_dev_tx_descriptor_status(void *tx_queue, uint16_t 
offset)
return RTE_ETH_TX_DESC_FULL;
 }
 
+static int
+i40e_check_tx_queue_offloads(struct rte_eth_dev *dev, uint64_t requested)
+{
+   struct rte_eth_dev_info dev_info;
+   uint64_t mandatory = dev->data->dev_conf.txmode.offloads;
+   uint64_t supported; /* All per port offloads */
+
+   dev->dev_ops->dev_infos_get(dev, &dev_info);
+   supported = dev_info.tx_offload_capa ^ dev_info.tx_queue_offload_capa;
+   if ((requested & dev_info.tx_offload_capa) != requested)
+   return 0; /* requested range check */
+   return !((mandatory ^ requested) & supported);
+}
+
 int
 i40e_dev_tx_queue_setup(struct rte_eth_dev *dev,
uint16_t queue_idx,
@@ -2015,6 +2029,16 @@ i40e_dev_tx_queue_setup(struct rte_eth_dev *dev,
uint16_t tx_rs_thresh, tx_free_thresh;
uint16_t reg_idx, i, base, bsf, tc_mapping;
int q_offset;
+   struct rte_eth_dev_info dev_info;
+
+   if (!i40e_check_tx_queue_offloads(dev, tx_conf->offloads)) {
+   dev->dev_ops->dev_infos_get(dev, &dev_info);
+   PMD_INIT_LOG(ERR, "%p: Tx queue offloads 0x%" PRIx64
+   " don't match port  offloads 0x%" PRIx64
+   " or supported offloads 0x%" PRIx64,
+   (void *)dev, tx_conf->offloads,
+   dev->data->dev_conf.txmode.offloads,
+   dev_info.tx_offload_capa); }
 
if (hw->mac.type == I40E_MAC_VF || hw->mac.type == I40E_MAC_X722_VF) {
vf = I40EVF_DEV_PRIVATE_TO_VF(dev->data->dev_private);
diff --git a/drivers/net/i40e/i40e_rxtx.h b/drivers/net/i40e/i40e_rxtx.h
index cb5f8c714..10feec4a2 100644
--- a/drivers/net/i40e/i40e_rxtx.h
+++ b/drivers/net/i40e/i40e_rxtx.h
@@ -149,6 +149,7 @@ struct i40e_tx_queue {
bool q_set; /**< indicate if tx queue has been configured */
bool tx_deferred_start; /**< don't start this queue in dev start */
uint8_t dcb_tc; /**< Traffic class of tx queue */
+   uint64_t offloads; /**< Tx offload flags of DEV_RX_OFFLOAD_* */
 };
 
 /** Offload features */
-- 
2.11.0



[dpdk-dev] [PATCH v4 0/2] convert to new Rx/Tx offloads API

2018-03-30 Thread Yanglong Wu
This patch support new offloads API in i40e PF and VF.

Yanglong Wu (2):
  net/i40e: convert to new Rx offloads API
  net/i40e: convert to new Tx offloads API

 drivers/net/i40e/i40e_ethdev.c| 28 +--
 drivers/net/i40e/i40e_ethdev_vf.c | 22 +--
 drivers/net/i40e/i40e_flow.c  |  3 ++-
 drivers/net/i40e/i40e_rxtx.c  | 57 ---
 drivers/net/i40e/i40e_rxtx.h  |  2 ++
 5 files changed, 92 insertions(+), 20 deletions(-)

-- 
2.11.0



[dpdk-dev] [PATCH v4 2/2] net/i40e: convert to new Tx offloads API

2018-03-30 Thread Yanglong Wu
Ethdev Tx offloads API has changed since:
commit cba7f53b717d ("ethdev: introduce Tx queue offloads API")
This commit support the new Tx offloads API.

Signed-off-by: Yanglong Wu 
---
v2:
Adding offload requests checking and
reworking patch according to review comments
---
v3:
fix error
---
v4:
fix error
---
 drivers/net/i40e/i40e_ethdev.c|  1 +
 drivers/net/i40e/i40e_ethdev_vf.c |  1 +
 drivers/net/i40e/i40e_rxtx.c  | 24 
 drivers/net/i40e/i40e_rxtx.h  |  1 +
 4 files changed, 27 insertions(+)

diff --git a/drivers/net/i40e/i40e_ethdev.c b/drivers/net/i40e/i40e_ethdev.c
index e06331d4d..1c9b09e85 100644
--- a/drivers/net/i40e/i40e_ethdev.c
+++ b/drivers/net/i40e/i40e_ethdev.c
@@ -3231,6 +3231,7 @@ i40e_dev_info_get(struct rte_eth_dev *dev, struct 
rte_eth_dev_info *dev_info)
DEV_RX_OFFLOAD_VLAN_EXTEND |
DEV_RX_OFFLOAD_VLAN_FILTER;
 
+   dev_info->tx_queue_offload_capa = 0;
dev_info->tx_offload_capa =
DEV_TX_OFFLOAD_VLAN_INSERT |
DEV_TX_OFFLOAD_QINQ_INSERT |
diff --git a/drivers/net/i40e/i40e_ethdev_vf.c 
b/drivers/net/i40e/i40e_ethdev_vf.c
index 8e131d850..3faa746d0 100644
--- a/drivers/net/i40e/i40e_ethdev_vf.c
+++ b/drivers/net/i40e/i40e_ethdev_vf.c
@@ -2185,6 +2185,7 @@ i40evf_dev_info_get(struct rte_eth_dev *dev, struct 
rte_eth_dev_info *dev_info)
DEV_RX_OFFLOAD_CRC_STRIP |
DEV_RX_OFFLOAD_SCATTER;
 
+   dev_info->tx_queue_offload_capa = 0;
dev_info->tx_offload_capa =
DEV_TX_OFFLOAD_VLAN_INSERT |
DEV_TX_OFFLOAD_QINQ_INSERT |
diff --git a/drivers/net/i40e/i40e_rxtx.c b/drivers/net/i40e/i40e_rxtx.c
index 4fdef69c1..b72b81350 100644
--- a/drivers/net/i40e/i40e_rxtx.c
+++ b/drivers/net/i40e/i40e_rxtx.c
@@ -1998,6 +1998,20 @@ i40e_dev_tx_descriptor_status(void *tx_queue, uint16_t 
offset)
return RTE_ETH_TX_DESC_FULL;
 }
 
+static int
+i40e_check_tx_queue_offloads(struct rte_eth_dev *dev, uint64_t requested)
+{
+   struct rte_eth_dev_info dev_info;
+   uint64_t mandatory = dev->data->dev_conf.txmode.offloads;
+   uint64_t supported; /* All per port offloads */
+
+   dev->dev_ops->dev_infos_get(dev, &dev_info);
+   supported = dev_info.tx_offload_capa ^ dev_info.tx_queue_offload_capa;
+   if ((requested & dev_info.tx_offload_capa) != requested)
+   return 0; /* requested range check */
+   return !((mandatory ^ requested) & supported);
+}
+
 int
 i40e_dev_tx_queue_setup(struct rte_eth_dev *dev,
uint16_t queue_idx,
@@ -2015,6 +2029,16 @@ i40e_dev_tx_queue_setup(struct rte_eth_dev *dev,
uint16_t tx_rs_thresh, tx_free_thresh;
uint16_t reg_idx, i, base, bsf, tc_mapping;
int q_offset;
+   struct rte_eth_dev_info dev_info;
+
+   if (!i40e_check_tx_queue_offloads(dev, tx_conf->offloads)) {
+   dev->dev_ops->dev_infos_get(dev, &dev_info);
+   PMD_INIT_LOG(ERR, "%p: Tx queue offloads 0x%" PRIx64
+   " don't match port  offloads 0x%" PRIx64
+   " or supported offloads 0x%" PRIx64,
+   (void *)dev, tx_conf->offloads,
+   dev->data->dev_conf.txmode.offloads,
+   dev_info.tx_offload_capa); }
 
if (hw->mac.type == I40E_MAC_VF || hw->mac.type == I40E_MAC_X722_VF) {
vf = I40EVF_DEV_PRIVATE_TO_VF(dev->data->dev_private);
diff --git a/drivers/net/i40e/i40e_rxtx.h b/drivers/net/i40e/i40e_rxtx.h
index cb5f8c714..10feec4a2 100644
--- a/drivers/net/i40e/i40e_rxtx.h
+++ b/drivers/net/i40e/i40e_rxtx.h
@@ -149,6 +149,7 @@ struct i40e_tx_queue {
bool q_set; /**< indicate if tx queue has been configured */
bool tx_deferred_start; /**< don't start this queue in dev start */
uint8_t dcb_tc; /**< Traffic class of tx queue */
+   uint64_t offloads; /**< Tx offload flags of DEV_RX_OFFLOAD_* */
 };
 
 /** Offload features */
-- 
2.11.0



[dpdk-dev] [PATCH v4 1/2] net/i40e: convert to new Rx offloads API

2018-03-30 Thread Yanglong Wu
Ethdev Rx offloads API has changed since:
commit cba7f53b717d ("ethdev: introduce Rx queue offloads API")
This commit support the new Rx offloads API.

Signed-off-by: Yanglong Wu 
---
v2:
Adding offload requests checking and
reworking patch according to review comments
---
v3:
fix error
---
v4:
fix error
---
 drivers/net/i40e/i40e_ethdev.c| 27 +++
 drivers/net/i40e/i40e_ethdev_vf.c | 21 +
 drivers/net/i40e/i40e_flow.c  |  3 ++-
 drivers/net/i40e/i40e_rxtx.c  | 33 ++---
 drivers/net/i40e/i40e_rxtx.h  |  1 +
 5 files changed, 65 insertions(+), 20 deletions(-)

diff --git a/drivers/net/i40e/i40e_ethdev.c b/drivers/net/i40e/i40e_ethdev.c
index dc473d701..e06331d4d 100644
--- a/drivers/net/i40e/i40e_ethdev.c
+++ b/drivers/net/i40e/i40e_ethdev.c
@@ -3219,6 +3219,7 @@ i40e_dev_info_get(struct rte_eth_dev *dev, struct 
rte_eth_dev_info *dev_info)
dev_info->max_rx_pktlen = I40E_FRAME_SIZE_MAX;
dev_info->max_mac_addrs = vsi->max_macaddrs;
dev_info->max_vfs = pci_dev->max_vfs;
+   dev_info->rx_queue_offload_capa = 0;
dev_info->rx_offload_capa =
DEV_RX_OFFLOAD_VLAN_STRIP |
DEV_RX_OFFLOAD_QINQ_STRIP |
@@ -3226,7 +3227,10 @@ i40e_dev_info_get(struct rte_eth_dev *dev, struct 
rte_eth_dev_info *dev_info)
DEV_RX_OFFLOAD_UDP_CKSUM |
DEV_RX_OFFLOAD_TCP_CKSUM |
DEV_RX_OFFLOAD_OUTER_IPV4_CKSUM |
-   DEV_RX_OFFLOAD_CRC_STRIP;
+   DEV_RX_OFFLOAD_CRC_STRIP |
+   DEV_RX_OFFLOAD_VLAN_EXTEND |
+   DEV_RX_OFFLOAD_VLAN_FILTER;
+
dev_info->tx_offload_capa =
DEV_TX_OFFLOAD_VLAN_INSERT |
DEV_TX_OFFLOAD_QINQ_INSERT |
@@ -3253,6 +3257,7 @@ i40e_dev_info_get(struct rte_eth_dev *dev, struct 
rte_eth_dev_info *dev_info)
},
.rx_free_thresh = I40E_DEFAULT_RX_FREE_THRESH,
.rx_drop_en = 0,
+   .offloads = 0,
};
 
dev_info->default_txconf = (struct rte_eth_txconf) {
@@ -3372,7 +3377,8 @@ i40e_vlan_tpid_set(struct rte_eth_dev *dev,
 {
struct i40e_hw *hw = I40E_DEV_PRIVATE_TO_HW(dev->data->dev_private);
struct i40e_pf *pf = I40E_DEV_PRIVATE_TO_PF(dev->data->dev_private);
-   int qinq = dev->data->dev_conf.rxmode.hw_vlan_extend;
+   int qinq = dev->data->dev_conf.rxmode.offloads &
+  DEV_RX_OFFLOAD_VLAN_EXTEND;
int ret = 0;
 
if ((vlan_type != ETH_VLAN_TYPE_INNER &&
@@ -3420,9 +3426,11 @@ i40e_vlan_offload_set(struct rte_eth_dev *dev, int mask)
 {
struct i40e_pf *pf = I40E_DEV_PRIVATE_TO_PF(dev->data->dev_private);
struct i40e_vsi *vsi = pf->main_vsi;
+   struct rte_eth_rxmode *rxmode;
 
+   rxmode = &dev->data->dev_conf.rxmode;
if (mask & ETH_VLAN_FILTER_MASK) {
-   if (dev->data->dev_conf.rxmode.hw_vlan_filter)
+   if (rxmode->offloads & DEV_RX_OFFLOAD_VLAN_FILTER)
i40e_vsi_config_vlan_filter(vsi, TRUE);
else
i40e_vsi_config_vlan_filter(vsi, FALSE);
@@ -3430,14 +3438,14 @@ i40e_vlan_offload_set(struct rte_eth_dev *dev, int mask)
 
if (mask & ETH_VLAN_STRIP_MASK) {
/* Enable or disable VLAN stripping */
-   if (dev->data->dev_conf.rxmode.hw_vlan_strip)
+   if (rxmode->offloads & DEV_RX_OFFLOAD_VLAN_STRIP)
i40e_vsi_config_vlan_stripping(vsi, TRUE);
else
i40e_vsi_config_vlan_stripping(vsi, FALSE);
}
 
if (mask & ETH_VLAN_EXTEND_MASK) {
-   if (dev->data->dev_conf.rxmode.hw_vlan_extend) {
+   if (rxmode->offloads & DEV_RX_OFFLOAD_VLAN_EXTEND) {
i40e_vsi_config_double_vlan(vsi, TRUE);
/* Set global registers with default ethertype. */
i40e_vlan_tpid_set(dev, ETH_VLAN_TYPE_OUTER,
@@ -3684,6 +3692,7 @@ i40e_macaddr_add(struct rte_eth_dev *dev,
struct i40e_pf *pf = I40E_DEV_PRIVATE_TO_PF(dev->data->dev_private);
struct i40e_mac_filter_info mac_filter;
struct i40e_vsi *vsi;
+   struct rte_eth_rxmode *rxmode = &dev->data->dev_conf.rxmode;
int ret;
 
/* If VMDQ not enabled or configured, return */
@@ -3702,7 +3711,7 @@ i40e_macaddr_add(struct rte_eth_dev *dev,
}
 
rte_memcpy(&mac_filter.mac_addr, mac_addr, ETHER_ADDR_LEN);
-   if (dev->data->dev_conf.rxmode.hw_vlan_filter)
+   if (rxmode->offloads & DEV_RX_OFFLOAD_VLAN_FILTER)
mac_filter.filter_type = RTE_MACVLAN_PERFECT_MATCH;
else
mac_filter.filter_type = RTE_

[dpdk-dev] [PATCH 1/2] net/ixgbe: fix l3fwd start failed on VF

2017-11-02 Thread Yanglong Wu
VF can't run in multi queue module,if nb_q_per_pool was set as 1.
Since the value of nb_q_per_pool pass through to max_rx_q and max_tx_q in
VF.

Fixes: 27b609cbd1c6 ("ethdev: move the multi-queue mode check to specific 
drivers")

Signed-off-by: Yanglong Wu 
---
 drivers/net/ixgbe/ixgbe_ethdev.c | 2 --
 1 file changed, 2 deletions(-)

diff --git a/drivers/net/ixgbe/ixgbe_ethdev.c b/drivers/net/ixgbe/ixgbe_ethdev.c
index 14b9c5303..ae9c44421 100644
--- a/drivers/net/ixgbe/ixgbe_ethdev.c
+++ b/drivers/net/ixgbe/ixgbe_ethdev.c
@@ -,8 +,6 @@ ixgbe_check_mq_mode(struct rte_eth_dev *dev)
case ETH_MQ_RX_NONE:
/* if nothing mq mode configure, use default scheme */
dev->data->dev_conf.rxmode.mq_mode = 
ETH_MQ_RX_VMDQ_ONLY;
-   if (RTE_ETH_DEV_SRIOV(dev).nb_q_per_pool > 1)
-   RTE_ETH_DEV_SRIOV(dev).nb_q_per_pool = 1;
break;
default: /* ETH_MQ_RX_DCB, ETH_MQ_RX_DCB_RSS or ETH_MQ_TX_DCB*/
/* SRIOV only works in VMDq enable mode */
-- 
2.11.0



[dpdk-dev] [PATCH 2/2] net/ixgbe: fix l3fwd start failed on PF

2017-11-02 Thread Yanglong Wu
which occurred when the SRIOV is active and tx_q > rx_q.
The number of nb_q_per_pool should equeal to max number
of queues supported by HW not nb_rx_q.

Fixes: 27b609cbd1c6 (ethdev: move the multi-queue mode 
check to specific drivers)

Signed-off-by: Yanglong Wu 
---
 drivers/net/ixgbe/ixgbe_ethdev.c | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/drivers/net/ixgbe/ixgbe_ethdev.c b/drivers/net/ixgbe/ixgbe_ethdev.c
index ae9c44421..0f0641da1 100644
--- a/drivers/net/ixgbe/ixgbe_ethdev.c
+++ b/drivers/net/ixgbe/ixgbe_ethdev.c
@@ -2180,7 +2180,7 @@ ixgbe_check_vf_rss_rxq_num(struct rte_eth_dev *dev, 
uint16_t nb_rx_q)
return -EINVAL;
}
 
-   RTE_ETH_DEV_SRIOV(dev).nb_q_per_pool = nb_rx_q;
+   RTE_ETH_DEV_SRIOV(dev).nb_q_per_pool = 
128/RTE_ETH_DEV_SRIOV(dev).active;
RTE_ETH_DEV_SRIOV(dev).def_pool_q_idx = pci_dev->max_vfs * nb_rx_q;
 
return 0;
-- 
2.11.0



[dpdk-dev] [PATCH v2] net/ixgbe: fix l3fwd start failed on PF

2017-11-19 Thread Yanglong Wu
L3fwd start failed on PF, for tx_q check failed.
That occured when the SRIOV is active and tx_q > rx_q.
The tx_q is equal to nb_q_per_pool. The number of nb_q_per_pool
should equeal to max number of queues supported by HW not nb_rx_q.

Fixes: 27b609cbd1c6 (ethdev: move the multi-queue mode check to specific 
drivers)

Signed-off-by: Yanglong Wu 
---
 drivers/net/ixgbe/ixgbe_ethdev.c | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/drivers/net/ixgbe/ixgbe_ethdev.c b/drivers/net/ixgbe/ixgbe_ethdev.c
index ae9c44421..0f0641da1 100644
--- a/drivers/net/ixgbe/ixgbe_ethdev.c
+++ b/drivers/net/ixgbe/ixgbe_ethdev.c
@@ -2180,7 +2180,7 @@ ixgbe_check_vf_rss_rxq_num(struct rte_eth_dev *dev, 
uint16_t nb_rx_q)
return -EINVAL;
}
 
-   RTE_ETH_DEV_SRIOV(dev).nb_q_per_pool = nb_rx_q;
+   RTE_ETH_DEV_SRIOV(dev).nb_q_per_pool = 128 / 
RTE_ETH_DEV_SRIOV(dev).active;
RTE_ETH_DEV_SRIOV(dev).def_pool_q_idx = pci_dev->max_vfs * nb_rx_q;
 
return 0;
-- 
2.11.0



[dpdk-dev] [PATCH v2] net/ixgbe: fix l3fwd start failed on VF

2017-11-19 Thread Yanglong Wu
VF can't run in multi queue mode, if nb_q_per_pool was set as 1.
The value of nb_q_per_pool is passed through to max_rx_q and max_tx_q in VF.
So if nb_q_per_pool is equal to 1, max_rx_q and max_tx_q can't be more
than 1 and VF multi queue mode will fail.

Fixes: 27b609cbd1c6 (ethdev: move the multi-queue mode check to specific 
drivers)

Signed-off-by: Yanglong Wu 
---
 drivers/net/ixgbe/ixgbe_ethdev.c | 2 --
 1 file changed, 2 deletions(-)

diff --git a/drivers/net/ixgbe/ixgbe_ethdev.c b/drivers/net/ixgbe/ixgbe_ethdev.c
index 14b9c5303..ae9c44421 100644
--- a/drivers/net/ixgbe/ixgbe_ethdev.c
+++ b/drivers/net/ixgbe/ixgbe_ethdev.c
@@ -,8 +,6 @@ ixgbe_check_mq_mode(struct rte_eth_dev *dev)
case ETH_MQ_RX_NONE:
/* if nothing mq mode configure, use default scheme */
dev->data->dev_conf.rxmode.mq_mode = 
ETH_MQ_RX_VMDQ_ONLY;
-   if (RTE_ETH_DEV_SRIOV(dev).nb_q_per_pool > 1)
-   RTE_ETH_DEV_SRIOV(dev).nb_q_per_pool = 1;
break;
default: /* ETH_MQ_RX_DCB, ETH_MQ_RX_DCB_RSS or ETH_MQ_TX_DCB*/
/* SRIOV only works in VMDq enable mode */
-- 
2.11.0



[dpdk-dev] [PATCH v3] net/ixgbe: fix l3fwd start failed on VF

2017-11-19 Thread Yanglong Wu
VF can't run in multi queue mode, if nb_q_per_pool was set as 1.
Nb_q_per_pool is passed through to max_rx_q and max_tx_q in VF.
So if nb_q_per_pool is equal to 1, max_rx_q and max_tx_q can't be more
than 1 and VF multi queue mode will fail.

Fixes: 27b609cbd1c6 (ethdev: move the multi-queue mode check)

Signed-off-by: Yanglong Wu 
---
 drivers/net/ixgbe/ixgbe_ethdev.c | 2 --
 1 file changed, 2 deletions(-)

diff --git a/drivers/net/ixgbe/ixgbe_ethdev.c b/drivers/net/ixgbe/ixgbe_ethdev.c
index 14b9c5303..ae9c44421 100644
--- a/drivers/net/ixgbe/ixgbe_ethdev.c
+++ b/drivers/net/ixgbe/ixgbe_ethdev.c
@@ -,8 +,6 @@ ixgbe_check_mq_mode(struct rte_eth_dev *dev)
case ETH_MQ_RX_NONE:
/* if nothing mq mode configure, use default scheme */
dev->data->dev_conf.rxmode.mq_mode = 
ETH_MQ_RX_VMDQ_ONLY;
-   if (RTE_ETH_DEV_SRIOV(dev).nb_q_per_pool > 1)
-   RTE_ETH_DEV_SRIOV(dev).nb_q_per_pool = 1;
break;
default: /* ETH_MQ_RX_DCB, ETH_MQ_RX_DCB_RSS or ETH_MQ_TX_DCB*/
/* SRIOV only works in VMDq enable mode */
-- 
2.11.0



[dpdk-dev] [PATCH v3] net/ixgbe: fix l3fwd start failed on PF

2017-11-19 Thread Yanglong Wu
L3fwd start failed on PF, for tx_q check failed.
That occurred when the SRIOV is active and tx_q > rx_q.
The tx_q is equal to nb_q_per_pool. The number of nb_q_per_pool
should equeal to max number of queues supported by HW not nb_rx_q.

Fixes: 27b609cbd1c6 (ethdev: move the multi-queue mode check to specific 
drivers)

Signed-off-by: Yanglong Wu 
---
 drivers/net/ixgbe/ixgbe_ethdev.c | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/drivers/net/ixgbe/ixgbe_ethdev.c b/drivers/net/ixgbe/ixgbe_ethdev.c
index ae9c44421..0f0641da1 100644
--- a/drivers/net/ixgbe/ixgbe_ethdev.c
+++ b/drivers/net/ixgbe/ixgbe_ethdev.c
@@ -2180,7 +2180,7 @@ ixgbe_check_vf_rss_rxq_num(struct rte_eth_dev *dev, 
uint16_t nb_rx_q)
return -EINVAL;
}
 
-   RTE_ETH_DEV_SRIOV(dev).nb_q_per_pool = nb_rx_q;
+   RTE_ETH_DEV_SRIOV(dev).nb_q_per_pool = 
128/RTE_ETH_DEV_SRIOV(dev).active;
RTE_ETH_DEV_SRIOV(dev).def_pool_q_idx = pci_dev->max_vfs * nb_rx_q;
 
return 0;
-- 
2.11.0



[dpdk-dev] [PATCH v4] net/ixgbe: fix l3fwd start failed on PF

2017-11-19 Thread Yanglong Wu
L3fwd start failed on PF, for tx_q check failed.
That occurred when the SRIOV is active and tx_q > rx_q.
The tx_q is equal to nb_q_per_pool. The number of nb_q_per_pool
should equeal to max number of queues supported by HW not nb_rx_q.

Fixes: 27b609cbd1c6 (ethdev: move the multi-queue mode check to specific 
drivers)

Signed-off-by: Yanglong Wu 
---
 drivers/net/ixgbe/ixgbe_ethdev.c | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/drivers/net/ixgbe/ixgbe_ethdev.c b/drivers/net/ixgbe/ixgbe_ethdev.c
index ae9c44421..0f0641da1 100644
--- a/drivers/net/ixgbe/ixgbe_ethdev.c
+++ b/drivers/net/ixgbe/ixgbe_ethdev.c
@@ -2180,7 +2180,7 @@ ixgbe_check_vf_rss_rxq_num(struct rte_eth_dev *dev, 
uint16_t nb_rx_q)
return -EINVAL;
}
 
-   RTE_ETH_DEV_SRIOV(dev).nb_q_per_pool = nb_rx_q;
+   RTE_ETH_DEV_SRIOV(dev).nb_q_per_pool = 128 / 
RTE_ETH_DEV_SRIOV(dev).active;
RTE_ETH_DEV_SRIOV(dev).def_pool_q_idx = pci_dev->max_vfs * nb_rx_q;
 
return 0;
-- 
2.11.0



[dpdk-dev] [PATCH] net/i40e: i40e support mac loopback

2017-11-19 Thread Yanglong Wu
According to loopback mode, setup loopback link or not.
If loopback link is setted, packets will be sent to
rx_q from tx_q directly.Loopback mode can be used to
support testing task.

Signed-off-by: Yanglong Wu 
---
 drivers/net/i40e/base/i40e_adminq_cmd.h |  1 +
 drivers/net/i40e/i40e_ethdev.c  | 12 +++
 2 files changed, 13 insertions(+)

diff --git a/drivers/net/i40e/base/i40e_adminq_cmd.h 
b/drivers/net/i40e/base/i40e_adminq_cmd.h
index c36da2a32..8171f877b 100644
--- a/drivers/net/i40e/base/i40e_adminq_cmd.h
+++ b/drivers/net/i40e/base/i40e_adminq_cmd.h
@@ -2128,6 +2128,7 @@ I40E_CHECK_CMD_LENGTH(i40e_aqc_an_advt_reg);
 /* Set Loopback mode (0x0618) */
 struct i40e_aqc_set_lb_mode {
__le16  lb_mode;
+#define I40E_AQ_LB_MODE_NONE   0x0
 #define I40E_AQ_LB_PHY_LOCAL   0x01
 #define I40E_AQ_LB_PHY_REMOTE  0x02
 #define I40E_AQ_LB_MAC_LOCAL   0x04
diff --git a/drivers/net/i40e/i40e_ethdev.c b/drivers/net/i40e/i40e_ethdev.c
index f40c463aa..2e6aa9d0d 100644
--- a/drivers/net/i40e/i40e_ethdev.c
+++ b/drivers/net/i40e/i40e_ethdev.c
@@ -2048,6 +2048,17 @@ i40e_dev_start(struct rte_eth_dev *dev)
}
}
 
+   /* Enable mac loopback mode */
+   if (hw->mac.type == I40E_MAC_XL710 &&
+   (dev->data->dev_conf.lpbk_mode == I40E_AQ_LB_MODE_NONE ||
+   dev->data->dev_conf.lpbk_mode == I40E_AQ_LB_PHY_LOCAL)) {
+   ret = i40e_aq_set_lb_modes(hw,
+  dev->data->dev_conf.lpbk_mode, NULL);
+   if (ret != I40E_SUCCESS) {
+   PMD_DRV_LOG(INFO, "fail to set loopback link");
+   goto err_up;
+   }
+   }
+
/* Apply link configure */
if (dev->data->dev_conf.link_speeds & ~(ETH_LINK_SPEED_100M |
ETH_LINK_SPEED_1G | ETH_LINK_SPEED_10G |
-- 
2.11.0



[dpdk-dev] [PATCH] app/testpmd: fix port_id alloction issue

2017-11-22 Thread Yanglong Wu
the port_id was allocated as a inccrete number,
for init function was passthroughed a wrong
size of parameter

Fixes:28caa76aea71 ("app/testpmd: fix port id type")

Signed-off-by: Yanglong Wu 
---
 app/test-pmd/cmdline.c | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/app/test-pmd/cmdline.c b/app/test-pmd/cmdline.c
index f71d96301..8990ebf6b 100644
--- a/app/test-pmd/cmdline.c
+++ b/app/test-pmd/cmdline.c
@@ -3352,7 +3352,7 @@ cmdline_parse_token_num_t cmd_vlan_tpid_tpid =
  tp_id, UINT16);
 cmdline_parse_token_num_t cmd_vlan_tpid_portid =
TOKEN_NUM_INITIALIZER(struct cmd_vlan_tpid_result,
- port_id, UINT8);
+ port_id, UINT16);
 
 cmdline_parse_inst_t cmd_vlan_tpid = {
.f = cmd_vlan_tpid_parsed,
-- 
2.11.0



[dpdk-dev] [PATCH v2] net/i40e: support mac loopback

2017-12-19 Thread Yanglong Wu
According to loopback mode, setup loopback link or not.
If loopback link is setted, packets in tx will be sent to rx directly.
Loopback mode can be used to support testing task

Signed-off-by: Yanglong Wu 
---
v2:
fix coding style issue
---
 drivers/net/i40e/i40e_ethdev.c | 10 ++
 drivers/net/i40e/i40e_ethdev.h |  3 ++-
 2 files changed, 12 insertions(+), 1 deletion(-)

diff --git a/drivers/net/i40e/i40e_ethdev.c b/drivers/net/i40e/i40e_ethdev.c
index 0739f65a8..e8bdb335a 100644
--- a/drivers/net/i40e/i40e_ethdev.c
+++ b/drivers/net/i40e/i40e_ethdev.c
@@ -2047,6 +2047,16 @@ i40e_dev_start(struct rte_eth_dev *dev)
 true, NULL);
}
}
+
+   /* Enable mac loopback mode */
+   if (dev->data->dev_conf.lpbk_mode == I40E_AQ_LB_MODE_NONE ||
+   dev->data->dev_conf.lpbk_mode == I40E_AQ_LB_PHY_LOCAL) {
+   ret = i40e_aq_set_lb_modes(hw, dev->data->dev_conf.lpbk_mode, 
NULL);
+   if (ret != I40E_SUCCESS) {
+   PMD_DRV_LOG(ERR, "fail to set loopback link");
+   goto err_up;
+   }
+   }
 
/* Apply link configure */
if (dev->data->dev_conf.link_speeds & ~(ETH_LINK_SPEED_100M |
diff --git a/drivers/net/i40e/i40e_ethdev.h b/drivers/net/i40e/i40e_ethdev.h
index cd67453d1..2ad9858e4 100644
--- a/drivers/net/i40e/i40e_ethdev.h
+++ b/drivers/net/i40e/i40e_ethdev.h
@@ -61,7 +61,8 @@
 #define I40E_NUM_MACADDR_MAX   64
 /* Maximum number of VFs */
 #define I40E_MAX_VF   128
-
+/*flag of no loopback*/
+#define I40E_AQ_LB_MODE_NONE 0x0
 /*
  * vlan_id is a 12 bit number.
  * The VFTA array is actually a 4096 bit array, 128 of 32bit elements.
-- 
2.11.0



[dpdk-dev] [PATCH v3] net/i40e: support mac loopback

2017-12-21 Thread Yanglong Wu
According to loopback mode, setup loopback link or not.
If loopback link is setted, packets in tx will be sent to rx directly.
Loopback mode can be used to support testing task

Signed-off-by: Yanglong Wu 
---
v2:
fix coding style issue
---
v3:
update release DOC
---
 doc/guides/rel_notes/release_18_02.rst |  6 ++
 drivers/net/i40e/i40e_ethdev.c | 10 ++
 drivers/net/i40e/i40e_ethdev.h |  3 ++-
 3 files changed, 18 insertions(+), 1 deletion(-)

diff --git a/doc/guides/rel_notes/release_18_02.rst 
b/doc/guides/rel_notes/release_18_02.rst
index 24b67bb8b..1bd747b49 100644
--- a/doc/guides/rel_notes/release_18_02.rst
+++ b/doc/guides/rel_notes/release_18_02.rst
@@ -41,6 +41,12 @@ New Features
  Also, make sure to start the actual text at the margin.
  =
 
+* **Added a mac loopback function for the FVL.**
+
+  Added a mac loopback function for the FVL in order to support test
+  task asked by users. According to device configuration, it will
+  setup TX->RX loopback link or not. If loopback link is setted,
+  packets in tx will be sent to rx directly.
 
 API Changes
 ---
diff --git a/drivers/net/i40e/i40e_ethdev.c b/drivers/net/i40e/i40e_ethdev.c
index 0739f65a8..e8bdb335a 100644
--- a/drivers/net/i40e/i40e_ethdev.c
+++ b/drivers/net/i40e/i40e_ethdev.c
@@ -2047,6 +2047,16 @@ i40e_dev_start(struct rte_eth_dev *dev)
 true, NULL);
}
}
+
+   /* Enable mac loopback mode */
+   if (dev->data->dev_conf.lpbk_mode == I40E_AQ_LB_MODE_NONE ||
+   dev->data->dev_conf.lpbk_mode == I40E_AQ_LB_PHY_LOCAL) {
+   ret = i40e_aq_set_lb_modes(hw, dev->data->dev_conf.lpbk_mode, 
NULL);
+   if (ret != I40E_SUCCESS) {
+   PMD_DRV_LOG(ERR, "fail to set loopback link");
+   goto err_up;
+   }
+   }
 
/* Apply link configure */
if (dev->data->dev_conf.link_speeds & ~(ETH_LINK_SPEED_100M |
diff --git a/drivers/net/i40e/i40e_ethdev.h b/drivers/net/i40e/i40e_ethdev.h
index cd67453d1..2ad9858e4 100644
--- a/drivers/net/i40e/i40e_ethdev.h
+++ b/drivers/net/i40e/i40e_ethdev.h
@@ -61,7 +61,8 @@
 #define I40E_NUM_MACADDR_MAX   64
 /* Maximum number of VFs */
 #define I40E_MAX_VF   128
-
+/*flag of no loopback*/
+#define I40E_AQ_LB_MODE_NONE 0x0
 /*
  * vlan_id is a 12 bit number.
  * The VFTA array is actually a 4096 bit array, 128 of 32bit elements.
-- 
2.11.0



[dpdk-dev] [PATCH v2] app/testpmd: fix port_id alloction issue

2017-12-21 Thread Yanglong Wu
In the feature of increasing port_id range from 8 bits to 16 bits,
vlan port_id allocation function was forget to substitute UINT8 with
UINT16, so the vlan port_id was allocated as a invalid number.

Signed-off-by: Yanglong Wu 
---
v2:
modified commit message
---
 app/test-pmd/cmdline.c | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/app/test-pmd/cmdline.c b/app/test-pmd/cmdline.c
index f71d96301..8990ebf6b 100644
--- a/app/test-pmd/cmdline.c
+++ b/app/test-pmd/cmdline.c
@@ -3352,7 +3352,7 @@ cmdline_parse_token_num_t cmd_vlan_tpid_tpid =
  tp_id, UINT16);
 cmdline_parse_token_num_t cmd_vlan_tpid_portid =
TOKEN_NUM_INITIALIZER(struct cmd_vlan_tpid_result,
- port_id, UINT8);
+ port_id, UINT16);
 
 cmdline_parse_inst_t cmd_vlan_tpid = {
.f = cmd_vlan_tpid_parsed,
-- 
2.11.0



[dpdk-dev] [PATCH v2] app/testpmd: fix port_id alloction issue

2017-12-21 Thread Yanglong Wu
In the feature of increasing port_id range from 8 bits to 16 bits,
vlan port_id allocation function was forget to substitute UINT8 with
UINT16, so the vlan port_id was allocated as a inccrete number.

Fixes:28caa76aea71 ("app/testpmd: fix port id type")

Signed-off-by: Yanglong Wu 
---
v2:
modified commit message
---
 app/test-pmd/cmdline.c | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/app/test-pmd/cmdline.c b/app/test-pmd/cmdline.c
index f71d96301..8990ebf6b 100644
--- a/app/test-pmd/cmdline.c
+++ b/app/test-pmd/cmdline.c
@@ -3352,7 +3352,7 @@ cmdline_parse_token_num_t cmd_vlan_tpid_tpid =
  tp_id, UINT16);
 cmdline_parse_token_num_t cmd_vlan_tpid_portid =
TOKEN_NUM_INITIALIZER(struct cmd_vlan_tpid_result,
- port_id, UINT8);
+ port_id, UINT16);
 
 cmdline_parse_inst_t cmd_vlan_tpid = {
.f = cmd_vlan_tpid_parsed,
-- 
2.11.0



[dpdk-dev] [PATCH v4] net/i40e: support mac loopback

2018-01-01 Thread Yanglong Wu
According to loopback mode, setup loopback link or not.
If loopback link is setted, packets in tx will be sent to rx directly.
Loopback mode can be used to support testing task

Signed-off-by: Yanglong Wu 
---
v2:
fix coding style issue
---
v3:
update release DOC
---
v4:
remove 'FVL'
---
 doc/guides/rel_notes/release_18_02.rst |  6 ++
 drivers/net/i40e/i40e_ethdev.c | 10 ++
 drivers/net/i40e/i40e_ethdev.h |  3 ++-
 3 files changed, 18 insertions(+), 1 deletion(-)

diff --git a/doc/guides/rel_notes/release_18_02.rst 
b/doc/guides/rel_notes/release_18_02.rst
index 24b67bb8b..81be184db 100644
--- a/doc/guides/rel_notes/release_18_02.rst
+++ b/doc/guides/rel_notes/release_18_02.rst
@@ -41,6 +41,12 @@ New Features
  Also, make sure to start the actual text at the margin.
  =
 
+* **Added a mac loopback function for the i40e.**
+
+  Add a mac loopback function for the i40e in order to support test 
+  task asked by users. According to device configuration, it will 
+  setup TX->RX loopback link or not. If loopback link is setted, 
+  packets in tx will be sent to rx directly.
 
 API Changes
 ---
diff --git a/drivers/net/i40e/i40e_ethdev.c b/drivers/net/i40e/i40e_ethdev.c
index 0739f65a8..e8bdb335a 100644
--- a/drivers/net/i40e/i40e_ethdev.c
+++ b/drivers/net/i40e/i40e_ethdev.c
@@ -2047,6 +2047,16 @@ i40e_dev_start(struct rte_eth_dev *dev)
 true, NULL);
}
}
+   
+   /* Enable mac loopback mode */
+   if (dev->data->dev_conf.lpbk_mode == I40E_AQ_LB_MODE_NONE ||
+   dev->data->dev_conf.lpbk_mode == I40E_AQ_LB_PHY_LOCAL) {
+   ret=i40e_aq_set_lb_modes(hw,dev->data->dev_conf.lpbk_mode,NULL);
+   if (ret != I40E_SUCCESS) {
+   PMD_DRV_LOG(ERR, "fail to set loopback link");
+   goto err_up;
+   }
+   }
 
/* Apply link configure */
if (dev->data->dev_conf.link_speeds & ~(ETH_LINK_SPEED_100M |
diff --git a/drivers/net/i40e/i40e_ethdev.h b/drivers/net/i40e/i40e_ethdev.h
index cd67453d1..2ad9858e4 100644
--- a/drivers/net/i40e/i40e_ethdev.h
+++ b/drivers/net/i40e/i40e_ethdev.h
@@ -61,7 +61,8 @@
 #define I40E_NUM_MACADDR_MAX   64
 /* Maximum number of VFs */
 #define I40E_MAX_VF   128
-
+/*flag of no loopback*/
+#define I40E_AQ_LB_MODE_NONE 0x0
 /*
  * vlan_id is a 12 bit number.
  * The VFTA array is actually a 4096 bit array, 128 of 32bit elements.
-- 
2.11.0



[dpdk-dev] [PATCH v5] net/i40e: support mac loopback

2018-01-01 Thread Yanglong Wu
According to loopback mode, setup loopback link or not.
If loopback link is setted, packets in tx will be sent to rx directly.
Loopback mode can be used to support testing task

Signed-off-by: Yanglong Wu 
---
v2:
fix coding style issue
---
v3:
update release DOC
---
v4:
remove 'FVL'
---
v5:
fix coding style isssue
---
 doc/guides/rel_notes/release_18_02.rst |  6 ++
 drivers/net/i40e/i40e_ethdev.c | 10 ++
 drivers/net/i40e/i40e_ethdev.h |  3 ++-
 3 files changed, 18 insertions(+), 1 deletion(-)

diff --git a/doc/guides/rel_notes/release_18_02.rst 
b/doc/guides/rel_notes/release_18_02.rst
index 24b67bb8b..81be184db 100644
--- a/doc/guides/rel_notes/release_18_02.rst
+++ b/doc/guides/rel_notes/release_18_02.rst
@@ -41,6 +41,12 @@ New Features
  Also, make sure to start the actual text at the margin.
  =
 
+* **Added a mac loopback function for the i40e.**
+
+  Add a mac loopback function for the i40e in order to support test
+  task asked by users. According to device configuration, it will
+  setup TX->RX loopback link or not. If loopback link is setted,
+  packets in tx will be sent to rx directly.
 
 API Changes
 ---
diff --git a/drivers/net/i40e/i40e_ethdev.c b/drivers/net/i40e/i40e_ethdev.c
index 0739f65a8..e8bdb335a 100644
--- a/drivers/net/i40e/i40e_ethdev.c
+++ b/drivers/net/i40e/i40e_ethdev.c
@@ -2047,6 +2047,16 @@ i40e_dev_start(struct rte_eth_dev *dev)
 true, NULL);
}
}
+
+   /* Enable mac loopback mode */
+   if (dev->data->dev_conf.lpbk_mode == I40E_AQ_LB_MODE_NONE ||
+   dev->data->dev_conf.lpbk_mode == I40E_AQ_LB_PHY_LOCAL) {
+   ret = i40e_aq_set_lb_modes(hw, dev->data->dev_conf.lpbk_mode, 
NULL);
+   if (ret != I40E_SUCCESS) {
+   PMD_DRV_LOG(ERR, "fail to set loopback link");
+   goto err_up;
+   }
+   }
 
/* Apply link configure */
if (dev->data->dev_conf.link_speeds & ~(ETH_LINK_SPEED_100M |
diff --git a/drivers/net/i40e/i40e_ethdev.h b/drivers/net/i40e/i40e_ethdev.h
index cd67453d1..2ad9858e4 100644
--- a/drivers/net/i40e/i40e_ethdev.h
+++ b/drivers/net/i40e/i40e_ethdev.h
@@ -61,7 +61,8 @@
 #define I40E_NUM_MACADDR_MAX   64
 /* Maximum number of VFs */
 #define I40E_MAX_VF   128
-
+/*flag of no loopback*/
+#define I40E_AQ_LB_MODE_NONE 0x0
 /*
  * vlan_id is a 12 bit number.
  * The VFTA array is actually a 4096 bit array, 128 of 32bit elements.
-- 
2.11.0



[dpdk-dev] [PATCH v3] app/testpmd: fix port_id alloction issue

2018-01-01 Thread Yanglong Wu
In the feature of increasing port_id range from 8 bits to 16 bits,
vlan port_id allocation function was forget to substitute UINT8 with
UINT16, so the vlan port_id was allocated as a inccrete number.

Fixes:28caa76aea71 ("app/testpmd: fix port id type")

Signed-off-by: Yanglong Wu 
Reviewed-by: Zhiyong Yang 
---
v2:
modified commit message
---
v3:
add review tag
---
 app/test-pmd/cmdline.c | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/app/test-pmd/cmdline.c b/app/test-pmd/cmdline.c
index f71d96301..8990ebf6b 100644
--- a/app/test-pmd/cmdline.c
+++ b/app/test-pmd/cmdline.c
@@ -3352,7 +3352,7 @@ cmdline_parse_token_num_t cmd_vlan_tpid_tpid =
  tp_id, UINT16);
 cmdline_parse_token_num_t cmd_vlan_tpid_portid =
TOKEN_NUM_INITIALIZER(struct cmd_vlan_tpid_result,
- port_id, UINT8);
+ port_id, UINT16);
 
 cmdline_parse_inst_t cmd_vlan_tpid = {
.f = cmd_vlan_tpid_parsed,
-- 
2.11.0



[dpdk-dev] [PATCH v5] net/ixgbe: fix l3fwd start failed on

2018-01-07 Thread Yanglong Wu
L3fwd start failed on PF, for tx_q check failed.
That occurred when the SRIOV is active and tx_q > rx_q.
The tx_q is equal to nb_q_per_pool. The number of nb_q_per_pool
should equeal to max number of queues supported by HW not nb_rx_q.

Fixes: 27b609cbd1c6 (ethdev: move the multi-queue mode check to
specific drivers)

Signed-off-by: Yanglong Wu 
---
v5:
Rework according to comments
---
 drivers/net/ixgbe/ixgbe_ethdev.c | 10 +++---
 1 file changed, 7 insertions(+), 3 deletions(-)

diff --git a/drivers/net/ixgbe/ixgbe_ethdev.c b/drivers/net/ixgbe/ixgbe_ethdev.c
index ff19a564a..baaeee5d9 100644
--- a/drivers/net/ixgbe/ixgbe_ethdev.c
+++ b/drivers/net/ixgbe/ixgbe_ethdev.c
@@ -95,6 +95,9 @@
 /* Timer value included in XOFF frames. */
 #define IXGBE_FC_PAUSE 0x680
 
+/*Default value of Max Rx Queue*/
+#define IXGBE_MAX_RX_QUEUE_NUM 128
+
 #define IXGBE_LINK_DOWN_CHECK_TIMEOUT 4000 /* ms */
 #define IXGBE_LINK_UP_CHECK_TIMEOUT   1000 /* ms */
 #define IXGBE_VMDQ_NUM_UC_MAC 4096 /* Maximum nb. of UC MAC addr. */
@@ -2194,9 +2197,10 @@ ixgbe_check_vf_rss_rxq_num(struct rte_eth_dev *dev, 
uint16_t nb_rx_q)
return -EINVAL;
}
 
-   RTE_ETH_DEV_SRIOV(dev).nb_q_per_pool = nb_rx_q;
-   RTE_ETH_DEV_SRIOV(dev).def_pool_q_idx = pci_dev->max_vfs * nb_rx_q;
-
+   RTE_ETH_DEV_SRIOV(dev).nb_q_per_pool =
+   IXGBE_MAX_RX_QUEUE_NUM / RTE_ETH_DEV_SRIOV(dev).active;
+   RTE_ETH_DEV_SRIOV(dev).def_pool_q_idx =
+   pci_dev->max_vfs * RTE_ETH_DEV_SRIOV(dev).nb_q_per_pool;
return 0;
 }
 
-- 
2.11.0



[dpdk-dev] [PATCH v4] net/ixgbe: fix l3fwd start failed on VF

2018-01-08 Thread Yanglong Wu
VF can't run in multi queue mode, if nb_q_per_pool was set as 1.
Nb_q_per_pool is passed through to max_rx_q and max_tx_q in VF.
So if nb_q_per_pool is equal to 1, max_rx_q and max_tx_q can't be more
than 1 and VF multi queue mode will fail.

Fixes: 27b609cbd1c6 (ethdev: move the multi-queue mode check)

Signed-off-by: Yanglong Wu 
---
v1~v3:
coding style issue fix
---
v4:
Rework according to comments
---
 drivers/net/ixgbe/ixgbe_ethdev.c | 2 --
 1 file changed, 2 deletions(-)

diff --git a/drivers/net/ixgbe/ixgbe_ethdev.c b/drivers/net/ixgbe/ixgbe_ethdev.c
index baaeee5d9..6af4f8b2b 100644
--- a/drivers/net/ixgbe/ixgbe_ethdev.c
+++ b/drivers/net/ixgbe/ixgbe_ethdev.c
@@ -2240,8 +2240,6 @@ ixgbe_check_mq_mode(struct rte_eth_dev *dev)
case ETH_MQ_RX_NONE:
/* if nothing mq mode configure, use default scheme */
dev->data->dev_conf.rxmode.mq_mode = 
ETH_MQ_RX_VMDQ_ONLY;
-   if (RTE_ETH_DEV_SRIOV(dev).nb_q_per_pool > 1)
-   RTE_ETH_DEV_SRIOV(dev).nb_q_per_pool = 1;
break;
default: /* ETH_MQ_RX_DCB, ETH_MQ_RX_DCB_RSS or ETH_MQ_TX_DCB*/
/* SRIOV only works in VMDq enable mode */
-- 
2.11.0



[dpdk-dev] [PATCH v6] net/ixgbe: fix tx_q check failed on PF

2018-01-09 Thread Yanglong Wu
Tx_q check failed on PF that occurred when the SRIOV is active 
and tx_q > rx_q. The tx_q is equal to nb_q_per_pool. The number 
of nb_q_per_pool should equeal to max number of queues supported
by HW not nb_rx_q.

Fixes: 27b609cbd1c6 (ethdev: move the multi-queue mode check to
specific drivers)

Signed-off-by: Yanglong Wu 
---
v5:
Rework according to comments
---
v6:
rework commit log
---
 drivers/net/ixgbe/ixgbe_ethdev.c | 10 +++---
 1 file changed, 7 insertions(+), 3 deletions(-)

diff --git a/drivers/net/ixgbe/ixgbe_ethdev.c b/drivers/net/ixgbe/ixgbe_ethdev.c
index ff19a564a..baaeee5d9 100644
--- a/drivers/net/ixgbe/ixgbe_ethdev.c
+++ b/drivers/net/ixgbe/ixgbe_ethdev.c
@@ -95,6 +95,9 @@
 /* Timer value included in XOFF frames. */
 #define IXGBE_FC_PAUSE 0x680
 
+/*Default value of Max Rx Queue*/
+#define IXGBE_MAX_RX_QUEUE_NUM 128
+
 #define IXGBE_LINK_DOWN_CHECK_TIMEOUT 4000 /* ms */
 #define IXGBE_LINK_UP_CHECK_TIMEOUT   1000 /* ms */
 #define IXGBE_VMDQ_NUM_UC_MAC 4096 /* Maximum nb. of UC MAC addr. */
@@ -2194,9 +2197,10 @@ ixgbe_check_vf_rss_rxq_num(struct rte_eth_dev *dev, 
uint16_t nb_rx_q)
return -EINVAL;
}
 
-   RTE_ETH_DEV_SRIOV(dev).nb_q_per_pool = nb_rx_q;
-   RTE_ETH_DEV_SRIOV(dev).def_pool_q_idx = pci_dev->max_vfs * nb_rx_q;
-
+   RTE_ETH_DEV_SRIOV(dev).nb_q_per_pool =
+   IXGBE_MAX_RX_QUEUE_NUM / RTE_ETH_DEV_SRIOV(dev).active;
+   RTE_ETH_DEV_SRIOV(dev).def_pool_q_idx =
+   pci_dev->max_vfs * RTE_ETH_DEV_SRIOV(dev).nb_q_per_pool;
return 0;
 }
 
-- 
2.11.0



[dpdk-dev] [PATCH v2] app/testpmd:vlan filter fail

2018-02-04 Thread Yanglong Wu
This bug is caused by miss port configuration.
The port_conf for the DCB configuration should
inherit the same configuration of the port.

Fix:0074d02fc(convert to new Rx offloads API)
Signed-off-by: Yanglong Wu 
---
v2:
changing patch accoding to the review
---
 app/test-pmd/testpmd.c | 3 +++
 1 file changed, 3 insertions(+)

diff --git a/app/test-pmd/testpmd.c b/app/test-pmd/testpmd.c
index 5dc8ccac5..da1d9bd3a 100644
--- a/app/test-pmd/testpmd.c
+++ b/app/test-pmd/testpmd.c
@@ -2324,6 +2324,9 @@ init_port_dcb_config(portid_t pid,
/* Enter DCB configuration status */
dcb_config = 1;

+   port_conf.rxmode = rte_port->dev_conf.rxmode;
+   port_conf.txmode = rte_port->dev_conf.txmode;
+
/*set configuration of DCB in vt mode and DCB in non-vt mode*/
retval = get_eth_dcb_conf(&port_conf, dcb_mode, num_tcs, pfc_en);
if (retval < 0)
-- 
2.11.0



[dpdk-dev] [PATCH v3] app/testpmd: fix port_id alloction issue

2018-02-04 Thread Yanglong Wu
In the feature of increasing port_id range from 8 bits to 16 bits,
vlan port_id allocation function was forget to substitute UINT8 with
UINT16, so the vlan port_id was allocated as a inccrete number.

Fixes:28caa76aea71 ("app/testpmd: fix port id type")

Signed-off-by: Yanglong Wu 
Reviewed-by: Zhiyong Yang 
---
v2:
modified commit message
---
v3:
add review tag
---
 app/test-pmd/cmdline.c | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/app/test-pmd/cmdline.c b/app/test-pmd/cmdline.c
index f71d96301..8990ebf6b 100644
--- a/app/test-pmd/cmdline.c
+++ b/app/test-pmd/cmdline.c
@@ -3352,7 +3352,7 @@ cmdline_parse_token_num_t cmd_vlan_tpid_tpid =
  tp_id, UINT16);
 cmdline_parse_token_num_t cmd_vlan_tpid_portid =
TOKEN_NUM_INITIALIZER(struct cmd_vlan_tpid_result,
- port_id, UINT8);
+ port_id, UINT16);
 
 cmdline_parse_inst_t cmd_vlan_tpid = {
.f = cmd_vlan_tpid_parsed,
-- 
2.11.0



[dpdk-dev] [PATCH v3] app/testpmd: fix port DCB configuration

2018-02-05 Thread Yanglong Wu
The port_conf for the DCB configuration should
inherit the same configuration of the port.

Fix:0074d02fc("app/testpmd: convert to new Rx offloads API")
Signed-off-by: Yanglong Wu 
---
v2:
changing patch accoding to review
---
v3:
changing patch accoding to comments
---
 app/test-pmd/testpmd.c | 3 +++
 1 file changed, 3 insertions(+)

diff --git a/app/test-pmd/testpmd.c b/app/test-pmd/testpmd.c
index 5dc8ccac5..da1d9bd3a 100644
--- a/app/test-pmd/testpmd.c
+++ b/app/test-pmd/testpmd.c
@@ -2324,6 +2324,9 @@ init_port_dcb_config(portid_t pid,
/* Enter DCB configuration status */
dcb_config = 1;
 
+   port_conf.rxmode = rte_port->dev_conf.rxmode;
+   port_conf.txmode = rte_port->dev_conf.txmode;
+
/*set configuration of DCB in vt mode and DCB in non-vt mode*/
retval = get_eth_dcb_conf(&port_conf, dcb_mode, num_tcs, pfc_en);
if (retval < 0)
-- 
2.11.0



[dpdk-dev] [PATCH v4] app/testpmd: fix port DCB configuration

2018-02-05 Thread Yanglong Wu
The port_conf for the DCB configuration should
inherit the same configuration of the port.

Fixes: 0074d02fca21("app/testpmd: convert to new Rx offloads API")
Signed-off-by: Yanglong Wu 
---
v2:
changing patch accoding to review
---
v3:
changing patch accoding to comments
---
v4:
changing patch accoding to comments
---
 app/test-pmd/testpmd.c | 3 +++
 1 file changed, 3 insertions(+)

diff --git a/app/test-pmd/testpmd.c b/app/test-pmd/testpmd.c
index 5dc8ccac5..da1d9bd3a 100644
--- a/app/test-pmd/testpmd.c
+++ b/app/test-pmd/testpmd.c
@@ -2324,6 +2324,9 @@ init_port_dcb_config(portid_t pid,
/* Enter DCB configuration status */
dcb_config = 1;
 
+   port_conf.rxmode = rte_port->dev_conf.rxmode;
+   port_conf.txmode = rte_port->dev_conf.txmode;
+
/*set configuration of DCB in vt mode and DCB in non-vt mode*/
retval = get_eth_dcb_conf(&port_conf, dcb_mode, num_tcs, pfc_en);
if (retval < 0)
-- 
2.11.0



[dpdk-dev] [PATCH v4] app/testpmd: fix port DCB configuration

2018-02-05 Thread Yanglong Wu
The port_conf for the DCB configuration should
inherit the same configuration of the port.

Fixes: 0074d02fca21("app/testpmd: convert to new Rx offloads API")
Signed-off-by: Yanglong Wu 

Acked-by: Shahaf Shuler 
---
v2:
changing patch accoding to review
---
v3:
changing patch accoding to comments
---
v4:
changing patch accoding to comments
---
 app/test-pmd/testpmd.c | 3 +++
 1 file changed, 3 insertions(+)

diff --git a/app/test-pmd/testpmd.c b/app/test-pmd/testpmd.c
index 5dc8ccac5..da1d9bd3a 100644
--- a/app/test-pmd/testpmd.c
+++ b/app/test-pmd/testpmd.c
@@ -2324,6 +2324,9 @@ init_port_dcb_config(portid_t pid,
/* Enter DCB configuration status */
dcb_config = 1;
 
+   port_conf.rxmode = rte_port->dev_conf.rxmode;
+   port_conf.txmode = rte_port->dev_conf.txmode;
+
/*set configuration of DCB in vt mode and DCB in non-vt mode*/
retval = get_eth_dcb_conf(&port_conf, dcb_mode, num_tcs, pfc_en);
if (retval < 0)
-- 
2.11.0



[dpdk-dev] [PATCH] Revert "net/i40e/base: enhance loopback AQ command"

2018-02-07 Thread Yanglong Wu
This patch fix loopback fail after share code change

This reverts commit 7b7711bea5f4b5c47010c42a690fb4f4c1b57858.

Signed-off-by: Yanglong Wu 
---
 drivers/net/i40e/base/i40e_adminq_cmd.h | 21 ++---
 drivers/net/i40e/base/i40e_common.c | 12 
 drivers/net/i40e/base/i40e_diag.c   | 17 ++---
 drivers/net/i40e/base/i40e_prototype.h  |  5 ++---
 drivers/net/i40e/i40e_ethdev.c  |  4 +---
 5 files changed, 11 insertions(+), 48 deletions(-)

diff --git a/drivers/net/i40e/base/i40e_adminq_cmd.h 
b/drivers/net/i40e/base/i40e_adminq_cmd.h
index bbf094add..801c0ff1b 100644
--- a/drivers/net/i40e/base/i40e_adminq_cmd.h
+++ b/drivers/net/i40e/base/i40e_adminq_cmd.h
@@ -2130,28 +2130,11 @@ I40E_CHECK_CMD_LENGTH(i40e_aqc_an_advt_reg);
 
 /* Set Loopback mode (0x0618) */
 struct i40e_aqc_set_lb_mode {
-   u8  lb_level;
-#define I40E_AQ_LB_NONE0
-#define I40E_AQ_LB_MAC 1
-#define I40E_AQ_LB_SERDES  2
-#define I40E_AQ_LB_PHY_INT 3
-#define I40E_AQ_LB_PHY_EXT 4
-#define I40E_AQ_LB_CPVL_PCS5
-#define I40E_AQ_LB_CPVL_EXT6
+   __le16  lb_mode;
 #define I40E_AQ_LB_PHY_LOCAL   0x01
 #define I40E_AQ_LB_PHY_REMOTE  0x02
 #define I40E_AQ_LB_MAC_LOCAL   0x04
-   u8  lb_type;
-#define I40E_AQ_LB_LOCAL   0
-#define I40E_AQ_LB_FAR 0x01
-   u8  speed;
-#define I40E_AQ_LB_SPEED_NONE  0
-#define I40E_AQ_LB_SPEED_1G1
-#define I40E_AQ_LB_SPEED_10G   2
-#define I40E_AQ_LB_SPEED_40G   3
-#define I40E_AQ_LB_SPEED_20G   4
-   u8  force_speed;
-   u8  reserved[12];
+   u8  reserved[14];
 };
 
 I40E_CHECK_CMD_LENGTH(i40e_aqc_set_lb_mode);
diff --git a/drivers/net/i40e/base/i40e_common.c 
b/drivers/net/i40e/base/i40e_common.c
index 6c65a3236..e0a5be14c 100644
--- a/drivers/net/i40e/base/i40e_common.c
+++ b/drivers/net/i40e/base/i40e_common.c
@@ -2172,9 +2172,9 @@ enum i40e_status_code i40e_aq_get_partner_advt(struct 
i40e_hw *hw,
  *
  * Sets loopback modes.
  **/
-enum i40e_status_code
-i40e_aq_set_lb_modes(struct i40e_hw *hw, u8 lb_level, u8 lb_type, u8 speed,
-struct i40e_asq_cmd_details *cmd_details)
+enum i40e_status_code i40e_aq_set_lb_modes(struct i40e_hw *hw,
+   u16 lb_modes,
+   struct i40e_asq_cmd_details *cmd_details)
 {
struct i40e_aq_desc desc;
struct i40e_aqc_set_lb_mode *cmd =
@@ -2184,11 +2184,7 @@ i40e_aq_set_lb_modes(struct i40e_hw *hw, u8 lb_level, u8 
lb_type, u8 speed,
i40e_fill_default_direct_cmd_desc(&desc,
  i40e_aqc_opc_set_lb_modes);
 
-   cmd->lb_level = lb_level;
-   cmd->lb_type = lb_type;
-   cmd->speed = speed;
-   if (speed)
-   cmd->force_speed = 1;
+   cmd->lb_mode = CPU_TO_LE16(lb_modes);
 
status = i40e_asq_send_command(hw, &desc, NULL, 0, cmd_details);
 
diff --git a/drivers/net/i40e/base/i40e_diag.c 
b/drivers/net/i40e/base/i40e_diag.c
index 0efa59de3..c3c76a0c8 100644
--- a/drivers/net/i40e/base/i40e_diag.c
+++ b/drivers/net/i40e/base/i40e_diag.c
@@ -45,21 +45,8 @@ enum i40e_status_code i40e_diag_set_loopback(struct i40e_hw 
*hw,
 enum i40e_lb_mode mode)
 {
enum i40e_status_code ret_code = I40E_SUCCESS;
-   u8 speed = I40E_AQ_LB_SPEED_10G;
-   u8 level = 0;
-   u8 type = 0;
-
-   if (mode == I40E_LB_MODE_PHY_LOCAL) {
-   level = I40E_AQ_LB_PHY_INT;
-   type = I40E_AQ_LB_LOCAL;
-   } else if (mode == I40E_LB_MODE_PHY_REMOTE) {
-   level = I40E_AQ_LB_PHY_INT;
-   type = I40E_AQ_LB_FAR;
-   } else if (mode == I40E_LB_MODE_MAC_LOCAL) {
-   level = I40E_AQ_LB_MAC;
-   type = I40E_AQ_LB_LOCAL;
-   }
-   if (i40e_aq_set_lb_modes(hw, level, type, speed, NULL))
+
+   if (i40e_aq_set_lb_modes(hw, mode, NULL))
ret_code = I40E_ERR_DIAG_TEST_FAILED;
 
return ret_code;
diff --git a/drivers/net/i40e/base/i40e_prototype.h 
b/drivers/net/i40e/base/i40e_prototype.h
index 1edfb2d18..c6ec2d769 100644
--- a/drivers/net/i40e/base/i40e_prototype.h
+++ b/drivers/net/i40e/base/i40e_prototype.h
@@ -142,9 +142,8 @@ enum i40e_status_code i40e_aq_get_local_advt_reg(struct 
i40e_hw *hw,
 enum i40e_status_code i40e_aq_get_partner_advt(struct i40e_hw *hw,
u64 *advt_reg,
struct i40e_asq_cmd_details *cmd_details);
-enum i40e_status_code
-i40e_aq_set_lb_modes(struct i40e_hw *hw, u8 lb_level, u8 lb_type, u8 speed,
-struct i40e_asq_cmd_details *cmd_details);
+enum i40e_status_code i40e_aq_set_lb_modes(struct i40e_hw *hw, u16 lb_modes,
+   struct i40e_asq_cmd_details *cmd_details);
 enum i40e_status_code i40e_aq_clear_pxe_mode(struct i40e_hw *hw,
struct i40e_asq_cmd_details *cmd_details);

[dpdk-dev] [PATCH v2] net/i40e: fix i40e loopback configuration error

2018-02-07 Thread Yanglong Wu
This reverts commit:
7b7711bea5f4("net/i40e/base: enhance loopback AQ command").

Commit(7b7711bea5f4) means to support multi type of loopbacks,
but it results to configuration error for adminq. So we revert
this commit in this version.

Fixes: 7b7711bea5f4 ("net/i40e/base: enhance loopback AQ command")

Signed-off-by: Yanglong Wu 
Acked-by: Qi Zhang 
---
v2:
update commit log
---
 drivers/net/i40e/base/i40e_adminq_cmd.h | 21 ++---
 drivers/net/i40e/base/i40e_common.c | 12 
 drivers/net/i40e/base/i40e_diag.c   | 17 ++---
 drivers/net/i40e/base/i40e_prototype.h  |  5 ++---
 drivers/net/i40e/i40e_ethdev.c  |  4 +---
 5 files changed, 11 insertions(+), 48 deletions(-)

diff --git a/drivers/net/i40e/base/i40e_adminq_cmd.h 
b/drivers/net/i40e/base/i40e_adminq_cmd.h
index bbf094add..801c0ff1b 100644
--- a/drivers/net/i40e/base/i40e_adminq_cmd.h
+++ b/drivers/net/i40e/base/i40e_adminq_cmd.h
@@ -2130,28 +2130,11 @@ I40E_CHECK_CMD_LENGTH(i40e_aqc_an_advt_reg);
 
 /* Set Loopback mode (0x0618) */
 struct i40e_aqc_set_lb_mode {
-   u8  lb_level;
-#define I40E_AQ_LB_NONE0
-#define I40E_AQ_LB_MAC 1
-#define I40E_AQ_LB_SERDES  2
-#define I40E_AQ_LB_PHY_INT 3
-#define I40E_AQ_LB_PHY_EXT 4
-#define I40E_AQ_LB_CPVL_PCS5
-#define I40E_AQ_LB_CPVL_EXT6
+   __le16  lb_mode;
 #define I40E_AQ_LB_PHY_LOCAL   0x01
 #define I40E_AQ_LB_PHY_REMOTE  0x02
 #define I40E_AQ_LB_MAC_LOCAL   0x04
-   u8  lb_type;
-#define I40E_AQ_LB_LOCAL   0
-#define I40E_AQ_LB_FAR 0x01
-   u8  speed;
-#define I40E_AQ_LB_SPEED_NONE  0
-#define I40E_AQ_LB_SPEED_1G1
-#define I40E_AQ_LB_SPEED_10G   2
-#define I40E_AQ_LB_SPEED_40G   3
-#define I40E_AQ_LB_SPEED_20G   4
-   u8  force_speed;
-   u8  reserved[12];
+   u8  reserved[14];
 };
 
 I40E_CHECK_CMD_LENGTH(i40e_aqc_set_lb_mode);
diff --git a/drivers/net/i40e/base/i40e_common.c 
b/drivers/net/i40e/base/i40e_common.c
index 6c65a3236..e0a5be14c 100644
--- a/drivers/net/i40e/base/i40e_common.c
+++ b/drivers/net/i40e/base/i40e_common.c
@@ -2172,9 +2172,9 @@ enum i40e_status_code i40e_aq_get_partner_advt(struct 
i40e_hw *hw,
  *
  * Sets loopback modes.
  **/
-enum i40e_status_code
-i40e_aq_set_lb_modes(struct i40e_hw *hw, u8 lb_level, u8 lb_type, u8 speed,
-struct i40e_asq_cmd_details *cmd_details)
+enum i40e_status_code i40e_aq_set_lb_modes(struct i40e_hw *hw,
+   u16 lb_modes,
+   struct i40e_asq_cmd_details *cmd_details)
 {
struct i40e_aq_desc desc;
struct i40e_aqc_set_lb_mode *cmd =
@@ -2184,11 +2184,7 @@ i40e_aq_set_lb_modes(struct i40e_hw *hw, u8 lb_level, u8 
lb_type, u8 speed,
i40e_fill_default_direct_cmd_desc(&desc,
  i40e_aqc_opc_set_lb_modes);
 
-   cmd->lb_level = lb_level;
-   cmd->lb_type = lb_type;
-   cmd->speed = speed;
-   if (speed)
-   cmd->force_speed = 1;
+   cmd->lb_mode = CPU_TO_LE16(lb_modes);
 
status = i40e_asq_send_command(hw, &desc, NULL, 0, cmd_details);
 
diff --git a/drivers/net/i40e/base/i40e_diag.c 
b/drivers/net/i40e/base/i40e_diag.c
index 0efa59de3..c3c76a0c8 100644
--- a/drivers/net/i40e/base/i40e_diag.c
+++ b/drivers/net/i40e/base/i40e_diag.c
@@ -45,21 +45,8 @@ enum i40e_status_code i40e_diag_set_loopback(struct i40e_hw 
*hw,
 enum i40e_lb_mode mode)
 {
enum i40e_status_code ret_code = I40E_SUCCESS;
-   u8 speed = I40E_AQ_LB_SPEED_10G;
-   u8 level = 0;
-   u8 type = 0;
-
-   if (mode == I40E_LB_MODE_PHY_LOCAL) {
-   level = I40E_AQ_LB_PHY_INT;
-   type = I40E_AQ_LB_LOCAL;
-   } else if (mode == I40E_LB_MODE_PHY_REMOTE) {
-   level = I40E_AQ_LB_PHY_INT;
-   type = I40E_AQ_LB_FAR;
-   } else if (mode == I40E_LB_MODE_MAC_LOCAL) {
-   level = I40E_AQ_LB_MAC;
-   type = I40E_AQ_LB_LOCAL;
-   }
-   if (i40e_aq_set_lb_modes(hw, level, type, speed, NULL))
+
+   if (i40e_aq_set_lb_modes(hw, mode, NULL))
ret_code = I40E_ERR_DIAG_TEST_FAILED;
 
return ret_code;
diff --git a/drivers/net/i40e/base/i40e_prototype.h 
b/drivers/net/i40e/base/i40e_prototype.h
index 1edfb2d18..c6ec2d769 100644
--- a/drivers/net/i40e/base/i40e_prototype.h
+++ b/drivers/net/i40e/base/i40e_prototype.h
@@ -142,9 +142,8 @@ enum i40e_status_code i40e_aq_get_local_advt_reg(struct 
i40e_hw *hw,
 enum i40e_status_code i40e_aq_get_partner_advt(struct i40e_hw *hw,
u64 *advt_reg,
struct i40e_asq_cmd_details *cmd_details);
-enum i40e_status_code
-i40e_aq_set_lb_modes(struct i40e_hw *hw, u8 lb_level, u8 lb_type, u8 speed,
-struct i40e_asq_cmd_details *cmd_details);
+enum i40e_status_code i

[dpdk-dev] [PATCH v2] net/i40e: fix i40e loopback configuration error

2018-02-07 Thread Yanglong Wu
This reverts commit:
commit 7b7711bea5f4 ("net/i40e/base: enhance loopback AQ command").

The commit "net/i40e/base: enhance loopback AQ command" means
to support multi type of loopbacks,but it results to configuration
error for the adminq. So we revert this commit in this version.

Fixes:commit 7b7711bea5f4 ("net/i40e/base: enhance loopback AQ command")

Signed-off-by: Yanglong Wu 
Acked-by: Qi Zhang 
---
v2:
update commit log
---
 drivers/net/i40e/base/i40e_adminq_cmd.h | 21 ++---
 drivers/net/i40e/base/i40e_common.c | 12 
 drivers/net/i40e/base/i40e_diag.c   | 17 ++---
 drivers/net/i40e/base/i40e_prototype.h  |  5 ++---
 drivers/net/i40e/i40e_ethdev.c  |  4 +---
 5 files changed, 11 insertions(+), 48 deletions(-)

diff --git a/drivers/net/i40e/base/i40e_adminq_cmd.h 
b/drivers/net/i40e/base/i40e_adminq_cmd.h
index bbf094add..801c0ff1b 100644
--- a/drivers/net/i40e/base/i40e_adminq_cmd.h
+++ b/drivers/net/i40e/base/i40e_adminq_cmd.h
@@ -2130,28 +2130,11 @@ I40E_CHECK_CMD_LENGTH(i40e_aqc_an_advt_reg);
 
 /* Set Loopback mode (0x0618) */
 struct i40e_aqc_set_lb_mode {
-   u8  lb_level;
-#define I40E_AQ_LB_NONE0
-#define I40E_AQ_LB_MAC 1
-#define I40E_AQ_LB_SERDES  2
-#define I40E_AQ_LB_PHY_INT 3
-#define I40E_AQ_LB_PHY_EXT 4
-#define I40E_AQ_LB_CPVL_PCS5
-#define I40E_AQ_LB_CPVL_EXT6
+   __le16  lb_mode;
 #define I40E_AQ_LB_PHY_LOCAL   0x01
 #define I40E_AQ_LB_PHY_REMOTE  0x02
 #define I40E_AQ_LB_MAC_LOCAL   0x04
-   u8  lb_type;
-#define I40E_AQ_LB_LOCAL   0
-#define I40E_AQ_LB_FAR 0x01
-   u8  speed;
-#define I40E_AQ_LB_SPEED_NONE  0
-#define I40E_AQ_LB_SPEED_1G1
-#define I40E_AQ_LB_SPEED_10G   2
-#define I40E_AQ_LB_SPEED_40G   3
-#define I40E_AQ_LB_SPEED_20G   4
-   u8  force_speed;
-   u8  reserved[12];
+   u8  reserved[14];
 };
 
 I40E_CHECK_CMD_LENGTH(i40e_aqc_set_lb_mode);
diff --git a/drivers/net/i40e/base/i40e_common.c 
b/drivers/net/i40e/base/i40e_common.c
index 6c65a3236..e0a5be14c 100644
--- a/drivers/net/i40e/base/i40e_common.c
+++ b/drivers/net/i40e/base/i40e_common.c
@@ -2172,9 +2172,9 @@ enum i40e_status_code i40e_aq_get_partner_advt(struct 
i40e_hw *hw,
  *
  * Sets loopback modes.
  **/
-enum i40e_status_code
-i40e_aq_set_lb_modes(struct i40e_hw *hw, u8 lb_level, u8 lb_type, u8 speed,
-struct i40e_asq_cmd_details *cmd_details)
+enum i40e_status_code i40e_aq_set_lb_modes(struct i40e_hw *hw,
+   u16 lb_modes,
+   struct i40e_asq_cmd_details *cmd_details)
 {
struct i40e_aq_desc desc;
struct i40e_aqc_set_lb_mode *cmd =
@@ -2184,11 +2184,7 @@ i40e_aq_set_lb_modes(struct i40e_hw *hw, u8 lb_level, u8 
lb_type, u8 speed,
i40e_fill_default_direct_cmd_desc(&desc,
  i40e_aqc_opc_set_lb_modes);
 
-   cmd->lb_level = lb_level;
-   cmd->lb_type = lb_type;
-   cmd->speed = speed;
-   if (speed)
-   cmd->force_speed = 1;
+   cmd->lb_mode = CPU_TO_LE16(lb_modes);
 
status = i40e_asq_send_command(hw, &desc, NULL, 0, cmd_details);
 
diff --git a/drivers/net/i40e/base/i40e_diag.c 
b/drivers/net/i40e/base/i40e_diag.c
index 0efa59de3..c3c76a0c8 100644
--- a/drivers/net/i40e/base/i40e_diag.c
+++ b/drivers/net/i40e/base/i40e_diag.c
@@ -45,21 +45,8 @@ enum i40e_status_code i40e_diag_set_loopback(struct i40e_hw 
*hw,
 enum i40e_lb_mode mode)
 {
enum i40e_status_code ret_code = I40E_SUCCESS;
-   u8 speed = I40E_AQ_LB_SPEED_10G;
-   u8 level = 0;
-   u8 type = 0;
-
-   if (mode == I40E_LB_MODE_PHY_LOCAL) {
-   level = I40E_AQ_LB_PHY_INT;
-   type = I40E_AQ_LB_LOCAL;
-   } else if (mode == I40E_LB_MODE_PHY_REMOTE) {
-   level = I40E_AQ_LB_PHY_INT;
-   type = I40E_AQ_LB_FAR;
-   } else if (mode == I40E_LB_MODE_MAC_LOCAL) {
-   level = I40E_AQ_LB_MAC;
-   type = I40E_AQ_LB_LOCAL;
-   }
-   if (i40e_aq_set_lb_modes(hw, level, type, speed, NULL))
+
+   if (i40e_aq_set_lb_modes(hw, mode, NULL))
ret_code = I40E_ERR_DIAG_TEST_FAILED;
 
return ret_code;
diff --git a/drivers/net/i40e/base/i40e_prototype.h 
b/drivers/net/i40e/base/i40e_prototype.h
index 1edfb2d18..c6ec2d769 100644
--- a/drivers/net/i40e/base/i40e_prototype.h
+++ b/drivers/net/i40e/base/i40e_prototype.h
@@ -142,9 +142,8 @@ enum i40e_status_code i40e_aq_get_local_advt_reg(struct 
i40e_hw *hw,
 enum i40e_status_code i40e_aq_get_partner_advt(struct i40e_hw *hw,
u64 *advt_reg,
struct i40e_asq_cmd_details *cmd_details);
-enum i40e_status_code
-i40e_aq_set_lb_modes(struct i40e_hw *hw, u8 lb_level, u8 lb_type, u8 speed,
-   

[dpdk-dev] [DPDK] net/i40e: convert to new Rx offloads API

2018-03-02 Thread Yanglong Wu
Ethdev Tx offloads API has changed since:
commit cba7f53b717d ("ethdev: introduce Tx queue offloads API")
This commit support the new Tx offloads API.

Signed-off-by: Yanglong Wu 
---
 drivers/net/i40e/i40e_ethdev.c| 30 ++
 drivers/net/i40e/i40e_ethdev_vf.c | 22 +++---
 drivers/net/i40e/i40e_flow.c  |  3 ++-
 drivers/net/i40e/i40e_rxtx.c  | 32 
 drivers/net/i40e/i40e_rxtx.h  |  1 +
 5 files changed, 68 insertions(+), 20 deletions(-)

diff --git a/drivers/net/i40e/i40e_ethdev.c b/drivers/net/i40e/i40e_ethdev.c
index 508b4171c..3cfc6a5b6 100644
--- a/drivers/net/i40e/i40e_ethdev.c
+++ b/drivers/net/i40e/i40e_ethdev.c
@@ -3176,6 +3176,7 @@ i40e_dev_info_get(struct rte_eth_dev *dev, struct 
rte_eth_dev_info *dev_info)
dev_info->max_rx_pktlen = I40E_FRAME_SIZE_MAX;
dev_info->max_mac_addrs = vsi->max_macaddrs;
dev_info->max_vfs = pci_dev->max_vfs;
+   dev_info->rx_queue_offload_capa = 0;
dev_info->rx_offload_capa =
DEV_RX_OFFLOAD_VLAN_STRIP |
DEV_RX_OFFLOAD_QINQ_STRIP |
@@ -3183,7 +3184,13 @@ i40e_dev_info_get(struct rte_eth_dev *dev, struct 
rte_eth_dev_info *dev_info)
DEV_RX_OFFLOAD_UDP_CKSUM |
DEV_RX_OFFLOAD_TCP_CKSUM |
DEV_RX_OFFLOAD_OUTER_IPV4_CKSUM |
-   DEV_RX_OFFLOAD_CRC_STRIP;
+   DEV_RX_OFFLOAD_CRC_STRIP |
+   DEV_RX_OFFLOAD_VLAN_EXTEND |
+   DEV_RX_OFFLOAD_VLAN_FILTER;
+
+   if (dev_info->max_rx_pktlen > ETHER_MAX_LEN)
+   dev_info->rx_offload_capa |= DEV_RX_OFFLOAD_JUMBO_FRAME;
+
dev_info->tx_offload_capa =
DEV_TX_OFFLOAD_VLAN_INSERT |
DEV_TX_OFFLOAD_QINQ_INSERT |
@@ -3210,6 +3217,7 @@ i40e_dev_info_get(struct rte_eth_dev *dev, struct 
rte_eth_dev_info *dev_info)
},
.rx_free_thresh = I40E_DEFAULT_RX_FREE_THRESH,
.rx_drop_en = 0,
+   .offloads = 0,
};
 
dev_info->default_txconf = (struct rte_eth_txconf) {
@@ -3329,7 +3337,8 @@ i40e_vlan_tpid_set(struct rte_eth_dev *dev,
 {
struct i40e_hw *hw = I40E_DEV_PRIVATE_TO_HW(dev->data->dev_private);
struct i40e_pf *pf = I40E_DEV_PRIVATE_TO_PF(dev->data->dev_private);
-   int qinq = dev->data->dev_conf.rxmode.hw_vlan_extend;
+   int qinq = dev->data->dev_conf.rxmode.offloads &
+  DEV_RX_OFFLOAD_VLAN_EXTEND;
int ret = 0;
 
if ((vlan_type != ETH_VLAN_TYPE_INNER &&
@@ -3377,9 +3386,11 @@ i40e_vlan_offload_set(struct rte_eth_dev *dev, int mask)
 {
struct i40e_pf *pf = I40E_DEV_PRIVATE_TO_PF(dev->data->dev_private);
struct i40e_vsi *vsi = pf->main_vsi;
+   struct rte_eth_rxmode *rxmode;
 
+   rxmode = &dev->data->dev_conf.rxmode;
if (mask & ETH_VLAN_FILTER_MASK) {
-   if (dev->data->dev_conf.rxmode.hw_vlan_filter)
+   if (rxmode->offloads & DEV_RX_OFFLOAD_VLAN_FILTER)
i40e_vsi_config_vlan_filter(vsi, TRUE);
else
i40e_vsi_config_vlan_filter(vsi, FALSE);
@@ -3387,14 +3398,14 @@ i40e_vlan_offload_set(struct rte_eth_dev *dev, int mask)
 
if (mask & ETH_VLAN_STRIP_MASK) {
/* Enable or disable VLAN stripping */
-   if (dev->data->dev_conf.rxmode.hw_vlan_strip)
+   if (rxmode->offloads & DEV_RX_OFFLOAD_VLAN_STRIP)
i40e_vsi_config_vlan_stripping(vsi, TRUE);
else
i40e_vsi_config_vlan_stripping(vsi, FALSE);
}
 
if (mask & ETH_VLAN_EXTEND_MASK) {
-   if (dev->data->dev_conf.rxmode.hw_vlan_extend) {
+   if (rxmode->offloads & DEV_RX_OFFLOAD_VLAN_EXTEND) {
i40e_vsi_config_double_vlan(vsi, TRUE);
/* Set global registers with default ethertype. */
i40e_vlan_tpid_set(dev, ETH_VLAN_TYPE_OUTER,
@@ -3641,6 +3652,7 @@ i40e_macaddr_add(struct rte_eth_dev *dev,
struct i40e_pf *pf = I40E_DEV_PRIVATE_TO_PF(dev->data->dev_private);
struct i40e_mac_filter_info mac_filter;
struct i40e_vsi *vsi;
+   struct rte_eth_rxmode *rxmode = &dev->data->dev_conf.rxmode;
int ret;
 
/* If VMDQ not enabled or configured, return */
@@ -3659,7 +3671,7 @@ i40e_macaddr_add(struct rte_eth_dev *dev,
}
 
rte_memcpy(&mac_filter.mac_addr, mac_addr, ETHER_ADDR_LEN);
-   if (dev->data->dev_conf.rxmode.hw_vlan_filter)
+   if (rxmode->offloads & DEV_RX_OFFLOAD_VLAN_FILTER)
mac_filter.filter_type = RTE_MACVLAN_PERFECT_MATCH;
else
mac_filter.filter_ty

[dpdk-dev] [DPDK] net/i40e: convert to new Tx offloads API

2018-03-02 Thread Yanglong Wu
Ethdev Tx offloads API has changed since:
commit cba7f53b717d ("ethdev: introduce Tx queue offloads API")
This commit support the new Tx offloads API.

Signed-off-by: Yanglong Wu 
---
 drivers/net/i40e/i40e_ethdev.c|  1 +
 drivers/net/i40e/i40e_ethdev_vf.c |  1 +
 drivers/net/i40e/i40e_rxtx.c  | 22 ++
 drivers/net/i40e/i40e_rxtx.h  |  1 +
 4 files changed, 25 insertions(+)

diff --git a/drivers/net/i40e/i40e_ethdev.c b/drivers/net/i40e/i40e_ethdev.c
index 3cfc6a5b6..3fb99764a 100644
--- a/drivers/net/i40e/i40e_ethdev.c
+++ b/drivers/net/i40e/i40e_ethdev.c
@@ -3191,6 +3191,7 @@ i40e_dev_info_get(struct rte_eth_dev *dev, struct 
rte_eth_dev_info *dev_info)
if (dev_info->max_rx_pktlen > ETHER_MAX_LEN)
dev_info->rx_offload_capa |= DEV_RX_OFFLOAD_JUMBO_FRAME;
 
+   dev_info->tx_queue_offload_capa = 0;
dev_info->tx_offload_capa =
DEV_TX_OFFLOAD_VLAN_INSERT |
DEV_TX_OFFLOAD_QINQ_INSERT |
diff --git a/drivers/net/i40e/i40e_ethdev_vf.c 
b/drivers/net/i40e/i40e_ethdev_vf.c
index d4f9bde1a..a028006df 100644
--- a/drivers/net/i40e/i40e_ethdev_vf.c
+++ b/drivers/net/i40e/i40e_ethdev_vf.c
@@ -2202,6 +2202,7 @@ i40evf_dev_info_get(struct rte_eth_dev *dev, struct 
rte_eth_dev_info *dev_info)
if (dev_info->max_rx_pktlen > ETHER_MAX_LEN)
dev_info->rx_offload_capa |= DEV_RX_OFFLOAD_JUMBO_FRAME;
 
+   dev_info->tx_queue_offload_capa = 0;
dev_info->tx_offload_capa =
DEV_TX_OFFLOAD_VLAN_INSERT |
DEV_TX_OFFLOAD_QINQ_INSERT |
diff --git a/drivers/net/i40e/i40e_rxtx.c b/drivers/net/i40e/i40e_rxtx.c
index 6492368ae..3024691fb 100644
--- a/drivers/net/i40e/i40e_rxtx.c
+++ b/drivers/net/i40e/i40e_rxtx.c
@@ -1996,6 +1996,18 @@ i40e_dev_tx_descriptor_status(void *tx_queue, uint16_t 
offset)
return RTE_ETH_TX_DESC_FULL;
 }
 
+static int
+i40e_check_tx_queue_offloads(struct rte_eth_dev *dev, uint64_t requested)
+{
+   struct rte_eth_dev_info dev_info;
+   uint64_t mandatory = dev->data->dev_conf.txmode.offloads;
+   uint64_t supported; /* All per port offloads */
+
+   dev->dev_ops->dev_infos_get(dev, &dev_info);
+   supported = dev_info.tx_offload_capa ^ dev_info.tx_queue_offload_capa;
+   return !((mandatory ^ requested) & supported);
+}
+
 int
 i40e_dev_tx_queue_setup(struct rte_eth_dev *dev,
uint16_t queue_idx,
@@ -2013,6 +2025,16 @@ i40e_dev_tx_queue_setup(struct rte_eth_dev *dev,
uint16_t tx_rs_thresh, tx_free_thresh;
uint16_t reg_idx, i, base, bsf, tc_mapping;
int q_offset;
+   struct rte_eth_dev_info dev_info;
+
+   if (!i40e_check_tx_queue_offloads(dev, tx_conf->offloads)) {
+   dev->dev_ops->dev_infos_get(dev, &dev_info);
+   PMD_INIT_LOG(ERR, "%p: Tx queue offloads 0x%" PRIx64
+   " don't match port  offloads 0x%" PRIx64
+   " or supported offloads 0x%" PRIx64,
+   (void *)dev, tx_conf->offloads,
+   dev->data->dev_conf.txmode.offloads,
+   dev_info.tx_offload_capa);
 
if (hw->mac.type == I40E_MAC_VF || hw->mac.type == I40E_MAC_X722_VF) {
vf = I40EVF_DEV_PRIVATE_TO_VF(dev->data->dev_private);
diff --git a/drivers/net/i40e/i40e_rxtx.h b/drivers/net/i40e/i40e_rxtx.h
index cb5f8c714..10feec4a2 100644
--- a/drivers/net/i40e/i40e_rxtx.h
+++ b/drivers/net/i40e/i40e_rxtx.h
@@ -149,6 +149,7 @@ struct i40e_tx_queue {
bool q_set; /**< indicate if tx queue has been configured */
bool tx_deferred_start; /**< don't start this queue in dev start */
uint8_t dcb_tc; /**< Traffic class of tx queue */
+   uint64_t offloads; /**< Tx offload flags of DEV_RX_OFFLOAD_* */
 };
 
 /** Offload features */
-- 
2.11.0