diff mbox

[net-next,15/18] liquidio support for new device cn23xx

Message ID 1470250549-10993-16-git-send-email-rvatsavayi@caviumnetworks.com
State Changes Requested, archived
Delegated to: David Miller
Headers show

Commit Message

Raghu Vatsavayi Aug. 3, 2016, 6:55 p.m. UTC
This patch adds support for LED identification and ethtool
based statistics for cn23xx device.

Signed-off-by: Derek Chickles <derek.chickles@caviumnetworks.com>
Signed-off-by: Satanand Burla <satananda.burla@caviumnetworks.com>
Signed-off-by: Felix Manlunas <felix.manlunas@caviumnetworks.com>
Signed-off-by: Raghu Vatsavayi <raghu.vatsavayi@caviumnetworks.com>
---
 .../ethernet/cavium/liquidio/cn23xx_pf_device.h    |   2 +
 drivers/net/ethernet/cavium/liquidio/lio_core.c    |   6 +
 drivers/net/ethernet/cavium/liquidio/lio_ethtool.c | 379 ++++++++++++++++++++-
 .../net/ethernet/cavium/liquidio/liquidio_common.h |   5 +
 4 files changed, 384 insertions(+), 8 deletions(-)

Comments

kernel test robot Aug. 3, 2016, 10:54 p.m. UTC | #1
Hi Raghu,

[auto build test WARNING on net-next/master]

url:    https://github.com/0day-ci/linux/commits/Raghu-Vatsavayi/liquidio-support-for-new-device-cn23xx/20160804-063711
config: tile-allmodconfig (attached as .config)
compiler: tilegx-linux-gcc (GCC) 4.6.2
reproduce:
        wget https://git.kernel.org/cgit/linux/kernel/git/wfg/lkp-tests.git/plain/sbin/make.cross -O ~/bin/make.cross
        chmod +x ~/bin/make.cross
        # save the attached .config to linux build tree
        make.cross ARCH=tile 

All warnings (new ones prefixed by >>):

   drivers/net/ethernet/cavium/liquidio/lio_ethtool.c: In function 'cn23xx_read_csr_reg':
>> drivers/net/ethernet/cavium/liquidio/lio_ethtool.c:1708:10: warning: format '%lx' expects argument of type 'long unsigned int', but argument 6 has type 'u64' [-Wformat]
   drivers/net/ethernet/cavium/liquidio/lio_ethtool.c:1714:7: warning: format '%lx' expects argument of type 'long unsigned int', but argument 6 has type 'u64' [-Wformat]
   drivers/net/ethernet/cavium/liquidio/lio_ethtool.c:1720:7: warning: format '%lx' expects argument of type 'long unsigned int', but argument 6 has type 'u64' [-Wformat]
   drivers/net/ethernet/cavium/liquidio/lio_ethtool.c:1725:10: warning: format '%lx' expects argument of type 'long unsigned int', but argument 4 has type 'u64' [-Wformat]
   drivers/net/ethernet/cavium/liquidio/lio_ethtool.c:1732:6: warning: format '%lx' expects argument of type 'long unsigned int', but argument 6 has type 'u64' [-Wformat]
   drivers/net/ethernet/cavium/liquidio/lio_ethtool.c:1739:10: warning: format '%lx' expects argument of type 'long unsigned int', but argument 6 has type 'u64' [-Wformat]
   drivers/net/ethernet/cavium/liquidio/lio_ethtool.c:1744:10: warning: format '%lx' expects argument of type 'long unsigned int', but argument 4 has type 'u64' [-Wformat]
   drivers/net/ethernet/cavium/liquidio/lio_ethtool.c:1749:10: warning: format '%lx' expects argument of type 'long unsigned int', but argument 4 has type 'u64' [-Wformat]
   drivers/net/ethernet/cavium/liquidio/lio_ethtool.c:1754:10: warning: format '%lx' expects argument of type 'long unsigned int', but argument 4 has type 'u64' [-Wformat]
   drivers/net/ethernet/cavium/liquidio/lio_ethtool.c:1759:10: warning: format '%lx' expects argument of type 'long unsigned int', but argument 4 has type 'u64' [-Wformat]
   drivers/net/ethernet/cavium/liquidio/lio_ethtool.c:1764:10: warning: format '%lx' expects argument of type 'long unsigned int', but argument 4 has type 'u64' [-Wformat]
   drivers/net/ethernet/cavium/liquidio/lio_ethtool.c:1769:10: warning: format '%lx' expects argument of type 'long unsigned int', but argument 4 has type 'u64' [-Wformat]
   drivers/net/ethernet/cavium/liquidio/lio_ethtool.c:1774:10: warning: format '%lx' expects argument of type 'long unsigned int', but argument 4 has type 'u64' [-Wformat]
   drivers/net/ethernet/cavium/liquidio/lio_ethtool.c:1782:11: warning: format '%lx' expects argument of type 'long unsigned int', but argument 4 has type 'u64' [-Wformat]
   drivers/net/ethernet/cavium/liquidio/lio_ethtool.c:1788:11: warning: format '%lx' expects argument of type 'long unsigned int', but argument 4 has type 'u64' [-Wformat]
   drivers/net/ethernet/cavium/liquidio/lio_ethtool.c:1795:8: warning: format '%lx' expects argument of type 'long unsigned int', but argument 5 has type 'u64' [-Wformat]
   drivers/net/ethernet/cavium/liquidio/lio_ethtool.c:1803:11: warning: format '%lx' expects argument of type 'long unsigned int', but argument 5 has type 'u64' [-Wformat]
   drivers/net/ethernet/cavium/liquidio/lio_ethtool.c:1811:7: warning: format '%lx' expects argument of type 'long unsigned int', but argument 5 has type 'u64' [-Wformat]
   drivers/net/ethernet/cavium/liquidio/lio_ethtool.c:1819:7: warning: format '%lx' expects argument of type 'long unsigned int', but argument 5 has type 'u64' [-Wformat]
   drivers/net/ethernet/cavium/liquidio/lio_ethtool.c:1827:11: warning: format '%lx' expects argument of type 'long unsigned int', but argument 5 has type 'u64' [-Wformat]
   drivers/net/ethernet/cavium/liquidio/lio_ethtool.c:1835:11: warning: format '%lx' expects argument of type 'long unsigned int', but argument 5 has type 'u64' [-Wformat]
   drivers/net/ethernet/cavium/liquidio/lio_ethtool.c:1843:11: warning: format '%lx' expects argument of type 'long unsigned int', but argument 5 has type 'u64' [-Wformat]
   drivers/net/ethernet/cavium/liquidio/lio_ethtool.c:1850:11: warning: format '%lx' expects argument of type 'long unsigned int', but argument 5 has type 'u64' [-Wformat]
   drivers/net/ethernet/cavium/liquidio/lio_ethtool.c:1858:11: warning: format '%lx' expects argument of type 'long unsigned int', but argument 5 has type 'u64' [-Wformat]
   drivers/net/ethernet/cavium/liquidio/lio_ethtool.c:1866:5: warning: format '%lx' expects argument of type 'long unsigned int', but argument 5 has type 'u64' [-Wformat]
   drivers/net/ethernet/cavium/liquidio/lio_ethtool.c:1875:8: warning: format '%lx' expects argument of type 'long unsigned int', but argument 5 has type 'u64' [-Wformat]
   drivers/net/ethernet/cavium/liquidio/lio_ethtool.c:1884:8: warning: format '%lx' expects argument of type 'long unsigned int', but argument 5 has type 'u64' [-Wformat]
   drivers/net/ethernet/cavium/liquidio/lio_ethtool.c:1893:8: warning: format '%lx' expects argument of type 'long unsigned int', but argument 5 has type 'u64' [-Wformat]
   drivers/net/ethernet/cavium/liquidio/lio_ethtool.c:1901:11: warning: format '%lx' expects argument of type 'long unsigned int', but argument 5 has type 'u64' [-Wformat]

