[PATCH V1 net 3/3] net: ena: update driver version from 2.0.1 to 2.0.2

2018-11-19 Thread akiyano
From: Arthur Kiyanovski 

Update driver version due to critical bug fixes.

Signed-off-by: Arthur Kiyanovski 
---
 drivers/net/ethernet/amazon/ena/ena_netdev.h | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/drivers/net/ethernet/amazon/ena/ena_netdev.h 
b/drivers/net/ethernet/amazon/ena/ena_netdev.h
index 5218736..dc8b617 100644
--- a/drivers/net/ethernet/amazon/ena/ena_netdev.h
+++ b/drivers/net/ethernet/amazon/ena/ena_netdev.h
@@ -45,7 +45,7 @@
 
 #define DRV_MODULE_VER_MAJOR   2
 #define DRV_MODULE_VER_MINOR   0
-#define DRV_MODULE_VER_SUBMINOR 1
+#define DRV_MODULE_VER_SUBMINOR 2
 
 #define DRV_MODULE_NAME"ena"
 #ifndef DRV_MODULE_VERSION
-- 
2.7.4



[PATCH V1 net 0/3] net: ena: hibernation and rmmod bug fixes

2018-11-19 Thread akiyano
From: Arthur Kiyanovski 

This patchset includes 2 bug fixes:
1. A fix to a crash during resume from hibernation.
2. A fix to an illegal memory access during driver removal (e.g. during rmmod)
   which might cause a crash in certain systems.

The subminor number in the driver version is also promoted to indicate driver
was changed.

Arthur Kiyanovski (3):
  net: ena: fix crash during failed resume from hibernation
  net: ena: fix crash during ena_remove()
  net: ena: update driver version from 2.0.1 to 2.0.2

 drivers/net/ethernet/amazon/ena/ena_netdev.c | 23 +++
 drivers/net/ethernet/amazon/ena/ena_netdev.h |  2 +-
 2 files changed, 12 insertions(+), 13 deletions(-)

-- 
2.7.4



[PATCH V1 net 1/3] net: ena: fix crash during failed resume from hibernation

2018-11-19 Thread akiyano
From: Arthur Kiyanovski 

During resume from hibernation if ena_restore_device fails,
ena_com_dev_reset() is called, and uses the readless read mechanism,
which was already destroyed by the call to
ena_com_mmio_reg_read_request_destroy(). This causes a NULL pointer
reference.

In this commit we switch the call order of the above two functions
to avoid this crash.

Fixes: d7703ddbd7c9 ("net: ena: fix rare bug when failed restart/resume is 
followed by driver removal")
Signed-off-by: Arthur Kiyanovski 
---
 drivers/net/ethernet/amazon/ena/ena_netdev.c | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/drivers/net/ethernet/amazon/ena/ena_netdev.c 
b/drivers/net/ethernet/amazon/ena/ena_netdev.c
index 18956e7..1d3cead 100644
--- a/drivers/net/ethernet/amazon/ena/ena_netdev.c
+++ b/drivers/net/ethernet/amazon/ena/ena_netdev.c
@@ -2694,8 +2694,8 @@ static int ena_restore_device(struct ena_adapter *adapter)
ena_com_abort_admin_commands(ena_dev);
ena_com_wait_for_abort_completion(ena_dev);
ena_com_admin_destroy(ena_dev);
-   ena_com_mmio_reg_read_request_destroy(ena_dev);
ena_com_dev_reset(ena_dev, ENA_REGS_RESET_DRIVER_INVALID_STATE);
+   ena_com_mmio_reg_read_request_destroy(ena_dev);
 err:
clear_bit(ENA_FLAG_DEVICE_RUNNING, >flags);
clear_bit(ENA_FLAG_ONGOING_RESET, >flags);
-- 
2.7.4



[PATCH V1 net 2/3] net: ena: fix crash during ena_remove()

2018-11-19 Thread akiyano
From: Arthur Kiyanovski 

In ena_remove() we have the following stack call:
ena_remove()
  unregister_netdev()
  ena_destroy_device()
netif_carrier_off()

Calling netif_carrier_off() causes linkwatch to try to handle the
link change event on the already unregistered netdev, which leads
to a read from an unreadable memory address.

This patch switches the order of the two functions, so that
netif_carrier_off() is called on a regiestered netdev.

To accomplish this fix we also had to:
1. Remove the set bit ENA_FLAG_TRIGGER_RESET
2. Add a sanitiy check in ena_close()
both to prevent double device reset (when calling unregister_netdev()
ena_close is called, but the device was already deleted in
ena_destroy_device()).
3. Set the admin_queue running state to false to avoid using it after
device was reset (for example when calling ena_destroy_all_io_queues()
right after ena_com_dev_reset() in ena_down)

Fixes: 944b28aa2982 ("net: ena: fix missing lock during device destruction")
Signed-off-by: Arthur Kiyanovski 
---
 drivers/net/ethernet/amazon/ena/ena_netdev.c | 21 ++---
 1 file changed, 10 insertions(+), 11 deletions(-)

diff --git a/drivers/net/ethernet/amazon/ena/ena_netdev.c 
b/drivers/net/ethernet/amazon/ena/ena_netdev.c
index 1d3cead..a70bb1b 100644
--- a/drivers/net/ethernet/amazon/ena/ena_netdev.c
+++ b/drivers/net/ethernet/amazon/ena/ena_netdev.c
@@ -1848,6 +1848,8 @@ static void ena_down(struct ena_adapter *adapter)
rc = ena_com_dev_reset(adapter->ena_dev, adapter->reset_reason);
if (rc)
dev_err(>pdev->dev, "Device reset failed\n");
+   /* stop submitting admin commands on a device that was reset */
+   ena_com_set_admin_running_state(adapter->ena_dev, false);
}
 
ena_destroy_all_io_queues(adapter);
@@ -1914,6 +1916,9 @@ static int ena_close(struct net_device *netdev)
 
netif_dbg(adapter, ifdown, netdev, "%s\n", __func__);
 
+   if (!test_bit(ENA_FLAG_DEVICE_RUNNING, >flags))
+   return 0;
+
if (test_bit(ENA_FLAG_DEV_UP, >flags))
ena_down(adapter);
 
@@ -2613,9 +2618,7 @@ static void ena_destroy_device(struct ena_adapter 
*adapter, bool graceful)
ena_down(adapter);
 
/* Stop the device from sending AENQ events (in case reset flag is set
-*  and device is up, ena_close already reset the device
-* In case the reset flag is set and the device is up, ena_down()
-* already perform the reset, so it can be skipped.
+*  and device is up, ena_down() already reset the device.
 */
if (!(test_bit(ENA_FLAG_TRIGGER_RESET, >flags) && dev_up))
ena_com_dev_reset(adapter->ena_dev, adapter->reset_reason);
@@ -3452,6 +3455,8 @@ static int ena_probe(struct pci_dev *pdev, const struct 
pci_device_id *ent)
ena_com_rss_destroy(ena_dev);
 err_free_msix:
ena_com_dev_reset(ena_dev, ENA_REGS_RESET_INIT_ERR);
+   /* stop submitting admin commands on a device that was reset */
+   ena_com_set_admin_running_state(ena_dev, false);
ena_free_mgmnt_irq(adapter);
ena_disable_msix(adapter);
 err_worker_destroy:
@@ -3498,18 +3503,12 @@ static void ena_remove(struct pci_dev *pdev)
 
cancel_work_sync(>reset_task);
 
-   unregister_netdev(netdev);
-
-   /* If the device is running then we want to make sure the device will be
-* reset to make sure no more events will be issued by the device.
-*/
-   if (test_bit(ENA_FLAG_DEVICE_RUNNING, >flags))
-   set_bit(ENA_FLAG_TRIGGER_RESET, >flags);
-
rtnl_lock();
ena_destroy_device(adapter, true);
rtnl_unlock();
 
+   unregister_netdev(netdev);
+
free_netdev(netdev);
 
ena_com_rss_destroy(ena_dev);
-- 
2.7.4



[PATCH V1 net-next] net: ena: fix compilation error in xtensa architecture

2018-10-21 Thread akiyano
From: Arthur Kiyanovski 

linux/prefetch.h is never explicitly included in ena_com, although
functions from it, such as prefetchw(), are used throughout ena_com.
This is an inclusion bug, and we fix it here by explicitly including
linux/prefetch.h. The bug was exposed when the driver was compiled
for the xtensa architecture.

