Re: [Intel-wired-lan] [PATCH 02/15] ice: Add support for control queues

2018-03-14 Thread Jeff Kirsher
On Mon, 2018-03-12 at 19:05 -0700, Shannon Nelson wrote:
> On 3/9/2018 9:21 AM, Anirudh Venkataramanan wrote:
> > A control queue is a hardware interface which is used by the driver
> > to interact with other subsystems (like firmware, PHY, etc.). It is
> > implemented as a producer-consumer ring. More specifically, an
> > "admin queue" is a type of control queue used to interact with the
> > firmware.
> > 
> > This patch introduces data structures and functions to initialize
> > and teardown control/admin queues. Once the admin queue is
> > initialized,
> > the driver uses it to get the firmware version.
> > 
> > Signed-off-by: Anirudh Venkataramanan  > .com>
> > ---
> >drivers/net/ethernet/intel/ice/Makefile |   4 +-
> >drivers/net/ethernet/intel/ice/ice.h|   1 +
> >drivers/net/ethernet/intel/ice/ice_adminq_cmd.h | 108 +++
> >drivers/net/ethernet/intel/ice/ice_common.c | 144 
> >drivers/net/ethernet/intel/ice/ice_common.h |  39 +
> >drivers/net/ethernet/intel/ice/ice_controlq.c   | 979
> > 
> >drivers/net/ethernet/intel/ice/ice_controlq.h   |  97 +++
> >drivers/net/ethernet/intel/ice/ice_hw_autogen.h |  46 ++
> >drivers/net/ethernet/intel/ice/ice_main.c   |  11 +-
> >drivers/net/ethernet/intel/ice/ice_osdep.h  |  86 +++
> >drivers/net/ethernet/intel/ice/ice_status.h |  35 +
> >drivers/net/ethernet/intel/ice/ice_type.h   |  22 +
> >12 files changed, 1570 insertions(+), 2 deletions(-)
> >create mode 100644
> > drivers/net/ethernet/intel/ice/ice_adminq_cmd.h
> >create mode 100644 drivers/net/ethernet/intel/ice/ice_common.c
> >create mode 100644 drivers/net/ethernet/intel/ice/ice_common.h
> >create mode 100644 drivers/net/ethernet/intel/ice/ice_controlq.c
> >create mode 100644 drivers/net/ethernet/intel/ice/ice_controlq.h
> >create mode 100644
> > drivers/net/ethernet/intel/ice/ice_hw_autogen.h
> >create mode 100644 drivers/net/ethernet/intel/ice/ice_osdep.h
> >create mode 100644 drivers/net/ethernet/intel/ice/ice_status.h
> > 
> > diff --git a/drivers/net/ethernet/intel/ice/Makefile
> > b/drivers/net/ethernet/intel/ice/Makefile
> > index 2a177ea21b74..eebf619e84a8 100644
> > --- a/drivers/net/ethernet/intel/ice/Makefile
> > +++ b/drivers/net/ethernet/intel/ice/Makefile
> > @@ -24,4 +24,6 @@
> >
> >obj-$(CONFIG_ICE) += ice.o
> >
> > -ice-y := ice_main.o
> > +ice-y := ice_main.o  \
> > +  ice_controlq.o \
> > +  ice_common.o
> > diff --git a/drivers/net/ethernet/intel/ice/ice.h
> > b/drivers/net/ethernet/intel/ice/ice.h
> > index d781027330cc..ea2fb63bb095 100644
> > --- a/drivers/net/ethernet/intel/ice/ice.h
> > +++ b/drivers/net/ethernet/intel/ice/ice.h
> > @@ -26,6 +26,7 @@
> >#include 
> >#include 
> >#include 
> > +#include 
> >#include 
> >#include "ice_devids.h"
> >#include "ice_type.h"
> > diff --git a/drivers/net/ethernet/intel/ice/ice_adminq_cmd.h
> > b/drivers/net/ethernet/intel/ice/ice_adminq_cmd.h
> > new file mode 100644
> > index ..885fa3c6fec4
> > --- /dev/null
> > +++ b/drivers/net/ethernet/intel/ice/ice_adminq_cmd.h
> > @@ -0,0 +1,108 @@
> > +/* SPDX-License-Identifier: GPL-2.0-only */
> > +/* Intel(R) Ethernet Connection E800 Series Linux Driver
> > + * Copyright (c) 2018, Intel Corporation.
> > + *
> > + * This program is free software; you can redistribute it and/or
> > modify it
> > + * under the terms and conditions of the GNU General Public
> > License,
> > + * version 2, as published by the Free Software Foundation.
> > + *
> > + * This program is distributed in the hope it will be useful, but
> > WITHOUT
> > + * ANY WARRANTY; without even the implied warranty of
> > MERCHANTABILITY or
> > + * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public
> > License for
> > + * more details.
> > + *
> > + * The full GNU General Public License is included in this
> > distribution in
> > + * the file called "COPYING".
> > + */
> > +
> > +#ifndef _ICE_ADMINQ_CMD_H_
> > +#define _ICE_ADMINQ_CMD_H_
> > +
> > +/* This header file defines the Admin Queue commands, error codes
> > and
> > + * descriptor format.  It is shared between Firmware and Software.
> > + */
> > +
> > +struct ice_aqc_generic {
> > + __le32 param0;
> > + __le32 param1;
> > + __le32 addr_high;
> > + __le32 addr_low;
> > +};
> > +
> > +/* Get version (direct 0x0001) */
> > +struct ice_aqc_get_ver {
> > + __le32 rom_ver;
> > + __le32 fw_build;
> > + u8 fw_branch;
> > + u8 fw_major;
> > + u8 fw_minor;
> > + u8 fw_patch;
> > + u8 api_branch;
> > + u8 api_major;
> > + u8 api_minor;
> > + u8 api_patch;
> > +};
> > +
> > +/* Queue Shutdown (direct 0x0003) */
> > +struct ice_aqc_q_shutdown {
> > +#define ICE_AQC_DRIVER_UNLOADING BIT(0)
> > + __le32 driver_unloading;
> > + u8 reserved[12];
> > +};
> > +
> > +/**
> > + * struct ice_aq_desc - Admin Queue (AQ

Re: [Intel-wired-lan] [PATCH 02/15] ice: Add support for control queues

2018-03-12 Thread Shannon Nelson

On 3/9/2018 9:21 AM, Anirudh Venkataramanan wrote:

A control queue is a hardware interface which is used by the driver
to interact with other subsystems (like firmware, PHY, etc.). It is
implemented as a producer-consumer ring. More specifically, an
"admin queue" is a type of control queue used to interact with the
firmware.

This patch introduces data structures and functions to initialize
and teardown control/admin queues. Once the admin queue is initialized,
the driver uses it to get the firmware version.

Signed-off-by: Anirudh Venkataramanan 
---
  drivers/net/ethernet/intel/ice/Makefile |   4 +-
  drivers/net/ethernet/intel/ice/ice.h|   1 +
  drivers/net/ethernet/intel/ice/ice_adminq_cmd.h | 108 +++
  drivers/net/ethernet/intel/ice/ice_common.c | 144 
  drivers/net/ethernet/intel/ice/ice_common.h |  39 +
  drivers/net/ethernet/intel/ice/ice_controlq.c   | 979 
  drivers/net/ethernet/intel/ice/ice_controlq.h   |  97 +++
  drivers/net/ethernet/intel/ice/ice_hw_autogen.h |  46 ++
  drivers/net/ethernet/intel/ice/ice_main.c   |  11 +-
  drivers/net/ethernet/intel/ice/ice_osdep.h  |  86 +++
  drivers/net/ethernet/intel/ice/ice_status.h |  35 +
  drivers/net/ethernet/intel/ice/ice_type.h   |  22 +
  12 files changed, 1570 insertions(+), 2 deletions(-)
  create mode 100644 drivers/net/ethernet/intel/ice/ice_adminq_cmd.h
  create mode 100644 drivers/net/ethernet/intel/ice/ice_common.c
  create mode 100644 drivers/net/ethernet/intel/ice/ice_common.h
  create mode 100644 drivers/net/ethernet/intel/ice/ice_controlq.c
  create mode 100644 drivers/net/ethernet/intel/ice/ice_controlq.h
  create mode 100644 drivers/net/ethernet/intel/ice/ice_hw_autogen.h
  create mode 100644 drivers/net/ethernet/intel/ice/ice_osdep.h
  create mode 100644 drivers/net/ethernet/intel/ice/ice_status.h

diff --git a/drivers/net/ethernet/intel/ice/Makefile 
b/drivers/net/ethernet/intel/ice/Makefile
index 2a177ea21b74..eebf619e84a8 100644
--- a/drivers/net/ethernet/intel/ice/Makefile
+++ b/drivers/net/ethernet/intel/ice/Makefile
@@ -24,4 +24,6 @@
  
  obj-$(CONFIG_ICE) += ice.o
  
-ice-y := ice_main.o

+ice-y := ice_main.o\
+ice_controlq.o \
+ice_common.o
diff --git a/drivers/net/ethernet/intel/ice/ice.h 
b/drivers/net/ethernet/intel/ice/ice.h
index d781027330cc..ea2fb63bb095 100644
--- a/drivers/net/ethernet/intel/ice/ice.h
+++ b/drivers/net/ethernet/intel/ice/ice.h
@@ -26,6 +26,7 @@
  #include 
  #include 
  #include 
+#include 
  #include 
  #include "ice_devids.h"
  #include "ice_type.h"
diff --git a/drivers/net/ethernet/intel/ice/ice_adminq_cmd.h 
b/drivers/net/ethernet/intel/ice/ice_adminq_cmd.h
new file mode 100644
index ..885fa3c6fec4
--- /dev/null
+++ b/drivers/net/ethernet/intel/ice/ice_adminq_cmd.h
@@ -0,0 +1,108 @@
+/* SPDX-License-Identifier: GPL-2.0-only */
+/* Intel(R) Ethernet Connection E800 Series Linux Driver
+ * Copyright (c) 2018, Intel Corporation.
+ *
+ * This program is free software; you can redistribute it and/or modify it
+ * under the terms and conditions of the GNU General Public License,
+ * version 2, as published by the Free Software Foundation.
+ *
+ * This program is distributed in the hope it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License for
+ * more details.
+ *
+ * The full GNU General Public License is included in this distribution in
+ * the file called "COPYING".
+ */
+
+#ifndef _ICE_ADMINQ_CMD_H_
+#define _ICE_ADMINQ_CMD_H_
+
+/* This header file defines the Admin Queue commands, error codes and
+ * descriptor format.  It is shared between Firmware and Software.
+ */
+
+struct ice_aqc_generic {
+   __le32 param0;
+   __le32 param1;
+   __le32 addr_high;
+   __le32 addr_low;
+};
+
+/* Get version (direct 0x0001) */
+struct ice_aqc_get_ver {
+   __le32 rom_ver;
+   __le32 fw_build;
+   u8 fw_branch;
+   u8 fw_major;
+   u8 fw_minor;
+   u8 fw_patch;
+   u8 api_branch;
+   u8 api_major;
+   u8 api_minor;
+   u8 api_patch;
+};
+
+/* Queue Shutdown (direct 0x0003) */
+struct ice_aqc_q_shutdown {
+#define ICE_AQC_DRIVER_UNLOADING   BIT(0)
+   __le32 driver_unloading;
+   u8 reserved[12];
+};
+
+/**
+ * struct ice_aq_desc - Admin Queue (AQ) descriptor
+ * @flags: ICE_AQ_FLAG_* flags
+ * @opcode: AQ command opcode
+ * @datalen: length in bytes of indirect/external data buffer
+ * @retval: return value from firmware
+ * @cookie_h: opaque data high-half
+ * @cookie_l: opaque data low-half
+ * @params: command-specific parameters
+ *
+ * Descriptor format for commands the driver posts on the Admin Transmit Queue
+ * (ATQ).  The firmware writes back onto the command descriptor and returns
+ * the result of the command.  Asynchronous events that are not an immediate
+ * result of the command are written to the Ad