vim +1708 drivers/net/ethernet/cavium/liquidio/lio_ethtool.c

  1692	
  1693	static int cn23xx_read_csr_reg(char *s, struct octeon_device *oct)
  1694	{
  1695		u32 reg;
  1696		u8 pf_num = oct->pf_num;
  1697		int len = 0;
  1698		int i;
  1699	
  1700		/* PCI  Window Registers */
  1701	
  1702		len += sprintf(s + len, "\n\t Octeon CSR Registers\n\n");
  1703	
  1704		/*0x29030 or 0x29040*/
  1705		reg = CN23XX_SLI_PKT_MAC_RINFO64(oct->pcie_port, oct->pf_num);
  1706		len += sprintf(s + len, "\n[%08x] (SLI_PKT_MAC%d_PF%d_RINFO): %016lx\n",
  1707			       reg, oct->pcie_port, oct->pf_num,
> 1708			       octeon_read_csr64(oct, reg));
  1709	
  1710		/*0x27080 or 0x27090*/
  1711		reg = CN23XX_SLI_MAC_PF_INT_ENB64(oct->pcie_port, oct->pf_num);
  1712		len +=
  1713		    sprintf(s + len, "\n[%08x] (SLI_MAC%d_PF%d_INT_ENB): %016lx\n", reg,
  1714			    oct->pcie_port, oct->pf_num, octeon_read_csr64(oct, reg));
  1715	
  1716		/*0x27000 or 0x27010*/

---
0-DAY kernel test infrastructure                Open Source Technology Center
https://lists.01.org/pipermail/kbuild-all                   Intel Corporation
kernel test robot Aug. 3, 2016, 11:15 p.m. UTC | #2
Hi Raghu,

[auto build test WARNING on net-next/master]

url:    https://github.com/0day-ci/linux/commits/Raghu-Vatsavayi/liquidio-support-for-new-device-cn23xx/20160804-063711
config: sparc64-allmodconfig (attached as .config)
compiler: sparc64-linux-gnu-gcc (Debian 5.4.0-6) 5.4.0 20160609
reproduce:
        wget https://git.kernel.org/cgit/linux/kernel/git/wfg/lkp-tests.git/plain/sbin/make.cross -O ~/bin/make.cross
        chmod +x ~/bin/make.cross
        # save the attached .config to linux build tree
        make.cross ARCH=sparc64 

All warnings (new ones prefixed by >>):

   drivers/net/ethernet/cavium/liquidio/lio_ethtool.c: In function 'cn23xx_read_csr_reg':
>> drivers/net/ethernet/cavium/liquidio/lio_ethtool.c:1706:26: warning: format '%lx' expects argument of type 'long unsigned int', but argument 6 has type 'u64 {aka long long unsigned int}' [-Wformat=]
     len += sprintf(s + len, "\n[%08x] (SLI_PKT_MAC%d_PF%d_RINFO): %016lx\n",
                             ^
   drivers/net/ethernet/cavium/liquidio/lio_ethtool.c:1713:23: warning: format '%lx' expects argument of type 'long unsigned int', but argument 6 has type 'u64 {aka long long unsigned int}' [-Wformat=]
         sprintf(s + len, "\n[%08x] (SLI_MAC%d_PF%d_INT_ENB): %016lx\n", reg,
                          ^
   drivers/net/ethernet/cavium/liquidio/lio_ethtool.c:1719:23: warning: format '%lx' expects argument of type 'long unsigned int', but argument 6 has type 'u64 {aka long long unsigned int}' [-Wformat=]
         sprintf(s + len, "\n[%08x] (SLI_MAC%d_PF%d_INT_SUM): %016lx\n", reg,
                          ^
   drivers/net/ethernet/cavium/liquidio/lio_ethtool.c:1724:26: warning: format '%lx' expects argument of type 'long unsigned int', but argument 4 has type 'u64 {aka long long unsigned int}' [-Wformat=]
     len += sprintf(s + len, "\n[%08x] (SLI_PKT_MEM_CTL): %016lx\n", reg,
                             ^
   drivers/net/ethernet/cavium/liquidio/lio_ethtool.c:1731:15: warning: format '%lx' expects argument of type 'long unsigned int', but argument 6 has type 'u64 {aka long long unsigned int}' [-Wformat=]
         s + len, "\n[%08x] (SLI_MAC%d_PF%d_PKT_VF_INT): %016lx\n", reg,
                  ^
   drivers/net/ethernet/cavium/liquidio/lio_ethtool.c:1737:26: warning: format '%lx' expects argument of type 'long unsigned int', but argument 6 has type 'u64 {aka long long unsigned int}' [-Wformat=]
     len += sprintf(s + len, "\n[%08x] (SLI_MAC%d_PF%d_PP_VF_INT): %016lx\n",
                             ^
   drivers/net/ethernet/cavium/liquidio/lio_ethtool.c:1743:26: warning: format '%lx' expects argument of type 'long unsigned int', but argument 4 has type 'u64 {aka long long unsigned int}' [-Wformat=]
     len += sprintf(s + len, "\n[%08x] (SLI_PKT_CNT_INT): %016lx\n", reg,
                             ^
   drivers/net/ethernet/cavium/liquidio/lio_ethtool.c:1748:26: warning: format '%lx' expects argument of type 'long unsigned int', but argument 4 has type 'u64 {aka long long unsigned int}' [-Wformat=]
     len += sprintf(s + len, "\n[%08x] (SLI_PKT_TIME_INT): %016lx\n", reg,
                             ^
   drivers/net/ethernet/cavium/liquidio/lio_ethtool.c:1753:26: warning: format '%lx' expects argument of type 'long unsigned int', but argument 4 has type 'u64 {aka long long unsigned int}' [-Wformat=]
     len += sprintf(s + len, "\n[%08x] (SLI_PKT_INT): %016lx\n", reg,
                             ^
   drivers/net/ethernet/cavium/liquidio/lio_ethtool.c:1758:26: warning: format '%lx' expects argument of type 'long unsigned int', but argument 4 has type 'u64 {aka long long unsigned int}' [-Wformat=]
     len += sprintf(s + len, "\n[%08x] (SLI_PKT_OUTPUT_WMARK): %016lx\n",
                             ^
   drivers/net/ethernet/cavium/liquidio/lio_ethtool.c:1763:26: warning: format '%lx' expects argument of type 'long unsigned int', but argument 4 has type 'u64 {aka long long unsigned int}' [-Wformat=]
     len += sprintf(s + len, "\n[%08x] (SLI_PKT_RING_RST): %016lx\n", reg,
                             ^
   drivers/net/ethernet/cavium/liquidio/lio_ethtool.c:1768:26: warning: format '%lx' expects argument of type 'long unsigned int', but argument 4 has type 'u64 {aka long long unsigned int}' [-Wformat=]
     len += sprintf(s + len, "\n[%08x] (SLI_PKT_GBL_CONTROL): %016lx\n", reg,
                             ^
   drivers/net/ethernet/cavium/liquidio/lio_ethtool.c:1773:26: warning: format '%lx' expects argument of type 'long unsigned int', but argument 4 has type 'u64 {aka long long unsigned int}' [-Wformat=]
     len += sprintf(s + len, "\n[%08x] (SLI_PKT_BIST_STATUS): %016lx\n", reg,
                             ^
   drivers/net/ethernet/cavium/liquidio/lio_ethtool.c:1781:11: warning: format '%lx' expects argument of type 'long unsigned int', but argument 4 has type 'u64 {aka long long unsigned int}' [-Wformat=]
              "\n[%08x] (SLI_PKT_OUT_BP_EN_W1S):  %016lx\n",
              ^
   drivers/net/ethernet/cavium/liquidio/lio_ethtool.c:1787:11: warning: format '%lx' expects argument of type 'long unsigned int', but argument 4 has type 'u64 {aka long long unsigned int}' [-Wformat=]
              "\n[%08x] (SLI_PKT_OUT_BP_EN2_W1S): %016lx\n",
              ^
   drivers/net/ethernet/cavium/liquidio/lio_ethtool.c:1794:24: warning: format '%lx' expects argument of type 'long unsigned int', but argument 5 has type 'u64 {aka long long unsigned int}' [-Wformat=]
          sprintf(s + len, "\n[%08x] (SLI_PKT%d_OUT_SIZE): %016lx\n",
                           ^
   drivers/net/ethernet/cavium/liquidio/lio_ethtool.c:1802:11: warning: format '%lx' expects argument of type 'long unsigned int', but argument 5 has type 'u64 {aka long long unsigned int}' [-Wformat=]
              "\n[%08x] (SLI_PKT_IN_DONE%d_CNTS): %016lx\n",
              ^
   drivers/net/ethernet/cavium/liquidio/lio_ethtool.c:1810:16: warning: format '%lx' expects argument of type 'long unsigned int', but argument 5 has type 'u64 {aka long long unsigned int}' [-Wformat=]
          s + len, "\n[%08x] (SLI_PKT%d_SLIST_BAOFF_DBELL): %016lx\n",
                   ^
   drivers/net/ethernet/cavium/liquidio/lio_ethtool.c:1818:16: warning: format '%lx' expects argument of type 'long unsigned int', but argument 5 has type 'u64 {aka long long unsigned int}' [-Wformat=]
          s + len, "\n[%08x] (SLI_PKT%d_SLIST_FIFO_RSIZE): %016lx\n",
                   ^
   drivers/net/ethernet/cavium/liquidio/lio_ethtool.c:1826:11: warning: format '%lx' expects argument of type 'long unsigned int', but argument 5 has type 'u64 {aka long long unsigned int}' [-Wformat=]
              "\n[%08x] (SLI_PKT%d__OUTPUT_CONTROL): %016lx\n",
              ^
   drivers/net/ethernet/cavium/liquidio/lio_ethtool.c:1834:11: warning: format '%lx' expects argument of type 'long unsigned int', but argument 5 has type 'u64 {aka long long unsigned int}' [-Wformat=]
              "\n[%08x] (SLI_PKT%d_SLIST_BADDR): %016lx\n",
              ^
   drivers/net/ethernet/cavium/liquidio/lio_ethtool.c:1842:11: warning: format '%lx' expects argument of type 'long unsigned int', but argument 5 has type 'u64 {aka long long unsigned int}' [-Wformat=]
              "\n[%08x] (SLI_PKT%d_INT_LEVELS): %016lx\n", reg,
              ^
   drivers/net/ethernet/cavium/liquidio/lio_ethtool.c:1849:27: warning: format '%lx' expects argument of type 'long unsigned int', but argument 5 has type 'u64 {aka long long unsigned int}' [-Wformat=]
      len += sprintf(s + len, "\n[%08x] (SLI_PKT%d_CNTS): %016lx\n",
                              ^
   drivers/net/ethernet/cavium/liquidio/lio_ethtool.c:1857:11: warning: format '%lx' expects argument of type 'long unsigned int', but argument 5 has type 'u64 {aka long long unsigned int}' [-Wformat=]
              "\n[%08x] (SLI_PKT%d_ERROR_INFO): %016lx\n", reg,
              ^
   drivers/net/ethernet/cavium/liquidio/lio_ethtool.c:1865:5: warning: format '%lx' expects argument of type 'long unsigned int', but argument 5 has type 'u64 {aka long long unsigned int}' [-Wformat=]
        "\n[%08x] (SLI_PKT%d_INPUT_CONTROL): %016lx\n",
        ^
   drivers/net/ethernet/cavium/liquidio/lio_ethtool.c:1874:8: warning: format '%lx' expects argument of type 'long unsigned int', but argument 5 has type 'u64 {aka long long unsigned int}' [-Wformat=]
           "\n[%08x] (SLI_PKT%d_INSTR_BADDR): %016lx\n", reg,
           ^
   drivers/net/ethernet/cavium/liquidio/lio_ethtool.c:1883:8: warning: format '%lx' expects argument of type 'long unsigned int', but argument 5 has type 'u64 {aka long long unsigned int}' [-Wformat=]
           "\n[%08x] (SLI_PKT%d_INSTR_BAOFF_DBELL): %016lx\n",
           ^
   drivers/net/ethernet/cavium/liquidio/lio_ethtool.c:1892:8: warning: format '%lx' expects argument of type 'long unsigned int', but argument 5 has type 'u64 {aka long long unsigned int}' [-Wformat=]
           "\n[%08x] (SLI_PKT%d_INSTR_FIFO_RSIZE): %016lx\n",
           ^
   drivers/net/ethernet/cavium/liquidio/lio_ethtool.c:1900:11: warning: format '%lx' expects argument of type 'long unsigned int', but argument 5 has type 'u64 {aka long long unsigned int}' [-Wformat=]
              "\n[%08x] (SLI_PKT_IN_DONE%d_CNTS): %016lx\n",
              ^

vim +1706 drivers/net/ethernet/cavium/liquidio/lio_ethtool.c

  1690		}
  1691	}
  1692	
  1693	static int cn23xx_read_csr_reg(char *s, struct octeon_device *oct)
  1694	{
  1695		u32 reg;
  1696		u8 pf_num = oct->pf_num;
  1697		int len = 0;
  1698		int i;
  1699	
  1700		/* PCI  Window Registers */
  1701	
  1702		len += sprintf(s + len, "\n\t Octeon CSR Registers\n\n");
  1703	
  1704		/*0x29030 or 0x29040*/
  1705		reg = CN23XX_SLI_PKT_MAC_RINFO64(oct->pcie_port, oct->pf_num);
> 1706		len += sprintf(s + len, "\n[%08x] (SLI_PKT_MAC%d_PF%d_RINFO): %016lx\n",
  1707			       reg, oct->pcie_port, oct->pf_num,
  1708			       octeon_read_csr64(oct, reg));
  1709	
  1710		/*0x27080 or 0x27090*/
  1711		reg = CN23XX_SLI_MAC_PF_INT_ENB64(oct->pcie_port, oct->pf_num);
  1712		len +=
  1713		    sprintf(s + len, "\n[%08x] (SLI_MAC%d_PF%d_INT_ENB): %016lx\n", reg,
  1714			    oct->pcie_port, oct->pf_num, octeon_read_csr64(oct, reg));

---
0-DAY kernel test infrastructure                Open Source Technology Center
https://lists.01.org/pipermail/kbuild-all                   Intel Corporation
diff mbox

Patch

diff --git a/drivers/net/ethernet/cavium/liquidio/cn23xx_pf_device.h b/drivers/net/ethernet/cavium/liquidio/cn23xx_pf_device.h
index ec25ea3..fa74caf 100644
--- a/drivers/net/ethernet/cavium/liquidio/cn23xx_pf_device.h
+++ b/drivers/net/ethernet/cavium/liquidio/cn23xx_pf_device.h
@@ -51,6 +51,8 @@  int setup_cn23xx_octeon_pf_device(struct octeon_device *oct);
 int validate_cn23xx_pf_config_info(struct octeon_device *oct,
 				   struct octeon_config *conf23xx);
 
+u32 cn23xx_pf_get_oq_ticks(struct octeon_device *oct, u32 time_intr_in_us);
+
 void cn23xx_dump_pf_initialized_regs(struct octeon_device *oct);
 
 int cn23xx_fw_lock(struct octeon_device *oct);
diff --git a/drivers/net/ethernet/cavium/liquidio/lio_core.c b/drivers/net/ethernet/cavium/liquidio/lio_core.c
index ad1db3f..2551645 100644
--- a/drivers/net/ethernet/cavium/liquidio/lio_core.c
+++ b/drivers/net/ethernet/cavium/liquidio/lio_core.c
@@ -163,6 +163,12 @@  void liquidio_link_ctrl_cmd_completion(void *nctrl_ptr)
 
 	case OCTNET_CMD_GPIO_ACCESS:
 		netif_info(lio, probe, lio->netdev, "LED Flashing visual identification\n");
+
+		break;
+
+	case OCTNET_CMD_ID_ACTIVE:
+		netif_info(lio, probe, lio->netdev, "LED Flashing visual identification\n");
+
 		break;
 
 	case OCTNET_CMD_LRO_ENABLE:
diff --git a/drivers/net/ethernet/cavium/liquidio/lio_ethtool.c b/drivers/net/ethernet/cavium/liquidio/lio_ethtool.c
index 16a92b9..d05e9b4 100644
--- a/drivers/net/ethernet/cavium/liquidio/lio_ethtool.c
+++ b/drivers/net/ethernet/cavium/liquidio/lio_ethtool.c
@@ -32,6 +32,7 @@ 
 #include "octeon_network.h"
 #include "cn66xx_regs.h"
 #include "cn66xx_device.h"
+#include "cn23xx_pf_device.h"
 
 static int octnet_get_link_stats(struct net_device *netdev);
 
@@ -75,6 +76,7 @@  enum {
 
 #define ARRAY_LENGTH(a) (sizeof(a) / sizeof((a)[0]))
 #define OCT_ETHTOOL_REGDUMP_LEN  4096
+#define OCT_ETHTOOL_REGDUMP_LEN_23XX  (4096 * 11)
 #define OCT_ETHTOOL_REGSVER  1
 
 /* statistics of PF */
@@ -259,6 +261,13 @@  lio_ethtool_get_channels(struct net_device *dev,
 		max_tx = CFG_GET_IQ_MAX_Q(conf6x);
 		rx_count = CFG_GET_NUM_RXQS_NIC_IF(conf6x, lio->ifidx);
 		tx_count = CFG_GET_NUM_TXQS_NIC_IF(conf6x, lio->ifidx);
+	} else if (OCTEON_CN23XX_PF(oct)) {
+		struct octeon_config *conf23 = CHIP_FIELD(oct, cn23xx_pf, conf);
+
+		max_rx = CFG_GET_OQ_MAX_Q(conf23);
+		max_tx = CFG_GET_IQ_MAX_Q(conf23);
+		rx_count = CFG_GET_NUM_RXQS_NIC_IF(conf23, lio->ifidx);
+		tx_count = CFG_GET_NUM_TXQS_NIC_IF(conf23, lio->ifidx);
 	}
 
 	channel->max_rx = max_rx;
@@ -332,6 +341,32 @@  static int octnet_gpio_access(struct net_device *netdev, int addr, int val)
 	return 0;
 }
 
+static int octnet_id_active(struct net_device *netdev, int val)
+{
+	struct lio *lio = GET_LIO(netdev);
+	struct octeon_device *oct = lio->oct_dev;
+	struct octnic_ctrl_pkt nctrl;
+	int ret = 0;
+
+	memset(&nctrl, 0, sizeof(struct octnic_ctrl_pkt));
+
+	nctrl.ncmd.u64 = 0;
+	nctrl.ncmd.s.cmd = OCTNET_CMD_ID_ACTIVE;
+	nctrl.ncmd.s.param1 = val;
+	nctrl.iq_no = lio->linfo.txpciq[0].s.q_no;
+	nctrl.wait_time = 100;
+	nctrl.netpndev = (u64)netdev;
+	nctrl.cb_fn = liquidio_link_ctrl_cmd_completion;
+
+	ret = octnet_send_nic_ctrl_pkt(lio->oct_dev, &nctrl);
+	if (ret < 0) {
+		dev_err(&oct->pci_dev->dev, "Failed to configure gpio value\n");
+		return -EINVAL;
+	}
+
+	return 0;
+}
+
 /* Callback for when mdio command response arrives
  */
 static void octnet_mdio_resp_callback(struct octeon_device *oct,
@@ -475,6 +510,11 @@  static int lio_set_phys_id(struct net_device *netdev,
 						   &value);
 			if (ret)
 				return ret;
+		} else if (oct->chip_id == OCTEON_CN23XX_PF_VID) {
+			octnet_id_active(netdev, LED_IDENTIFICATION_ON);
+
+			/* returns 0 since updates are asynchronous */
+			return 0;
 		} else {
 			return -EINVAL;
 		}
@@ -520,7 +560,10 @@  static int lio_set_phys_id(struct net_device *netdev,
 						   &lio->phy_beacon_val);
 			if (ret)
 				return ret;
+		} else if (oct->chip_id == OCTEON_CN23XX_PF_VID) {
+			octnet_id_active(netdev, LED_IDENTIFICATION_OFF);
 
+			return 0;
 		} else {
 			return -EINVAL;
 		}
@@ -549,6 +592,13 @@  lio_ethtool_get_ringparam(struct net_device *netdev,
 		rx_max_pending = CN6XXX_MAX_OQ_DESCRIPTORS;
 		rx_pending = CFG_GET_NUM_RX_DESCS_NIC_IF(conf6x, lio->ifidx);
 		tx_pending = CFG_GET_NUM_TX_DESCS_NIC_IF(conf6x, lio->ifidx);
+	} else if (OCTEON_CN23XX_PF(oct)) {
+		struct octeon_config *conf23 = CHIP_FIELD(oct, cn23xx_pf, conf);
+
+		tx_max_pending = CN23XX_MAX_IQ_DESCRIPTORS;
+		rx_max_pending = CN23XX_MAX_OQ_DESCRIPTORS;
+		rx_pending = CFG_GET_NUM_RX_DESCS_NIC_IF(conf23, lio->ifidx);
+		tx_pending = CFG_GET_NUM_TX_DESCS_NIC_IF(conf23, lio->ifidx);
 	}
 
 	if (lio->mtu > OCTNET_DEFAULT_FRM_SIZE - OCTNET_FRM_HEADER_SIZE) {
@@ -947,6 +997,16 @@  static int lio_get_intr_coalesce(struct net_device *netdev,
 	intrmod_cfg = &oct->intrmod;
 
 	switch (oct->chip_id) {
+	case OCTEON_CN23XX_PF_VID:
+		if (!intrmod_cfg->rx_enable) {
+			intr_coal->rx_coalesce_usecs = intrmod_cfg->rx_usecs;
+			intr_coal->rx_max_coalesced_frames =
+				intrmod_cfg->rx_frames;
+		}
+		if (!intrmod_cfg->tx_enable)
+			intr_coal->tx_max_coalesced_frames =
+				intrmod_cfg->tx_frames;
+		break;
 	case OCTEON_CN68XX:
 	case OCTEON_CN66XX: {
 		struct octeon_cn6xxx *cn6xxx =
@@ -982,7 +1042,15 @@  static int lio_get_intr_coalesce(struct net_device *netdev,
 		intr_coal->rx_coalesce_usecs_low =
 			intrmod_cfg->rx_mintmr_trigger;
 		intr_coal->rx_max_coalesced_frames_low =
-			intrmod_cfg->rx_mincnt_trigger;
+		    intrmod_cfg->rx_mincnt_trigger;
+	}
+	if (OCTEON_CN23XX_PF(oct) &&
+	    (intrmod_cfg->tx_enable)) {
+		intr_coal->use_adaptive_tx_coalesce = intrmod_cfg->tx_enable;
+		intr_coal->tx_max_coalesced_frames_high =
+		    intrmod_cfg->tx_maxcnt_trigger;
+		intr_coal->tx_max_coalesced_frames_low =
+		    intrmod_cfg->tx_mincnt_trigger;
 	}
 	return 0;
 }
@@ -1059,11 +1127,11 @@  static void
 octnet_nic_stats_callback(struct octeon_device *oct_dev,
 			  u32 status, void *ptr)
 {
-	struct octeon_soft_command  *sc = (struct octeon_soft_command  *)ptr;
-	struct oct_nic_stats_resp *resp = (struct oct_nic_stats_resp *)
-		sc->virtrptr;
-	struct oct_nic_stats_ctrl *ctrl = (struct oct_nic_stats_ctrl *)
-		sc->ctxptr;
+	struct octeon_soft_command *sc = (struct octeon_soft_command *)ptr;
+	struct oct_nic_stats_resp *resp =
+	    (struct oct_nic_stats_resp *)sc->virtrptr;
+	struct oct_nic_stats_ctrl *ctrl =
+	    (struct oct_nic_stats_ctrl *)sc->ctxptr;
 	struct nic_rx_stats *rsp_rstats = &resp->stats.fromwire;
 	struct nic_tx_stats *rsp_tstats = &resp->stats.fromhost;
 
@@ -1313,6 +1381,27 @@  oct_cfg_rx_intrcnt(struct lio *lio, struct ethtool_coalesce *intr_coal)
 		CFG_SET_OQ_INTR_PKT(cn6xxx->conf, rx_max_coalesced_frames);
 		break;
 	}
+	case OCTEON_CN23XX_PF_VID: {
+		int q_no;
+
+		if (!intr_coal->rx_max_coalesced_frames)
+			rx_max_coalesced_frames = oct->intrmod.rx_frames;
+		else
+			rx_max_coalesced_frames =
+			    intr_coal->rx_max_coalesced_frames;
+		for (q_no = 0; q_no < oct->num_oqs; q_no++) {
+			q_no += oct->sriov_info.pf_srn;
+			octeon_write_csr64(
+			    oct, CN23XX_SLI_OQ_PKT_INT_LEVELS(q_no),
+			    (octeon_read_csr64(
+				 oct, CN23XX_SLI_OQ_PKT_INT_LEVELS(q_no)) &
+			     (0x3fffff00000000UL)) |
+				rx_max_coalesced_frames);
+			/*consider setting resend bit*/
+		}
+		oct->intrmod.rx_frames = rx_max_coalesced_frames;
+		break;
+	}
 	default:
 		return -EINVAL;
 	}
@@ -1345,6 +1434,27 @@  static int oct_cfg_rx_intrtime(struct lio *lio,
 		CFG_SET_OQ_INTR_TIME(cn6xxx->conf, rx_coalesce_usecs);
 		break;
 	}
+	case OCTEON_CN23XX_PF_VID: {
+		u64 time_threshold;
+		int q_no;
+
+		if (!intr_coal->rx_coalesce_usecs)
+			rx_coalesce_usecs = oct->intrmod.rx_usecs;
+		else
+			rx_coalesce_usecs = intr_coal->rx_coalesce_usecs;
+		time_threshold =
+		    cn23xx_pf_get_oq_ticks(oct, (u32)rx_coalesce_usecs);
+		for (q_no = 0; q_no < oct->num_oqs; q_no++) {
+			q_no += oct->sriov_info.pf_srn;
+			octeon_write_csr64(oct,
+					   CN23XX_SLI_OQ_PKT_INT_LEVELS(q_no),
+					   (oct->intrmod.rx_frames |
+					    ((u64)time_threshold << 32)));
+			/*consider writing to resend bit here*/
+		}
+		oct->intrmod.rx_usecs = rx_coalesce_usecs;
+		break;
+	}
 	default:
 		return -EINVAL;
 	}
@@ -1357,12 +1467,37 @@  oct_cfg_tx_intrcnt(struct lio *lio, struct ethtool_coalesce *intr_coal
 		   __attribute__((unused)))
 {
 	struct octeon_device *oct = lio->oct_dev;
+	u32 iq_intr_pkt;
+	void __iomem *inst_cnt_reg;
+	u64 val;
 
 	/* Config Cnt based interrupt values */
 	switch (oct->chip_id) {
 	case OCTEON_CN68XX:
 	case OCTEON_CN66XX:
 		break;
+	case OCTEON_CN23XX_PF_VID: {
+		int q_no;
+
+		if (!intr_coal->tx_max_coalesced_frames)
+			iq_intr_pkt = CN23XX_DEF_IQ_INTR_THRESHOLD &
+				      CN23XX_PKT_IN_DONE_WMARK_MASK;
+		else
+			iq_intr_pkt = intr_coal->tx_max_coalesced_frames &
+				      CN23XX_PKT_IN_DONE_WMARK_MASK;
+		for (q_no = 0; q_no < oct->num_iqs; q_no++) {
+			inst_cnt_reg = (oct->instr_queue[q_no])->inst_cnt_reg;
+			val = readq(inst_cnt_reg);
+			/*clear wmark and count.dont want to write count back*/
+			val = (val & 0xFFFF000000000000ULL) |
+			      ((u64)iq_intr_pkt
+			       << CN23XX_PKT_IN_DONE_WMARK_BIT_POS);
+			writeq(val, inst_cnt_reg);
+			/*consider setting resend bit*/
+		}
+		oct->intrmod.tx_frames = iq_intr_pkt;
+		break;
+	}
 	default:
 		return -EINVAL;
 	}
@@ -1398,6 +1533,8 @@  static int lio_set_intr_coalesce(struct net_device *netdev,
 			return -EINVAL;
 		}
 		break;
+	case OCTEON_CN23XX_PF_VID:
+		break;
 	default:
 		return -EINVAL;
 	}
@@ -1540,9 +1677,231 @@  static int lio_nway_reset(struct net_device *netdev)
 }
 
 /* Return register dump len. */
-static int lio_get_regs_len(struct net_device *dev __attribute__((unused)))
+static int lio_get_regs_len(struct net_device *dev)
+{
+	struct lio *lio = GET_LIO(dev);
+	struct octeon_device *oct = lio->oct_dev;
+
+	switch (oct->chip_id) {
+	case OCTEON_CN23XX_PF_VID:
+		return OCT_ETHTOOL_REGDUMP_LEN_23XX;
+	default:
+		return OCT_ETHTOOL_REGDUMP_LEN;
+	}
+}
+
+static int cn23xx_read_csr_reg(char *s, struct octeon_device *oct)
 {
-	return OCT_ETHTOOL_REGDUMP_LEN;
+	u32 reg;
+	u8 pf_num = oct->pf_num;
+	int len = 0;
+	int i;
+
+	/* PCI  Window Registers */
+
+	len += sprintf(s + len, "\n\t Octeon CSR Registers\n\n");
+
+	/*0x29030 or 0x29040*/
+	reg = CN23XX_SLI_PKT_MAC_RINFO64(oct->pcie_port, oct->pf_num);
+	len += sprintf(s + len, "\n[%08x] (SLI_PKT_MAC%d_PF%d_RINFO): %016lx\n",
+		       reg, oct->pcie_port, oct->pf_num,
+		       octeon_read_csr64(oct, reg));
+
+	/*0x27080 or 0x27090*/
+	reg = CN23XX_SLI_MAC_PF_INT_ENB64(oct->pcie_port, oct->pf_num);
+	len +=
+	    sprintf(s + len, "\n[%08x] (SLI_MAC%d_PF%d_INT_ENB): %016lx\n", reg,
+		    oct->pcie_port, oct->pf_num, octeon_read_csr64(oct, reg));
+
+	/*0x27000 or 0x27010*/
+	reg = CN23XX_SLI_MAC_PF_INT_SUM64(oct->pcie_port, oct->pf_num);
+	len +=
+	    sprintf(s + len, "\n[%08x] (SLI_MAC%d_PF%d_INT_SUM): %016lx\n", reg,
+		    oct->pcie_port, oct->pf_num, octeon_read_csr64(oct, reg));
+
+	/*0x29120*/
+	reg = 0x29120;
+	len += sprintf(s + len, "\n[%08x] (SLI_PKT_MEM_CTL): %016lx\n", reg,
+		       octeon_read_csr64(oct, reg));
+
+	/*0x27300*/
+	reg = 0x27300 + oct->pcie_port * CN23XX_MAC_INT_OFFSET +
+	      (oct->pf_num) * CN23XX_PF_INT_OFFSET;
+	len += sprintf(
+	    s + len, "\n[%08x] (SLI_MAC%d_PF%d_PKT_VF_INT): %016lx\n", reg,
+	    oct->pcie_port, oct->pf_num, octeon_read_csr64(oct, reg));
+
+	/*0x27200*/
+	reg = 0x27200 + oct->pcie_port * CN23XX_MAC_INT_OFFSET +
+	      (oct->pf_num) * CN23XX_PF_INT_OFFSET;
+	len += sprintf(s + len, "\n[%08x] (SLI_MAC%d_PF%d_PP_VF_INT): %016lx\n",
+		       reg, oct->pcie_port, oct->pf_num,
+		       octeon_read_csr64(oct, reg));
+
+	/*29130*/
+	reg = CN23XX_SLI_PKT_CNT_INT;
+	len += sprintf(s + len, "\n[%08x] (SLI_PKT_CNT_INT): %016lx\n", reg,
+		       octeon_read_csr64(oct, reg));
+
+	/*0x29140*/
+	reg = CN23XX_SLI_PKT_TIME_INT;
+	len += sprintf(s + len, "\n[%08x] (SLI_PKT_TIME_INT): %016lx\n", reg,
+		       octeon_read_csr64(oct, reg));
+
+	/*0x29160*/
+	reg = 0x29160;
+	len += sprintf(s + len, "\n[%08x] (SLI_PKT_INT): %016lx\n", reg,
+		       octeon_read_csr64(oct, reg));
+
+	/*0x29180*/
+	reg = CN23XX_SLI_OQ_WMARK;
+	len += sprintf(s + len, "\n[%08x] (SLI_PKT_OUTPUT_WMARK): %016lx\n",
+		       reg, octeon_read_csr64(oct, reg));
+
+	/*0x291E0*/
+	reg = CN23XX_SLI_PKT_IOQ_RING_RST;
+	len += sprintf(s + len, "\n[%08x] (SLI_PKT_RING_RST): %016lx\n", reg,
+		       octeon_read_csr64(oct, reg));
+
+	/*0x29210*/
+	reg = CN23XX_SLI_GBL_CONTROL;
+	len += sprintf(s + len, "\n[%08x] (SLI_PKT_GBL_CONTROL): %016lx\n", reg,
+		       octeon_read_csr64(oct, reg));
+
+	/*0x29220*/
+	reg = 0x29220;
+	len += sprintf(s + len, "\n[%08x] (SLI_PKT_BIST_STATUS): %016lx\n", reg,
+		       octeon_read_csr64(oct, reg));
+
+	/*PF only*/
+	if (pf_num == 0) {
+		/*0x29260*/
+		reg = CN23XX_SLI_OUT_BP_EN_W1S;
+		len += sprintf(s + len,
+			       "\n[%08x] (SLI_PKT_OUT_BP_EN_W1S):  %016lx\n",
+			       reg, octeon_read_csr64(oct, reg));
+	} else if (pf_num == 1) {
+		/*0x29270*/
+		reg = CN23XX_SLI_OUT_BP_EN2_W1S;
+		len += sprintf(s + len,
+			       "\n[%08x] (SLI_PKT_OUT_BP_EN2_W1S): %016lx\n",
+			       reg, octeon_read_csr64(oct, reg));
+	}
+
+	for (i = 0; i < CN23XX_MAX_OUTPUT_QUEUES; i++) {
+		reg = CN23XX_SLI_OQ_BUFF_INFO_SIZE(i);
+		len +=
+		    sprintf(s + len, "\n[%08x] (SLI_PKT%d_OUT_SIZE): %016lx\n",
+			    reg, i, octeon_read_csr64(oct, reg));
+	}
+
+	/*0x10040*/
+	for (i = 0; i < CN23XX_MAX_INPUT_QUEUES; i++) {
+		reg = CN23XX_SLI_IQ_INSTR_COUNT64(i);
+		len += sprintf(s + len,
+			       "\n[%08x] (SLI_PKT_IN_DONE%d_CNTS): %016lx\n",
+			       reg, i, octeon_read_csr64(oct, reg));
+	}
+
+	/*0x10080*/
+	for (i = 0; i < CN23XX_MAX_OUTPUT_QUEUES; i++) {
+		reg = CN23XX_SLI_OQ_PKTS_CREDIT(i);
+		len += sprintf(
+		    s + len, "\n[%08x] (SLI_PKT%d_SLIST_BAOFF_DBELL): %016lx\n",
+		    reg, i, octeon_read_csr64(oct, reg));
+	}
+
+	/*0x10090*/
+	for (i = 0; i < CN23XX_MAX_OUTPUT_QUEUES; i++) {
+		reg = CN23XX_SLI_OQ_SIZE(i);
+		len += sprintf(
+		    s + len, "\n[%08x] (SLI_PKT%d_SLIST_FIFO_RSIZE): %016lx\n",
+		    reg, i, octeon_read_csr64(oct, reg));
+	}
+
+	/*0x10050*/
+	for (i = 0; i < CN23XX_MAX_OUTPUT_QUEUES; i++) {
+		reg = CN23XX_SLI_OQ_PKT_CONTROL(i);
+		len += sprintf(s + len,
+			       "\n[%08x] (SLI_PKT%d__OUTPUT_CONTROL): %016lx\n",
+			       reg, i, octeon_read_csr64(oct, reg));
+	}
+
+	/*0x10070*/
+	for (i = 0; i < CN23XX_MAX_OUTPUT_QUEUES; i++) {
+		reg = CN23XX_SLI_OQ_BASE_ADDR64(i);
+		len += sprintf(s + len,
+			       "\n[%08x] (SLI_PKT%d_SLIST_BADDR): %016lx\n",
+			       reg, i, octeon_read_csr64(oct, reg));
+	}
+
+	/*0x100a0*/
+	for (i = 0; i < CN23XX_MAX_OUTPUT_QUEUES; i++) {
+		reg = CN23XX_SLI_OQ_PKT_INT_LEVELS(i);
+		len += sprintf(s + len,
+			       "\n[%08x] (SLI_PKT%d_INT_LEVELS): %016lx\n", reg,
+			       i, octeon_read_csr64(oct, reg));
+	}
+
+	/*0x100b0*/
+	for (i = 0; i < CN23XX_MAX_OUTPUT_QUEUES; i++) {
+		reg = CN23XX_SLI_OQ_PKTS_SENT(i);
+		len += sprintf(s + len, "\n[%08x] (SLI_PKT%d_CNTS): %016lx\n",
+			       reg, i, octeon_read_csr64(oct, reg));
+	}
+
+	/*0x100c0*/
+	for (i = 0; i < CN23XX_MAX_OUTPUT_QUEUES; i++) {
+		reg = 0x100c0 + i * CN23XX_OQ_OFFSET;
+		len += sprintf(s + len,
+			       "\n[%08x] (SLI_PKT%d_ERROR_INFO): %016lx\n", reg,
+			       i, octeon_read_csr64(oct, reg));
+
+		/*0x10000*/
+		for (i = 0; i < CN23XX_MAX_INPUT_QUEUES; i++) {
+			reg = CN23XX_SLI_IQ_PKT_CONTROL64(i);
+			len += sprintf(
+				s + len,
+				"\n[%08x] (SLI_PKT%d_INPUT_CONTROL): %016lx\n",
+				reg, i, octeon_read_csr64(oct, reg));
+		}
+
+		/*0x10010*/
+		for (i = 0; i < CN23XX_MAX_INPUT_QUEUES; i++) {
+			reg = CN23XX_SLI_IQ_BASE_ADDR64(i);
+			len += sprintf(
+			    s + len,
+			    "\n[%08x] (SLI_PKT%d_INSTR_BADDR): %016lx\n", reg,
+			    i, octeon_read_csr64(oct, reg));
+		}
+
+		/*0x10020*/
+		for (i = 0; i < CN23XX_MAX_INPUT_QUEUES; i++) {
+			reg = CN23XX_SLI_IQ_DOORBELL(i);
+			len += sprintf(
+			    s + len,
+			    "\n[%08x] (SLI_PKT%d_INSTR_BAOFF_DBELL): %016lx\n",
+			    reg, i, octeon_read_csr64(oct, reg));
+		}
+
+		/*0x10030*/
+		for (i = 0; i < CN23XX_MAX_INPUT_QUEUES; i++) {
+			reg = CN23XX_SLI_IQ_SIZE(i);
+			len += sprintf(
+			    s + len,
+			    "\n[%08x] (SLI_PKT%d_INSTR_FIFO_RSIZE): %016lx\n",
+			    reg, i, octeon_read_csr64(oct, reg));
+		}
+
+		/*0x10040*/
+		for (i = 0; i < CN23XX_MAX_INPUT_QUEUES; i++)
+			reg = CN23XX_SLI_IQ_INSTR_COUNT64(i);
+		len += sprintf(s + len,
+			       "\n[%08x] (SLI_PKT_IN_DONE%d_CNTS): %016lx\n",
+			       reg, i, octeon_read_csr64(oct, reg));
+	}
+
+	return len;
 }
 
 static int cn6xxx_read_csr_reg(char *s, struct octeon_device *oct)
@@ -1687,6 +2046,10 @@  static void lio_get_regs(struct net_device *dev,
 	regs->version = OCT_ETHTOOL_REGSVER;
 
 	switch (oct->chip_id) {
+	case OCTEON_CN23XX_PF_VID:
+		memset(regbuf, 0, OCT_ETHTOOL_REGDUMP_LEN_23XX);
+		len += cn23xx_read_csr_reg(regbuf + len, oct);
+		break;
 	case OCTEON_CN68XX:
 	case OCTEON_CN66XX:
 		memset(regbuf, 0, OCT_ETHTOOL_REGDUMP_LEN);
diff --git a/drivers/net/ethernet/cavium/liquidio/liquidio_common.h b/drivers/net/ethernet/cavium/liquidio/liquidio_common.h
index 9f328ff..4e33f48 100644
--- a/drivers/net/ethernet/cavium/liquidio/liquidio_common.h
+++ b/drivers/net/ethernet/cavium/liquidio/liquidio_common.h
@@ -234,6 +234,9 @@  static inline void add_sg_size(struct octeon_sg_entry *sg_entry,
 #define   OCTNET_CMD_ADD_VLAN_FILTER  0x17
 #define   OCTNET_CMD_DEL_VLAN_FILTER  0x18
 #define   OCTNET_CMD_VXLAN_PORT_CONFIG 0x19
+
+#define   OCTNET_CMD_ID_ACTIVE         0x1a
+
 #define   OCTNET_CMD_VXLAN_PORT_ADD    0x0
 #define   OCTNET_CMD_VXLAN_PORT_DEL    0x1
 #define   OCTNET_CMD_RXCSUM_ENABLE     0x0
@@ -830,6 +833,8 @@  struct oct_link_stats {
 #define VITESSE_PHY_GPIO_DRIVEOFF 0x4
 #define VITESSE_PHY_GPIO_HIGH     0x2
 #define VITESSE_PHY_GPIO_LOW      0x3
+#define LED_IDENTIFICATION_ON     0x1
+#define LED_IDENTIFICATION_OFF    0x0
 
 struct oct_mdio_cmd {
 	u64 op;