Fixes: 689b2bdaaa14 ("net: ena: add functions for handling Low Latency Queues 
in ena_com")
Fixes: 8c590f977638 ("ena: Fix Kconfig dependency on X86")
Signed-off-by: Arthur Kiyanovski 
---
 drivers/net/ethernet/amazon/ena/ena_com.h | 1 +
 1 file changed, 1 insertion(+)

diff --git a/drivers/net/ethernet/amazon/ena/ena_com.h 
b/drivers/net/ethernet/amazon/ena/ena_com.h
index ae8b485..078d6f2 100644
--- a/drivers/net/ethernet/amazon/ena/ena_com.h
+++ b/drivers/net/ethernet/amazon/ena/ena_com.h
@@ -38,6 +38,7 @@
 #include 
 #include 
 #include 
+#include 
 #include 
 #include 
 #include 
-- 
2.7.4



[PATCH V1 net-next] net: ena: enable Low Latency Queues

2018-10-17 Thread akiyano
From: Arthur Kiyanovski 

Use the new API to enable usage of LLQ.

Signed-off-by: Arthur Kiyanovski 
---
 drivers/net/ethernet/amazon/ena/ena_netdev.c | 18 --
 1 file changed, 4 insertions(+), 14 deletions(-)

diff --git a/drivers/net/ethernet/amazon/ena/ena_netdev.c 
b/drivers/net/ethernet/amazon/ena/ena_netdev.c
index 284a0a6..18956e7 100644
--- a/drivers/net/ethernet/amazon/ena/ena_netdev.c
+++ b/drivers/net/ethernet/amazon/ena/ena_netdev.c
@@ -3022,20 +3022,10 @@ static int ena_calc_io_queue_num(struct pci_dev *pdev,
int io_sq_num, io_queue_num;
 
/* In case of LLQ use the llq number in the get feature cmd */
-   if (ena_dev->tx_mem_queue_type == ENA_ADMIN_PLACEMENT_POLICY_DEV) {
-   io_sq_num = get_feat_ctx->max_queues.max_legacy_llq_num;
-
-   if (io_sq_num == 0) {
-   dev_err(>dev,
-   "Trying to use LLQ but llq_num is 0. Fall back 
into regular queues\n");
-
-   ena_dev->tx_mem_queue_type =
-   ENA_ADMIN_PLACEMENT_POLICY_HOST;
-   io_sq_num = get_feat_ctx->max_queues.max_sq_num;
-   }
-   } else {
+   if (ena_dev->tx_mem_queue_type == ENA_ADMIN_PLACEMENT_POLICY_DEV)
+   io_sq_num = get_feat_ctx->llq.max_llq_num;
+   else
io_sq_num = get_feat_ctx->max_queues.max_sq_num;
-   }
 
io_queue_num = min_t(int, num_online_cpus(), ENA_MAX_NUM_IO_QUEUES);
io_queue_num = min_t(int, io_queue_num, io_sq_num);
@@ -3238,7 +3228,7 @@ static int ena_calc_queue_size(struct pci_dev *pdev,
 
if (ena_dev->tx_mem_queue_type == ENA_ADMIN_PLACEMENT_POLICY_DEV)
queue_size = min_t(u32, queue_size,
-  
get_feat_ctx->max_queues.max_legacy_llq_depth);
+  get_feat_ctx->llq.max_llq_depth);
 
queue_size = rounddown_pow_of_two(queue_size);
 
-- 
2.7.4



[PATCH V2 net-next 11/12] net: ena: update driver version to 2.0.1

2018-10-11 Thread akiyano
From: Arthur Kiyanovski 

Signed-off-by: Arthur Kiyanovski 
---
 drivers/net/ethernet/amazon/ena/ena_netdev.h | 6 +++---
 1 file changed, 3 insertions(+), 3 deletions(-)

diff --git a/drivers/net/ethernet/amazon/ena/ena_netdev.h 
b/drivers/net/ethernet/amazon/ena/ena_netdev.h
index d241dfc..5218736 100644
--- a/drivers/net/ethernet/amazon/ena/ena_netdev.h
+++ b/drivers/net/ethernet/amazon/ena/ena_netdev.h
@@ -43,9 +43,9 @@
 #include "ena_com.h"
 #include "ena_eth_com.h"
 
-#define DRV_MODULE_VER_MAJOR   1
-#define DRV_MODULE_VER_MINOR   5
-#define DRV_MODULE_VER_SUBMINOR 0
+#define DRV_MODULE_VER_MAJOR   2
+#define DRV_MODULE_VER_MINOR   0
+#define DRV_MODULE_VER_SUBMINOR 1
 
 #define DRV_MODULE_NAME"ena"
 #ifndef DRV_MODULE_VERSION
-- 
2.7.4



[PATCH V2 net-next 10/12] net: ena: remove redundant parameter in ena_com_admin_init()

2018-10-11 Thread akiyano
From: Arthur Kiyanovski 

Remove redundant spinlock acquire parameter from ena_com_admin_init()

Signed-off-by: Arthur Kiyanovski 
---
 drivers/net/ethernet/amazon/ena/ena_com.c| 6 ++
 drivers/net/ethernet/amazon/ena/ena_com.h| 5 +
 drivers/net/ethernet/amazon/ena/ena_netdev.c | 2 +-
 3 files changed, 4 insertions(+), 9 deletions(-)

diff --git a/drivers/net/ethernet/amazon/ena/ena_com.c 
b/drivers/net/ethernet/amazon/ena/ena_com.c
index 5c468b2..420cede 100644
--- a/drivers/net/ethernet/amazon/ena/ena_com.c
+++ b/drivers/net/ethernet/amazon/ena/ena_com.c
@@ -1701,8 +1701,7 @@ void ena_com_mmio_reg_read_request_write_dev_addr(struct 
ena_com_dev *ena_dev)
 }
 
 int ena_com_admin_init(struct ena_com_dev *ena_dev,
-  struct ena_aenq_handlers *aenq_handlers,
-  bool init_spinlock)
+  struct ena_aenq_handlers *aenq_handlers)
 {
struct ena_com_admin_queue *admin_queue = _dev->admin_queue;
u32 aq_caps, acq_caps, dev_sts, addr_low, addr_high;
@@ -1728,8 +1727,7 @@ int ena_com_admin_init(struct ena_com_dev *ena_dev,
 
atomic_set(_queue->outstanding_cmds, 0);
 
-   if (init_spinlock)
-   spin_lock_init(_queue->q_lock);
+   spin_lock_init(_queue->q_lock);
 
ret = ena_com_init_comp_ctxt(admin_queue);
if (ret)
diff --git a/drivers/net/ethernet/amazon/ena/ena_com.h 
b/drivers/net/ethernet/amazon/ena/ena_com.h
index 25af8d0..ae8b485 100644
--- a/drivers/net/ethernet/amazon/ena/ena_com.h
+++ b/drivers/net/ethernet/amazon/ena/ena_com.h
@@ -436,8 +436,6 @@ void ena_com_mmio_reg_read_request_destroy(struct 
ena_com_dev *ena_dev);
 /* ena_com_admin_init - Init the admin and the async queues
  * @ena_dev: ENA communication layer struct
  * @aenq_handlers: Those handlers to be called upon event.
- * @init_spinlock: Indicate if this method should init the admin spinlock or
- * the spinlock was init before (for example, in a case of FLR).
  *
  * Initialize the admin submission and completion queues.
  * Initialize the asynchronous events notification queues.
@@ -445,8 +443,7 @@ void ena_com_mmio_reg_read_request_destroy(struct 
ena_com_dev *ena_dev);
  * @return - 0 on success, negative value on failure.
  */
 int ena_com_admin_init(struct ena_com_dev *ena_dev,
-  struct ena_aenq_handlers *aenq_handlers,
-  bool init_spinlock);
+  struct ena_aenq_handlers *aenq_handlers);
 
 /* ena_com_admin_destroy - Destroy the admin and the async events queues.
  * @ena_dev: ENA communication layer struct
diff --git a/drivers/net/ethernet/amazon/ena/ena_netdev.c 
b/drivers/net/ethernet/amazon/ena/ena_netdev.c
index e71bf82..3494d4a 100644
--- a/drivers/net/ethernet/amazon/ena/ena_netdev.c
+++ b/drivers/net/ethernet/amazon/ena/ena_netdev.c
@@ -2503,7 +2503,7 @@ static int ena_device_init(struct ena_com_dev *ena_dev, 
struct pci_dev *pdev,
}
 
/* ENA admin level init */
-   rc = ena_com_admin_init(ena_dev, _handlers, true);
+   rc = ena_com_admin_init(ena_dev, _handlers);
if (rc) {
dev_err(dev,
"Can not initialize ena admin queue with device\n");
-- 
2.7.4



[PATCH V2 net-next 09/12] net: ena: change rx copybreak default to reduce kernel memory pressure

2018-10-11 Thread akiyano
From: Arthur Kiyanovski 

Improves socket memory utilization when receiving packets larger
than 128 bytes (the previous rx copybreak) and smaller than 256 bytes.

Signed-off-by: Arthur Kiyanovski 
---
 drivers/net/ethernet/amazon/ena/ena_netdev.h | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/drivers/net/ethernet/amazon/ena/ena_netdev.h 
b/drivers/net/ethernet/amazon/ena/ena_netdev.h
index 0cf35ae..d241dfc 100644
--- a/drivers/net/ethernet/amazon/ena/ena_netdev.h
+++ b/drivers/net/ethernet/amazon/ena/ena_netdev.h
@@ -81,7 +81,7 @@
 #define ENA_DEFAULT_RING_SIZE  (1024)
 
 #define ENA_TX_WAKEUP_THRESH   (MAX_SKB_FRAGS + 2)
-#define ENA_DEFAULT_RX_COPYBREAK   (128 - NET_IP_ALIGN)
+#define ENA_DEFAULT_RX_COPYBREAK   (256 - NET_IP_ALIGN)
 
 /* limit the buffer size to 600 bytes to handle MTU changes from very
  * small to very large, in which case the number of buffers per packet
-- 
2.7.4



[PATCH V2 net-next 07/12] net: ena: explicit casting and initialization, and clearer error handling

2018-10-11 Thread akiyano
From: Arthur Kiyanovski 

Signed-off-by: Arthur Kiyanovski 
---
 drivers/net/ethernet/amazon/ena/ena_com.c| 39 
 drivers/net/ethernet/amazon/ena/ena_netdev.c |  5 ++--
 drivers/net/ethernet/amazon/ena/ena_netdev.h | 22 
 3 files changed, 36 insertions(+), 30 deletions(-)

diff --git a/drivers/net/ethernet/amazon/ena/ena_com.c 
b/drivers/net/ethernet/amazon/ena/ena_com.c
index 5220c75..5c468b2 100644
--- a/drivers/net/ethernet/amazon/ena/ena_com.c
+++ b/drivers/net/ethernet/amazon/ena/ena_com.c
@@ -235,7 +235,7 @@ static struct ena_comp_ctx 
*__ena_com_submit_admin_cmd(struct ena_com_admin_queu
tail_masked = admin_queue->sq.tail & queue_size_mask;
 
/* In case of queue FULL */
-   cnt = atomic_read(_queue->outstanding_cmds);
+   cnt = (u16)atomic_read(_queue->outstanding_cmds);
if (cnt >= admin_queue->q_depth) {
pr_debug("admin queue is full.\n");
admin_queue->stats.out_of_space++;
@@ -304,7 +304,7 @@ static struct ena_comp_ctx *ena_com_submit_admin_cmd(struct 
ena_com_admin_queue
 struct ena_admin_acq_entry 
*comp,
 size_t comp_size_in_bytes)
 {
-   unsigned long flags;
+   unsigned long flags = 0;
struct ena_comp_ctx *comp_ctx;
 
spin_lock_irqsave(_queue->q_lock, flags);
@@ -332,7 +332,7 @@ static int ena_com_init_io_sq(struct ena_com_dev *ena_dev,
 
memset(_sq->desc_addr, 0x0, sizeof(io_sq->desc_addr));
 
-   io_sq->dma_addr_bits = ena_dev->dma_addr_bits;
+   io_sq->dma_addr_bits = (u8)ena_dev->dma_addr_bits;
io_sq->desc_entry_size =
(io_sq->direction == ENA_COM_IO_QUEUE_DIRECTION_TX) ?
sizeof(struct ena_eth_io_tx_desc) :
@@ -486,7 +486,7 @@ static void ena_com_handle_admin_completion(struct 
ena_com_admin_queue *admin_qu
 
/* Go over all the completions */
while ((READ_ONCE(cqe->acq_common_descriptor.flags) &
-   ENA_ADMIN_ACQ_COMMON_DESC_PHASE_MASK) == phase) {
+   ENA_ADMIN_ACQ_COMMON_DESC_PHASE_MASK) == phase) {
/* Do not read the rest of the completion entry before the
 * phase bit was validated
 */
@@ -537,7 +537,8 @@ static int ena_com_comp_status_to_errno(u8 comp_status)
 static int ena_com_wait_and_process_admin_cq_polling(struct ena_comp_ctx 
*comp_ctx,
 struct ena_com_admin_queue 
*admin_queue)
 {
-   unsigned long flags, timeout;
+   unsigned long flags = 0;
+   unsigned long timeout;
int ret;
 
timeout = jiffies + usecs_to_jiffies(admin_queue->completion_timeout);
@@ -736,7 +737,7 @@ static int ena_com_config_llq_info(struct ena_com_dev 
*ena_dev,
 static int ena_com_wait_and_process_admin_cq_interrupts(struct ena_comp_ctx 
*comp_ctx,
struct 
ena_com_admin_queue *admin_queue)
 {
-   unsigned long flags;
+   unsigned long flags = 0;
int ret;
 
wait_for_completion_timeout(_ctx->wait_event,
@@ -782,7 +783,7 @@ static u32 ena_com_reg_bar_read32(struct ena_com_dev 
*ena_dev, u16 offset)
volatile struct ena_admin_ena_mmio_req_read_less_resp *read_resp =
mmio_read->read_resp;
u32 mmio_read_reg, ret, i;
-   unsigned long flags;
+   unsigned long flags = 0;
u32 timeout = mmio_read->reg_read_to;
 
might_sleep();
@@ -1426,7 +1427,7 @@ void ena_com_abort_admin_commands(struct ena_com_dev 
*ena_dev)
 void ena_com_wait_for_abort_completion(struct ena_com_dev *ena_dev)
 {
struct ena_com_admin_queue *admin_queue = _dev->admin_queue;
-   unsigned long flags;
+   unsigned long flags = 0;
 
spin_lock_irqsave(_queue->q_lock, flags);
while (atomic_read(_queue->outstanding_cmds) != 0) {
@@ -1470,7 +1471,7 @@ bool ena_com_get_admin_running_state(struct ena_com_dev 
*ena_dev)
 void ena_com_set_admin_running_state(struct ena_com_dev *ena_dev, bool state)
 {
struct ena_com_admin_queue *admin_queue = _dev->admin_queue;
-   unsigned long flags;
+   unsigned long flags = 0;
 
spin_lock_irqsave(_queue->q_lock, flags);
ena_dev->admin_queue.running_state = state;
@@ -1504,7 +1505,7 @@ int ena_com_set_aenq_config(struct ena_com_dev *ena_dev, 
u32 groups_flag)
}
 
if ((get_resp.u.aenq.supported_groups & groups_flag) != groups_flag) {
-   pr_warn("Trying to set unsupported aenq events. supported flag: 
%x asked flag: %x\n",
+   pr_warn("Trying to set unsupported aenq events. supported flag: 
0x%x asked flag: 0x%x\n",
get_resp.u.aenq.supported_groups, groups_flag);
return -EOPNOTSUPP;
}
@@ -1652,7 +1653,7 @@ int ena_com_mmio_reg_read_request_init(struct ena_com_dev 
*ena_dev)
 

[PATCH V2 net-next 12/12] net: ena: fix indentations in ena_defs for better readability

2018-10-11 Thread akiyano
From: Arthur Kiyanovski 

Signed-off-by: Arthur Kiyanovski 
---
 drivers/net/ethernet/amazon/ena/ena_admin_defs.h  | 334 +-
 drivers/net/ethernet/amazon/ena/ena_eth_io_defs.h | 223 +++
 drivers/net/ethernet/amazon/ena/ena_regs_defs.h   | 206 +++--
 3 files changed, 338 insertions(+), 425 deletions(-)

diff --git a/drivers/net/ethernet/amazon/ena/ena_admin_defs.h 
b/drivers/net/ethernet/amazon/ena/ena_admin_defs.h
index b439ec1..9f80b73 100644
--- a/drivers/net/ethernet/amazon/ena/ena_admin_defs.h
+++ b/drivers/net/ethernet/amazon/ena/ena_admin_defs.h
@@ -32,119 +32,81 @@
 #ifndef _ENA_ADMIN_H_
 #define _ENA_ADMIN_H_
 
-enum ena_admin_aq_opcode {
-   ENA_ADMIN_CREATE_SQ = 1,
-
-   ENA_ADMIN_DESTROY_SQ= 2,
-
-   ENA_ADMIN_CREATE_CQ = 3,
-
-   ENA_ADMIN_DESTROY_CQ= 4,
-
-   ENA_ADMIN_GET_FEATURE   = 8,
 
-   ENA_ADMIN_SET_FEATURE   = 9,
-
-   ENA_ADMIN_GET_STATS = 11,
+enum ena_admin_aq_opcode {
+   ENA_ADMIN_CREATE_SQ = 1,
+   ENA_ADMIN_DESTROY_SQ= 2,
+   ENA_ADMIN_CREATE_CQ = 3,
+   ENA_ADMIN_DESTROY_CQ= 4,
+   ENA_ADMIN_GET_FEATURE   = 8,
+   ENA_ADMIN_SET_FEATURE   = 9,
+   ENA_ADMIN_GET_STATS = 11,
 };
 
 enum ena_admin_aq_completion_status {
-   ENA_ADMIN_SUCCESS   = 0,
-
-   ENA_ADMIN_RESOURCE_ALLOCATION_FAILURE   = 1,
-
-   ENA_ADMIN_BAD_OPCODE= 2,
-
-   ENA_ADMIN_UNSUPPORTED_OPCODE= 3,
-
-   ENA_ADMIN_MALFORMED_REQUEST = 4,
-
+   ENA_ADMIN_SUCCESS   = 0,
+   ENA_ADMIN_RESOURCE_ALLOCATION_FAILURE   = 1,
+   ENA_ADMIN_BAD_OPCODE= 2,
+   ENA_ADMIN_UNSUPPORTED_OPCODE= 3,
+   ENA_ADMIN_MALFORMED_REQUEST = 4,
/* Additional status is provided in ACQ entry extended_status */
-   ENA_ADMIN_ILLEGAL_PARAMETER = 5,
-
-   ENA_ADMIN_UNKNOWN_ERROR = 6,
-
-   ENA_ADMIN_RESOURCE_BUSY = 7,
+   ENA_ADMIN_ILLEGAL_PARAMETER = 5,
+   ENA_ADMIN_UNKNOWN_ERROR = 6,
+   ENA_ADMIN_RESOURCE_BUSY = 7,
 };
 
 enum ena_admin_aq_feature_id {
-   ENA_ADMIN_DEVICE_ATTRIBUTES = 1,
-
-   ENA_ADMIN_MAX_QUEUES_NUM= 2,
-
-   ENA_ADMIN_HW_HINTS  = 3,
-
-   ENA_ADMIN_LLQ   = 4,
-
-   ENA_ADMIN_RSS_HASH_FUNCTION = 10,
-
-   ENA_ADMIN_STATELESS_OFFLOAD_CONFIG  = 11,
-
-   ENA_ADMIN_RSS_REDIRECTION_TABLE_CONFIG  = 12,
-
-   ENA_ADMIN_MTU   = 14,
-
-   ENA_ADMIN_RSS_HASH_INPUT= 18,
-
-   ENA_ADMIN_INTERRUPT_MODERATION  = 20,
-
-   ENA_ADMIN_AENQ_CONFIG   = 26,
-
-   ENA_ADMIN_LINK_CONFIG   = 27,
-
-   ENA_ADMIN_HOST_ATTR_CONFIG  = 28,
-
-   ENA_ADMIN_FEATURES_OPCODE_NUM   = 32,
+   ENA_ADMIN_DEVICE_ATTRIBUTES = 1,
+   ENA_ADMIN_MAX_QUEUES_NUM= 2,
+   ENA_ADMIN_HW_HINTS  = 3,
+   ENA_ADMIN_LLQ   = 4,
+   ENA_ADMIN_RSS_HASH_FUNCTION = 10,
+   ENA_ADMIN_STATELESS_OFFLOAD_CONFIG  = 11,
+   ENA_ADMIN_RSS_REDIRECTION_TABLE_CONFIG  = 12,
+   ENA_ADMIN_MTU   = 14,
+   ENA_ADMIN_RSS_HASH_INPUT= 18,
+   ENA_ADMIN_INTERRUPT_MODERATION  = 20,
+   ENA_ADMIN_AENQ_CONFIG   = 26,
+   ENA_ADMIN_LINK_CONFIG   = 27,
+   ENA_ADMIN_HOST_ATTR_CONFIG  = 28,
+   ENA_ADMIN_FEATURES_OPCODE_NUM   = 32,
 };
 
 enum ena_admin_placement_policy_type {
/* descriptors and headers are in host memory */
-   ENA_ADMIN_PLACEMENT_POLICY_HOST = 1,
-
+   ENA_ADMIN_PLACEMENT_POLICY_HOST = 1,
/* descriptors and headers are in device memory (a.k.a Low Latency
 * Queue)
 */
-   ENA_ADMIN_PLACEMENT_POLICY_DEV  = 3,
+   ENA_ADMIN_PLACEMENT_POLICY_DEV  = 3,
 };
 
 enum ena_admin_link_types {
-   ENA_ADMIN_LINK_SPEED_1G = 0x1,
-
-   ENA_ADMIN_LINK_SPEED_2_HALF_G   = 0x2,
-
-   ENA_ADMIN_LINK_SPEED_5G = 0x4,
-
-   ENA_ADMIN_LINK_SPEED_10G= 0x8,
-
-   ENA_ADMIN_LINK_SPEED_25G= 0x10,
-
-   ENA_ADMIN_LINK_SPEED_40G= 0x20,
-
-   ENA_ADMIN_LINK_SPEED_50G= 0x40,
-
-   ENA_ADMIN_LINK_SPEED_100G   = 0x80,
-
-   ENA_ADMIN_LINK_SPEED_200G   = 0x100,
-
-   ENA_ADMIN_LINK_SPEED_400G   = 0x200,
+   

[PATCH V2 net-next 08/12] net: ena: limit refill Rx threshold to 256 to avoid latency issues

2018-10-11 Thread akiyano
From: Arthur Kiyanovski 

Currently Rx refill is done when the number of required descriptors is
above 1/8 queue size. With a default of 1024 entries per queue the
threshold is 128 descriptors.
There is intention to increase the queue size to 8196 entries.
In this case threshold of 1024 descriptors is too large and can hurt
latency.
Add another limitation to Rx threshold to be at most 256 descriptors.

Signed-off-by: Arthur Kiyanovski 
---
 drivers/net/ethernet/amazon/ena/ena_netdev.c | 4 +++-
 drivers/net/ethernet/amazon/ena/ena_netdev.h | 5 +++--
 2 files changed, 6 insertions(+), 3 deletions(-)

diff --git a/drivers/net/ethernet/amazon/ena/ena_netdev.c 
b/drivers/net/ethernet/amazon/ena/ena_netdev.c
index 9927a5b..e71bf82 100644
--- a/drivers/net/ethernet/amazon/ena/ena_netdev.c
+++ b/drivers/net/ethernet/amazon/ena/ena_netdev.c
@@ -1122,7 +1122,9 @@ static int ena_clean_rx_irq(struct ena_ring *rx_ring, 
struct napi_struct *napi,
rx_ring->next_to_clean = next_to_clean;
 
refill_required = ena_com_free_desc(rx_ring->ena_com_io_sq);
-   refill_threshold = rx_ring->ring_size / ENA_RX_REFILL_THRESH_DIVIDER;
+   refill_threshold =
+   min_t(int, rx_ring->ring_size / ENA_RX_REFILL_THRESH_DIVIDER,
+ ENA_RX_REFILL_THRESH_PACKET);
 
/* Optimization, try to batch new rx buffers */
if (refill_required > refill_threshold) {
diff --git a/drivers/net/ethernet/amazon/ena/ena_netdev.h 
b/drivers/net/ethernet/amazon/ena/ena_netdev.h
index a16baf0..0cf35ae 100644
--- a/drivers/net/ethernet/amazon/ena/ena_netdev.h
+++ b/drivers/net/ethernet/amazon/ena/ena_netdev.h
@@ -106,10 +106,11 @@
  */
 #define ENA_TX_POLL_BUDGET_DIVIDER 4
 
-/* Refill Rx queue when number of available descriptors is below
- * QUEUE_SIZE / ENA_RX_REFILL_THRESH_DIVIDER
+/* Refill Rx queue when number of required descriptors is above
+ * QUEUE_SIZE / ENA_RX_REFILL_THRESH_DIVIDER or ENA_RX_REFILL_THRESH_PACKET
  */
 #define ENA_RX_REFILL_THRESH_DIVIDER   8
+#define ENA_RX_REFILL_THRESH_PACKET256
 
 /* Number of queues to check for missing queues per timer service */
 #define ENA_MONITORED_TX_QUEUES4
-- 
2.7.4



[PATCH V2 net-next 03/12] net: ena: introduce Low Latency Queues data structures according to ENA spec

2018-10-11 Thread akiyano
From: Arthur Kiyanovski 

Low Latency Queues(LLQ) allow usage of device's memory for descriptors
and headers. Such queues decrease processing time since data is already
located on the device when driver rings the doorbell.

Signed-off-by: Arthur Kiyanovski 
---
 drivers/net/ethernet/amazon/ena/ena_admin_defs.h | 90 +++-
 drivers/net/ethernet/amazon/ena/ena_com.h| 38 ++
 drivers/net/ethernet/amazon/ena/ena_netdev.c |  6 +-
 3 files changed, 128 insertions(+), 6 deletions(-)

diff --git a/drivers/net/ethernet/amazon/ena/ena_admin_defs.h 
b/drivers/net/ethernet/amazon/ena/ena_admin_defs.h
index d735164..b439ec1 100644
--- a/drivers/net/ethernet/amazon/ena/ena_admin_defs.h
+++ b/drivers/net/ethernet/amazon/ena/ena_admin_defs.h
@@ -74,6 +74,8 @@ enum ena_admin_aq_feature_id {
 
ENA_ADMIN_HW_HINTS  = 3,
 
+   ENA_ADMIN_LLQ   = 4,
+
ENA_ADMIN_RSS_HASH_FUNCTION = 10,
 
ENA_ADMIN_STATELESS_OFFLOAD_CONFIG  = 11,
@@ -485,8 +487,85 @@ struct ena_admin_device_attr_feature_desc {
u32 max_mtu;
 };
 
+enum ena_admin_llq_header_location {
+   /* header is in descriptor list */
+   ENA_ADMIN_INLINE_HEADER = 1,
+   /* header in a separate ring, implies 16B descriptor list entry */
+   ENA_ADMIN_HEADER_RING   = 2,
+};
+
+enum ena_admin_llq_ring_entry_size {
+   ENA_ADMIN_LIST_ENTRY_SIZE_128B  = 1,
+   ENA_ADMIN_LIST_ENTRY_SIZE_192B  = 2,
+   ENA_ADMIN_LIST_ENTRY_SIZE_256B  = 4,
+};
+
+enum ena_admin_llq_num_descs_before_header {
+   ENA_ADMIN_LLQ_NUM_DESCS_BEFORE_HEADER_0 = 0,
+   ENA_ADMIN_LLQ_NUM_DESCS_BEFORE_HEADER_1 = 1,
+   ENA_ADMIN_LLQ_NUM_DESCS_BEFORE_HEADER_2 = 2,
+   ENA_ADMIN_LLQ_NUM_DESCS_BEFORE_HEADER_4 = 4,
+   ENA_ADMIN_LLQ_NUM_DESCS_BEFORE_HEADER_8 = 8,
+};
+
+/* packet descriptor list entry always starts with one or more descriptors,
+ * followed by a header. The rest of the descriptors are located in the
+ * beginning of the subsequent entry. Stride refers to how the rest of the
+ * descriptors are placed. This field is relevant only for inline header
+ * mode
+ */
+enum ena_admin_llq_stride_ctrl {
+   ENA_ADMIN_SINGLE_DESC_PER_ENTRY = 1,
+   ENA_ADMIN_MULTIPLE_DESCS_PER_ENTRY  = 2,
+};
+
+struct ena_admin_feature_llq_desc {
+   u32 max_llq_num;
+
+   u32 max_llq_depth;
+
+   /*  specify the header locations the device supports. bitfield of
+*enum ena_admin_llq_header_location.
+*/
+   u16 header_location_ctrl_supported;
+
+   /* the header location the driver selected to use. */
+   u16 header_location_ctrl_enabled;
+
+   /* if inline header is specified - this is the size of descriptor
+*list entry. If header in a separate ring is specified - this is
+*the size of header ring entry. bitfield of enum
+*ena_admin_llq_ring_entry_size. specify the entry sizes the device
+*supports
+*/
+   u16 entry_size_ctrl_supported;
+
+   /* the entry size the driver selected to use. */
+   u16 entry_size_ctrl_enabled;
+
+   /* valid only if inline header is specified. First entry associated
+*with the packet includes descriptors and header. Rest of the
+*entries occupied by descriptors. This parameter defines the max
+*number of descriptors precedding the header in the first entry.
+*The field is bitfield of enum
+*ena_admin_llq_num_descs_before_header and specify the values the
+*device supports
+*/
+   u16 desc_num_before_header_supported;
+
+   /* the desire field the driver selected to use */
+   u16 desc_num_before_header_enabled;
+
+   /* valid only if inline was chosen. bitfield of enum
+*ena_admin_llq_stride_ctrl
+*/
+   u16 descriptors_stride_ctrl_supported;
+
+   /* the stride control the driver selected to use */
+   u16 descriptors_stride_ctrl_enabled;
+};
+
 struct ena_admin_queue_feature_desc {
-   /* including LLQs */
u32 max_sq_num;
 
u32 max_sq_depth;
@@ -495,9 +574,9 @@ struct ena_admin_queue_feature_desc {
 
u32 max_cq_depth;
 
-   u32 max_llq_num;
+   u32 max_legacy_llq_num;
 
-   u32 max_llq_depth;
+   u32 max_legacy_llq_depth;
 
u32 max_header_size;
 
@@ -822,6 +901,8 @@ struct ena_admin_get_feat_resp {
 
struct ena_admin_device_attr_feature_desc dev_attr;
 
+   struct ena_admin_feature_llq_desc llq;
+
struct ena_admin_queue_feature_desc max_queue;
 
struct ena_admin_feature_aenq_desc aenq;
@@ -869,6 +950,9 @@ struct ena_admin_set_feat_cmd {
 
/* rss indirection table */
struct ena_admin_feature_rss_ind_table 

[PATCH V2 net-next 00/12] Improving performance and reducing latencies, by using latest capabilities exposed in ENA device

2018-10-11 Thread akiyano
From: Arthur Kiyanovski 

This patchset introduces the following:
1. A new placement policy of Tx headers and descriptors, which takes
advantage of an option to place headers + descriptors in device memory
space. This is sometimes referred to as LLQ - low latency queue.
The patch set defines the admin capability, maps the device memory as
write-combined, and adds a mode in transmit datapath to do header +
descriptor placement on the device.
2. Support for RX checksum offloading
3. Miscelaneous small improvements and code cleanups

Note: V1 of this patchset was created as if patches e2a322a 248ab77
from net were applied to net-next before applying the patchset. This V2 
version does not assume this, and should be applyed directly on net-next
without the aformentioned patches.

Arthur Kiyanovski (12):
  net: ena: minor performance improvement
  net: ena: complete host info to match latest ENA spec
  net: ena: introduce Low Latency Queues data structures according to
ENA spec
  net: ena: add functions for handling Low Latency Queues in ena_com
  net: ena: add functions for handling Low Latency Queues in ena_netdev
  net: ena: use CSUM_CHECKED device indication to report skb's checksum
status
  net: ena: explicit casting and initialization, and clearer error
handling
  net: ena: limit refill Rx threshold to 256 to avoid latency issues
  net: ena: change rx copybreak default to reduce kernel memory pressure
  net: ena: remove redundant parameter in ena_com_admin_init()
  net: ena: update driver version to 2.0.1
  net: ena: fix indentations in ena_defs for better readability

 drivers/net/ethernet/amazon/ena/ena_admin_defs.h  | 425 -
 drivers/net/ethernet/amazon/ena/ena_com.c | 302 +--
 drivers/net/ethernet/amazon/ena/ena_com.h |  71 +++-
 drivers/net/ethernet/amazon/ena/ena_common_defs.h |   4 +-
 drivers/net/ethernet/amazon/ena/ena_eth_com.c | 277 +-
 drivers/net/ethernet/amazon/ena/ena_eth_com.h |  72 +++-
 drivers/net/ethernet/amazon/ena/ena_eth_io_defs.h | 229 ++-
 drivers/net/ethernet/amazon/ena/ena_ethtool.c |   2 +
 drivers/net/ethernet/amazon/ena/ena_netdev.c  | 446 ++
 drivers/net/ethernet/amazon/ena/ena_netdev.h  |  42 +-
 drivers/net/ethernet/amazon/ena/ena_regs_defs.h   | 206 +-
 11 files changed, 1334 insertions(+), 742 deletions(-)

-- 
2.7.4



[PATCH V2 net-next 06/12] net: ena: use CSUM_CHECKED device indication to report skb's checksum status

2018-10-11 Thread akiyano
From: Arthur Kiyanovski 

Set skb->ip_summed to the correct value as reported by the device.
Add counter for the case where rx csum offload is enabled but
device didn't check it.

Signed-off-by: Arthur Kiyanovski 
---
 drivers/net/ethernet/amazon/ena/ena_eth_com.c |  3 +++
 drivers/net/ethernet/amazon/ena/ena_eth_com.h |  1 +
 drivers/net/ethernet/amazon/ena/ena_eth_io_defs.h | 10 --
 drivers/net/ethernet/amazon/ena/ena_ethtool.c |  1 +
 drivers/net/ethernet/amazon/ena/ena_netdev.c  | 13 -
 drivers/net/ethernet/amazon/ena/ena_netdev.h  |  1 +
 6 files changed, 26 insertions(+), 3 deletions(-)

diff --git a/drivers/net/ethernet/amazon/ena/ena_eth_com.c 
b/drivers/net/ethernet/amazon/ena/ena_eth_com.c
index 2a53b54..6f8e15b 100644
--- a/drivers/net/ethernet/amazon/ena/ena_eth_com.c
+++ b/drivers/net/ethernet/amazon/ena/ena_eth_com.c
@@ -354,6 +354,9 @@ static inline void ena_com_rx_set_flags(struct 
ena_com_rx_ctx *ena_rx_ctx,
ena_rx_ctx->l4_csum_err =
(cdesc->status & ENA_ETH_IO_RX_CDESC_BASE_L4_CSUM_ERR_MASK) >>
ENA_ETH_IO_RX_CDESC_BASE_L4_CSUM_ERR_SHIFT;
+   ena_rx_ctx->l4_csum_checked =
+   !!((cdesc->status & 
ENA_ETH_IO_RX_CDESC_BASE_L4_CSUM_CHECKED_MASK) >>
+   ENA_ETH_IO_RX_CDESC_BASE_L4_CSUM_CHECKED_SHIFT);
ena_rx_ctx->hash = cdesc->hash;
ena_rx_ctx->frag =
(cdesc->status & ENA_ETH_IO_RX_CDESC_BASE_IPV4_FRAG_MASK) >>
diff --git a/drivers/net/ethernet/amazon/ena/ena_eth_com.h 
b/drivers/net/ethernet/amazon/ena/ena_eth_com.h
index bcc8407..340d02b 100644
--- a/drivers/net/ethernet/amazon/ena/ena_eth_com.h
+++ b/drivers/net/ethernet/amazon/ena/ena_eth_com.h
@@ -67,6 +67,7 @@ struct ena_com_rx_ctx {
enum ena_eth_io_l4_proto_index l4_proto;
bool l3_csum_err;
bool l4_csum_err;
+   u8 l4_csum_checked;
/* fragmented packet */
bool frag;
u32 hash;
diff --git a/drivers/net/ethernet/amazon/ena/ena_eth_io_defs.h 
b/drivers/net/ethernet/amazon/ena/ena_eth_io_defs.h
index f320c58..4c5ccaa 100644
--- a/drivers/net/ethernet/amazon/ena/ena_eth_io_defs.h
+++ b/drivers/net/ethernet/amazon/ena/ena_eth_io_defs.h
@@ -242,9 +242,13 @@ struct ena_eth_io_rx_cdesc_base {
 *checksum error detected, or, the controller didn't
 *validate the checksum. This bit is valid only when
 *l4_proto_idx indicates TCP/UDP packet, and,
-*ipv4_frag is not set
+*ipv4_frag is not set. This bit is valid only when
+*l4_csum_checked below is set.
 * 15 : ipv4_frag - Indicates IPv4 fragmented packet
-* 23:16 : reserved16
+* 16 : l4_csum_checked - L4 checksum was verified
+*(could be OK or error), when cleared the status of
+*checksum is unknown
+* 23:17 : reserved17 - MBZ
 * 24 : phase
 * 25 : l3_csum2 - second checksum engine result
 * 26 : first - Indicates first descriptor in
@@ -390,6 +394,8 @@ struct ena_eth_io_numa_node_cfg_reg {
 #define ENA_ETH_IO_RX_CDESC_BASE_L4_CSUM_ERR_MASK BIT(14)
 #define ENA_ETH_IO_RX_CDESC_BASE_IPV4_FRAG_SHIFT 15
 #define ENA_ETH_IO_RX_CDESC_BASE_IPV4_FRAG_MASK BIT(15)
+#define ENA_ETH_IO_RX_CDESC_BASE_L4_CSUM_CHECKED_SHIFT 16
+#define ENA_ETH_IO_RX_CDESC_BASE_L4_CSUM_CHECKED_MASK BIT(16)
 #define ENA_ETH_IO_RX_CDESC_BASE_PHASE_SHIFT 24
 #define ENA_ETH_IO_RX_CDESC_BASE_PHASE_MASK BIT(24)
 #define ENA_ETH_IO_RX_CDESC_BASE_L3_CSUM2_SHIFT 25
diff --git a/drivers/net/ethernet/amazon/ena/ena_ethtool.c 
b/drivers/net/ethernet/amazon/ena/ena_ethtool.c
index fd28bd0..f3a5a38 100644
--- a/drivers/net/ethernet/amazon/ena/ena_ethtool.c
+++ b/drivers/net/ethernet/amazon/ena/ena_ethtool.c
@@ -97,6 +97,7 @@ static const struct ena_stats ena_stats_rx_strings[] = {
ENA_STAT_RX_ENTRY(rx_copybreak_pkt),
ENA_STAT_RX_ENTRY(bad_req_id),
ENA_STAT_RX_ENTRY(empty_rx_ring),
+   ENA_STAT_RX_ENTRY(csum_unchecked),
 };
 
 static const struct ena_stats ena_stats_ena_com_strings[] = {
diff --git a/drivers/net/ethernet/amazon/ena/ena_netdev.c 
b/drivers/net/ethernet/amazon/ena/ena_netdev.c
index 98314b2..eea0584 100644
--- a/drivers/net/ethernet/amazon/ena/ena_netdev.c
+++ b/drivers/net/ethernet/amazon/ena/ena_netdev.c
@@ -994,8 +994,19 @@ static inline void ena_rx_checksum(struct ena_ring 
*rx_ring,
return;
}
 
-   skb->ip_summed = CHECKSUM_UNNECESSARY;
+   if (likely(ena_rx_ctx->l4_csum_checked)) {
+   skb->ip_summed = CHECKSUM_UNNECESSARY;
+   } else {
+   u64_stats_update_begin(_ring->syncp);
+   rx_ring->rx_stats.csum_unchecked++;
+   u64_stats_update_end(_ring->syncp);
+   skb->ip_summed = CHECKSUM_NONE;
+   }
+   } else {
+   skb->ip_summed = CHECKSUM_NONE;
+  

[PATCH V2 net-next 01/12] net: ena: minor performance improvement

2018-10-11 Thread akiyano
From: Arthur Kiyanovski 

Reduce fastpath overhead by making ena_com_tx_comp_req_id_get() inline.
Also move it to ena_eth_com.h file with its dependency function
ena_com_cq_inc_head().

Signed-off-by: Arthur Kiyanovski 
---
 drivers/net/ethernet/amazon/ena/ena_eth_com.c | 43 -
 drivers/net/ethernet/amazon/ena/ena_eth_com.h | 46 +--
 2 files changed, 44 insertions(+), 45 deletions(-)

diff --git a/drivers/net/ethernet/amazon/ena/ena_eth_com.c 
b/drivers/net/ethernet/amazon/ena/ena_eth_com.c
index 1c682b7..2fa032b 100644
--- a/drivers/net/ethernet/amazon/ena/ena_eth_com.c
+++ b/drivers/net/ethernet/amazon/ena/ena_eth_com.c
@@ -59,15 +59,6 @@ static inline struct ena_eth_io_rx_cdesc_base 
*ena_com_get_next_rx_cdesc(
return cdesc;
 }
 
-static inline void ena_com_cq_inc_head(struct ena_com_io_cq *io_cq)
-{
-   io_cq->head++;
-
-   /* Switch phase bit in case of wrap around */
-   if (unlikely((io_cq->head & (io_cq->q_depth - 1)) == 0))
-   io_cq->phase ^= 1;
-}
-
 static inline void *get_sq_desc(struct ena_com_io_sq *io_sq)
 {
u16 tail_masked;
@@ -477,40 +468,6 @@ int ena_com_add_single_rx_desc(struct ena_com_io_sq *io_sq,
return 0;
 }
 
-int ena_com_tx_comp_req_id_get(struct ena_com_io_cq *io_cq, u16 *req_id)
-{
-   u8 expected_phase, cdesc_phase;
-   struct ena_eth_io_tx_cdesc *cdesc;
-   u16 masked_head;
-
-   masked_head = io_cq->head & (io_cq->q_depth - 1);
-   expected_phase = io_cq->phase;
-
-   cdesc = (struct ena_eth_io_tx_cdesc *)
-   ((uintptr_t)io_cq->cdesc_addr.virt_addr +
-   (masked_head * io_cq->cdesc_entry_size_in_bytes));
-
-   /* When the current completion descriptor phase isn't the same as the
-* expected, it mean that the device still didn't update
-* this completion.
-*/
-   cdesc_phase = READ_ONCE(cdesc->flags) & ENA_ETH_IO_TX_CDESC_PHASE_MASK;
-   if (cdesc_phase != expected_phase)
-   return -EAGAIN;
-
-   dma_rmb();
-   if (unlikely(cdesc->req_id >= io_cq->q_depth)) {
-   pr_err("Invalid req id %d\n", cdesc->req_id);
-   return -EINVAL;
-   }
-
-   ena_com_cq_inc_head(io_cq);
-
-   *req_id = READ_ONCE(cdesc->req_id);
-
-   return 0;
-}
-
 bool ena_com_cq_empty(struct ena_com_io_cq *io_cq)
 {
struct ena_eth_io_rx_cdesc_base *cdesc;
diff --git a/drivers/net/ethernet/amazon/ena/ena_eth_com.h 
b/drivers/net/ethernet/amazon/ena/ena_eth_com.h
index 2f76572..4930324 100644
--- a/drivers/net/ethernet/amazon/ena/ena_eth_com.h
+++ b/drivers/net/ethernet/amazon/ena/ena_eth_com.h
@@ -86,8 +86,6 @@ int ena_com_add_single_rx_desc(struct ena_com_io_sq *io_sq,
   struct ena_com_buf *ena_buf,
   u16 req_id);
 
-int ena_com_tx_comp_req_id_get(struct ena_com_io_cq *io_cq, u16 *req_id);
-
 bool ena_com_cq_empty(struct ena_com_io_cq *io_cq);
 
 static inline void ena_com_unmask_intr(struct ena_com_io_cq *io_cq,
@@ -159,4 +157,48 @@ static inline void ena_com_comp_ack(struct ena_com_io_sq 
*io_sq, u16 elem)
io_sq->next_to_comp += elem;
 }
 
+static inline void ena_com_cq_inc_head(struct ena_com_io_cq *io_cq)
+{
+   io_cq->head++;
+
+   /* Switch phase bit in case of wrap around */
+   if (unlikely((io_cq->head & (io_cq->q_depth - 1)) == 0))
+   io_cq->phase ^= 1;
+}
+
+static inline int ena_com_tx_comp_req_id_get(struct ena_com_io_cq *io_cq,
+u16 *req_id)
+{
+   u8 expected_phase, cdesc_phase;
+   struct ena_eth_io_tx_cdesc *cdesc;
+   u16 masked_head;
+
+   masked_head = io_cq->head & (io_cq->q_depth - 1);
+   expected_phase = io_cq->phase;
+
+   cdesc = (struct ena_eth_io_tx_cdesc *)
+   ((uintptr_t)io_cq->cdesc_addr.virt_addr +
+   (masked_head * io_cq->cdesc_entry_size_in_bytes));
+
+   /* When the current completion descriptor phase isn't the same as the
+* expected, it mean that the device still didn't update
+* this completion.
+*/
+   cdesc_phase = READ_ONCE(cdesc->flags) & ENA_ETH_IO_TX_CDESC_PHASE_MASK;
+   if (cdesc_phase != expected_phase)
+   return -EAGAIN;
+
+   dma_rmb();
+
+   *req_id = READ_ONCE(cdesc->req_id);
+   if (unlikely(*req_id >= io_cq->q_depth)) {
+   pr_err("Invalid req id %d\n", cdesc->req_id);
+   return -EINVAL;
+   }
+
+   ena_com_cq_inc_head(io_cq);
+
+   return 0;
+}
+
 #endif /* ENA_ETH_COM_H_ */
-- 
2.7.4



[PATCH V2 net-next 02/12] net: ena: complete host info to match latest ENA spec

2018-10-11 Thread akiyano
From: Arthur Kiyanovski 

Add new fields and definitions to host info and fill them
according to the latest ENA spec version.

Signed-off-by: Arthur Kiyanovski 
---
 drivers/net/ethernet/amazon/ena/ena_admin_defs.h  | 31 ++-
 drivers/net/ethernet/amazon/ena/ena_com.c | 12 +++--
 drivers/net/ethernet/amazon/ena/ena_common_defs.h |  4 +--
 drivers/net/ethernet/amazon/ena/ena_netdev.c  | 10 +---
 4 files changed, 43 insertions(+), 14 deletions(-)

diff --git a/drivers/net/ethernet/amazon/ena/ena_admin_defs.h 
b/drivers/net/ethernet/amazon/ena/ena_admin_defs.h
index 4532e57..d735164 100644
--- a/drivers/net/ethernet/amazon/ena/ena_admin_defs.h
+++ b/drivers/net/ethernet/amazon/ena/ena_admin_defs.h
@@ -63,6 +63,8 @@ enum ena_admin_aq_completion_status {
ENA_ADMIN_ILLEGAL_PARAMETER = 5,
 
ENA_ADMIN_UNKNOWN_ERROR = 6,
+
+   ENA_ADMIN_RESOURCE_BUSY = 7,
 };
 
 enum ena_admin_aq_feature_id {
@@ -702,6 +704,10 @@ enum ena_admin_os_type {
ENA_ADMIN_OS_FREEBSD= 4,
 
ENA_ADMIN_OS_IPXE   = 5,
+
+   ENA_ADMIN_OS_ESXI   = 6,
+
+   ENA_ADMIN_OS_GROUPS_NUM = 6,
 };
 
 struct ena_admin_host_info {
@@ -723,11 +729,27 @@ struct ena_admin_host_info {
/* 7:0 : major
 * 15:8 : minor
 * 23:16 : sub_minor
+* 31:24 : module_type
 */
u32 driver_version;
 
/* features bitmap */
-   u32 supported_network_features[4];
+   u32 supported_network_features[2];
+
+   /* ENA spec version of driver */
+   u16 ena_spec_version;
+
+   /* ENA device's Bus, Device and Function
+* 2:0 : function
+* 7:3 : device
+* 15:8 : bus
+*/
+   u16 bdf;
+
+   /* Number of CPUs */
+   u16 num_cpus;
+
+   u16 reserved;
 };
 
 struct ena_admin_rss_ind_table_entry {
@@ -1008,6 +1030,13 @@ struct ena_admin_ena_mmio_req_read_less_resp {
 #define ENA_ADMIN_HOST_INFO_MINOR_MASK GENMASK(15, 8)
 #define ENA_ADMIN_HOST_INFO_SUB_MINOR_SHIFT 16
 #define ENA_ADMIN_HOST_INFO_SUB_MINOR_MASK GENMASK(23, 16)
+#define ENA_ADMIN_HOST_INFO_MODULE_TYPE_SHIFT 24
+#define ENA_ADMIN_HOST_INFO_MODULE_TYPE_MASK GENMASK(31, 24)
+#define ENA_ADMIN_HOST_INFO_FUNCTION_MASK GENMASK(2, 0)
+#define ENA_ADMIN_HOST_INFO_DEVICE_SHIFT 3
+#define ENA_ADMIN_HOST_INFO_DEVICE_MASK GENMASK(7, 3)
+#define ENA_ADMIN_HOST_INFO_BUS_SHIFT 8
+#define ENA_ADMIN_HOST_INFO_BUS_MASK GENMASK(15, 8)
 
 /* aenq_common_desc */
 #define ENA_ADMIN_AENQ_COMMON_DESC_PHASE_MASK BIT(0)
diff --git a/drivers/net/ethernet/amazon/ena/ena_com.c 
b/drivers/net/ethernet/amazon/ena/ena_com.c
index 7635c38..b6e6a47 100644
--- a/drivers/net/ethernet/amazon/ena/ena_com.c
+++ b/drivers/net/ethernet/amazon/ena/ena_com.c
@@ -41,9 +41,6 @@
 #define ENA_ASYNC_QUEUE_DEPTH 16
 #define ENA_ADMIN_QUEUE_DEPTH 32
 
-#define MIN_ENA_VER (((ENA_COMMON_SPEC_VERSION_MAJOR) << \
-   ENA_REGS_VERSION_MAJOR_VERSION_SHIFT) \
-   | (ENA_COMMON_SPEC_VERSION_MINOR))
 
 #define ENA_CTRL_MAJOR 0
 #define ENA_CTRL_MINOR 0
@@ -1400,11 +1397,6 @@ int ena_com_validate_version(struct ena_com_dev *ena_dev)
ENA_REGS_VERSION_MAJOR_VERSION_SHIFT,
ver & ENA_REGS_VERSION_MINOR_VERSION_MASK);
 
-   if (ver < MIN_ENA_VER) {
-   pr_err("ENA version is lower than the minimal version the 
driver supports\n");
-   return -1;
-   }
-
pr_info("ena controller version: %d.%d.%d implementation version %d\n",
(ctrl_ver & ENA_REGS_CONTROLLER_VERSION_MAJOR_VERSION_MASK) >>
ENA_REGS_CONTROLLER_VERSION_MAJOR_VERSION_SHIFT,
@@ -2441,6 +2433,10 @@ int ena_com_allocate_host_info(struct ena_com_dev 
*ena_dev)
if (unlikely(!host_attr->host_info))
return -ENOMEM;
 
+   host_attr->host_info->ena_spec_version =
+   ((ENA_COMMON_SPEC_VERSION_MAJOR << 
ENA_REGS_VERSION_MAJOR_VERSION_SHIFT) |
+   (ENA_COMMON_SPEC_VERSION_MINOR));
+
return 0;
 }
 
diff --git a/drivers/net/ethernet/amazon/ena/ena_common_defs.h 
b/drivers/net/ethernet/amazon/ena/ena_common_defs.h
index bb8d736..23beb7e 100644
--- a/drivers/net/ethernet/amazon/ena/ena_common_defs.h
+++ b/drivers/net/ethernet/amazon/ena/ena_common_defs.h
@@ -32,8 +32,8 @@
 #ifndef _ENA_COMMON_H_
 #define _ENA_COMMON_H_
 
-#define ENA_COMMON_SPEC_VERSION_MAJOR  0 /*  */
-#define ENA_COMMON_SPEC_VERSION_MINOR  10 /*  */
+#define ENA_COMMON_SPEC_VERSION_MAJOR2
+#define ENA_COMMON_SPEC_VERSION_MINOR0
 
 /* ENA operates with 48-bit memory addresses. ena_mem_addr_t */
 struct ena_common_mem_addr {
diff --git a/drivers/net/ethernet/amazon/ena/ena_netdev.c 
b/drivers/net/ethernet/amazon/ena/ena_netdev.c
index 13eb6a4..86fd01d 100644
--- a/drivers/net/ethernet/amazon/ena/ena_netdev.c
+++ b/drivers/net/ethernet/amazon/ena/ena_netdev.c
@@ -2201,7 +2201,8 @@ static u16 

[PATCH V2 net-next 05/12] net: ena: add functions for handling Low Latency Queues in ena_netdev

2018-10-11 Thread akiyano
From: Arthur Kiyanovski 

This patch includes all code changes necessary in ena_netdev to enable
packet sending via the LLQ placemnt mode.

Signed-off-by: Arthur Kiyanovski 
---
 drivers/net/ethernet/amazon/ena/ena_ethtool.c |   1 +
 drivers/net/ethernet/amazon/ena/ena_netdev.c  | 387 --
 drivers/net/ethernet/amazon/ena/ena_netdev.h  |   6 +
 3 files changed, 251 insertions(+), 143 deletions(-)

diff --git a/drivers/net/ethernet/amazon/ena/ena_ethtool.c 
b/drivers/net/ethernet/amazon/ena/ena_ethtool.c
index 521607b..fd28bd0 100644
--- a/drivers/net/ethernet/amazon/ena/ena_ethtool.c
+++ b/drivers/net/ethernet/amazon/ena/ena_ethtool.c
@@ -81,6 +81,7 @@ static const struct ena_stats ena_stats_tx_strings[] = {
ENA_STAT_TX_ENTRY(doorbells),
ENA_STAT_TX_ENTRY(prepare_ctx_err),
ENA_STAT_TX_ENTRY(bad_req_id),
+   ENA_STAT_TX_ENTRY(llq_buffer_copy),
ENA_STAT_TX_ENTRY(missed_tx),
 };
 
diff --git a/drivers/net/ethernet/amazon/ena/ena_netdev.c 
b/drivers/net/ethernet/amazon/ena/ena_netdev.c
index 79a4e87..98314b2 100644
--- a/drivers/net/ethernet/amazon/ena/ena_netdev.c
+++ b/drivers/net/ethernet/amazon/ena/ena_netdev.c
@@ -237,6 +237,17 @@ static int ena_setup_tx_resources(struct ena_adapter 
*adapter, int qid)
}
}
 
+   size = tx_ring->tx_max_header_size;
+   tx_ring->push_buf_intermediate_buf = vzalloc_node(size, node);
+   if (!tx_ring->push_buf_intermediate_buf) {
+   tx_ring->push_buf_intermediate_buf = vzalloc(size);
+   if (!tx_ring->push_buf_intermediate_buf) {
+   vfree(tx_ring->tx_buffer_info);
+   vfree(tx_ring->free_tx_ids);
+   return -ENOMEM;
+   }
+   }
+
/* Req id ring for TX out of order completions */
for (i = 0; i < tx_ring->ring_size; i++)
tx_ring->free_tx_ids[i] = i;
@@ -265,6 +276,9 @@ static void ena_free_tx_resources(struct ena_adapter 
*adapter, int qid)
 
vfree(tx_ring->free_tx_ids);
tx_ring->free_tx_ids = NULL;
+
+   vfree(tx_ring->push_buf_intermediate_buf);
+   tx_ring->push_buf_intermediate_buf = NULL;
 }
 
 /* ena_setup_all_tx_resources - allocate I/O Tx queues resources for All queues
@@ -602,6 +616,36 @@ static void ena_free_all_rx_bufs(struct ena_adapter 
*adapter)
ena_free_rx_bufs(adapter, i);
 }
 
+static inline void ena_unmap_tx_skb(struct ena_ring *tx_ring,
+   struct ena_tx_buffer *tx_info)
+{
+   struct ena_com_buf *ena_buf;
+   u32 cnt;
+   int i;
+
+   ena_buf = tx_info->bufs;
+   cnt = tx_info->num_of_bufs;
+
+   if (unlikely(!cnt))
+   return;
+
+   if (tx_info->map_linear_data) {
+   dma_unmap_single(tx_ring->dev,
+dma_unmap_addr(ena_buf, paddr),
+dma_unmap_len(ena_buf, len),
+DMA_TO_DEVICE);
+   ena_buf++;
+   cnt--;
+   }
+
+   /* unmap remaining mapped pages */
+   for (i = 0; i < cnt; i++) {
+   dma_unmap_page(tx_ring->dev, dma_unmap_addr(ena_buf, paddr),
+  dma_unmap_len(ena_buf, len), DMA_TO_DEVICE);
+   ena_buf++;
+   }
+}
+
 /* ena_free_tx_bufs - Free Tx Buffers per Queue
  * @tx_ring: TX ring for which buffers be freed
  */
@@ -612,9 +656,6 @@ static void ena_free_tx_bufs(struct ena_ring *tx_ring)
 
for (i = 0; i < tx_ring->ring_size; i++) {
struct ena_tx_buffer *tx_info = _ring->tx_buffer_info[i];
-   struct ena_com_buf *ena_buf;
-   int nr_frags;
-   int j;
 
if (!tx_info->skb)
continue;
@@ -630,21 +671,7 @@ static void ena_free_tx_bufs(struct ena_ring *tx_ring)
   tx_ring->qid, i);
}
 
-   ena_buf = tx_info->bufs;
-   dma_unmap_single(tx_ring->dev,
-ena_buf->paddr,
-ena_buf->len,
-DMA_TO_DEVICE);
-
-   /* unmap remaining mapped pages */
-   nr_frags = tx_info->num_of_bufs - 1;
-   for (j = 0; j < nr_frags; j++) {
-   ena_buf++;
-   dma_unmap_page(tx_ring->dev,
-  ena_buf->paddr,
-  ena_buf->len,
-  DMA_TO_DEVICE);
-   }
+   ena_unmap_tx_skb(tx_ring, tx_info);
 
dev_kfree_skb_any(tx_info->skb);
}
@@ -735,8 +762,6 @@ static int ena_clean_tx_irq(struct ena_ring *tx_ring, u32 
budget)
while (tx_pkts < budget) {
struct ena_tx_buffer *tx_info;
struct sk_buff *skb;
-   struct ena_com_buf 

[PATCH V2 net-next 04/12] net: ena: add functions for handling Low Latency Queues in ena_com

2018-10-11 Thread akiyano
From: Arthur Kiyanovski 

This patch introduces APIs for detection, initialization, configuration
and actual usage of low latency queues(LLQ). It extends transmit API with
creation of LLQ descriptors in device memory (which include host buffers
descriptors as well as packet header)

Signed-off-by: Arthur Kiyanovski 
---
 drivers/net/ethernet/amazon/ena/ena_com.c | 249 --
 drivers/net/ethernet/amazon/ena/ena_com.h |  28 +++
 drivers/net/ethernet/amazon/ena/ena_eth_com.c | 231 ++--
 drivers/net/ethernet/amazon/ena/ena_eth_com.h |  25 ++-
 drivers/net/ethernet/amazon/ena/ena_netdev.c  |  21 +--
 5 files changed, 474 insertions(+), 80 deletions(-)

diff --git a/drivers/net/ethernet/amazon/ena/ena_com.c 
b/drivers/net/ethernet/amazon/ena/ena_com.c
index b6e6a47..5220c75 100644
--- a/drivers/net/ethernet/amazon/ena/ena_com.c
+++ b/drivers/net/ethernet/amazon/ena/ena_com.c
@@ -58,6 +58,8 @@
 
 #define ENA_MMIO_READ_TIMEOUT 0x
 
+#define ENA_COM_BOUNCE_BUFFER_CNTRL_CNT4
+
 #define ENA_REGS_ADMIN_INTR_MASK 1
 
 #define ENA_POLL_MS5
@@ -352,21 +354,48 @@ static int ena_com_init_io_sq(struct ena_com_dev *ena_dev,
_sq->desc_addr.phys_addr,
GFP_KERNEL);
}
-   } else {
+
+   if (!io_sq->desc_addr.virt_addr) {
+   pr_err("memory allocation failed");
+   return -ENOMEM;
+   }
+   }
+
+   if (io_sq->mem_queue_type == ENA_ADMIN_PLACEMENT_POLICY_DEV) {
+   /* Allocate bounce buffers */
+   io_sq->bounce_buf_ctrl.buffer_size =
+   ena_dev->llq_info.desc_list_entry_size;
+   io_sq->bounce_buf_ctrl.buffers_num =
+   ENA_COM_BOUNCE_BUFFER_CNTRL_CNT;
+   io_sq->bounce_buf_ctrl.next_to_use = 0;
+
+   size = io_sq->bounce_buf_ctrl.buffer_size *
+io_sq->bounce_buf_ctrl.buffers_num;
+
dev_node = dev_to_node(ena_dev->dmadev);
set_dev_node(ena_dev->dmadev, ctx->numa_node);
-   io_sq->desc_addr.virt_addr =
+   io_sq->bounce_buf_ctrl.base_buffer =
devm_kzalloc(ena_dev->dmadev, size, GFP_KERNEL);
set_dev_node(ena_dev->dmadev, dev_node);
-   if (!io_sq->desc_addr.virt_addr) {
-   io_sq->desc_addr.virt_addr =
+   if (!io_sq->bounce_buf_ctrl.base_buffer)
+   io_sq->bounce_buf_ctrl.base_buffer =
devm_kzalloc(ena_dev->dmadev, size, GFP_KERNEL);
+
+   if (!io_sq->bounce_buf_ctrl.base_buffer) {
+   pr_err("bounce buffer memory allocation failed");
+   return -ENOMEM;
}
-   }
 
-   if (!io_sq->desc_addr.virt_addr) {
-   pr_err("memory allocation failed");
-   return -ENOMEM;
+   memcpy(_sq->llq_info, _dev->llq_info,
+  sizeof(io_sq->llq_info));
+
+   /* Initiate the first bounce buffer */
+   io_sq->llq_buf_ctrl.curr_bounce_buf =
+   ena_com_get_next_bounce_buffer(_sq->bounce_buf_ctrl);
+   memset(io_sq->llq_buf_ctrl.curr_bounce_buf,
+  0x0, io_sq->llq_info.desc_list_entry_size);
+   io_sq->llq_buf_ctrl.descs_left_in_line =
+   io_sq->llq_info.descs_num_before_header;
}
 
io_sq->tail = 0;
@@ -554,6 +583,156 @@ static int 
ena_com_wait_and_process_admin_cq_polling(struct ena_comp_ctx *comp_c
return ret;
 }
 
+/**
+ * Set the LLQ configurations of the firmware
+ *
+ * The driver provides only the enabled feature values to the device,
+ * which in turn, checks if they are supported.
+ */
+static int ena_com_set_llq(struct ena_com_dev *ena_dev)
+{
+   struct ena_com_admin_queue *admin_queue;
+   struct ena_admin_set_feat_cmd cmd;
+   struct ena_admin_set_feat_resp resp;
+   struct ena_com_llq_info *llq_info = _dev->llq_info;
+   int ret;
+
+   memset(, 0x0, sizeof(cmd));
+   admin_queue = _dev->admin_queue;
+
+   cmd.aq_common_descriptor.opcode = ENA_ADMIN_SET_FEATURE;
+   cmd.feat_common.feature_id = ENA_ADMIN_LLQ;
+
+   cmd.u.llq.header_location_ctrl_enabled = llq_info->header_location_ctrl;
+   cmd.u.llq.entry_size_ctrl_enabled = llq_info->desc_list_entry_size_ctrl;
+   cmd.u.llq.desc_num_before_header_enabled = 
llq_info->descs_num_before_header;
+   cmd.u.llq.descriptors_stride_ctrl_enabled = llq_info->desc_stride_ctrl;
+
+   ret = ena_com_execute_admin_command(admin_queue,
+   (struct ena_admin_aq_entry *),
+   sizeof(cmd),
+   (struct 

[PATCH V1 net-next 12/12] net: ena: fix indentations in ena_defs for better readability

2018-10-09 Thread akiyano
From: Arthur Kiyanovski 

Signed-off-by: Arthur Kiyanovski 
---
 drivers/net/ethernet/amazon/ena/ena_admin_defs.h  | 334 +-
 drivers/net/ethernet/amazon/ena/ena_eth_io_defs.h | 223 +++
 drivers/net/ethernet/amazon/ena/ena_regs_defs.h   | 206 +++--
 3 files changed, 338 insertions(+), 425 deletions(-)

diff --git a/drivers/net/ethernet/amazon/ena/ena_admin_defs.h 
b/drivers/net/ethernet/amazon/ena/ena_admin_defs.h
index b439ec1..9f80b73 100644
--- a/drivers/net/ethernet/amazon/ena/ena_admin_defs.h
+++ b/drivers/net/ethernet/amazon/ena/ena_admin_defs.h
@@ -32,119 +32,81 @@
 #ifndef _ENA_ADMIN_H_
 #define _ENA_ADMIN_H_
 
-enum ena_admin_aq_opcode {
-   ENA_ADMIN_CREATE_SQ = 1,
-
-   ENA_ADMIN_DESTROY_SQ= 2,
-
-   ENA_ADMIN_CREATE_CQ = 3,
-
-   ENA_ADMIN_DESTROY_CQ= 4,
-
-   ENA_ADMIN_GET_FEATURE   = 8,
 
-   ENA_ADMIN_SET_FEATURE   = 9,
-
-   ENA_ADMIN_GET_STATS = 11,
+enum ena_admin_aq_opcode {
+   ENA_ADMIN_CREATE_SQ = 1,
+   ENA_ADMIN_DESTROY_SQ= 2,
+   ENA_ADMIN_CREATE_CQ = 3,
+   ENA_ADMIN_DESTROY_CQ= 4,
+   ENA_ADMIN_GET_FEATURE   = 8,
+   ENA_ADMIN_SET_FEATURE   = 9,
+   ENA_ADMIN_GET_STATS = 11,
 };
 
 enum ena_admin_aq_completion_status {
-   ENA_ADMIN_SUCCESS   = 0,
-
-   ENA_ADMIN_RESOURCE_ALLOCATION_FAILURE   = 1,
-
-   ENA_ADMIN_BAD_OPCODE= 2,
-
-   ENA_ADMIN_UNSUPPORTED_OPCODE= 3,
-
-   ENA_ADMIN_MALFORMED_REQUEST = 4,
-
+   ENA_ADMIN_SUCCESS   = 0,
+   ENA_ADMIN_RESOURCE_ALLOCATION_FAILURE   = 1,
+   ENA_ADMIN_BAD_OPCODE= 2,
+   ENA_ADMIN_UNSUPPORTED_OPCODE= 3,
+   ENA_ADMIN_MALFORMED_REQUEST = 4,
/* Additional status is provided in ACQ entry extended_status */
-   ENA_ADMIN_ILLEGAL_PARAMETER = 5,
-
-   ENA_ADMIN_UNKNOWN_ERROR = 6,
-
-   ENA_ADMIN_RESOURCE_BUSY = 7,
+   ENA_ADMIN_ILLEGAL_PARAMETER = 5,
+   ENA_ADMIN_UNKNOWN_ERROR = 6,
+   ENA_ADMIN_RESOURCE_BUSY = 7,
 };
 
 enum ena_admin_aq_feature_id {
-   ENA_ADMIN_DEVICE_ATTRIBUTES = 1,
-
-   ENA_ADMIN_MAX_QUEUES_NUM= 2,
-
-   ENA_ADMIN_HW_HINTS  = 3,
-
-   ENA_ADMIN_LLQ   = 4,
-
-   ENA_ADMIN_RSS_HASH_FUNCTION = 10,
-
-   ENA_ADMIN_STATELESS_OFFLOAD_CONFIG  = 11,
-
-   ENA_ADMIN_RSS_REDIRECTION_TABLE_CONFIG  = 12,
-
-   ENA_ADMIN_MTU   = 14,
-
-   ENA_ADMIN_RSS_HASH_INPUT= 18,
-
-   ENA_ADMIN_INTERRUPT_MODERATION  = 20,
-
-   ENA_ADMIN_AENQ_CONFIG   = 26,
-
-   ENA_ADMIN_LINK_CONFIG   = 27,
-
-   ENA_ADMIN_HOST_ATTR_CONFIG  = 28,
-
-   ENA_ADMIN_FEATURES_OPCODE_NUM   = 32,
+   ENA_ADMIN_DEVICE_ATTRIBUTES = 1,
+   ENA_ADMIN_MAX_QUEUES_NUM= 2,
+   ENA_ADMIN_HW_HINTS  = 3,
+   ENA_ADMIN_LLQ   = 4,
+   ENA_ADMIN_RSS_HASH_FUNCTION = 10,
+   ENA_ADMIN_STATELESS_OFFLOAD_CONFIG  = 11,
+   ENA_ADMIN_RSS_REDIRECTION_TABLE_CONFIG  = 12,
+   ENA_ADMIN_MTU   = 14,
+   ENA_ADMIN_RSS_HASH_INPUT= 18,
+   ENA_ADMIN_INTERRUPT_MODERATION  = 20,
+   ENA_ADMIN_AENQ_CONFIG   = 26,
+   ENA_ADMIN_LINK_CONFIG   = 27,
+   ENA_ADMIN_HOST_ATTR_CONFIG  = 28,
+   ENA_ADMIN_FEATURES_OPCODE_NUM   = 32,
 };
 
 enum ena_admin_placement_policy_type {
/* descriptors and headers are in host memory */
-   ENA_ADMIN_PLACEMENT_POLICY_HOST = 1,
-
+   ENA_ADMIN_PLACEMENT_POLICY_HOST = 1,
/* descriptors and headers are in device memory (a.k.a Low Latency
 * Queue)
 */
-   ENA_ADMIN_PLACEMENT_POLICY_DEV  = 3,
+   ENA_ADMIN_PLACEMENT_POLICY_DEV  = 3,
 };
 
 enum ena_admin_link_types {
-   ENA_ADMIN_LINK_SPEED_1G = 0x1,
-
-   ENA_ADMIN_LINK_SPEED_2_HALF_G   = 0x2,
-
-   ENA_ADMIN_LINK_SPEED_5G = 0x4,
-
-   ENA_ADMIN_LINK_SPEED_10G= 0x8,
-
-   ENA_ADMIN_LINK_SPEED_25G= 0x10,
-
-   ENA_ADMIN_LINK_SPEED_40G= 0x20,
-
-   ENA_ADMIN_LINK_SPEED_50G= 0x40,
-
-   ENA_ADMIN_LINK_SPEED_100G   = 0x80,
-
-   ENA_ADMIN_LINK_SPEED_200G   = 0x100,
-
-   ENA_ADMIN_LINK_SPEED_400G   = 0x200,
+   

[PATCH V1 net-next 11/12] net: ena: update driver version to 2.0.1

2018-10-09 Thread akiyano
From: Arthur Kiyanovski 

Signed-off-by: Arthur Kiyanovski 
---
 drivers/net/ethernet/amazon/ena/ena_netdev.h | 6 +++---
 1 file changed, 3 insertions(+), 3 deletions(-)

diff --git a/drivers/net/ethernet/amazon/ena/ena_netdev.h 
b/drivers/net/ethernet/amazon/ena/ena_netdev.h
index d241dfc..5218736 100644
--- a/drivers/net/ethernet/amazon/ena/ena_netdev.h
+++ b/drivers/net/ethernet/amazon/ena/ena_netdev.h
@@ -43,9 +43,9 @@
 #include "ena_com.h"
 #include "ena_eth_com.h"
 
-#define DRV_MODULE_VER_MAJOR   1
-#define DRV_MODULE_VER_MINOR   5
-#define DRV_MODULE_VER_SUBMINOR 0
+#define DRV_MODULE_VER_MAJOR   2
+#define DRV_MODULE_VER_MINOR   0
+#define DRV_MODULE_VER_SUBMINOR 1
 
 #define DRV_MODULE_NAME"ena"
 #ifndef DRV_MODULE_VERSION
-- 
2.7.4



[PATCH V1 net-next 08/12] net: ena: limit refill Rx threshold to 256 to avoid latency issues

2018-10-09 Thread akiyano
From: Arthur Kiyanovski 

Currently Rx refill is done when the number of required descriptors is
above 1/8 queue size. With a default of 1024 entries per queue the
threshold is 128 descriptors.
There is intention to increase the queue size to 8196 entries.
In this case threshold of 1024 descriptors is too large and can hurt
latency.
Add another limitation to Rx threshold to be at most 256 descriptors.

Signed-off-by: Arthur Kiyanovski 
---
 drivers/net/ethernet/amazon/ena/ena_netdev.c | 4 +++-
 drivers/net/ethernet/amazon/ena/ena_netdev.h | 5 +++--
 2 files changed, 6 insertions(+), 3 deletions(-)

diff --git a/drivers/net/ethernet/amazon/ena/ena_netdev.c 
b/drivers/net/ethernet/amazon/ena/ena_netdev.c
index e345220..c4c33b1 100644
--- a/drivers/net/ethernet/amazon/ena/ena_netdev.c
+++ b/drivers/net/ethernet/amazon/ena/ena_netdev.c
@@ -1122,7 +1122,9 @@ static int ena_clean_rx_irq(struct ena_ring *rx_ring, 
struct napi_struct *napi,
rx_ring->next_to_clean = next_to_clean;
 
refill_required = ena_com_free_desc(rx_ring->ena_com_io_sq);
-   refill_threshold = rx_ring->ring_size / ENA_RX_REFILL_THRESH_DIVIDER;
+   refill_threshold =
+   min_t(int, rx_ring->ring_size / ENA_RX_REFILL_THRESH_DIVIDER,
+ ENA_RX_REFILL_THRESH_PACKET);
 
/* Optimization, try to batch new rx buffers */
if (refill_required > refill_threshold) {
diff --git a/drivers/net/ethernet/amazon/ena/ena_netdev.h 
b/drivers/net/ethernet/amazon/ena/ena_netdev.h
index a16baf0..0cf35ae 100644
--- a/drivers/net/ethernet/amazon/ena/ena_netdev.h
+++ b/drivers/net/ethernet/amazon/ena/ena_netdev.h
@@ -106,10 +106,11 @@
  */
 #define ENA_TX_POLL_BUDGET_DIVIDER 4
 
-/* Refill Rx queue when number of available descriptors is below
- * QUEUE_SIZE / ENA_RX_REFILL_THRESH_DIVIDER
+/* Refill Rx queue when number of required descriptors is above
+ * QUEUE_SIZE / ENA_RX_REFILL_THRESH_DIVIDER or ENA_RX_REFILL_THRESH_PACKET
  */
 #define ENA_RX_REFILL_THRESH_DIVIDER   8
+#define ENA_RX_REFILL_THRESH_PACKET256
 
 /* Number of queues to check for missing queues per timer service */
 #define ENA_MONITORED_TX_QUEUES4
-- 
2.7.4



[PATCH V1 net-next 10/12] net: ena: remove redundant parameter in ena_com_admin_init()

2018-10-09 Thread akiyano
From: Arthur Kiyanovski 

Remove redundant spinlock acquire parameter from ena_com_admin_init()

Signed-off-by: Arthur Kiyanovski 
---
 drivers/net/ethernet/amazon/ena/ena_com.c| 6 ++
 drivers/net/ethernet/amazon/ena/ena_com.h| 5 +
 drivers/net/ethernet/amazon/ena/ena_netdev.c | 2 +-
 3 files changed, 4 insertions(+), 9 deletions(-)

diff --git a/drivers/net/ethernet/amazon/ena/ena_com.c 
b/drivers/net/ethernet/amazon/ena/ena_com.c
index 5c468b2..420cede 100644
--- a/drivers/net/ethernet/amazon/ena/ena_com.c
+++ b/drivers/net/ethernet/amazon/ena/ena_com.c
@@ -1701,8 +1701,7 @@ void ena_com_mmio_reg_read_request_write_dev_addr(struct 
ena_com_dev *ena_dev)
 }
 
 int ena_com_admin_init(struct ena_com_dev *ena_dev,
-  struct ena_aenq_handlers *aenq_handlers,
-  bool init_spinlock)
+  struct ena_aenq_handlers *aenq_handlers)
 {
struct ena_com_admin_queue *admin_queue = _dev->admin_queue;
u32 aq_caps, acq_caps, dev_sts, addr_low, addr_high;
@@ -1728,8 +1727,7 @@ int ena_com_admin_init(struct ena_com_dev *ena_dev,
 
atomic_set(_queue->outstanding_cmds, 0);
 
-   if (init_spinlock)
-   spin_lock_init(_queue->q_lock);
+   spin_lock_init(_queue->q_lock);
 
ret = ena_com_init_comp_ctxt(admin_queue);
if (ret)
diff --git a/drivers/net/ethernet/amazon/ena/ena_com.h 
b/drivers/net/ethernet/amazon/ena/ena_com.h
index 25af8d0..ae8b485 100644
--- a/drivers/net/ethernet/amazon/ena/ena_com.h
+++ b/drivers/net/ethernet/amazon/ena/ena_com.h
@@ -436,8 +436,6 @@ void ena_com_mmio_reg_read_request_destroy(struct 
ena_com_dev *ena_dev);
 /* ena_com_admin_init - Init the admin and the async queues
  * @ena_dev: ENA communication layer struct
  * @aenq_handlers: Those handlers to be called upon event.
- * @init_spinlock: Indicate if this method should init the admin spinlock or
- * the spinlock was init before (for example, in a case of FLR).
  *
  * Initialize the admin submission and completion queues.
  * Initialize the asynchronous events notification queues.
@@ -445,8 +443,7 @@ void ena_com_mmio_reg_read_request_destroy(struct 
ena_com_dev *ena_dev);
  * @return - 0 on success, negative value on failure.
  */
 int ena_com_admin_init(struct ena_com_dev *ena_dev,
-  struct ena_aenq_handlers *aenq_handlers,
-  bool init_spinlock);
+  struct ena_aenq_handlers *aenq_handlers);
 
 /* ena_com_admin_destroy - Destroy the admin and the async events queues.
  * @ena_dev: ENA communication layer struct
diff --git a/drivers/net/ethernet/amazon/ena/ena_netdev.c 
b/drivers/net/ethernet/amazon/ena/ena_netdev.c
index c4c33b1..284a0a6 100644
--- a/drivers/net/ethernet/amazon/ena/ena_netdev.c
+++ b/drivers/net/ethernet/amazon/ena/ena_netdev.c
@@ -2508,7 +2508,7 @@ static int ena_device_init(struct ena_com_dev *ena_dev, 
struct pci_dev *pdev,
}
 
/* ENA admin level init */
-   rc = ena_com_admin_init(ena_dev, _handlers, true);
+   rc = ena_com_admin_init(ena_dev, _handlers);
if (rc) {
dev_err(dev,
"Can not initialize ena admin queue with device\n");
-- 
2.7.4



[PATCH V1 net-next 09/12] net: ena: change rx copybreak default to reduce kernel memory pressure

2018-10-09 Thread akiyano
From: Arthur Kiyanovski 

Improves socket memory utilization when receiving packets larger
than 128 bytes (the previous rx copybreak) and smaller than 256 bytes.

Signed-off-by: Arthur Kiyanovski 
---
 drivers/net/ethernet/amazon/ena/ena_netdev.h | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/drivers/net/ethernet/amazon/ena/ena_netdev.h 
b/drivers/net/ethernet/amazon/ena/ena_netdev.h
index 0cf35ae..d241dfc 100644
--- a/drivers/net/ethernet/amazon/ena/ena_netdev.h
+++ b/drivers/net/ethernet/amazon/ena/ena_netdev.h
@@ -81,7 +81,7 @@
 #define ENA_DEFAULT_RING_SIZE  (1024)
 
 #define ENA_TX_WAKEUP_THRESH   (MAX_SKB_FRAGS + 2)
-#define ENA_DEFAULT_RX_COPYBREAK   (128 - NET_IP_ALIGN)
+#define ENA_DEFAULT_RX_COPYBREAK   (256 - NET_IP_ALIGN)
 
 /* limit the buffer size to 600 bytes to handle MTU changes from very
  * small to very large, in which case the number of buffers per packet
-- 
2.7.4



[PATCH V1 net-next 04/12] net: ena: add functions for handling Low Latency Queues in ena_com

2018-10-09 Thread akiyano
From: Arthur Kiyanovski 

This patch introduces APIs for detection, initialization, configuration
and actual usage of low latency queues(LLQ). It extends transmit API with
creation of LLQ descriptors in device memory (which include host buffers
descriptors as well as packet header)

Signed-off-by: Arthur Kiyanovski 
---
 drivers/net/ethernet/amazon/ena/ena_com.c | 249 --
 drivers/net/ethernet/amazon/ena/ena_com.h |  28 +++
 drivers/net/ethernet/amazon/ena/ena_eth_com.c | 231 ++--
 drivers/net/ethernet/amazon/ena/ena_eth_com.h |  25 ++-
 drivers/net/ethernet/amazon/ena/ena_netdev.c  |  21 +--
 5 files changed, 474 insertions(+), 80 deletions(-)

diff --git a/drivers/net/ethernet/amazon/ena/ena_com.c 
b/drivers/net/ethernet/amazon/ena/ena_com.c
index b6e6a47..5220c75 100644
--- a/drivers/net/ethernet/amazon/ena/ena_com.c
+++ b/drivers/net/ethernet/amazon/ena/ena_com.c
@@ -58,6 +58,8 @@
 
 #define ENA_MMIO_READ_TIMEOUT 0x
 
+#define ENA_COM_BOUNCE_BUFFER_CNTRL_CNT4
+
 #define ENA_REGS_ADMIN_INTR_MASK 1
 
 #define ENA_POLL_MS5
@@ -352,21 +354,48 @@ static int ena_com_init_io_sq(struct ena_com_dev *ena_dev,
_sq->desc_addr.phys_addr,
GFP_KERNEL);
}
-   } else {
+
+   if (!io_sq->desc_addr.virt_addr) {
+   pr_err("memory allocation failed");
+   return -ENOMEM;
+   }
+   }
+
+   if (io_sq->mem_queue_type == ENA_ADMIN_PLACEMENT_POLICY_DEV) {
+   /* Allocate bounce buffers */
+   io_sq->bounce_buf_ctrl.buffer_size =
+   ena_dev->llq_info.desc_list_entry_size;
+   io_sq->bounce_buf_ctrl.buffers_num =
+   ENA_COM_BOUNCE_BUFFER_CNTRL_CNT;
+   io_sq->bounce_buf_ctrl.next_to_use = 0;
+
+   size = io_sq->bounce_buf_ctrl.buffer_size *
+io_sq->bounce_buf_ctrl.buffers_num;
+
dev_node = dev_to_node(ena_dev->dmadev);
set_dev_node(ena_dev->dmadev, ctx->numa_node);
-   io_sq->desc_addr.virt_addr =
+   io_sq->bounce_buf_ctrl.base_buffer =
devm_kzalloc(ena_dev->dmadev, size, GFP_KERNEL);
set_dev_node(ena_dev->dmadev, dev_node);
-   if (!io_sq->desc_addr.virt_addr) {
-   io_sq->desc_addr.virt_addr =
+   if (!io_sq->bounce_buf_ctrl.base_buffer)
+   io_sq->bounce_buf_ctrl.base_buffer =
devm_kzalloc(ena_dev->dmadev, size, GFP_KERNEL);
+
+   if (!io_sq->bounce_buf_ctrl.base_buffer) {
+   pr_err("bounce buffer memory allocation failed");
+   return -ENOMEM;
}
-   }
 
-   if (!io_sq->desc_addr.virt_addr) {
-   pr_err("memory allocation failed");
-   return -ENOMEM;
+   memcpy(_sq->llq_info, _dev->llq_info,
+  sizeof(io_sq->llq_info));
+
+   /* Initiate the first bounce buffer */
+   io_sq->llq_buf_ctrl.curr_bounce_buf =
+   ena_com_get_next_bounce_buffer(_sq->bounce_buf_ctrl);
+   memset(io_sq->llq_buf_ctrl.curr_bounce_buf,
+  0x0, io_sq->llq_info.desc_list_entry_size);
+   io_sq->llq_buf_ctrl.descs_left_in_line =
+   io_sq->llq_info.descs_num_before_header;
}
 
io_sq->tail = 0;
@@ -554,6 +583,156 @@ static int 
ena_com_wait_and_process_admin_cq_polling(struct ena_comp_ctx *comp_c
return ret;
 }
 
+/**
+ * Set the LLQ configurations of the firmware
+ *
+ * The driver provides only the enabled feature values to the device,
+ * which in turn, checks if they are supported.
+ */
+static int ena_com_set_llq(struct ena_com_dev *ena_dev)
+{
+   struct ena_com_admin_queue *admin_queue;
+   struct ena_admin_set_feat_cmd cmd;
+   struct ena_admin_set_feat_resp resp;
+   struct ena_com_llq_info *llq_info = _dev->llq_info;
+   int ret;
+
+   memset(, 0x0, sizeof(cmd));
+   admin_queue = _dev->admin_queue;
+
+   cmd.aq_common_descriptor.opcode = ENA_ADMIN_SET_FEATURE;
+   cmd.feat_common.feature_id = ENA_ADMIN_LLQ;
+
+   cmd.u.llq.header_location_ctrl_enabled = llq_info->header_location_ctrl;
+   cmd.u.llq.entry_size_ctrl_enabled = llq_info->desc_list_entry_size_ctrl;
+   cmd.u.llq.desc_num_before_header_enabled = 
llq_info->descs_num_before_header;
+   cmd.u.llq.descriptors_stride_ctrl_enabled = llq_info->desc_stride_ctrl;
+
+   ret = ena_com_execute_admin_command(admin_queue,
+   (struct ena_admin_aq_entry *),
+   sizeof(cmd),
+   (struct 

[PATCH V1 net-next 05/12] net: ena: add functions for handling Low Latency Queues in ena_netdev

2018-10-09 Thread akiyano
From: Arthur Kiyanovski 

This patch includes all code changes necessary in ena_netdev to enable
packet sending via the LLQ placemnt mode.

Signed-off-by: Arthur Kiyanovski 
---
 drivers/net/ethernet/amazon/ena/ena_ethtool.c |   1 +
 drivers/net/ethernet/amazon/ena/ena_netdev.c  | 387 --
 drivers/net/ethernet/amazon/ena/ena_netdev.h  |   6 +
 3 files changed, 251 insertions(+), 143 deletions(-)

diff --git a/drivers/net/ethernet/amazon/ena/ena_ethtool.c 
b/drivers/net/ethernet/amazon/ena/ena_ethtool.c
index 521607b..fd28bd0 100644
--- a/drivers/net/ethernet/amazon/ena/ena_ethtool.c
+++ b/drivers/net/ethernet/amazon/ena/ena_ethtool.c
@@ -81,6 +81,7 @@ static const struct ena_stats ena_stats_tx_strings[] = {
ENA_STAT_TX_ENTRY(doorbells),
ENA_STAT_TX_ENTRY(prepare_ctx_err),
ENA_STAT_TX_ENTRY(bad_req_id),
+   ENA_STAT_TX_ENTRY(llq_buffer_copy),
ENA_STAT_TX_ENTRY(missed_tx),
 };
 
diff --git a/drivers/net/ethernet/amazon/ena/ena_netdev.c 
b/drivers/net/ethernet/amazon/ena/ena_netdev.c
index e732bd2..fcdfaf0 100644
--- a/drivers/net/ethernet/amazon/ena/ena_netdev.c
+++ b/drivers/net/ethernet/amazon/ena/ena_netdev.c
@@ -237,6 +237,17 @@ static int ena_setup_tx_resources(struct ena_adapter 
*adapter, int qid)
}
}
 
+   size = tx_ring->tx_max_header_size;
+   tx_ring->push_buf_intermediate_buf = vzalloc_node(size, node);
+   if (!tx_ring->push_buf_intermediate_buf) {
+   tx_ring->push_buf_intermediate_buf = vzalloc(size);
+   if (!tx_ring->push_buf_intermediate_buf) {
+   vfree(tx_ring->tx_buffer_info);
+   vfree(tx_ring->free_tx_ids);
+   return -ENOMEM;
+   }
+   }
+
/* Req id ring for TX out of order completions */
for (i = 0; i < tx_ring->ring_size; i++)
tx_ring->free_tx_ids[i] = i;
@@ -265,6 +276,9 @@ static void ena_free_tx_resources(struct ena_adapter 
*adapter, int qid)
 
vfree(tx_ring->free_tx_ids);
tx_ring->free_tx_ids = NULL;
+
+   vfree(tx_ring->push_buf_intermediate_buf);
+   tx_ring->push_buf_intermediate_buf = NULL;
 }
 
 /* ena_setup_all_tx_resources - allocate I/O Tx queues resources for All queues
@@ -602,6 +616,36 @@ static void ena_free_all_rx_bufs(struct ena_adapter 
*adapter)
ena_free_rx_bufs(adapter, i);
 }
 
+static inline void ena_unmap_tx_skb(struct ena_ring *tx_ring,
+   struct ena_tx_buffer *tx_info)
+{
+   struct ena_com_buf *ena_buf;
+   u32 cnt;
+   int i;
+
+   ena_buf = tx_info->bufs;
+   cnt = tx_info->num_of_bufs;
+
+   if (unlikely(!cnt))
+   return;
+
+   if (tx_info->map_linear_data) {
+   dma_unmap_single(tx_ring->dev,
+dma_unmap_addr(ena_buf, paddr),
+dma_unmap_len(ena_buf, len),
+DMA_TO_DEVICE);
+   ena_buf++;
+   cnt--;
+   }
+
+   /* unmap remaining mapped pages */
+   for (i = 0; i < cnt; i++) {
+   dma_unmap_page(tx_ring->dev, dma_unmap_addr(ena_buf, paddr),
+  dma_unmap_len(ena_buf, len), DMA_TO_DEVICE);
+   ena_buf++;
+   }
+}
+
 /* ena_free_tx_bufs - Free Tx Buffers per Queue
  * @tx_ring: TX ring for which buffers be freed
  */
@@ -612,9 +656,6 @@ static void ena_free_tx_bufs(struct ena_ring *tx_ring)
 
for (i = 0; i < tx_ring->ring_size; i++) {
struct ena_tx_buffer *tx_info = _ring->tx_buffer_info[i];
-   struct ena_com_buf *ena_buf;
-   int nr_frags;
-   int j;
 
if (!tx_info->skb)
continue;
@@ -630,21 +671,7 @@ static void ena_free_tx_bufs(struct ena_ring *tx_ring)
   tx_ring->qid, i);
}
 
-   ena_buf = tx_info->bufs;
-   dma_unmap_single(tx_ring->dev,
-ena_buf->paddr,
-ena_buf->len,
-DMA_TO_DEVICE);
-
-   /* unmap remaining mapped pages */
-   nr_frags = tx_info->num_of_bufs - 1;
-   for (j = 0; j < nr_frags; j++) {
-   ena_buf++;
-   dma_unmap_page(tx_ring->dev,
-  ena_buf->paddr,
-  ena_buf->len,
-  DMA_TO_DEVICE);
-   }
+   ena_unmap_tx_skb(tx_ring, tx_info);
 
dev_kfree_skb_any(tx_info->skb);
}
@@ -735,8 +762,6 @@ static int ena_clean_tx_irq(struct ena_ring *tx_ring, u32 
budget)
while (tx_pkts < budget) {
struct ena_tx_buffer *tx_info;
struct sk_buff *skb;
-   struct ena_com_buf 

[PATCH V1 net-next 06/12] net: ena: use CSUM_CHECKED device indication to report skb's checksum status

2018-10-09 Thread akiyano
From: Arthur Kiyanovski 

Set skb->ip_summed to the correct value as reported by the device.
Add counter for the case where rx csum offload is enabled but
device didn't check it.

Signed-off-by: Arthur Kiyanovski 
---
 drivers/net/ethernet/amazon/ena/ena_eth_com.c |  3 +++
 drivers/net/ethernet/amazon/ena/ena_eth_com.h |  1 +
 drivers/net/ethernet/amazon/ena/ena_eth_io_defs.h | 10 --
 drivers/net/ethernet/amazon/ena/ena_ethtool.c |  1 +
 drivers/net/ethernet/amazon/ena/ena_netdev.c  | 13 -
 drivers/net/ethernet/amazon/ena/ena_netdev.h  |  1 +
 6 files changed, 26 insertions(+), 3 deletions(-)

diff --git a/drivers/net/ethernet/amazon/ena/ena_eth_com.c 
b/drivers/net/ethernet/amazon/ena/ena_eth_com.c
index 17107ca..f6c2d38 100644
--- a/drivers/net/ethernet/amazon/ena/ena_eth_com.c
+++ b/drivers/net/ethernet/amazon/ena/ena_eth_com.c
@@ -354,6 +354,9 @@ static inline void ena_com_rx_set_flags(struct 
ena_com_rx_ctx *ena_rx_ctx,
ena_rx_ctx->l4_csum_err =
!!((cdesc->status & ENA_ETH_IO_RX_CDESC_BASE_L4_CSUM_ERR_MASK) 
>>
ENA_ETH_IO_RX_CDESC_BASE_L4_CSUM_ERR_SHIFT);
+   ena_rx_ctx->l4_csum_checked =
+   !!((cdesc->status & 
ENA_ETH_IO_RX_CDESC_BASE_L4_CSUM_CHECKED_MASK) >>
+   ENA_ETH_IO_RX_CDESC_BASE_L4_CSUM_CHECKED_SHIFT);
ena_rx_ctx->hash = cdesc->hash;
ena_rx_ctx->frag =
(cdesc->status & ENA_ETH_IO_RX_CDESC_BASE_IPV4_FRAG_MASK) >>
diff --git a/drivers/net/ethernet/amazon/ena/ena_eth_com.h 
b/drivers/net/ethernet/amazon/ena/ena_eth_com.h
index bcc8407..340d02b 100644
--- a/drivers/net/ethernet/amazon/ena/ena_eth_com.h
+++ b/drivers/net/ethernet/amazon/ena/ena_eth_com.h
@@ -67,6 +67,7 @@ struct ena_com_rx_ctx {
enum ena_eth_io_l4_proto_index l4_proto;
bool l3_csum_err;
bool l4_csum_err;
+   u8 l4_csum_checked;
/* fragmented packet */
bool frag;
u32 hash;
diff --git a/drivers/net/ethernet/amazon/ena/ena_eth_io_defs.h 
b/drivers/net/ethernet/amazon/ena/ena_eth_io_defs.h
index f320c58..4c5ccaa 100644
--- a/drivers/net/ethernet/amazon/ena/ena_eth_io_defs.h
+++ b/drivers/net/ethernet/amazon/ena/ena_eth_io_defs.h
@@ -242,9 +242,13 @@ struct ena_eth_io_rx_cdesc_base {
 *checksum error detected, or, the controller didn't
 *validate the checksum. This bit is valid only when
 *l4_proto_idx indicates TCP/UDP packet, and,
-*ipv4_frag is not set
+*ipv4_frag is not set. This bit is valid only when
+*l4_csum_checked below is set.
 * 15 : ipv4_frag - Indicates IPv4 fragmented packet
-* 23:16 : reserved16
+* 16 : l4_csum_checked - L4 checksum was verified
+*(could be OK or error), when cleared the status of
+*checksum is unknown
+* 23:17 : reserved17 - MBZ
 * 24 : phase
 * 25 : l3_csum2 - second checksum engine result
 * 26 : first - Indicates first descriptor in
@@ -390,6 +394,8 @@ struct ena_eth_io_numa_node_cfg_reg {
 #define ENA_ETH_IO_RX_CDESC_BASE_L4_CSUM_ERR_MASK BIT(14)
 #define ENA_ETH_IO_RX_CDESC_BASE_IPV4_FRAG_SHIFT 15
 #define ENA_ETH_IO_RX_CDESC_BASE_IPV4_FRAG_MASK BIT(15)
+#define ENA_ETH_IO_RX_CDESC_BASE_L4_CSUM_CHECKED_SHIFT 16
+#define ENA_ETH_IO_RX_CDESC_BASE_L4_CSUM_CHECKED_MASK BIT(16)
 #define ENA_ETH_IO_RX_CDESC_BASE_PHASE_SHIFT 24
 #define ENA_ETH_IO_RX_CDESC_BASE_PHASE_MASK BIT(24)
 #define ENA_ETH_IO_RX_CDESC_BASE_L3_CSUM2_SHIFT 25
diff --git a/drivers/net/ethernet/amazon/ena/ena_ethtool.c 
b/drivers/net/ethernet/amazon/ena/ena_ethtool.c
index fd28bd0..f3a5a38 100644
--- a/drivers/net/ethernet/amazon/ena/ena_ethtool.c
+++ b/drivers/net/ethernet/amazon/ena/ena_ethtool.c
@@ -97,6 +97,7 @@ static const struct ena_stats ena_stats_rx_strings[] = {
ENA_STAT_RX_ENTRY(rx_copybreak_pkt),
ENA_STAT_RX_ENTRY(bad_req_id),
ENA_STAT_RX_ENTRY(empty_rx_ring),
+   ENA_STAT_RX_ENTRY(csum_unchecked),
 };
 
 static const struct ena_stats ena_stats_ena_com_strings[] = {
diff --git a/drivers/net/ethernet/amazon/ena/ena_netdev.c 
b/drivers/net/ethernet/amazon/ena/ena_netdev.c
index fcdfaf0..35b0ce5 100644
--- a/drivers/net/ethernet/amazon/ena/ena_netdev.c
+++ b/drivers/net/ethernet/amazon/ena/ena_netdev.c
@@ -994,8 +994,19 @@ static inline void ena_rx_checksum(struct ena_ring 
*rx_ring,
return;
}
 
-   skb->ip_summed = CHECKSUM_UNNECESSARY;
+   if (likely(ena_rx_ctx->l4_csum_checked)) {
+   skb->ip_summed = CHECKSUM_UNNECESSARY;
+   } else {
+   u64_stats_update_begin(_ring->syncp);
+   rx_ring->rx_stats.csum_unchecked++;
+   u64_stats_update_end(_ring->syncp);
+   skb->ip_summed = CHECKSUM_NONE;
+   }
+   } else {
+   skb->ip_summed = CHECKSUM_NONE;
+ 

[PATCH V1 net-next 07/12] net: ena: explicit casting and initialization, and clearer error handling

2018-10-09 Thread akiyano
From: Arthur Kiyanovski 

Signed-off-by: Arthur Kiyanovski 
---
 drivers/net/ethernet/amazon/ena/ena_com.c| 39 
 drivers/net/ethernet/amazon/ena/ena_netdev.c |  5 ++--
 drivers/net/ethernet/amazon/ena/ena_netdev.h | 22 
 3 files changed, 36 insertions(+), 30 deletions(-)

diff --git a/drivers/net/ethernet/amazon/ena/ena_com.c 
b/drivers/net/ethernet/amazon/ena/ena_com.c
index 5220c75..5c468b2 100644
--- a/drivers/net/ethernet/amazon/ena/ena_com.c
+++ b/drivers/net/ethernet/amazon/ena/ena_com.c
@@ -235,7 +235,7 @@ static struct ena_comp_ctx 
*__ena_com_submit_admin_cmd(struct ena_com_admin_queu
tail_masked = admin_queue->sq.tail & queue_size_mask;
 
/* In case of queue FULL */
-   cnt = atomic_read(_queue->outstanding_cmds);
+   cnt = (u16)atomic_read(_queue->outstanding_cmds);
if (cnt >= admin_queue->q_depth) {
pr_debug("admin queue is full.\n");
admin_queue->stats.out_of_space++;
@@ -304,7 +304,7 @@ static struct ena_comp_ctx *ena_com_submit_admin_cmd(struct 
ena_com_admin_queue
 struct ena_admin_acq_entry 
*comp,
 size_t comp_size_in_bytes)
 {
-   unsigned long flags;
+   unsigned long flags = 0;
struct ena_comp_ctx *comp_ctx;
 
spin_lock_irqsave(_queue->q_lock, flags);
@@ -332,7 +332,7 @@ static int ena_com_init_io_sq(struct ena_com_dev *ena_dev,
 
memset(_sq->desc_addr, 0x0, sizeof(io_sq->desc_addr));
 
-   io_sq->dma_addr_bits = ena_dev->dma_addr_bits;
+   io_sq->dma_addr_bits = (u8)ena_dev->dma_addr_bits;
io_sq->desc_entry_size =
(io_sq->direction == ENA_COM_IO_QUEUE_DIRECTION_TX) ?
sizeof(struct ena_eth_io_tx_desc) :
@@ -486,7 +486,7 @@ static void ena_com_handle_admin_completion(struct 
ena_com_admin_queue *admin_qu
 
/* Go over all the completions */
while ((READ_ONCE(cqe->acq_common_descriptor.flags) &
-   ENA_ADMIN_ACQ_COMMON_DESC_PHASE_MASK) == phase) {
+   ENA_ADMIN_ACQ_COMMON_DESC_PHASE_MASK) == phase) {
/* Do not read the rest of the completion entry before the
 * phase bit was validated
 */
@@ -537,7 +537,8 @@ static int ena_com_comp_status_to_errno(u8 comp_status)
 static int ena_com_wait_and_process_admin_cq_polling(struct ena_comp_ctx 
*comp_ctx,
 struct ena_com_admin_queue 
*admin_queue)
 {
-   unsigned long flags, timeout;
+   unsigned long flags = 0;
+   unsigned long timeout;
int ret;
 
timeout = jiffies + usecs_to_jiffies(admin_queue->completion_timeout);
@@ -736,7 +737,7 @@ static int ena_com_config_llq_info(struct ena_com_dev 
*ena_dev,
 static int ena_com_wait_and_process_admin_cq_interrupts(struct ena_comp_ctx 
*comp_ctx,
struct 
ena_com_admin_queue *admin_queue)
 {
-   unsigned long flags;
+   unsigned long flags = 0;
int ret;
 
wait_for_completion_timeout(_ctx->wait_event,
@@ -782,7 +783,7 @@ static u32 ena_com_reg_bar_read32(struct ena_com_dev 
*ena_dev, u16 offset)
volatile struct ena_admin_ena_mmio_req_read_less_resp *read_resp =
mmio_read->read_resp;
u32 mmio_read_reg, ret, i;
-   unsigned long flags;
+   unsigned long flags = 0;
u32 timeout = mmio_read->reg_read_to;
 
might_sleep();
@@ -1426,7 +1427,7 @@ void ena_com_abort_admin_commands(struct ena_com_dev 
*ena_dev)
 void ena_com_wait_for_abort_completion(struct ena_com_dev *ena_dev)
 {
struct ena_com_admin_queue *admin_queue = _dev->admin_queue;
-   unsigned long flags;
+   unsigned long flags = 0;
 
spin_lock_irqsave(_queue->q_lock, flags);
while (atomic_read(_queue->outstanding_cmds) != 0) {
@@ -1470,7 +1471,7 @@ bool ena_com_get_admin_running_state(struct ena_com_dev 
*ena_dev)
 void ena_com_set_admin_running_state(struct ena_com_dev *ena_dev, bool state)
 {
struct ena_com_admin_queue *admin_queue = _dev->admin_queue;
-   unsigned long flags;
+   unsigned long flags = 0;
 
spin_lock_irqsave(_queue->q_lock, flags);
ena_dev->admin_queue.running_state = state;
@@ -1504,7 +1505,7 @@ int ena_com_set_aenq_config(struct ena_com_dev *ena_dev, 
u32 groups_flag)
}
 
if ((get_resp.u.aenq.supported_groups & groups_flag) != groups_flag) {
-   pr_warn("Trying to set unsupported aenq events. supported flag: 
%x asked flag: %x\n",
+   pr_warn("Trying to set unsupported aenq events. supported flag: 
0x%x asked flag: 0x%x\n",
get_resp.u.aenq.supported_groups, groups_flag);
return -EOPNOTSUPP;
}
@@ -1652,7 +1653,7 @@ int ena_com_mmio_reg_read_request_init(struct ena_com_dev 
*ena_dev)
 

[PATCH V1 net-next 00/12] Improving performance and reducing latencies, by using latest capabilities exposed in ENA device

2018-10-09 Thread akiyano
From: Arthur Kiyanovski 

This patchset introduces the following:
1. A new placement policy of Tx headers and descriptors, which takes
advantage of an option to place headers + descriptors in device memory
space. This is sometimes referred to as LLQ - low latency queue.
The patch set defines the admin capability, maps the device memory as
write-combined, and adds a mode in transmit datapath to do header +
descriptor placement on the device.
2. Support for RX checksum offloading
3. Miscelaneous small improvements and code cleanups

Arthur Kiyanovski (12):
  net: ena: minor performance improvement
  net: ena: complete host info to match latest ENA spec
  net: ena: introduce Low Latency Queues data structures according to
ENA spec
  net: ena: add functions for handling Low Latency Queues in ena_com
  net: ena: add functions for handling Low Latency Queues in ena_netdev
  net: ena: use CSUM_CHECKED device indication to report skb's checksum
status
  net: ena: explicit casting and initialization, and clearer error
handling
  net: ena: limit refill Rx threshold to 256 to avoid latency issues
  net: ena: change rx copybreak default to reduce kernel memory pressure
  net: ena: remove redundant parameter in ena_com_admin_init()
  net: ena: update driver version to 2.0.1
  net: ena: fix indentations in ena_defs for better readability

 drivers/net/ethernet/amazon/ena/ena_admin_defs.h  | 425 -
 drivers/net/ethernet/amazon/ena/ena_com.c | 302 +--
 drivers/net/ethernet/amazon/ena/ena_com.h |  71 +++-
 drivers/net/ethernet/amazon/ena/ena_common_defs.h |   4 +-
 drivers/net/ethernet/amazon/ena/ena_eth_com.c | 277 +-
 drivers/net/ethernet/amazon/ena/ena_eth_com.h |  72 +++-
 drivers/net/ethernet/amazon/ena/ena_eth_io_defs.h | 229 ++-
 drivers/net/ethernet/amazon/ena/ena_ethtool.c |   2 +
 drivers/net/ethernet/amazon/ena/ena_netdev.c  | 446 ++
 drivers/net/ethernet/amazon/ena/ena_netdev.h  |  42 +-
 drivers/net/ethernet/amazon/ena/ena_regs_defs.h   | 206 +-
 11 files changed, 1334 insertions(+), 742 deletions(-)

-- 
2.7.4



[PATCH V1 net-next 03/12] net: ena: introduce Low Latency Queues data structures according to ENA spec

2018-10-09 Thread akiyano
From: Arthur Kiyanovski 

Low Latency Queues(LLQ) allow usage of device's memory for descriptors
and headers. Such queues decrease processing time since data is already
located on the device when driver rings the doorbell.

Signed-off-by: Arthur Kiyanovski 
---
 drivers/net/ethernet/amazon/ena/ena_admin_defs.h | 90 +++-
 drivers/net/ethernet/amazon/ena/ena_com.h| 38 ++
 drivers/net/ethernet/amazon/ena/ena_netdev.c |  6 +-
 3 files changed, 128 insertions(+), 6 deletions(-)

diff --git a/drivers/net/ethernet/amazon/ena/ena_admin_defs.h 
b/drivers/net/ethernet/amazon/ena/ena_admin_defs.h
index d735164..b439ec1 100644
--- a/drivers/net/ethernet/amazon/ena/ena_admin_defs.h
+++ b/drivers/net/ethernet/amazon/ena/ena_admin_defs.h
@@ -74,6 +74,8 @@ enum ena_admin_aq_feature_id {
 
ENA_ADMIN_HW_HINTS  = 3,
 
+   ENA_ADMIN_LLQ   = 4,
+
ENA_ADMIN_RSS_HASH_FUNCTION = 10,
 
ENA_ADMIN_STATELESS_OFFLOAD_CONFIG  = 11,
@@ -485,8 +487,85 @@ struct ena_admin_device_attr_feature_desc {
u32 max_mtu;
 };
 
+enum ena_admin_llq_header_location {
+   /* header is in descriptor list */
+   ENA_ADMIN_INLINE_HEADER = 1,
+   /* header in a separate ring, implies 16B descriptor list entry */
+   ENA_ADMIN_HEADER_RING   = 2,
+};
+
+enum ena_admin_llq_ring_entry_size {
+   ENA_ADMIN_LIST_ENTRY_SIZE_128B  = 1,
+   ENA_ADMIN_LIST_ENTRY_SIZE_192B  = 2,
+   ENA_ADMIN_LIST_ENTRY_SIZE_256B  = 4,
+};
+
+enum ena_admin_llq_num_descs_before_header {
+   ENA_ADMIN_LLQ_NUM_DESCS_BEFORE_HEADER_0 = 0,
+   ENA_ADMIN_LLQ_NUM_DESCS_BEFORE_HEADER_1 = 1,
+   ENA_ADMIN_LLQ_NUM_DESCS_BEFORE_HEADER_2 = 2,
+   ENA_ADMIN_LLQ_NUM_DESCS_BEFORE_HEADER_4 = 4,
+   ENA_ADMIN_LLQ_NUM_DESCS_BEFORE_HEADER_8 = 8,
+};
+
+/* packet descriptor list entry always starts with one or more descriptors,
+ * followed by a header. The rest of the descriptors are located in the
+ * beginning of the subsequent entry. Stride refers to how the rest of the
+ * descriptors are placed. This field is relevant only for inline header
+ * mode
+ */
+enum ena_admin_llq_stride_ctrl {
+   ENA_ADMIN_SINGLE_DESC_PER_ENTRY = 1,
+   ENA_ADMIN_MULTIPLE_DESCS_PER_ENTRY  = 2,
+};
+
+struct ena_admin_feature_llq_desc {
+   u32 max_llq_num;
+
+   u32 max_llq_depth;
+
+   /*  specify the header locations the device supports. bitfield of
+*enum ena_admin_llq_header_location.
+*/
+   u16 header_location_ctrl_supported;
+
+   /* the header location the driver selected to use. */
+   u16 header_location_ctrl_enabled;
+
+   /* if inline header is specified - this is the size of descriptor
+*list entry. If header in a separate ring is specified - this is
+*the size of header ring entry. bitfield of enum
+*ena_admin_llq_ring_entry_size. specify the entry sizes the device
+*supports
+*/
+   u16 entry_size_ctrl_supported;
+
+   /* the entry size the driver selected to use. */
+   u16 entry_size_ctrl_enabled;
+
+   /* valid only if inline header is specified. First entry associated
+*with the packet includes descriptors and header. Rest of the
+*entries occupied by descriptors. This parameter defines the max
+*number of descriptors precedding the header in the first entry.
+*The field is bitfield of enum
+*ena_admin_llq_num_descs_before_header and specify the values the
+*device supports
+*/
+   u16 desc_num_before_header_supported;
+
+   /* the desire field the driver selected to use */
+   u16 desc_num_before_header_enabled;
+
+   /* valid only if inline was chosen. bitfield of enum
+*ena_admin_llq_stride_ctrl
+*/
+   u16 descriptors_stride_ctrl_supported;
+
+   /* the stride control the driver selected to use */
+   u16 descriptors_stride_ctrl_enabled;
+};
+
 struct ena_admin_queue_feature_desc {
-   /* including LLQs */
u32 max_sq_num;
 
u32 max_sq_depth;
@@ -495,9 +574,9 @@ struct ena_admin_queue_feature_desc {
 
u32 max_cq_depth;
 
-   u32 max_llq_num;
+   u32 max_legacy_llq_num;
 
-   u32 max_llq_depth;
+   u32 max_legacy_llq_depth;
 
u32 max_header_size;
 
@@ -822,6 +901,8 @@ struct ena_admin_get_feat_resp {
 
struct ena_admin_device_attr_feature_desc dev_attr;
 
+   struct ena_admin_feature_llq_desc llq;
+
struct ena_admin_queue_feature_desc max_queue;
 
struct ena_admin_feature_aenq_desc aenq;
@@ -869,6 +950,9 @@ struct ena_admin_set_feat_cmd {
 
/* rss indirection table */
struct ena_admin_feature_rss_ind_table 

[PATCH V1 net-next 02/12] net: ena: complete host info to match latest ENA spec

2018-10-09 Thread akiyano
From: Arthur Kiyanovski 

Add new fields and definitions to host info and fill them
according to the latest ENA spec version.

Signed-off-by: Arthur Kiyanovski 
---
 drivers/net/ethernet/amazon/ena/ena_admin_defs.h  | 31 ++-
 drivers/net/ethernet/amazon/ena/ena_com.c | 12 +++--
 drivers/net/ethernet/amazon/ena/ena_common_defs.h |  4 +--
 drivers/net/ethernet/amazon/ena/ena_netdev.c  | 10 +---
 4 files changed, 43 insertions(+), 14 deletions(-)

diff --git a/drivers/net/ethernet/amazon/ena/ena_admin_defs.h 
b/drivers/net/ethernet/amazon/ena/ena_admin_defs.h
index 4532e57..d735164 100644
--- a/drivers/net/ethernet/amazon/ena/ena_admin_defs.h
+++ b/drivers/net/ethernet/amazon/ena/ena_admin_defs.h
@@ -63,6 +63,8 @@ enum ena_admin_aq_completion_status {
ENA_ADMIN_ILLEGAL_PARAMETER = 5,
 
ENA_ADMIN_UNKNOWN_ERROR = 6,
+
+   ENA_ADMIN_RESOURCE_BUSY = 7,
 };
 
 enum ena_admin_aq_feature_id {
@@ -702,6 +704,10 @@ enum ena_admin_os_type {
ENA_ADMIN_OS_FREEBSD= 4,
 
ENA_ADMIN_OS_IPXE   = 5,
+
+   ENA_ADMIN_OS_ESXI   = 6,
+
+   ENA_ADMIN_OS_GROUPS_NUM = 6,
 };
 
 struct ena_admin_host_info {
@@ -723,11 +729,27 @@ struct ena_admin_host_info {
/* 7:0 : major
 * 15:8 : minor
 * 23:16 : sub_minor
+* 31:24 : module_type
 */
u32 driver_version;
 
/* features bitmap */
-   u32 supported_network_features[4];
+   u32 supported_network_features[2];
+
+   /* ENA spec version of driver */
+   u16 ena_spec_version;
+
+   /* ENA device's Bus, Device and Function
+* 2:0 : function
+* 7:3 : device
+* 15:8 : bus
+*/
+   u16 bdf;
+
+   /* Number of CPUs */
+   u16 num_cpus;
+
+   u16 reserved;
 };
 
 struct ena_admin_rss_ind_table_entry {
@@ -1008,6 +1030,13 @@ struct ena_admin_ena_mmio_req_read_less_resp {
 #define ENA_ADMIN_HOST_INFO_MINOR_MASK GENMASK(15, 8)
 #define ENA_ADMIN_HOST_INFO_SUB_MINOR_SHIFT 16
 #define ENA_ADMIN_HOST_INFO_SUB_MINOR_MASK GENMASK(23, 16)
+#define ENA_ADMIN_HOST_INFO_MODULE_TYPE_SHIFT 24
+#define ENA_ADMIN_HOST_INFO_MODULE_TYPE_MASK GENMASK(31, 24)
+#define ENA_ADMIN_HOST_INFO_FUNCTION_MASK GENMASK(2, 0)
+#define ENA_ADMIN_HOST_INFO_DEVICE_SHIFT 3
+#define ENA_ADMIN_HOST_INFO_DEVICE_MASK GENMASK(7, 3)
+#define ENA_ADMIN_HOST_INFO_BUS_SHIFT 8
+#define ENA_ADMIN_HOST_INFO_BUS_MASK GENMASK(15, 8)
 
 /* aenq_common_desc */
 #define ENA_ADMIN_AENQ_COMMON_DESC_PHASE_MASK BIT(0)
diff --git a/drivers/net/ethernet/amazon/ena/ena_com.c 
b/drivers/net/ethernet/amazon/ena/ena_com.c
index 7635c38..b6e6a47 100644
--- a/drivers/net/ethernet/amazon/ena/ena_com.c
+++ b/drivers/net/ethernet/amazon/ena/ena_com.c
@@ -41,9 +41,6 @@
 #define ENA_ASYNC_QUEUE_DEPTH 16
 #define ENA_ADMIN_QUEUE_DEPTH 32
 
-#define MIN_ENA_VER (((ENA_COMMON_SPEC_VERSION_MAJOR) << \
-   ENA_REGS_VERSION_MAJOR_VERSION_SHIFT) \
-   | (ENA_COMMON_SPEC_VERSION_MINOR))
 
 #define ENA_CTRL_MAJOR 0
 #define ENA_CTRL_MINOR 0
@@ -1400,11 +1397,6 @@ int ena_com_validate_version(struct ena_com_dev *ena_dev)
ENA_REGS_VERSION_MAJOR_VERSION_SHIFT,
ver & ENA_REGS_VERSION_MINOR_VERSION_MASK);
 
-   if (ver < MIN_ENA_VER) {
-   pr_err("ENA version is lower than the minimal version the 
driver supports\n");
-   return -1;
-   }
-
pr_info("ena controller version: %d.%d.%d implementation version %d\n",
(ctrl_ver & ENA_REGS_CONTROLLER_VERSION_MAJOR_VERSION_MASK) >>
ENA_REGS_CONTROLLER_VERSION_MAJOR_VERSION_SHIFT,
@@ -2441,6 +2433,10 @@ int ena_com_allocate_host_info(struct ena_com_dev 
*ena_dev)
if (unlikely(!host_attr->host_info))
return -ENOMEM;
 
+   host_attr->host_info->ena_spec_version =
+   ((ENA_COMMON_SPEC_VERSION_MAJOR << 
ENA_REGS_VERSION_MAJOR_VERSION_SHIFT) |
+   (ENA_COMMON_SPEC_VERSION_MINOR));
+
return 0;
 }
 
diff --git a/drivers/net/ethernet/amazon/ena/ena_common_defs.h 
b/drivers/net/ethernet/amazon/ena/ena_common_defs.h
index bb8d736..23beb7e 100644
--- a/drivers/net/ethernet/amazon/ena/ena_common_defs.h
+++ b/drivers/net/ethernet/amazon/ena/ena_common_defs.h
@@ -32,8 +32,8 @@
 #ifndef _ENA_COMMON_H_
 #define _ENA_COMMON_H_
 
-#define ENA_COMMON_SPEC_VERSION_MAJOR  0 /*  */
-#define ENA_COMMON_SPEC_VERSION_MINOR  10 /*  */
+#define ENA_COMMON_SPEC_VERSION_MAJOR2
+#define ENA_COMMON_SPEC_VERSION_MINOR0
 
 /* ENA operates with 48-bit memory addresses. ena_mem_addr_t */
 struct ena_common_mem_addr {
diff --git a/drivers/net/ethernet/amazon/ena/ena_netdev.c 
b/drivers/net/ethernet/amazon/ena/ena_netdev.c
index 69a4978..0c9c0d3 100644
--- a/drivers/net/ethernet/amazon/ena/ena_netdev.c
+++ b/drivers/net/ethernet/amazon/ena/ena_netdev.c
@@ -2206,7 +2206,8 @@ static u16 

[PATCH V1 net-next 01/12] net: ena: minor performance improvement

2018-10-09 Thread akiyano
From: Arthur Kiyanovski 

Reduce fastpath overhead by making ena_com_tx_comp_req_id_get() inline.
Also move it to ena_eth_com.h file with its dependency function
ena_com_cq_inc_head().

Signed-off-by: Arthur Kiyanovski 
---
 drivers/net/ethernet/amazon/ena/ena_eth_com.c | 43 -
 drivers/net/ethernet/amazon/ena/ena_eth_com.h | 46 +--
 2 files changed, 44 insertions(+), 45 deletions(-)

diff --git a/drivers/net/ethernet/amazon/ena/ena_eth_com.c 
b/drivers/net/ethernet/amazon/ena/ena_eth_com.c
index 2b3ff0c..9c0511e 100644
--- a/drivers/net/ethernet/amazon/ena/ena_eth_com.c
+++ b/drivers/net/ethernet/amazon/ena/ena_eth_com.c
@@ -59,15 +59,6 @@ static inline struct ena_eth_io_rx_cdesc_base 
*ena_com_get_next_rx_cdesc(
return cdesc;
 }
 
-static inline void ena_com_cq_inc_head(struct ena_com_io_cq *io_cq)
-{
-   io_cq->head++;
-
-   /* Switch phase bit in case of wrap around */
-   if (unlikely((io_cq->head & (io_cq->q_depth - 1)) == 0))
-   io_cq->phase ^= 1;
-}
-
 static inline void *get_sq_desc(struct ena_com_io_sq *io_sq)
 {
u16 tail_masked;
@@ -477,40 +468,6 @@ int ena_com_add_single_rx_desc(struct ena_com_io_sq *io_sq,
return 0;
 }
 
-int ena_com_tx_comp_req_id_get(struct ena_com_io_cq *io_cq, u16 *req_id)
-{
-   u8 expected_phase, cdesc_phase;
-   struct ena_eth_io_tx_cdesc *cdesc;
-   u16 masked_head;
-
-   masked_head = io_cq->head & (io_cq->q_depth - 1);
-   expected_phase = io_cq->phase;
-
-   cdesc = (struct ena_eth_io_tx_cdesc *)
-   ((uintptr_t)io_cq->cdesc_addr.virt_addr +
-   (masked_head * io_cq->cdesc_entry_size_in_bytes));
-
-   /* When the current completion descriptor phase isn't the same as the
-* expected, it mean that the device still didn't update
-* this completion.
-*/
-   cdesc_phase = READ_ONCE(cdesc->flags) & ENA_ETH_IO_TX_CDESC_PHASE_MASK;
-   if (cdesc_phase != expected_phase)
-   return -EAGAIN;
-
-   dma_rmb();
-   if (unlikely(cdesc->req_id >= io_cq->q_depth)) {
-   pr_err("Invalid req id %d\n", cdesc->req_id);
-   return -EINVAL;
-   }
-
-   ena_com_cq_inc_head(io_cq);
-
-   *req_id = READ_ONCE(cdesc->req_id);
-
-   return 0;
-}
-
 bool ena_com_cq_empty(struct ena_com_io_cq *io_cq)
 {
struct ena_eth_io_rx_cdesc_base *cdesc;
diff --git a/drivers/net/ethernet/amazon/ena/ena_eth_com.h 
b/drivers/net/ethernet/amazon/ena/ena_eth_com.h
index 2f76572..4930324 100644
--- a/drivers/net/ethernet/amazon/ena/ena_eth_com.h
+++ b/drivers/net/ethernet/amazon/ena/ena_eth_com.h
@@ -86,8 +86,6 @@ int ena_com_add_single_rx_desc(struct ena_com_io_sq *io_sq,
   struct ena_com_buf *ena_buf,
   u16 req_id);
 
-int ena_com_tx_comp_req_id_get(struct ena_com_io_cq *io_cq, u16 *req_id);
-
 bool ena_com_cq_empty(struct ena_com_io_cq *io_cq);
 
 static inline void ena_com_unmask_intr(struct ena_com_io_cq *io_cq,
@@ -159,4 +157,48 @@ static inline void ena_com_comp_ack(struct ena_com_io_sq 
*io_sq, u16 elem)
io_sq->next_to_comp += elem;
 }
 
+static inline void ena_com_cq_inc_head(struct ena_com_io_cq *io_cq)
+{
+   io_cq->head++;
+
+   /* Switch phase bit in case of wrap around */
+   if (unlikely((io_cq->head & (io_cq->q_depth - 1)) == 0))
+   io_cq->phase ^= 1;
+}
+
+static inline int ena_com_tx_comp_req_id_get(struct ena_com_io_cq *io_cq,
+u16 *req_id)
+{
+   u8 expected_phase, cdesc_phase;
+   struct ena_eth_io_tx_cdesc *cdesc;
+   u16 masked_head;
+
+   masked_head = io_cq->head & (io_cq->q_depth - 1);
+   expected_phase = io_cq->phase;
+
+   cdesc = (struct ena_eth_io_tx_cdesc *)
+   ((uintptr_t)io_cq->cdesc_addr.virt_addr +
+   (masked_head * io_cq->cdesc_entry_size_in_bytes));
+
+   /* When the current completion descriptor phase isn't the same as the
+* expected, it mean that the device still didn't update
+* this completion.
+*/
+   cdesc_phase = READ_ONCE(cdesc->flags) & ENA_ETH_IO_TX_CDESC_PHASE_MASK;
+   if (cdesc_phase != expected_phase)
+   return -EAGAIN;
+
+   dma_rmb();
+
+   *req_id = READ_ONCE(cdesc->req_id);
+   if (unlikely(*req_id >= io_cq->q_depth)) {
+   pr_err("Invalid req id %d\n", cdesc->req_id);
+   return -EINVAL;
+   }
+
+   ena_com_cq_inc_head(io_cq);
+
+   return 0;
+}
+
 #endif /* ENA_ETH_COM_H_ */
-- 
2.7.4



[PATCH V2 net 3/4] net: ena: fix NULL dereference due to untimely napi initialization

2018-10-09 Thread akiyano
From: Arthur Kiyanovski 

napi poll functions should be initialized before running request_irq(),
to handle a rare condition where there is a pending interrupt, causing
the ISR to fire immediately while the poll function wasn't set yet,
causing a NULL dereference.

Fixes: 1738cd3ed342 ("net: ena: Add a driver for Amazon Elastic Network 
Adapters (ENA)")
Signed-off-by: Arthur Kiyanovski 
---
 drivers/net/ethernet/amazon/ena/ena_netdev.c | 9 +++--
 1 file changed, 7 insertions(+), 2 deletions(-)

diff --git a/drivers/net/ethernet/amazon/ena/ena_netdev.c 
b/drivers/net/ethernet/amazon/ena/ena_netdev.c
index ce18e07..d906293 100644
--- a/drivers/net/ethernet/amazon/ena/ena_netdev.c
+++ b/drivers/net/ethernet/amazon/ena/ena_netdev.c
@@ -1575,8 +1575,6 @@ static int ena_up_complete(struct ena_adapter *adapter)
if (rc)
return rc;
 
-   ena_init_napi(adapter);
-
ena_change_mtu(adapter->netdev, adapter->netdev->mtu);
 
ena_refill_all_rx_bufs(adapter);
@@ -1730,6 +1728,13 @@ static int ena_up(struct ena_adapter *adapter)
 
ena_setup_io_intr(adapter);
 
+   /* napi poll functions should be initialized before running
+* request_irq(), to handle a rare condition where there is a pending
+* interrupt, causing the ISR to fire immediately while the poll
+* function wasn't set yet, causing a null dereference
+*/
+   ena_init_napi(adapter);
+
rc = ena_request_io_irq(adapter);
if (rc)
goto err_req_irq;
-- 
2.7.4



[PATCH V2 net 1/4] net: ena: fix warning in rmmod caused by double iounmap

2018-10-09 Thread akiyano
From: Arthur Kiyanovski 

Memory mapped with devm_ioremap is automatically freed when the driver
is disconnected from the device. Therefore there is no need to
explicitly call devm_iounmap.

Fixes: 0857d92f71b6 ("net: ena: add missing unmap bars on device removal")
Fixes: 411838e7b41c ("net: ena: fix rare kernel crash when bar memory remap 
fails")
Signed-off-by: Arthur Kiyanovski 
---
 drivers/net/ethernet/amazon/ena/ena_netdev.c | 9 +
 1 file changed, 1 insertion(+), 8 deletions(-)

diff --git a/drivers/net/ethernet/amazon/ena/ena_netdev.c 
b/drivers/net/ethernet/amazon/ena/ena_netdev.c
index 25621a2..78d84ca 100644
--- a/drivers/net/ethernet/amazon/ena/ena_netdev.c
+++ b/drivers/net/ethernet/amazon/ena/ena_netdev.c
@@ -3099,15 +3099,8 @@ static int ena_rss_init_default(struct ena_adapter 
*adapter)
 
 static void ena_release_bars(struct ena_com_dev *ena_dev, struct pci_dev *pdev)
 {
-   int release_bars;
+   int release_bars = pci_select_bars(pdev, IORESOURCE_MEM) & ENA_BAR_MASK;
 
-   if (ena_dev->mem_bar)
-   devm_iounmap(>dev, ena_dev->mem_bar);
-
-   if (ena_dev->reg_bar)
-   devm_iounmap(>dev, ena_dev->reg_bar);
-
-   release_bars = pci_select_bars(pdev, IORESOURCE_MEM) & ENA_BAR_MASK;
pci_release_selected_regions(pdev, release_bars);
 }
 
-- 
2.7.4



[PATCH V2 net 2/4] net: ena: fix rare bug when failed restart/resume is followed by driver removal

2018-10-09 Thread akiyano
From: Arthur Kiyanovski 

In a rare scenario when ena_device_restore() fails, followed by device
remove, an FLR will not be issued. In this case, the device will keep
sending asynchronous AENQ keep-alive events, even after driver removal,
leading to memory corruption.

Fixes: 8c5c7abdeb2d ("net: ena: add power management ops to the ENA driver")
Signed-off-by: Arthur Kiyanovski 
---
 drivers/net/ethernet/amazon/ena/ena_netdev.c | 4 
 1 file changed, 4 insertions(+)

diff --git a/drivers/net/ethernet/amazon/ena/ena_netdev.c 
b/drivers/net/ethernet/amazon/ena/ena_netdev.c
index 78d84ca..ce18e07 100644
--- a/drivers/net/ethernet/amazon/ena/ena_netdev.c
+++ b/drivers/net/ethernet/amazon/ena/ena_netdev.c
@@ -2619,7 +2619,11 @@ static int ena_restore_device(struct ena_adapter 
*adapter)
ena_free_mgmnt_irq(adapter);
ena_disable_msix(adapter);
 err_device_destroy:
+   ena_com_abort_admin_commands(ena_dev);
+   ena_com_wait_for_abort_completion(ena_dev);
ena_com_admin_destroy(ena_dev);
+   ena_com_mmio_reg_read_request_destroy(ena_dev);
+   ena_com_dev_reset(ena_dev, ENA_REGS_RESET_DRIVER_INVALID_STATE);
 err:
clear_bit(ENA_FLAG_DEVICE_RUNNING, >flags);
clear_bit(ENA_FLAG_ONGOING_RESET, >flags);
-- 
2.7.4



[PATCH V2 net 4/4] net: ena: fix auto casting to boolean

2018-10-09 Thread akiyano
From: Arthur Kiyanovski 

Eliminate potential auto casting compilation error.

Fixes: 1738cd3ed342 ("net: ena: Add a driver for Amazon Elastic Network 
Adapters (ENA)")
Signed-off-by: Arthur Kiyanovski 
---
 drivers/net/ethernet/amazon/ena/ena_eth_com.c | 8 
 1 file changed, 4 insertions(+), 4 deletions(-)

diff --git a/drivers/net/ethernet/amazon/ena/ena_eth_com.c 
b/drivers/net/ethernet/amazon/ena/ena_eth_com.c
index 1c682b7..2b3ff0c 100644
--- a/drivers/net/ethernet/amazon/ena/ena_eth_com.c
+++ b/drivers/net/ethernet/amazon/ena/ena_eth_com.c
@@ -245,11 +245,11 @@ static inline void ena_com_rx_set_flags(struct 
ena_com_rx_ctx *ena_rx_ctx,
(cdesc->status & ENA_ETH_IO_RX_CDESC_BASE_L4_PROTO_IDX_MASK) >>
ENA_ETH_IO_RX_CDESC_BASE_L4_PROTO_IDX_SHIFT;
ena_rx_ctx->l3_csum_err =
-   (cdesc->status & ENA_ETH_IO_RX_CDESC_BASE_L3_CSUM_ERR_MASK) >>
-   ENA_ETH_IO_RX_CDESC_BASE_L3_CSUM_ERR_SHIFT;
+   !!((cdesc->status & ENA_ETH_IO_RX_CDESC_BASE_L3_CSUM_ERR_MASK) 
>>
+   ENA_ETH_IO_RX_CDESC_BASE_L3_CSUM_ERR_SHIFT);
ena_rx_ctx->l4_csum_err =
-   (cdesc->status & ENA_ETH_IO_RX_CDESC_BASE_L4_CSUM_ERR_MASK) >>
-   ENA_ETH_IO_RX_CDESC_BASE_L4_CSUM_ERR_SHIFT;
+   !!((cdesc->status & ENA_ETH_IO_RX_CDESC_BASE_L4_CSUM_ERR_MASK) 
>>
+   ENA_ETH_IO_RX_CDESC_BASE_L4_CSUM_ERR_SHIFT);
ena_rx_ctx->hash = cdesc->hash;
ena_rx_ctx->frag =
(cdesc->status & ENA_ETH_IO_RX_CDESC_BASE_IPV4_FRAG_MASK) >>
-- 
2.7.4



[PATCH V2 net 0/4] minor bug fixes for ENA Ethernet driver

2018-10-09 Thread akiyano
From: Arthur Kiyanovski 

Arthur Kiyanovski (4):
  net: ena: fix warning in rmmod caused by double iounmap
  net: ena: fix rare bug when failed restart/resume is followed by
driver removal
  net: ena: fix NULL dereference due to untimely napi initialization
  net: ena: fix auto casting to boolean

 drivers/net/ethernet/amazon/ena/ena_eth_com.c |  8 
 drivers/net/ethernet/amazon/ena/ena_netdev.c  | 22 --
 2 files changed, 16 insertions(+), 14 deletions(-)

-- 
2.7.4



[PATCH V1 net 4/5] net: ena: fix NULL dereference due to untimely napi initialization

2018-10-08 Thread akiyano
From: Arthur Kiyanovski 

napi poll functions should be initialized before running request_irq(),
to handle a rare condition where there is a pending interrupt, causing
the ISR to fire immediately while the poll function wasn't set yet,
causing a NULL dereference.

Signed-off-by: Arthur Kiyanovski 
---
 drivers/net/ethernet/amazon/ena/ena_netdev.c | 9 +++--
 1 file changed, 7 insertions(+), 2 deletions(-)

diff --git a/drivers/net/ethernet/amazon/ena/ena_netdev.c 
b/drivers/net/ethernet/amazon/ena/ena_netdev.c
index 7282a27..8dd8065 100644
--- a/drivers/net/ethernet/amazon/ena/ena_netdev.c
+++ b/drivers/net/ethernet/amazon/ena/ena_netdev.c
@@ -1575,8 +1575,6 @@ static int ena_up_complete(struct ena_adapter *adapter)
if (rc)
return rc;
 
-   ena_init_napi(adapter);
-
ena_change_mtu(adapter->netdev, adapter->netdev->mtu);
 
ena_refill_all_rx_bufs(adapter);
@@ -1730,6 +1728,13 @@ static int ena_up(struct ena_adapter *adapter)
 
ena_setup_io_intr(adapter);
 
+   /* napi poll functions should be initialized before running
+* request_irq(), to handle a rare condition where there is a pending
+* interrupt, causing the ISR to fire immediately while the poll
+* function wasn't set yet, causing a null dereference
+*/
+   ena_init_napi(adapter);
+
rc = ena_request_io_irq(adapter);
if (rc)
goto err_req_irq;
-- 
2.7.4



[PATCH V1 net 3/5] net: ena: fix rare bug when failed restart/resume is followed by driver removal

2018-10-08 Thread akiyano
From: Arthur Kiyanovski 

In a rare scenario when ena_device_restore() fails, followed by device
remove, an FLR will not be issued. In this case, the device will keep
sending asynchronous AENQ keep-alive events, even after driver removal,
leading to memory corruption.

Signed-off-by: Arthur Kiyanovski 
---
 drivers/net/ethernet/amazon/ena/ena_netdev.c | 4 
 1 file changed, 4 insertions(+)

diff --git a/drivers/net/ethernet/amazon/ena/ena_netdev.c 
b/drivers/net/ethernet/amazon/ena/ena_netdev.c
index 23f2dda..7282a27 100644
--- a/drivers/net/ethernet/amazon/ena/ena_netdev.c
+++ b/drivers/net/ethernet/amazon/ena/ena_netdev.c
@@ -2619,7 +2619,11 @@ static int ena_restore_device(struct ena_adapter 
*adapter)
ena_free_mgmnt_irq(adapter);
ena_disable_msix(adapter);
 err_device_destroy:
+   ena_com_abort_admin_commands(ena_dev);
+   ena_com_wait_for_abort_completion(ena_dev);
ena_com_admin_destroy(ena_dev);
+   ena_com_mmio_reg_read_request_destroy(ena_dev);
+   ena_com_dev_reset(ena_dev, ENA_REGS_RESET_DRIVER_INVALID_STATE);
 err:
clear_bit(ENA_FLAG_DEVICE_RUNNING, >flags);
clear_bit(ENA_FLAG_ONGOING_RESET, >flags);
-- 
2.7.4



[PATCH V1 net 5/5] net: ena: fix auto casting to boolean

2018-10-08 Thread akiyano
From: Arthur Kiyanovski 

Eliminate potential auto casting compilation error.

Signed-off-by: Arthur Kiyanovski 
---
 drivers/net/ethernet/amazon/ena/ena_eth_com.c | 8 
 1 file changed, 4 insertions(+), 4 deletions(-)

diff --git a/drivers/net/ethernet/amazon/ena/ena_eth_com.c 
b/drivers/net/ethernet/amazon/ena/ena_eth_com.c
index 1c682b7..2b3ff0c 100644
--- a/drivers/net/ethernet/amazon/ena/ena_eth_com.c
+++ b/drivers/net/ethernet/amazon/ena/ena_eth_com.c
@@ -245,11 +245,11 @@ static inline void ena_com_rx_set_flags(struct 
ena_com_rx_ctx *ena_rx_ctx,
(cdesc->status & ENA_ETH_IO_RX_CDESC_BASE_L4_PROTO_IDX_MASK) >>
ENA_ETH_IO_RX_CDESC_BASE_L4_PROTO_IDX_SHIFT;
ena_rx_ctx->l3_csum_err =
-   (cdesc->status & ENA_ETH_IO_RX_CDESC_BASE_L3_CSUM_ERR_MASK) >>
-   ENA_ETH_IO_RX_CDESC_BASE_L3_CSUM_ERR_SHIFT;
+   !!((cdesc->status & ENA_ETH_IO_RX_CDESC_BASE_L3_CSUM_ERR_MASK) 
>>
+   ENA_ETH_IO_RX_CDESC_BASE_L3_CSUM_ERR_SHIFT);
ena_rx_ctx->l4_csum_err =
-   (cdesc->status & ENA_ETH_IO_RX_CDESC_BASE_L4_CSUM_ERR_MASK) >>
-   ENA_ETH_IO_RX_CDESC_BASE_L4_CSUM_ERR_SHIFT;
+   !!((cdesc->status & ENA_ETH_IO_RX_CDESC_BASE_L4_CSUM_ERR_MASK) 
>>
+   ENA_ETH_IO_RX_CDESC_BASE_L4_CSUM_ERR_SHIFT);
ena_rx_ctx->hash = cdesc->hash;
ena_rx_ctx->frag =
(cdesc->status & ENA_ETH_IO_RX_CDESC_BASE_IPV4_FRAG_MASK) >>
-- 
2.7.4



[PATCH V1 net 0/5] minor bug fixes for ENA Ethernet driver

2018-10-08 Thread akiyano
From: Arthur Kiyanovski 

Arthur Kiyanovski (5):
  net: ena: fix indentations in ena_defs for better readability
  net: ena: fix warning in rmmod caused by double iounmap
  net: ena: fix rare bug when failed restart/resume is followed by
driver removal
  net: ena: fix NULL dereference due to untimely napi initialization
  net: ena: fix auto casting to boolean

 drivers/net/ethernet/amazon/ena/ena_admin_defs.h  | 308 +-
 drivers/net/ethernet/amazon/ena/ena_eth_com.c |   8 +-
 drivers/net/ethernet/amazon/ena/ena_eth_io_defs.h | 219 ---
 drivers/net/ethernet/amazon/ena/ena_netdev.c  |  23 +-
 drivers/net/ethernet/amazon/ena/ena_regs_defs.h   | 206 +++
 5 files changed, 341 insertions(+), 423 deletions(-)

-- 
2.7.4



[PATCH V1 net 2/5] net: ena: fix warning in rmmod caused by double iounmap

2018-10-08 Thread akiyano
From: Arthur Kiyanovski 

Memory mapped with devm_ioremap is automatically freed when the driver
is disconnected from the device. Therefore there is no need to
explicitly call devm_iounmap.

Signed-off-by: Arthur Kiyanovski 
---
 drivers/net/ethernet/amazon/ena/ena_netdev.c | 10 +-
 1 file changed, 1 insertion(+), 9 deletions(-)

diff --git a/drivers/net/ethernet/amazon/ena/ena_netdev.c 
b/drivers/net/ethernet/amazon/ena/ena_netdev.c
index 25621a2..23f2dda 100644
--- a/drivers/net/ethernet/amazon/ena/ena_netdev.c
+++ b/drivers/net/ethernet/amazon/ena/ena_netdev.c
@@ -3099,15 +3099,7 @@ static int ena_rss_init_default(struct ena_adapter 
*adapter)
 
 static void ena_release_bars(struct ena_com_dev *ena_dev, struct pci_dev *pdev)
 {
-   int release_bars;
-
-   if (ena_dev->mem_bar)
-   devm_iounmap(>dev, ena_dev->mem_bar);
-
-   if (ena_dev->reg_bar)
-   devm_iounmap(>dev, ena_dev->reg_bar);
-
-   release_bars = pci_select_bars(pdev, IORESOURCE_MEM) & ENA_BAR_MASK;
+   int release_bars = pci_select_bars(pdev, IORESOURCE_MEM) & ENA_BAR_MASK;
pci_release_selected_regions(pdev, release_bars);
 }
 
-- 
2.7.4



[PATCH V1 net 1/5] net: ena: fix indentations in ena_defs for better readability

2018-10-08 Thread akiyano
From: Arthur Kiyanovski 

Signed-off-by: Arthur Kiyanovski 
---
 drivers/net/ethernet/amazon/ena/ena_admin_defs.h  | 308 +-
 drivers/net/ethernet/amazon/ena/ena_eth_io_defs.h | 219 ---
 drivers/net/ethernet/amazon/ena/ena_regs_defs.h   | 206 +++
 3 files changed, 325 insertions(+), 408 deletions(-)

diff --git a/drivers/net/ethernet/amazon/ena/ena_admin_defs.h 
b/drivers/net/ethernet/amazon/ena/ena_admin_defs.h
index 4532e57..6bdd2ef 100644
--- a/drivers/net/ethernet/amazon/ena/ena_admin_defs.h
+++ b/drivers/net/ethernet/amazon/ena/ena_admin_defs.h
@@ -32,115 +32,79 @@
 #ifndef _ENA_ADMIN_H_
 #define _ENA_ADMIN_H_
 
-enum ena_admin_aq_opcode {
-   ENA_ADMIN_CREATE_SQ = 1,
-
-   ENA_ADMIN_DESTROY_SQ= 2,
-
-   ENA_ADMIN_CREATE_CQ = 3,
-
-   ENA_ADMIN_DESTROY_CQ= 4,
-
-   ENA_ADMIN_GET_FEATURE   = 8,
 
-   ENA_ADMIN_SET_FEATURE   = 9,
-
-   ENA_ADMIN_GET_STATS = 11,
+enum ena_admin_aq_opcode {
+   ENA_ADMIN_CREATE_SQ = 1,
+   ENA_ADMIN_DESTROY_SQ= 2,
+   ENA_ADMIN_CREATE_CQ = 3,
+   ENA_ADMIN_DESTROY_CQ= 4,
+   ENA_ADMIN_GET_FEATURE   = 8,
+   ENA_ADMIN_SET_FEATURE   = 9,
+   ENA_ADMIN_GET_STATS = 11,
 };
 
 enum ena_admin_aq_completion_status {
-   ENA_ADMIN_SUCCESS   = 0,
-
-   ENA_ADMIN_RESOURCE_ALLOCATION_FAILURE   = 1,
-
-   ENA_ADMIN_BAD_OPCODE= 2,
-
-   ENA_ADMIN_UNSUPPORTED_OPCODE= 3,
-
-   ENA_ADMIN_MALFORMED_REQUEST = 4,
-
+   ENA_ADMIN_SUCCESS   = 0,
+   ENA_ADMIN_RESOURCE_ALLOCATION_FAILURE   = 1,
+   ENA_ADMIN_BAD_OPCODE= 2,
+   ENA_ADMIN_UNSUPPORTED_OPCODE= 3,
+   ENA_ADMIN_MALFORMED_REQUEST = 4,
/* Additional status is provided in ACQ entry extended_status */
-   ENA_ADMIN_ILLEGAL_PARAMETER = 5,
-
-   ENA_ADMIN_UNKNOWN_ERROR = 6,
+   ENA_ADMIN_ILLEGAL_PARAMETER = 5,
+   ENA_ADMIN_UNKNOWN_ERROR = 6,
 };
 
 enum ena_admin_aq_feature_id {
-   ENA_ADMIN_DEVICE_ATTRIBUTES = 1,
-
-   ENA_ADMIN_MAX_QUEUES_NUM= 2,
-
-   ENA_ADMIN_HW_HINTS  = 3,
-
-   ENA_ADMIN_RSS_HASH_FUNCTION = 10,
-
-   ENA_ADMIN_STATELESS_OFFLOAD_CONFIG  = 11,
-
-   ENA_ADMIN_RSS_REDIRECTION_TABLE_CONFIG  = 12,
-
-   ENA_ADMIN_MTU   = 14,
-
-   ENA_ADMIN_RSS_HASH_INPUT= 18,
-
-   ENA_ADMIN_INTERRUPT_MODERATION  = 20,
-
-   ENA_ADMIN_AENQ_CONFIG   = 26,
-
-   ENA_ADMIN_LINK_CONFIG   = 27,
-
-   ENA_ADMIN_HOST_ATTR_CONFIG  = 28,
-
-   ENA_ADMIN_FEATURES_OPCODE_NUM   = 32,
+   ENA_ADMIN_DEVICE_ATTRIBUTES = 1,
+   ENA_ADMIN_MAX_QUEUES_NUM= 2,
+   ENA_ADMIN_HW_HINTS  = 3,
+   ENA_ADMIN_RSS_HASH_FUNCTION = 10,
+   ENA_ADMIN_STATELESS_OFFLOAD_CONFIG  = 11,
+   ENA_ADMIN_RSS_REDIRECTION_TABLE_CONFIG  = 12,
+   ENA_ADMIN_MTU   = 14,
+   ENA_ADMIN_RSS_HASH_INPUT= 18,
+   ENA_ADMIN_INTERRUPT_MODERATION  = 20,
+   ENA_ADMIN_AENQ_CONFIG   = 26,
+   ENA_ADMIN_LINK_CONFIG   = 27,
+   ENA_ADMIN_HOST_ATTR_CONFIG  = 28,
+   ENA_ADMIN_FEATURES_OPCODE_NUM   = 32,
 };
 
 enum ena_admin_placement_policy_type {
/* descriptors and headers are in host memory */
-   ENA_ADMIN_PLACEMENT_POLICY_HOST = 1,
-
+   ENA_ADMIN_PLACEMENT_POLICY_HOST = 1,
/* descriptors and headers are in device memory (a.k.a Low Latency
 * Queue)
 */
-   ENA_ADMIN_PLACEMENT_POLICY_DEV  = 3,
+   ENA_ADMIN_PLACEMENT_POLICY_DEV  = 3,
 };
 
 enum ena_admin_link_types {
-   ENA_ADMIN_LINK_SPEED_1G = 0x1,
-
-   ENA_ADMIN_LINK_SPEED_2_HALF_G   = 0x2,
-
-   ENA_ADMIN_LINK_SPEED_5G = 0x4,
-
-   ENA_ADMIN_LINK_SPEED_10G= 0x8,
-
-   ENA_ADMIN_LINK_SPEED_25G= 0x10,
-
-   ENA_ADMIN_LINK_SPEED_40G= 0x20,
-
-   ENA_ADMIN_LINK_SPEED_50G= 0x40,
-
-   ENA_ADMIN_LINK_SPEED_100G   = 0x80,
-
-   ENA_ADMIN_LINK_SPEED_200G   = 0x100,
-
-   ENA_ADMIN_LINK_SPEED_400G   = 0x200,
+   ENA_ADMIN_LINK_SPEED_1G = 0x1,
+   ENA_ADMIN_LINK_SPEED_2_HALF_G   = 0x2,
+   ENA_ADMIN_LINK_SPEED_5G = 0x4,
+   ENA_ADMIN_LINK_SPEED_10G= 0x8,
+