[PATCH net-next v6 0/2] net: thunderx: add support for PTP clock

2018-01-15 Thread Aleksey Makarov
This series adds support for IEEE 1588 Precision Time Protocol
to Cavium ethernet driver.

The first patch adds support for the Precision Time Protocol Clocks and
Timestamping coprocessor (PTP) found on Cavium processors.
It registers a new PTP clock in the PTP core and provides functions
to use the counter in BGX, TNS, GTI, and NIC blocks.

The second patch introduces support for the PTP protocol to the
Cavium ThunderX ethernet driver.

v6:
- check if ptp_clock_register() returns NULL (Richard Cochran)
- fix doc comment for cavium_ptp_enable() (Richard Cochran)
- fix a function call formatting; use defined constant (Richard Cochran)
- add comments for `tx_ptp_skbs` and `ptp_skb` (Richard Cochran)
- use adjfine() instead of adjfreq() (Richard Cochran)
- add Acked-by: Philippe Ombredanne 

v5: https://lkml.kernel.org/r/20171211141435.2915-1-aleksey.maka...@cavium.com
- fix the file headers (add SPDX tags, remove advertisment) (Philippe 
Ombredanne)
- use "imply" instead of "select" (Richard Cochran)
- add some code in cavium_ptp_get() for the case when the PTP driver has not 
been
  registered with the PTP core

v4: https://lkml.kernel.org/r/20171208103442.19354-1-aleksey.maka...@cavium.com
- use IS_ENABLED. This fixes compilation of the ptp as a module (David Miller)
- select PTP_1588_CLOCK, not depend on it.  This fixes a build warning.
- change u64 to __be64.  This fixes the sparse warning
  "warning: cast to restricted __be64"
- make nicvf_config_hwtstamp() static. This fixes the sparse warning
  "warning: symbol 'nicvf_config_hwtstamp' was not declared. Should it be 
static?"

v3: https://lkml.kernel.org/r/20171206133100.26436-1-aleksey.maka...@cavium.com
- rebase to net-next

v2: https://lkml.kernel.org/r/20171117134909.8954-1-aleksey.maka...@cavium.com
- use readq()/writeq() in place of cavium_ptp_reg_read()/cavium_ptp_reg_write(),
  don't use readq_relaxed()/writeq_relaxed() (David Daney)

v1: https://lkml.kernel.org/r/20171107190704.15458-1-aleksey.maka...@cavium.com

Radoslaw Biernacki (1):
  net: add support for Cavium PTP coprocessor

Sunil Goutham (1):
  net: thunderx: add timestamping support

 drivers/net/ethernet/cavium/Kconfig|  13 +
 drivers/net/ethernet/cavium/Makefile   |   1 +
 drivers/net/ethernet/cavium/common/Makefile|   1 +
 drivers/net/ethernet/cavium/common/cavium_ptp.c| 353 +
 drivers/net/ethernet/cavium/common/cavium_ptp.h|  70 
 drivers/net/ethernet/cavium/thunder/nic.h  |  36 +++
 drivers/net/ethernet/cavium/thunder/nic_main.c |  56 +++-
 drivers/net/ethernet/cavium/thunder/nic_reg.h  |   1 +
 .../net/ethernet/cavium/thunder/nicvf_ethtool.c|  29 +-
 drivers/net/ethernet/cavium/thunder/nicvf_main.c   | 169 +-
 drivers/net/ethernet/cavium/thunder/nicvf_queues.c |  26 ++
 drivers/net/ethernet/cavium/thunder/thunder_bgx.c  |  29 ++
 drivers/net/ethernet/cavium/thunder/thunder_bgx.h  |   4 +
 13 files changed, 782 insertions(+), 6 deletions(-)
 create mode 100644 drivers/net/ethernet/cavium/common/Makefile
 create mode 100644 drivers/net/ethernet/cavium/common/cavium_ptp.c
 create mode 100644 drivers/net/ethernet/cavium/common/cavium_ptp.h

-- 
2.15.1



[PATCH net-next v6 2/2] net: thunderx: add timestamping support

2018-01-15 Thread Aleksey Makarov
From: Sunil Goutham 

This adds timestamping support for both receive and transmit
paths. On the receive side no filters are supported i.e either
all pkts will get a timestamp appended infront of the packet or none.
On the transmit side HW doesn't support timestamp insertion but
only generates a separate CQE with transmitted packet's timestamp.
Also HW supports only one packet at a time for timestamping on the
transmit side.

Signed-off-by: Sunil Goutham 
Signed-off-by: Aleksey Makarov 
Acked-by: Philippe Ombredanne 
---
 drivers/net/ethernet/cavium/Kconfig|   1 +
 drivers/net/ethernet/cavium/thunder/nic.h  |  36 +
 drivers/net/ethernet/cavium/thunder/nic_main.c |  56 ++-
 drivers/net/ethernet/cavium/thunder/nic_reg.h  |   1 +
 .../net/ethernet/cavium/thunder/nicvf_ethtool.c|  29 +++-
 drivers/net/ethernet/cavium/thunder/nicvf_main.c   | 169 -
 drivers/net/ethernet/cavium/thunder/nicvf_queues.c |  26 
 drivers/net/ethernet/cavium/thunder/thunder_bgx.c  |  29 
 drivers/net/ethernet/cavium/thunder/thunder_bgx.h  |   4 +
 9 files changed, 345 insertions(+), 6 deletions(-)

diff --git a/drivers/net/ethernet/cavium/Kconfig 
b/drivers/net/ethernet/cavium/Kconfig
index 96586c0b4490..043e3c11c42b 100644
--- a/drivers/net/ethernet/cavium/Kconfig
+++ b/drivers/net/ethernet/cavium/Kconfig
@@ -27,6 +27,7 @@ config THUNDER_NIC_PF
 
 config THUNDER_NIC_VF
tristate "Thunder Virtual function driver"
+   imply CAVIUM_PTP
depends on 64BIT
---help---
  This driver supports Thunder's NIC virtual function
diff --git a/drivers/net/ethernet/cavium/thunder/nic.h 
b/drivers/net/ethernet/cavium/thunder/nic.h
index 4a02e618e318..4cacce5d2b16 100644
--- a/drivers/net/ethernet/cavium/thunder/nic.h
+++ b/drivers/net/ethernet/cavium/thunder/nic.h
@@ -263,6 +263,8 @@ struct nicvf_drv_stats {
struct u64_stats_sync   syncp;
 };
 
+struct cavium_ptp;
+
 struct nicvf {
struct nicvf*pnicvf;
struct net_device   *netdev;
@@ -312,6 +314,33 @@ struct nicvf {
struct tasklet_struct   qs_err_task;
struct work_struct  reset_task;
 
+   /* PTP timestamp */
+   struct cavium_ptp   *ptp_clock;
+   /* Inbound timestamping is on */
+   boolhw_rx_tstamp;
+   /* When the packet that requires timestamping is sent, hardware inserts
+* two entries to the completion queue.  First is the regular
+* CQE_TYPE_SEND entry that signals that the packet was sent.
+* The second is CQE_TYPE_SEND_PTP that contains the actual timestamp
+* for that packet.
+* `ptp_skb` is initialized in the handler for the CQE_TYPE_SEND
+* entry and is used and zeroed in the handler for the CQE_TYPE_SEND_PTP
+* entry.
+* So `ptp_skb` is used to hold the pointer to the packet between
+* the calls to CQE_TYPE_SEND and CQE_TYPE_SEND_PTP handlers.
+*/
+   struct sk_buff  *ptp_skb;
+   /* `tx_ptp_skbs` is set when the hardware is sending a packet that
+* requires timestamping.  Cavium hardware can not process more than one
+* such packet at once so this is set each time the driver submits
+* a packet that requires timestamping to the send queue and clears
+* each time it receives the entry on the completion queue saying
+* that such packet was sent.
+* So `tx_ptp_skbs` prevents driver from submitting more than one
+* packet that requires timestamping to the hardware for transmitting.
+*/
+   atomic_ttx_ptp_skbs;
+
/* Interrupt coalescing settings */
u32 cq_coalesce_usecs;
u32 msg_enable;
@@ -371,6 +400,7 @@ struct nicvf {
 #defineNIC_MBOX_MSG_LOOPBACK   0x16/* Set interface in 
loopback */
 #defineNIC_MBOX_MSG_RESET_STAT_COUNTER 0x17/* Reset statistics 
counters */
 #defineNIC_MBOX_MSG_PFC0x18/* Pause frame control 
*/
+#defineNIC_MBOX_MSG_PTP_CFG0x19/* HW packet timestamp 
*/
 #defineNIC_MBOX_MSG_CFG_DONE   0xF0/* VF configuration 
done */
 #defineNIC_MBOX_MSG_SHUTDOWN   0xF1/* VF is being shutdown 
*/
 
@@ -521,6 +551,11 @@ struct pfc {
u8fc_tx;
 };
 
+struct set_ptp {
+   u8msg;
+   bool  enable;
+};
+
 /* 128 bit shared memory between PF and each VF */
 union nic_mbx {
struct { u8 msg; }  msg;
@@ -540,6 +575,7 @@ union nic_mbx {
struct set_loopback lbk;
struct reset_stat_cfg   reset_stat;
struct pfc  pfc;
+   struct set_ptp  ptp;
 };
 
 #define NIC_NODE_ID_MASK   0x03
diff --git a/drivers/net/ethernet/cavium/thunder/nic_main.c 
b/drivers/net/ethernet/cavium/thunder/nic_main.c
index 8f1dd55b3e08..8325577d

[PATCH net-next v6 1/2] net: add support for Cavium PTP coprocessor

2018-01-15 Thread Aleksey Makarov
From: Radoslaw Biernacki 

This patch adds support for the Precision Time Protocol
Clocks and Timestamping hardware found on Cavium ThunderX
processors.

Signed-off-by: Radoslaw Biernacki 
Signed-off-by: Aleksey Makarov 
Acked-by: Philippe Ombredanne 
---
 drivers/net/ethernet/cavium/Kconfig |  12 +
 drivers/net/ethernet/cavium/Makefile|   1 +
 drivers/net/ethernet/cavium/common/Makefile |   1 +
 drivers/net/ethernet/cavium/common/cavium_ptp.c | 353 
 drivers/net/ethernet/cavium/common/cavium_ptp.h |  70 +
 5 files changed, 437 insertions(+)
 create mode 100644 drivers/net/ethernet/cavium/common/Makefile
 create mode 100644 drivers/net/ethernet/cavium/common/cavium_ptp.c
 create mode 100644 drivers/net/ethernet/cavium/common/cavium_ptp.h

diff --git a/drivers/net/ethernet/cavium/Kconfig 
b/drivers/net/ethernet/cavium/Kconfig
index 63be75eb34d2..96586c0b4490 100644
--- a/drivers/net/ethernet/cavium/Kconfig
+++ b/drivers/net/ethernet/cavium/Kconfig
@@ -50,6 +50,18 @@ config   THUNDER_NIC_RGX
  This driver supports configuring XCV block of RGX interface
  present on CN81XX chip.
 
+config CAVIUM_PTP
+   tristate "Cavium PTP coprocessor as PTP clock"
+   depends on 64BIT
+   imply PTP_1588_CLOCK
+   default y
+   ---help---
+ This driver adds support for the Precision Time Protocol Clocks and
+ Timestamping coprocessor (PTP) found on Cavium processors.
+ PTP provides timestamping mechanism that is suitable for use in IEEE 
1588
+ Precision Time Protocol or other purposes.  Timestamps can be used in
+ BGX, TNS, GTI, and NIC blocks.
+
 config LIQUIDIO
tristate "Cavium LiquidIO support"
depends on 64BIT
diff --git a/drivers/net/ethernet/cavium/Makefile 
b/drivers/net/ethernet/cavium/Makefile
index 872da9f7c31a..946bba84e81d 100644
--- a/drivers/net/ethernet/cavium/Makefile
+++ b/drivers/net/ethernet/cavium/Makefile
@@ -1,6 +1,7 @@
 #
 # Makefile for the Cavium ethernet device drivers.
 #
+obj-$(CONFIG_NET_VENDOR_CAVIUM) += common/
 obj-$(CONFIG_NET_VENDOR_CAVIUM) += thunder/
 obj-$(CONFIG_NET_VENDOR_CAVIUM) += liquidio/
 obj-$(CONFIG_NET_VENDOR_CAVIUM) += octeon/
diff --git a/drivers/net/ethernet/cavium/common/Makefile 
b/drivers/net/ethernet/cavium/common/Makefile
new file mode 100644
index ..dd8561b8060b
--- /dev/null
+++ b/drivers/net/ethernet/cavium/common/Makefile
@@ -0,0 +1 @@
+obj-$(CONFIG_CAVIUM_PTP) += cavium_ptp.o
diff --git a/drivers/net/ethernet/cavium/common/cavium_ptp.c 
b/drivers/net/ethernet/cavium/common/cavium_ptp.c
new file mode 100644
index ..c87c9c684a33
--- /dev/null
+++ b/drivers/net/ethernet/cavium/common/cavium_ptp.c
@@ -0,0 +1,353 @@
+// SPDX-License-Identifier: GPL-2.0
+/* cavium_ptp.c - PTP 1588 clock on Cavium hardware
+ * Copyright (c) 2003-2015, 2017 Cavium, Inc.
+ */
+
+#include 
+#include 
+#include 
+#include 
+
+#include "cavium_ptp.h"
+
+#define DRV_NAME   "Cavium PTP Driver"
+
+#define PCI_DEVICE_ID_CAVIUM_PTP   0xA00C
+#define PCI_DEVICE_ID_CAVIUM_RST   0xA00E
+
+#define PCI_PTP_BAR_NO 0
+#define PCI_RST_BAR_NO 0
+
+#define PTP_CLOCK_CFG  0xF00ULL
+#define  PTP_CLOCK_CFG_PTP_EN  BIT(0)
+#define PTP_CLOCK_LO   0xF08ULL
+#define PTP_CLOCK_HI   0xF10ULL
+#define PTP_CLOCK_COMP 0xF18ULL
+
+#define RST_BOOT   0x1600ULL
+#define CLOCK_BASE_RATE5000ULL
+
+static u64 ptp_cavium_clock_get(void)
+{
+   struct pci_dev *pdev;
+   void __iomem *base;
+   u64 ret = CLOCK_BASE_RATE * 16;
+
+   pdev = pci_get_device(PCI_VENDOR_ID_CAVIUM,
+ PCI_DEVICE_ID_CAVIUM_RST, NULL);
+   if (!pdev)
+   goto error;
+
+   base = pci_ioremap_bar(pdev, PCI_RST_BAR_NO);
+   if (!base)
+   goto error_put_pdev;
+
+   ret = CLOCK_BASE_RATE * ((readq(base + RST_BOOT) >> 33) & 0x3f);
+
+   iounmap(base);
+
+error_put_pdev:
+   pci_dev_put(pdev);
+
+error:
+   return ret;
+}
+
+struct cavium_ptp *cavium_ptp_get(void)
+{
+   struct cavium_ptp *ptp;
+   struct pci_dev *pdev;
+
+   pdev = pci_get_device(PCI_VENDOR_ID_CAVIUM,
+ PCI_DEVICE_ID_CAVIUM_PTP, NULL);
+   if (!pdev)
+   return ERR_PTR(-ENODEV);
+
+   ptp = pci_get_drvdata(pdev);
+   if (!ptp)
+   ptp = ERR_PTR(-EPROBE_DEFER);
+   if (IS_ERR(ptp))
+   pci_dev_put(pdev);
+
+   return ptp;
+}
+EXPORT_SYMBOL(cavium_ptp_get);
+
+void cavium_ptp_put(struct cavium_ptp *ptp)
+{
+   pci_dev_put(ptp->pdev);
+}
+EXPORT_SYMBOL(cavium_ptp_put);
+
+/**
+ * cavium_ptp_adjfine() - Adjust ptp frequency
+ * @ptp: PTP clock info
+ * @scaled_ppm: how much to adjust by, in parts per million, but with a
+ *  16 bit binary fractional field
+ */
+static int cavium_ptp_adjfine(struct ptp_clo

Re: [PATCH net-next v5 2/2] net: thunderx: add timestamping support

2018-01-08 Thread Aleksey Makarov


On 12.12.2017 05:32, Richard Cochran wrote:
> On Mon, Dec 11, 2017 at 05:14:31PM +0300, Aleksey Makarov wrote:
>> diff --git a/drivers/net/ethernet/cavium/thunder/nic.h 
>> b/drivers/net/ethernet/cavium/thunder/nic.h
>> index 4a02e618e318..204b234beb9d 100644
>> --- a/drivers/net/ethernet/cavium/thunder/nic.h
>> +++ b/drivers/net/ethernet/cavium/thunder/nic.h
>> @@ -263,6 +263,8 @@ struct nicvf_drv_stats {
>>  struct u64_stats_sync   syncp;
>>  };
>>  
>> +struct cavium_ptp;
>> +
>>  struct nicvf {
>>  struct nicvf*pnicvf;
>>  struct net_device   *netdev;
>> @@ -312,6 +314,12 @@ struct nicvf {
>>  struct tasklet_struct   qs_err_task;
>>  struct work_struct  reset_task;
>>  
>> +/* PTP timestamp */
>> +struct cavium_ptp   *ptp_clock;
>> +boolhw_rx_tstamp;
>> +struct sk_buff  *ptp_skb;
>> +atomic_ttx_ptp_skbs;
> 
> It is disturbing that the above two fields are set in different
> places.  Shouldn't they be unified into one logical lock?

No, they should not as they are not quite related.

`tx_ptp_skbs` is set when the hardware is sending a packet that requires
timestamping.  Cavium hardware can not process more than one
such packet at once so this is set each time the driver submits
a packet that requires timestamping to the send queue and clears
each time it receives the entry on the completion queue saying
that such packet was sent.

So `tx_ptp_skbs` prevents driver from submitting more than one
packet that requires timestamping to the hardware for transmitting.

When that packet is sent, hardware inserts two entries to
the completion queue.  First is the regular CQE_TYPE_SEND entry
that signals that the packet was sent.  The second is CQE_TYPE_SEND_PTP
that contains the actual timestamp for that packet.

`ptp_skb` is initialized in the handler for the CQE_TYPE_SEND
entry and is used and zeroed in the handler for the CQE_TYPE_SEND_PTP
entry.

So `ptp_skb` is used to hold the pointer to the packet between
the calls to CQE_TYPE_SEND and CQE_TYPE_SEND_PTP handlers.

I am going to add those comments to the sources, fix other issues and
send v6 in short time.

Thank you
Aleksey Makarov

> Here you clear them together:
> 
>> +static void nicvf_snd_ptp_handler(struct net_device *netdev,
>> +  struct cqe_send_t *cqe_tx)
>> +{
>> +struct nicvf *nic = netdev_priv(netdev);
>> +struct skb_shared_hwtstamps ts;
>> +u64 ns;
>> +
>> +nic = nic->pnicvf;
>> +
>> +/* Sync for 'ptp_skb' */
>> +smp_rmb();
>> +
>> +/* New timestamp request can be queued now */
>> +atomic_set(&nic->tx_ptp_skbs, 0);
>> +
>> +/* Check for timestamp requested skb */
>> +if (!nic->ptp_skb)
>> +return;
>> +
>> +/* Check if timestamping is timedout, which is set to 10us */
>> +if (cqe_tx->send_status == CQ_TX_ERROP_TSTMP_TIMEOUT ||
>> +cqe_tx->send_status == CQ_TX_ERROP_TSTMP_CONFLICT)
>> +goto no_tstamp;
>> +
>> +/* Get the timestamp */
>> +memset(&ts, 0, sizeof(ts));
>> +ns = cavium_ptp_tstamp2time(nic->ptp_clock, cqe_tx->ptp_timestamp);
>> +ts.hwtstamp = ns_to_ktime(ns);
>> +skb_tstamp_tx(nic->ptp_skb, &ts);
>> +
>> +no_tstamp:
>> +/* Free the original skb */
>> +dev_kfree_skb_any(nic->ptp_skb);
>> +nic->ptp_skb = NULL;
>> +/* Sync 'ptp_skb' */
>> +smp_wmb();
>> +}
>> +
> 
> but here you set the one:
> 
>> @@ -657,7 +697,12 @@ static void nicvf_snd_pkt_handler(struct net_device 
>> *netdev,
>>  prefetch(skb);
>>  (*tx_pkts)++;
>>  *tx_bytes += skb->len;
>> -napi_consume_skb(skb, budget);
>> +/* If timestamp is requested for this skb, don't free it */
>> +if (skb_shinfo(skb)->tx_flags & SKBTX_IN_PROGRESS &&
>> +!nic->pnicvf->ptp_skb)
>> +nic->pnicvf->ptp_skb = skb;
>> +else
>> +napi_consume_skb(skb, budget);
>>  sq->skbuff[cqe_tx->sqe_ptr] = (u64)NULL;
>>  } else {
>>  /* In case of SW TSO on 88xx, only last segment will have
> 
> here you clear one:
> 
>> @@ -1319,12 +1382,28 @@ int nicvf_stop(struct net_device *netdev)
>>  
>>  nicvf_free_cq_poll(nic);
>>  
>> +/* Free any pending SKB s

Re: [PATCH net-next v5 1/2] net: add support for Cavium PTP coprocessor

2017-12-12 Thread Aleksey Makarov

Hi Richard,

On 12/12/2017 01:59 AM, Richard Cochran wrote:


Sorry I didn't finish reviewing before...

On Mon, Dec 11, 2017 at 05:14:30PM +0300, Aleksey Makarov wrote:


[ ... ]


+static int cavium_ptp_probe(struct pci_dev *pdev,
+   const struct pci_device_id *ent)
+{
+   struct device *dev = &pdev->dev;
+   struct cavium_ptp *clock;
+   struct cyclecounter *cc;
+   u64 clock_cfg;
+   u64 clock_comp;
+   int err;
+
+   clock = devm_kzalloc(dev, sizeof(*clock), GFP_KERNEL);
+   if (!clock)
+   return -ENOMEM;
+
+   clock->pdev = pdev;
+
+   err = pcim_enable_device(pdev);
+   if (err)
+   return err;
+
+   err = pcim_iomap_regions(pdev, 1 << PCI_PTP_BAR_NO, pci_name(pdev));
+   if (err)
+   return err;
+
+   clock->reg_base = pcim_iomap_table(pdev)[PCI_PTP_BAR_NO];
+
+   spin_lock_init(&clock->spin_lock);
+
+   cc = &clock->cycle_counter;
+   cc->read = cavium_ptp_cc_read;
+   cc->mask = CYCLECOUNTER_MASK(64);
+   cc->mult = 1;
+   cc->shift = 0;
+
+   timecounter_init(&clock->time_counter, &clock->cycle_counter,
+ktime_to_ns(ktime_get_real()));
+
+   clock->clock_rate = ptp_cavium_clock_get();
+
+   clock->ptp_info = (struct ptp_clock_info) {
+   .owner  = THIS_MODULE,
+   .name   = "ThunderX PTP",
+   .max_adj= 10ull,
+   .n_ext_ts   = 0,
+   .n_pins = 0,
+   .pps= 0,
+   .adjfreq= cavium_ptp_adjfreq,
+   .adjtime= cavium_ptp_adjtime,
+   .gettime64  = cavium_ptp_gettime,
+   .settime64  = cavium_ptp_settime,
+   .enable = cavium_ptp_enable,
+   };
+
+   clock_cfg = readq(clock->reg_base + PTP_CLOCK_CFG);
+   clock_cfg |= PTP_CLOCK_CFG_PTP_EN;
+   writeq(clock_cfg, clock->reg_base + PTP_CLOCK_CFG);
+
+   clock_comp = ((u64)10ull << 32) / clock->clock_rate;
+   writeq(clock_comp, clock->reg_base + PTP_CLOCK_COMP);
+
+   clock->ptp_clock = ptp_clock_register(&clock->ptp_info, dev);
+   if (IS_ERR(clock->ptp_clock)) {


You need to handle the case when ptp_clock_register() returns NULL.

from ptp_clock_kernel.h:

/**
  * ptp_clock_register() - register a PTP hardware clock driver
  *
  * @info:   Structure describing the new clock.
  * @parent: Pointer to the parent device of the new clock.
  *
  * Returns a valid pointer on success or PTR_ERR on failure.  If PHC
  * support is missing at the configuration level, this function
  * returns NULL, and drivers are expected to gracefully handle that
  * case separately.
  */


If ptp_clock_register() returns NULL, the device is still paired with the 
driver,
but the driver is not registered in the PTP core.  When ethernet driver needs
the reference to this cavium PTP driver, it calls cavium_ptp_get() that checks
if ptp->ptp_clock is NULL and, if so, returns -ENODEV.

I need this behavior because I need to differentiate between two cases:

- the state when the driver is not initialized for the device because of PTP 
core
  has not registered it.  In this case function cavium_ptp_get() returns -ENODEV
  and ethernet driver proceeds without PTP device.

- the state when the driver is not initialized because kernel has not tired
  to initialize it yet.  In this case function cavium_ptp_get() returns 
-EPROBE_DEFER
  that is used in ethernet driver to defer initialization.

If you know how to do the same in more smoothly please share it.  Or else I 
would
prefer to insert a comment about it and leave it as is.

Richard, thank you for review.  I am going to address your comments in my next 
series.

Thank you
Aleksey Makarov
 

+   clock_cfg = readq(clock->reg_base + PTP_CLOCK_CFG);
+   clock_cfg &= ~PTP_CLOCK_CFG_PTP_EN;
+   writeq(clock_cfg, clock->reg_base + PTP_CLOCK_CFG);
+   return PTR_ERR(clock->ptp_clock);
+   }
+
+   pci_set_drvdata(pdev, clock);
+   return 0;
+}


Thanks,
Richard



[PATCH net-next v5 2/2] net: thunderx: add timestamping support

2017-12-11 Thread Aleksey Makarov
From: Sunil Goutham 

This adds timestamping support for both receive and transmit
paths. On the receive side no filters are supported i.e either
all pkts will get a timestamp appended infront of the packet or none.
On the transmit side HW doesn't support timestamp insertion but
only generates a separate CQE with transmitted packet's timestamp.
Also HW supports only one packet at a time for timestamping on the
transmit side.

Signed-off-by: Sunil Goutham 
Signed-off-by: Aleksey Makarov 
---
 drivers/net/ethernet/cavium/Kconfig|   1 +
 drivers/net/ethernet/cavium/thunder/nic.h  |  15 ++
 drivers/net/ethernet/cavium/thunder/nic_main.c |  58 ++-
 drivers/net/ethernet/cavium/thunder/nic_reg.h  |   1 +
 .../net/ethernet/cavium/thunder/nicvf_ethtool.c|  29 +++-
 drivers/net/ethernet/cavium/thunder/nicvf_main.c   | 173 -
 drivers/net/ethernet/cavium/thunder/nicvf_queues.c |  26 
 drivers/net/ethernet/cavium/thunder/thunder_bgx.c  |  29 
 drivers/net/ethernet/cavium/thunder/thunder_bgx.h  |   4 +
 9 files changed, 330 insertions(+), 6 deletions(-)

diff --git a/drivers/net/ethernet/cavium/Kconfig 
b/drivers/net/ethernet/cavium/Kconfig
index 96586c0b4490..043e3c11c42b 100644
--- a/drivers/net/ethernet/cavium/Kconfig
+++ b/drivers/net/ethernet/cavium/Kconfig
@@ -27,6 +27,7 @@ config THUNDER_NIC_PF
 
 config THUNDER_NIC_VF
tristate "Thunder Virtual function driver"
+   imply CAVIUM_PTP
depends on 64BIT
---help---
  This driver supports Thunder's NIC virtual function
diff --git a/drivers/net/ethernet/cavium/thunder/nic.h 
b/drivers/net/ethernet/cavium/thunder/nic.h
index 4a02e618e318..204b234beb9d 100644
--- a/drivers/net/ethernet/cavium/thunder/nic.h
+++ b/drivers/net/ethernet/cavium/thunder/nic.h
@@ -263,6 +263,8 @@ struct nicvf_drv_stats {
struct u64_stats_sync   syncp;
 };
 
+struct cavium_ptp;
+
 struct nicvf {
struct nicvf*pnicvf;
struct net_device   *netdev;
@@ -312,6 +314,12 @@ struct nicvf {
struct tasklet_struct   qs_err_task;
struct work_struct  reset_task;
 
+   /* PTP timestamp */
+   struct cavium_ptp   *ptp_clock;
+   boolhw_rx_tstamp;
+   struct sk_buff  *ptp_skb;
+   atomic_ttx_ptp_skbs;
+
/* Interrupt coalescing settings */
u32 cq_coalesce_usecs;
u32 msg_enable;
@@ -371,6 +379,7 @@ struct nicvf {
 #defineNIC_MBOX_MSG_LOOPBACK   0x16/* Set interface in 
loopback */
 #defineNIC_MBOX_MSG_RESET_STAT_COUNTER 0x17/* Reset statistics 
counters */
 #defineNIC_MBOX_MSG_PFC0x18/* Pause frame control 
*/
+#defineNIC_MBOX_MSG_PTP_CFG0x19/* HW packet timestamp 
*/
 #defineNIC_MBOX_MSG_CFG_DONE   0xF0/* VF configuration 
done */
 #defineNIC_MBOX_MSG_SHUTDOWN   0xF1/* VF is being shutdown 
*/
 
@@ -521,6 +530,11 @@ struct pfc {
u8fc_tx;
 };
 
+struct set_ptp {
+   u8msg;
+   bool  enable;
+};
+
 /* 128 bit shared memory between PF and each VF */
 union nic_mbx {
struct { u8 msg; }  msg;
@@ -540,6 +554,7 @@ union nic_mbx {
struct set_loopback lbk;
struct reset_stat_cfg   reset_stat;
struct pfc  pfc;
+   struct set_ptp  ptp;
 };
 
 #define NIC_NODE_ID_MASK   0x03
diff --git a/drivers/net/ethernet/cavium/thunder/nic_main.c 
b/drivers/net/ethernet/cavium/thunder/nic_main.c
index 8f1dd55b3e08..4c1c5414a162 100644
--- a/drivers/net/ethernet/cavium/thunder/nic_main.c
+++ b/drivers/net/ethernet/cavium/thunder/nic_main.c
@@ -426,13 +426,22 @@ static void nic_init_hw(struct nicpf *nic)
/* Enable backpressure */
nic_reg_write(nic, NIC_PF_BP_CFG, (1ULL << 6) | 0x03);
 
-   /* TNS and TNS bypass modes are present only on 88xx */
+   /* TNS and TNS bypass modes are present only on 88xx
+* Also offset of this CSR has changed in 81xx and 83xx.
+*/
if (nic->pdev->subsystem_device == PCI_SUBSYS_DEVID_88XX_NIC_PF) {
/* Disable TNS mode on both interfaces */
nic_reg_write(nic, NIC_PF_INTF_0_1_SEND_CFG,
- (NIC_TNS_BYPASS_MODE << 7) | BGX0_BLOCK);
+ (NIC_TNS_BYPASS_MODE << 7) |
+ BGX0_BLOCK | (1ULL << 16));
nic_reg_write(nic, NIC_PF_INTF_0_1_SEND_CFG | (1 << 8),
- (NIC_TNS_BYPASS_MODE << 7) | BGX1_BLOCK);
+ (NIC_TNS_BYPASS_MODE << 7) |
+ BGX1_BLOCK | (1ULL << 16));
+   } else {
+   /* Configure timestamp generation timeout to 10us */
+   for (i = 0; i < nic->hw

[PATCH net-next v5 1/2] net: add support for Cavium PTP coprocessor

2017-12-11 Thread Aleksey Makarov
From: Radoslaw Biernacki 

This patch adds support for the Precision Time Protocol
Clocks and Timestamping hardware found on Cavium ThunderX
processors.

Signed-off-by: Radoslaw Biernacki 
Signed-off-by: Aleksey Makarov 
---
 drivers/net/ethernet/cavium/Kconfig |  12 +
 drivers/net/ethernet/cavium/Makefile|   1 +
 drivers/net/ethernet/cavium/common/Makefile |   1 +
 drivers/net/ethernet/cavium/common/cavium_ptp.c | 329 
 drivers/net/ethernet/cavium/common/cavium_ptp.h |  70 +
 5 files changed, 413 insertions(+)
 create mode 100644 drivers/net/ethernet/cavium/common/Makefile
 create mode 100644 drivers/net/ethernet/cavium/common/cavium_ptp.c
 create mode 100644 drivers/net/ethernet/cavium/common/cavium_ptp.h

diff --git a/drivers/net/ethernet/cavium/Kconfig 
b/drivers/net/ethernet/cavium/Kconfig
index 63be75eb34d2..96586c0b4490 100644
--- a/drivers/net/ethernet/cavium/Kconfig
+++ b/drivers/net/ethernet/cavium/Kconfig
@@ -50,6 +50,18 @@ config   THUNDER_NIC_RGX
  This driver supports configuring XCV block of RGX interface
  present on CN81XX chip.
 
+config CAVIUM_PTP
+   tristate "Cavium PTP coprocessor as PTP clock"
+   depends on 64BIT
+   imply PTP_1588_CLOCK
+   default y
+   ---help---
+ This driver adds support for the Precision Time Protocol Clocks and
+ Timestamping coprocessor (PTP) found on Cavium processors.
+ PTP provides timestamping mechanism that is suitable for use in IEEE 
1588
+ Precision Time Protocol or other purposes.  Timestamps can be used in
+ BGX, TNS, GTI, and NIC blocks.
+
 config LIQUIDIO
tristate "Cavium LiquidIO support"
depends on 64BIT
diff --git a/drivers/net/ethernet/cavium/Makefile 
b/drivers/net/ethernet/cavium/Makefile
index 872da9f7c31a..946bba84e81d 100644
--- a/drivers/net/ethernet/cavium/Makefile
+++ b/drivers/net/ethernet/cavium/Makefile
@@ -1,6 +1,7 @@
 #
 # Makefile for the Cavium ethernet device drivers.
 #
+obj-$(CONFIG_NET_VENDOR_CAVIUM) += common/
 obj-$(CONFIG_NET_VENDOR_CAVIUM) += thunder/
 obj-$(CONFIG_NET_VENDOR_CAVIUM) += liquidio/
 obj-$(CONFIG_NET_VENDOR_CAVIUM) += octeon/
diff --git a/drivers/net/ethernet/cavium/common/Makefile 
b/drivers/net/ethernet/cavium/common/Makefile
new file mode 100644
index ..dd8561b8060b
--- /dev/null
+++ b/drivers/net/ethernet/cavium/common/Makefile
@@ -0,0 +1 @@
+obj-$(CONFIG_CAVIUM_PTP) += cavium_ptp.o
diff --git a/drivers/net/ethernet/cavium/common/cavium_ptp.c 
b/drivers/net/ethernet/cavium/common/cavium_ptp.c
new file mode 100644
index ..8b48863bfdec
--- /dev/null
+++ b/drivers/net/ethernet/cavium/common/cavium_ptp.c
@@ -0,0 +1,329 @@
+// SPDX-License-Identifier: GPL-2.0
+/* cavium_ptp.c - PTP 1588 clock on Cavium hardware
+ * Copyright (c) 2003-2015, 2017 Cavium, Inc.
+ */
+
+#include 
+#include 
+#include 
+#include 
+
+#include "cavium_ptp.h"
+
+#define DRV_NAME   "Cavium PTP Driver"
+
+#define PCI_DEVICE_ID_CAVIUM_PTP   0xA00C
+#define PCI_DEVICE_ID_CAVIUM_RST   0xA00E
+
+#define PCI_PTP_BAR_NO 0
+#define PCI_RST_BAR_NO 0
+
+#define PTP_CLOCK_CFG  0xF00ULL
+#define  PTP_CLOCK_CFG_PTP_EN  BIT(0)
+#define PTP_CLOCK_LO   0xF08ULL
+#define PTP_CLOCK_HI   0xF10ULL
+#define PTP_CLOCK_COMP 0xF18ULL
+
+#define RST_BOOT   0x1600ULL
+#define CLOCK_BASE_RATE5000ULL
+
+static u64 ptp_cavium_clock_get(void)
+{
+   struct pci_dev *pdev;
+   void __iomem *base;
+   u64 ret = CLOCK_BASE_RATE * 16;
+
+   pdev = pci_get_device(PCI_VENDOR_ID_CAVIUM,
+ PCI_DEVICE_ID_CAVIUM_RST, NULL);
+   if (!pdev)
+   goto error;
+
+   base = pci_ioremap_bar(pdev, PCI_RST_BAR_NO);
+   if (!base)
+   goto error_put_pdev;
+
+   ret = CLOCK_BASE_RATE * ((readq(base + RST_BOOT) >> 33) & 0x3f);
+
+   iounmap(base);
+
+error_put_pdev:
+   pci_dev_put(pdev);
+
+error:
+   return ret;
+}
+
+struct cavium_ptp *cavium_ptp_get(void)
+{
+   struct cavium_ptp *ptp;
+   struct pci_dev *pdev;
+
+   pdev = pci_get_device(PCI_VENDOR_ID_CAVIUM,
+ PCI_DEVICE_ID_CAVIUM_PTP, NULL);
+   if (!pdev)
+   return ERR_PTR(-ENODEV);
+
+   ptp = pci_get_drvdata(pdev);
+   if (!ptp) {
+   pci_dev_put(pdev);
+   ptp = ERR_PTR(-EPROBE_DEFER);
+   } else if (!ptp->ptp_clock) {
+   pci_dev_put(pdev);
+   ptp = ERR_PTR(-ENODEV);
+   }
+
+   return ptp;
+}
+EXPORT_SYMBOL(cavium_ptp_get);
+
+void cavium_ptp_put(struct cavium_ptp *ptp)
+{
+   pci_dev_put(ptp->pdev);
+}
+EXPORT_SYMBOL(cavium_ptp_put);
+
+/**
+ * cavium_ptp_adjfreq() - Adjust ptp frequency
+ * @ptp: PTP clock info
+ * @ppb: how much to adjust by, in parts-per-billion
+ */
+static int cavium_ptp_adjfreq(str

[PATCH net-next v5 0/2] net: thunderx: add support for PTP clock

2017-12-11 Thread Aleksey Makarov
This series adds support for IEEE 1588 Precision Time Protocol
to Cavium ethernet driver.

The first patch adds support for the Precision Time Protocol Clocks and
Timestamping coprocessor (PTP) found on Cavium processors.
It registers a new PTP clock in the PTP core and provides functions
to use the counter in BGX, TNS, GTI, and NIC blocks.

The second patch introduces support for the PTP protocol to the
Cavium ThunderX ethernet driver.

v5:
- fix the file headers (add SPDX tags, remove advertisment) (Philippe 
Ombredanne)
- use "imply" instead of "select" (Richard Cochran)
- add some code in cavium_ptp_get() for the case when the PTP driver has not 
been
  registered with the PTP core

v4: https://lkml.kernel.org/r/20171208103442.19354-1-aleksey.maka...@cavium.com
- use IS_ENABLED. This fixes compilation of the ptp as a module (David Miller)
- select PTP_1588_CLOCK, not depend on it.  This fixes a build warning.
- change u64 to __be64.  This fixes the sparse warning
  "warning: cast to restricted __be64"
- make nicvf_config_hwtstamp() static. This fixes the sparse warning
  "warning: symbol 'nicvf_config_hwtstamp' was not declared. Should it be 
static?"

v3: https://lkml.kernel.org/r/20171206133100.26436-1-aleksey.maka...@cavium.com
- rebase to net-next

v2: https://lkml.kernel.org/r/20171117134909.8954-1-aleksey.maka...@cavium.com
- use readq()/writeq() in place of cavium_ptp_reg_read()/cavium_ptp_reg_write(),
  don't use readq_relaxed()/writeq_relaxed() (David Daney)

v1: https://lkml.kernel.org/r/20171107190704.15458-1-aleksey.maka...@cavium.com

Radoslaw Biernacki (1):
  net: add support for Cavium PTP coprocessor

Sunil Goutham (1):
  net: thunderx: add timestamping support

 drivers/net/ethernet/cavium/Kconfig|  13 +
 drivers/net/ethernet/cavium/Makefile   |   1 +
 drivers/net/ethernet/cavium/common/Makefile|   1 +
 drivers/net/ethernet/cavium/common/cavium_ptp.c| 329 +
 drivers/net/ethernet/cavium/common/cavium_ptp.h|  70 +
 drivers/net/ethernet/cavium/thunder/nic.h  |  15 +
 drivers/net/ethernet/cavium/thunder/nic_main.c |  58 +++-
 drivers/net/ethernet/cavium/thunder/nic_reg.h  |   1 +
 .../net/ethernet/cavium/thunder/nicvf_ethtool.c|  29 +-
 drivers/net/ethernet/cavium/thunder/nicvf_main.c   | 173 ++-
 drivers/net/ethernet/cavium/thunder/nicvf_queues.c |  26 ++
 drivers/net/ethernet/cavium/thunder/thunder_bgx.c  |  29 ++
 drivers/net/ethernet/cavium/thunder/thunder_bgx.h  |   4 +
 13 files changed, 743 insertions(+), 6 deletions(-)
 create mode 100644 drivers/net/ethernet/cavium/common/Makefile
 create mode 100644 drivers/net/ethernet/cavium/common/cavium_ptp.c
 create mode 100644 drivers/net/ethernet/cavium/common/cavium_ptp.h

-- 
2.15.1



[PATCH net-next v4 2/2] net: thunderx: add timestamping support

2017-12-08 Thread Aleksey Makarov
From: Sunil Goutham 

This adds timestamping support for both receive and transmit
paths. On the receive side no filters are supported i.e either
all pkts will get a timestamp appended infront of the packet or none.
On the transmit side HW doesn't support timestamp insertion but
only generates a separate CQE with transmitted packet's timestamp.
Also HW supports only one packet at a time for timestamping on the
transmit side.

Signed-off-by: Sunil Goutham 
Signed-off-by: Aleksey Makarov 
---
 drivers/net/ethernet/cavium/Kconfig|   1 +
 drivers/net/ethernet/cavium/thunder/nic.h  |  15 ++
 drivers/net/ethernet/cavium/thunder/nic_main.c |  58 ++-
 drivers/net/ethernet/cavium/thunder/nic_reg.h  |   1 +
 .../net/ethernet/cavium/thunder/nicvf_ethtool.c|  29 +++-
 drivers/net/ethernet/cavium/thunder/nicvf_main.c   | 173 -
 drivers/net/ethernet/cavium/thunder/nicvf_queues.c |  26 
 drivers/net/ethernet/cavium/thunder/thunder_bgx.c  |  29 
 drivers/net/ethernet/cavium/thunder/thunder_bgx.h  |   4 +
 9 files changed, 330 insertions(+), 6 deletions(-)

diff --git a/drivers/net/ethernet/cavium/Kconfig 
b/drivers/net/ethernet/cavium/Kconfig
index 2380e9834007..d163c5bdbbcb 100644
--- a/drivers/net/ethernet/cavium/Kconfig
+++ b/drivers/net/ethernet/cavium/Kconfig
@@ -27,6 +27,7 @@ config THUNDER_NIC_PF
 
 config THUNDER_NIC_VF
tristate "Thunder Virtual function driver"
+   select CAVIUM_PTP
depends on 64BIT
---help---
  This driver supports Thunder's NIC virtual function
diff --git a/drivers/net/ethernet/cavium/thunder/nic.h 
b/drivers/net/ethernet/cavium/thunder/nic.h
index 4a02e618e318..204b234beb9d 100644
--- a/drivers/net/ethernet/cavium/thunder/nic.h
+++ b/drivers/net/ethernet/cavium/thunder/nic.h
@@ -263,6 +263,8 @@ struct nicvf_drv_stats {
struct u64_stats_sync   syncp;
 };
 
+struct cavium_ptp;
+
 struct nicvf {
struct nicvf*pnicvf;
struct net_device   *netdev;
@@ -312,6 +314,12 @@ struct nicvf {
struct tasklet_struct   qs_err_task;
struct work_struct  reset_task;
 
+   /* PTP timestamp */
+   struct cavium_ptp   *ptp_clock;
+   boolhw_rx_tstamp;
+   struct sk_buff  *ptp_skb;
+   atomic_ttx_ptp_skbs;
+
/* Interrupt coalescing settings */
u32 cq_coalesce_usecs;
u32 msg_enable;
@@ -371,6 +379,7 @@ struct nicvf {
 #defineNIC_MBOX_MSG_LOOPBACK   0x16/* Set interface in 
loopback */
 #defineNIC_MBOX_MSG_RESET_STAT_COUNTER 0x17/* Reset statistics 
counters */
 #defineNIC_MBOX_MSG_PFC0x18/* Pause frame control 
*/
+#defineNIC_MBOX_MSG_PTP_CFG0x19/* HW packet timestamp 
*/
 #defineNIC_MBOX_MSG_CFG_DONE   0xF0/* VF configuration 
done */
 #defineNIC_MBOX_MSG_SHUTDOWN   0xF1/* VF is being shutdown 
*/
 
@@ -521,6 +530,11 @@ struct pfc {
u8fc_tx;
 };
 
+struct set_ptp {
+   u8msg;
+   bool  enable;
+};
+
 /* 128 bit shared memory between PF and each VF */
 union nic_mbx {
struct { u8 msg; }  msg;
@@ -540,6 +554,7 @@ union nic_mbx {
struct set_loopback lbk;
struct reset_stat_cfg   reset_stat;
struct pfc  pfc;
+   struct set_ptp  ptp;
 };
 
 #define NIC_NODE_ID_MASK   0x03
diff --git a/drivers/net/ethernet/cavium/thunder/nic_main.c 
b/drivers/net/ethernet/cavium/thunder/nic_main.c
index 8f1dd55b3e08..4c1c5414a162 100644
--- a/drivers/net/ethernet/cavium/thunder/nic_main.c
+++ b/drivers/net/ethernet/cavium/thunder/nic_main.c
@@ -426,13 +426,22 @@ static void nic_init_hw(struct nicpf *nic)
/* Enable backpressure */
nic_reg_write(nic, NIC_PF_BP_CFG, (1ULL << 6) | 0x03);
 
-   /* TNS and TNS bypass modes are present only on 88xx */
+   /* TNS and TNS bypass modes are present only on 88xx
+* Also offset of this CSR has changed in 81xx and 83xx.
+*/
if (nic->pdev->subsystem_device == PCI_SUBSYS_DEVID_88XX_NIC_PF) {
/* Disable TNS mode on both interfaces */
nic_reg_write(nic, NIC_PF_INTF_0_1_SEND_CFG,
- (NIC_TNS_BYPASS_MODE << 7) | BGX0_BLOCK);
+ (NIC_TNS_BYPASS_MODE << 7) |
+ BGX0_BLOCK | (1ULL << 16));
nic_reg_write(nic, NIC_PF_INTF_0_1_SEND_CFG | (1 << 8),
- (NIC_TNS_BYPASS_MODE << 7) | BGX1_BLOCK);
+ (NIC_TNS_BYPASS_MODE << 7) |
+ BGX1_BLOCK | (1ULL << 16));
+   } else {
+   /* Configure timestamp generation timeout to 10us */
+   for (i = 0; i < nic->hw

[PATCH net-next v4 1/2] net: add support for Cavium PTP coprocessor

2017-12-08 Thread Aleksey Makarov
From: Radoslaw Biernacki 

This patch adds support for the Precision Time Protocol
Clocks and Timestamping hardware found on Cavium ThunderX
processors.

Signed-off-by: Radoslaw Biernacki 
Signed-off-by: Aleksey Makarov 
---
 drivers/net/ethernet/cavium/Kconfig |  12 +
 drivers/net/ethernet/cavium/Makefile|   1 +
 drivers/net/ethernet/cavium/common/Makefile |   1 +
 drivers/net/ethernet/cavium/common/cavium_ptp.c | 334 
 drivers/net/ethernet/cavium/common/cavium_ptp.h |  78 ++
 5 files changed, 426 insertions(+)
 create mode 100644 drivers/net/ethernet/cavium/common/Makefile
 create mode 100644 drivers/net/ethernet/cavium/common/cavium_ptp.c
 create mode 100644 drivers/net/ethernet/cavium/common/cavium_ptp.h

diff --git a/drivers/net/ethernet/cavium/Kconfig 
b/drivers/net/ethernet/cavium/Kconfig
index 63be75eb34d2..2380e9834007 100644
--- a/drivers/net/ethernet/cavium/Kconfig
+++ b/drivers/net/ethernet/cavium/Kconfig
@@ -50,6 +50,18 @@ config   THUNDER_NIC_RGX
  This driver supports configuring XCV block of RGX interface
  present on CN81XX chip.
 
+config CAVIUM_PTP
+   tristate "Cavium PTP coprocessor as PTP clock"
+   depends on 64BIT
+   select PTP_1588_CLOCK
+   default y
+   ---help---
+ This driver adds support for the Precision Time Protocol Clocks and
+ Timestamping coprocessor (PTP) found on Cavium processors.
+ PTP provides timestamping mechanism that is suitable for use in IEEE 
1588
+ Precision Time Protocol or other purposes.  Timestamps can be used in
+ BGX, TNS, GTI, and NIC blocks.
+
 config LIQUIDIO
tristate "Cavium LiquidIO support"
depends on 64BIT
diff --git a/drivers/net/ethernet/cavium/Makefile 
b/drivers/net/ethernet/cavium/Makefile
index 872da9f7c31a..946bba84e81d 100644
--- a/drivers/net/ethernet/cavium/Makefile
+++ b/drivers/net/ethernet/cavium/Makefile
@@ -1,6 +1,7 @@
 #
 # Makefile for the Cavium ethernet device drivers.
 #
+obj-$(CONFIG_NET_VENDOR_CAVIUM) += common/
 obj-$(CONFIG_NET_VENDOR_CAVIUM) += thunder/
 obj-$(CONFIG_NET_VENDOR_CAVIUM) += liquidio/
 obj-$(CONFIG_NET_VENDOR_CAVIUM) += octeon/
diff --git a/drivers/net/ethernet/cavium/common/Makefile 
b/drivers/net/ethernet/cavium/common/Makefile
new file mode 100644
index ..dd8561b8060b
--- /dev/null
+++ b/drivers/net/ethernet/cavium/common/Makefile
@@ -0,0 +1 @@
+obj-$(CONFIG_CAVIUM_PTP) += cavium_ptp.o
diff --git a/drivers/net/ethernet/cavium/common/cavium_ptp.c 
b/drivers/net/ethernet/cavium/common/cavium_ptp.c
new file mode 100644
index ..f4c738db27fd
--- /dev/null
+++ b/drivers/net/ethernet/cavium/common/cavium_ptp.c
@@ -0,0 +1,334 @@
+/*
+ * cavium_ptp.c - PTP 1588 clock on Cavium hardware
+ *
+ * Copyright (c) 2003-2015, 2017 Cavium, Inc.
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License.
+ *
+ * This file may also be available under a different license from Cavium.
+ * Contact Cavium, Inc. for more information
+ */
+
+#include 
+#include 
+#include 
+#include 
+
+#include "cavium_ptp.h"
+
+#define DRV_NAME   "Cavium PTP Driver"
+
+#define PCI_DEVICE_ID_CAVIUM_PTP   0xA00C
+#define PCI_DEVICE_ID_CAVIUM_RST   0xA00E
+
+#define PCI_PTP_BAR_NO 0
+#define PCI_RST_BAR_NO 0
+
+#define PTP_CLOCK_CFG  0xF00ULL
+#define  PTP_CLOCK_CFG_PTP_EN  BIT(0)
+#define PTP_CLOCK_LO   0xF08ULL
+#define PTP_CLOCK_HI   0xF10ULL
+#define PTP_CLOCK_COMP 0xF18ULL
+
+#define RST_BOOT   0x1600ULL
+#define CLOCK_BASE_RATE5000ULL
+
+static u64 ptp_cavium_clock_get(void)
+{
+   struct pci_dev *pdev;
+   void __iomem *base;
+   u64 ret = CLOCK_BASE_RATE * 16;
+
+   pdev = pci_get_device(PCI_VENDOR_ID_CAVIUM,
+ PCI_DEVICE_ID_CAVIUM_RST, NULL);
+   if (!pdev)
+   goto error;
+
+   base = pci_ioremap_bar(pdev, PCI_RST_BAR_NO);
+   if (!base)
+   goto error_put_pdev;
+
+   ret = CLOCK_BASE_RATE * ((readq(base + RST_BOOT) >> 33) & 0x3f);
+
+   iounmap(base);
+
+error_put_pdev:
+   pci_dev_put(pdev);
+
+error:
+   return ret;
+}
+
+struct cavium_ptp *cavium_ptp_get(void)
+{
+   struct cavium_ptp *ptp;
+   struct pci_dev *pdev;
+
+   pdev = pci_get_device(PCI_VENDOR_ID_CAVIUM,
+ PCI_DEVICE_ID_CAVIUM_PTP, NULL);
+   if (!pdev)
+   return ERR_PTR(-ENODEV);
+
+   ptp = pci_get_drvdata(pdev);
+   if (!ptp) {
+   pci_dev_put(pdev);
+   ptp = ERR_PTR(-EPROBE_DEFER);
+   }
+
+   return ptp;
+}
+EXPORT_SYMBOL(cavium_ptp_get);
+
+void cavium_ptp_put(struct cavium_ptp *ptp)
+{
+   pci_dev_put(ptp->pdev);
+}
+EXPORT_

[PATCH net-next v4 0/2] net: thunderx: add support for PTP clock

2017-12-08 Thread Aleksey Makarov
This series adds support for IEEE 1588 Precision Time Protocol
to Cavium ethernet driver.

The first patch adds support for the Precision Time Protocol Clocks and
Timestamping coprocessor (PTP) found on Cavium processors.
It registers a new PTP clock in the PTP core and provides functions
to use the counter in BGX, TNS, GTI, and NIC blocks.

The second patch introduces support for the PTP protocol to the
Cavium ThunderX ethernet driver.

v4:
- use IS_ENABLED. This fixes compilation of the ptp as a module (David Miller)
- select PTP_1588_CLOCK, not depend on it.  This fixes a build warning.
- change u64 to __be64.  This fixes the sparse warning
  "warning: cast to restricted __be64"
- make nicvf_config_hwtstamp() static. This fixes the sparse warning
  "warning: symbol 'nicvf_config_hwtstamp' was not declared. Should it be 
static?"

v3: https://lkml.kernel.org/r/20171206133100.26436-1-aleksey.maka...@cavium.com
- rebase to net-next

v2: https://lkml.kernel.org/r/20171117134909.8954-1-aleksey.maka...@cavium.com
- use readq()/writeq() in place of cavium_ptp_reg_read()/cavium_ptp_reg_write(),
  don't use readq_relaxed()/writeq_relaxed() (David Daney)

v1: https://lkml.kernel.org/r/20171107190704.15458-1-aleksey.maka...@cavium.com

Radoslaw Biernacki (1):
  net: add support for Cavium PTP coprocessor

Sunil Goutham (1):
  net: thunderx: add timestamping support

 drivers/net/ethernet/cavium/Kconfig|  13 +
 drivers/net/ethernet/cavium/Makefile   |   1 +
 drivers/net/ethernet/cavium/common/Makefile|   1 +
 drivers/net/ethernet/cavium/common/cavium_ptp.c| 334 +
 drivers/net/ethernet/cavium/common/cavium_ptp.h|  78 +
 drivers/net/ethernet/cavium/thunder/nic.h  |  15 +
 drivers/net/ethernet/cavium/thunder/nic_main.c |  58 +++-
 drivers/net/ethernet/cavium/thunder/nic_reg.h  |   1 +
 .../net/ethernet/cavium/thunder/nicvf_ethtool.c|  29 +-
 drivers/net/ethernet/cavium/thunder/nicvf_main.c   | 173 ++-
 drivers/net/ethernet/cavium/thunder/nicvf_queues.c |  26 ++
 drivers/net/ethernet/cavium/thunder/thunder_bgx.c  |  29 ++
 drivers/net/ethernet/cavium/thunder/thunder_bgx.h  |   4 +
 13 files changed, 756 insertions(+), 6 deletions(-)
 create mode 100644 drivers/net/ethernet/cavium/common/Makefile
 create mode 100644 drivers/net/ethernet/cavium/common/cavium_ptp.c
 create mode 100644 drivers/net/ethernet/cavium/common/cavium_ptp.h

-- 
2.15.1



[PATCH net-next v3 1/2] net: add support for Cavium PTP coprocessor

2017-12-06 Thread Aleksey Makarov
From: Radoslaw Biernacki 

This patch adds support for the Precision Time Protocol
Clocks and Timestamping hardware found on Cavium ThunderX
processors.

Signed-off-by: Radoslaw Biernacki 
Signed-off-by: Aleksey Makarov 
---
 drivers/net/ethernet/cavium/Kconfig |  13 +
 drivers/net/ethernet/cavium/Makefile|   1 +
 drivers/net/ethernet/cavium/common/Makefile |   1 +
 drivers/net/ethernet/cavium/common/cavium_ptp.c | 334 
 drivers/net/ethernet/cavium/common/cavium_ptp.h |  78 ++
 5 files changed, 427 insertions(+)
 create mode 100644 drivers/net/ethernet/cavium/common/Makefile
 create mode 100644 drivers/net/ethernet/cavium/common/cavium_ptp.c
 create mode 100644 drivers/net/ethernet/cavium/common/cavium_ptp.h

diff --git a/drivers/net/ethernet/cavium/Kconfig 
b/drivers/net/ethernet/cavium/Kconfig
index 63be75eb34d2..fabe0ffcc2d4 100644
--- a/drivers/net/ethernet/cavium/Kconfig
+++ b/drivers/net/ethernet/cavium/Kconfig
@@ -50,6 +50,19 @@ config   THUNDER_NIC_RGX
  This driver supports configuring XCV block of RGX interface
  present on CN81XX chip.
 
+config CAVIUM_PTP
+   tristate "Cavium PTP coprocessor as PTP clock"
+   depends on 64BIT
+   depends on PTP_1588_CLOCK
+   select CAVIUM_RST
+   default y
+   ---help---
+ This driver adds support for the Precision Time Protocol Clocks and
+ Timestamping coprocessor (PTP) found on Cavium processors.
+ PTP provides timestamping mechanism that is suitable for use in IEEE 
1588
+ Precision Time Protocol or other purposes.  Timestamps can be used in
+ BGX, TNS, GTI, and NIC blocks.
+
 config LIQUIDIO
tristate "Cavium LiquidIO support"
depends on 64BIT
diff --git a/drivers/net/ethernet/cavium/Makefile 
b/drivers/net/ethernet/cavium/Makefile
index 872da9f7c31a..946bba84e81d 100644
--- a/drivers/net/ethernet/cavium/Makefile
+++ b/drivers/net/ethernet/cavium/Makefile
@@ -1,6 +1,7 @@
 #
 # Makefile for the Cavium ethernet device drivers.
 #
+obj-$(CONFIG_NET_VENDOR_CAVIUM) += common/
 obj-$(CONFIG_NET_VENDOR_CAVIUM) += thunder/
 obj-$(CONFIG_NET_VENDOR_CAVIUM) += liquidio/
 obj-$(CONFIG_NET_VENDOR_CAVIUM) += octeon/
diff --git a/drivers/net/ethernet/cavium/common/Makefile 
b/drivers/net/ethernet/cavium/common/Makefile
new file mode 100644
index ..dd8561b8060b
--- /dev/null
+++ b/drivers/net/ethernet/cavium/common/Makefile
@@ -0,0 +1 @@
+obj-$(CONFIG_CAVIUM_PTP) += cavium_ptp.o
diff --git a/drivers/net/ethernet/cavium/common/cavium_ptp.c 
b/drivers/net/ethernet/cavium/common/cavium_ptp.c
new file mode 100644
index ..f4c738db27fd
--- /dev/null
+++ b/drivers/net/ethernet/cavium/common/cavium_ptp.c
@@ -0,0 +1,334 @@
+/*
+ * cavium_ptp.c - PTP 1588 clock on Cavium hardware
+ *
+ * Copyright (c) 2003-2015, 2017 Cavium, Inc.
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License.
+ *
+ * This file may also be available under a different license from Cavium.
+ * Contact Cavium, Inc. for more information
+ */
+
+#include 
+#include 
+#include 
+#include 
+
+#include "cavium_ptp.h"
+
+#define DRV_NAME   "Cavium PTP Driver"
+
+#define PCI_DEVICE_ID_CAVIUM_PTP   0xA00C
+#define PCI_DEVICE_ID_CAVIUM_RST   0xA00E
+
+#define PCI_PTP_BAR_NO 0
+#define PCI_RST_BAR_NO 0
+
+#define PTP_CLOCK_CFG  0xF00ULL
+#define  PTP_CLOCK_CFG_PTP_EN  BIT(0)
+#define PTP_CLOCK_LO   0xF08ULL
+#define PTP_CLOCK_HI   0xF10ULL
+#define PTP_CLOCK_COMP 0xF18ULL
+
+#define RST_BOOT   0x1600ULL
+#define CLOCK_BASE_RATE5000ULL
+
+static u64 ptp_cavium_clock_get(void)
+{
+   struct pci_dev *pdev;
+   void __iomem *base;
+   u64 ret = CLOCK_BASE_RATE * 16;
+
+   pdev = pci_get_device(PCI_VENDOR_ID_CAVIUM,
+ PCI_DEVICE_ID_CAVIUM_RST, NULL);
+   if (!pdev)
+   goto error;
+
+   base = pci_ioremap_bar(pdev, PCI_RST_BAR_NO);
+   if (!base)
+   goto error_put_pdev;
+
+   ret = CLOCK_BASE_RATE * ((readq(base + RST_BOOT) >> 33) & 0x3f);
+
+   iounmap(base);
+
+error_put_pdev:
+   pci_dev_put(pdev);
+
+error:
+   return ret;
+}
+
+struct cavium_ptp *cavium_ptp_get(void)
+{
+   struct cavium_ptp *ptp;
+   struct pci_dev *pdev;
+
+   pdev = pci_get_device(PCI_VENDOR_ID_CAVIUM,
+ PCI_DEVICE_ID_CAVIUM_PTP, NULL);
+   if (!pdev)
+   return ERR_PTR(-ENODEV);
+
+   ptp = pci_get_drvdata(pdev);
+   if (!ptp) {
+   pci_dev_put(pdev);
+   ptp = ERR_PTR(-EPROBE_DEFER);
+   }
+
+   return ptp;
+}
+EXPORT_SYMBOL(cavium_ptp_get);
+
+void cavium_ptp_put(struct cavium_ptp *ptp)
+{
+   pci_de

[PATCH net-next v3 2/2] net: thunderx: add timestamping support

2017-12-06 Thread Aleksey Makarov
From: Sunil Goutham 

This adds timestamping support for both receive and transmit
paths. On the receive side no filters are supported i.e either
all pkts will get a timestamp appended infront of the packet or none.
On the transmit side HW doesn't support timestamp insertion but
only generates a separate CQE with transmitted packet's timestamp.
Also HW supports only one packet at a time for timestamping on the
transmit side.

Signed-off-by: Sunil Goutham 
Signed-off-by: Aleksey Makarov 
---
 drivers/net/ethernet/cavium/Kconfig|   1 +
 drivers/net/ethernet/cavium/thunder/nic.h  |  15 ++
 drivers/net/ethernet/cavium/thunder/nic_main.c |  58 ++-
 drivers/net/ethernet/cavium/thunder/nic_reg.h  |   1 +
 .../net/ethernet/cavium/thunder/nicvf_ethtool.c|  29 +++-
 drivers/net/ethernet/cavium/thunder/nicvf_main.c   | 173 -
 drivers/net/ethernet/cavium/thunder/nicvf_queues.c |  26 
 drivers/net/ethernet/cavium/thunder/thunder_bgx.c  |  29 
 drivers/net/ethernet/cavium/thunder/thunder_bgx.h  |   4 +
 9 files changed, 330 insertions(+), 6 deletions(-)

diff --git a/drivers/net/ethernet/cavium/Kconfig 
b/drivers/net/ethernet/cavium/Kconfig
index fabe0ffcc2d4..6d003cbe197c 100644
--- a/drivers/net/ethernet/cavium/Kconfig
+++ b/drivers/net/ethernet/cavium/Kconfig
@@ -27,6 +27,7 @@ config THUNDER_NIC_PF
 
 config THUNDER_NIC_VF
tristate "Thunder Virtual function driver"
+   select CAVIUM_PTP
depends on 64BIT
---help---
  This driver supports Thunder's NIC virtual function
diff --git a/drivers/net/ethernet/cavium/thunder/nic.h 
b/drivers/net/ethernet/cavium/thunder/nic.h
index 4a02e618e318..204b234beb9d 100644
--- a/drivers/net/ethernet/cavium/thunder/nic.h
+++ b/drivers/net/ethernet/cavium/thunder/nic.h
@@ -263,6 +263,8 @@ struct nicvf_drv_stats {
struct u64_stats_sync   syncp;
 };
 
+struct cavium_ptp;
+
 struct nicvf {
struct nicvf*pnicvf;
struct net_device   *netdev;
@@ -312,6 +314,12 @@ struct nicvf {
struct tasklet_struct   qs_err_task;
struct work_struct  reset_task;
 
+   /* PTP timestamp */
+   struct cavium_ptp   *ptp_clock;
+   boolhw_rx_tstamp;
+   struct sk_buff  *ptp_skb;
+   atomic_ttx_ptp_skbs;
+
/* Interrupt coalescing settings */
u32 cq_coalesce_usecs;
u32 msg_enable;
@@ -371,6 +379,7 @@ struct nicvf {
 #defineNIC_MBOX_MSG_LOOPBACK   0x16/* Set interface in 
loopback */
 #defineNIC_MBOX_MSG_RESET_STAT_COUNTER 0x17/* Reset statistics 
counters */
 #defineNIC_MBOX_MSG_PFC0x18/* Pause frame control 
*/
+#defineNIC_MBOX_MSG_PTP_CFG0x19/* HW packet timestamp 
*/
 #defineNIC_MBOX_MSG_CFG_DONE   0xF0/* VF configuration 
done */
 #defineNIC_MBOX_MSG_SHUTDOWN   0xF1/* VF is being shutdown 
*/
 
@@ -521,6 +530,11 @@ struct pfc {
u8fc_tx;
 };
 
+struct set_ptp {
+   u8msg;
+   bool  enable;
+};
+
 /* 128 bit shared memory between PF and each VF */
 union nic_mbx {
struct { u8 msg; }  msg;
@@ -540,6 +554,7 @@ union nic_mbx {
struct set_loopback lbk;
struct reset_stat_cfg   reset_stat;
struct pfc  pfc;
+   struct set_ptp  ptp;
 };
 
 #define NIC_NODE_ID_MASK   0x03
diff --git a/drivers/net/ethernet/cavium/thunder/nic_main.c 
b/drivers/net/ethernet/cavium/thunder/nic_main.c
index 8f1dd55b3e08..4c1c5414a162 100644
--- a/drivers/net/ethernet/cavium/thunder/nic_main.c
+++ b/drivers/net/ethernet/cavium/thunder/nic_main.c
@@ -426,13 +426,22 @@ static void nic_init_hw(struct nicpf *nic)
/* Enable backpressure */
nic_reg_write(nic, NIC_PF_BP_CFG, (1ULL << 6) | 0x03);
 
-   /* TNS and TNS bypass modes are present only on 88xx */
+   /* TNS and TNS bypass modes are present only on 88xx
+* Also offset of this CSR has changed in 81xx and 83xx.
+*/
if (nic->pdev->subsystem_device == PCI_SUBSYS_DEVID_88XX_NIC_PF) {
/* Disable TNS mode on both interfaces */
nic_reg_write(nic, NIC_PF_INTF_0_1_SEND_CFG,
- (NIC_TNS_BYPASS_MODE << 7) | BGX0_BLOCK);
+ (NIC_TNS_BYPASS_MODE << 7) |
+ BGX0_BLOCK | (1ULL << 16));
nic_reg_write(nic, NIC_PF_INTF_0_1_SEND_CFG | (1 << 8),
- (NIC_TNS_BYPASS_MODE << 7) | BGX1_BLOCK);
+ (NIC_TNS_BYPASS_MODE << 7) |
+ BGX1_BLOCK | (1ULL << 16));
+   } else {
+   /* Configure timestamp generation timeout to 10us */
+   for (i = 0; i < nic->hw

[PATCH net-next v3 0/2] net: thunderx: add support for PTP clock

2017-12-06 Thread Aleksey Makarov
This series adds support for IEEE 1588 Precision Time Protocol
to Cavium ethernet driver.

The first patch adds support for the Precision Time Protocol Clocks and
Timestamping coprocessor (PTP) found on Cavium processors.
It registers a new PTP clock in the PTP core and provides functions
to use the counter in BGX, TNS, GTI, and NIC blocks.

The second patch introduces support for the PTP protocol to the
Cavium ThunderX ethernet driver.

v3:
- rebase to net-next

v2: https://lkml.kernel.org/r/20171117134909.8954-1-aleksey.maka...@cavium.com
- use readq()/writeq() in place of cavium_ptp_reg_read()/cavium_ptp_reg_write(),
  don't use readq_relaxed()/writeq_relaxed() (David Daney)

v1: https://lkml.kernel.org/r/20171107190704.15458-1-aleksey.maka...@cavium.com

Radoslaw Biernacki (1):
  net: add support for Cavium PTP coprocessor

Sunil Goutham (1):
  net: thunderx: add timestamping support

 drivers/net/ethernet/cavium/Kconfig|  14 +
 drivers/net/ethernet/cavium/Makefile   |   1 +
 drivers/net/ethernet/cavium/common/Makefile|   1 +
 drivers/net/ethernet/cavium/common/cavium_ptp.c| 334 +
 drivers/net/ethernet/cavium/common/cavium_ptp.h|  78 +
 drivers/net/ethernet/cavium/thunder/nic.h  |  15 +
 drivers/net/ethernet/cavium/thunder/nic_main.c |  58 +++-
 drivers/net/ethernet/cavium/thunder/nic_reg.h  |   1 +
 .../net/ethernet/cavium/thunder/nicvf_ethtool.c|  29 +-
 drivers/net/ethernet/cavium/thunder/nicvf_main.c   | 173 ++-
 drivers/net/ethernet/cavium/thunder/nicvf_queues.c |  26 ++
 drivers/net/ethernet/cavium/thunder/thunder_bgx.c  |  29 ++
 drivers/net/ethernet/cavium/thunder/thunder_bgx.h  |   4 +
 13 files changed, 757 insertions(+), 6 deletions(-)
 create mode 100644 drivers/net/ethernet/cavium/common/Makefile
 create mode 100644 drivers/net/ethernet/cavium/common/cavium_ptp.c
 create mode 100644 drivers/net/ethernet/cavium/common/cavium_ptp.h

-- 
2.15.1



[PATCH net-next] net: thunderx: Set max queue count taking XDP_TX into account

2017-11-24 Thread Aleksey Makarov
From: Sunil Goutham 

on T81 there are only 4 cores, hence setting max queue count to 4
would leave nothing for XDP_TX. This patch fixes this by doubling
max queue count in above scenarios.

Signed-off-by: Sunil Goutham 
Signed-off-by: cjacob 
Signed-off-by: Aleksey Makarov 
---
 drivers/net/ethernet/cavium/thunder/nicvf_main.c | 5 +
 1 file changed, 5 insertions(+)

diff --git a/drivers/net/ethernet/cavium/thunder/nicvf_main.c 
b/drivers/net/ethernet/cavium/thunder/nicvf_main.c
index b82e28262c57..52b3a6044f85 100644
--- a/drivers/net/ethernet/cavium/thunder/nicvf_main.c
+++ b/drivers/net/ethernet/cavium/thunder/nicvf_main.c
@@ -1891,6 +1891,11 @@ static int nicvf_probe(struct pci_dev *pdev, const 
struct pci_device_id *ent)
nic->pdev = pdev;
nic->pnicvf = nic;
nic->max_queues = qcount;
+   /* If no of CPUs are too low, there won't be any queues left
+* for XDP_TX, hence double it.
+*/
+   if (!nic->t88)
+   nic->max_queues *= 2;
 
/* MAP VF's configuration registers */
nic->reg_base = pcim_iomap(pdev, PCI_CFG_REG_BAR_NUM, 0);
-- 
2.15.0



[PATCH net-next] net: thunderx: Add support for xdp redirect

2017-11-24 Thread Aleksey Makarov
From: Sunil Goutham 

This patch adds support for XDP_REDIRECT. Flush is not
yet supported.

Signed-off-by: Sunil Goutham 
Signed-off-by: cjacob 
Signed-off-by: Aleksey Makarov 
---
 drivers/net/ethernet/cavium/thunder/nicvf_main.c   | 110 -
 drivers/net/ethernet/cavium/thunder/nicvf_queues.c |  11 ++-
 drivers/net/ethernet/cavium/thunder/nicvf_queues.h |   4 +
 3 files changed, 94 insertions(+), 31 deletions(-)

diff --git a/drivers/net/ethernet/cavium/thunder/nicvf_main.c 
b/drivers/net/ethernet/cavium/thunder/nicvf_main.c
index a063c36c4c58..b82e28262c57 100644
--- a/drivers/net/ethernet/cavium/thunder/nicvf_main.c
+++ b/drivers/net/ethernet/cavium/thunder/nicvf_main.c
@@ -65,6 +65,11 @@ module_param(cpi_alg, int, S_IRUGO);
 MODULE_PARM_DESC(cpi_alg,
 "PFC algorithm (0=none, 1=VLAN, 2=VLAN16, 3=IP Diffserv)");
 
+struct nicvf_xdp_tx {
+   u64 dma_addr;
+   u8  qidx;
+};
+
 static inline u8 nicvf_netdev_qidx(struct nicvf *nic, u8 qidx)
 {
if (nic->sqs_mode)
@@ -500,14 +505,29 @@ static int nicvf_init_resources(struct nicvf *nic)
return 0;
 }
 
+static void nicvf_unmap_page(struct nicvf *nic, struct page *page, u64 
dma_addr)
+{
+   /* Check if it's a recycled page, if not unmap the DMA mapping.
+* Recycled page holds an extra reference.
+*/
+   if (page_ref_count(page) == 1) {
+   dma_addr &= PAGE_MASK;
+   dma_unmap_page_attrs(&nic->pdev->dev, dma_addr,
+RCV_FRAG_LEN + XDP_HEADROOM,
+DMA_FROM_DEVICE,
+DMA_ATTR_SKIP_CPU_SYNC);
+   }
+}
+
 static inline bool nicvf_xdp_rx(struct nicvf *nic, struct bpf_prog *prog,
struct cqe_rx_t *cqe_rx, struct snd_queue *sq,
struct sk_buff **skb)
 {
struct xdp_buff xdp;
struct page *page;
+   struct nicvf_xdp_tx *xdp_tx = NULL;
u32 action;
-   u16 len, offset = 0;
+   u16 len, err, offset = 0;
u64 dma_addr, cpu_addr;
void *orig_data;
 
@@ -521,7 +541,7 @@ static inline bool nicvf_xdp_rx(struct nicvf *nic, struct 
bpf_prog *prog,
cpu_addr = (u64)phys_to_virt(cpu_addr);
page = virt_to_page((void *)cpu_addr);
 
-   xdp.data_hard_start = page_address(page);
+   xdp.data_hard_start = page_address(page) + RCV_BUF_HEADROOM;
xdp.data = (void *)cpu_addr;
xdp_set_data_meta_invalid(&xdp);
xdp.data_end = xdp.data + len;
@@ -540,18 +560,7 @@ static inline bool nicvf_xdp_rx(struct nicvf *nic, struct 
bpf_prog *prog,
 
switch (action) {
case XDP_PASS:
-   /* Check if it's a recycled page, if not
-* unmap the DMA mapping.
-*
-* Recycled page holds an extra reference.
-*/
-   if (page_ref_count(page) == 1) {
-   dma_addr &= PAGE_MASK;
-   dma_unmap_page_attrs(&nic->pdev->dev, dma_addr,
-RCV_FRAG_LEN + XDP_PACKET_HEADROOM,
-DMA_FROM_DEVICE,
-DMA_ATTR_SKIP_CPU_SYNC);
-   }
+   nicvf_unmap_page(nic, page, dma_addr);
 
/* Build SKB and pass on packet to network stack */
*skb = build_skb(xdp.data,
@@ -564,6 +573,20 @@ static inline bool nicvf_xdp_rx(struct nicvf *nic, struct 
bpf_prog *prog,
case XDP_TX:
nicvf_xdp_sq_append_pkt(nic, sq, (u64)xdp.data, dma_addr, len);
return true;
+   case XDP_REDIRECT:
+   /* Save DMA address for use while transmitting */
+   xdp_tx = (struct nicvf_xdp_tx *)page_address(page);
+   xdp_tx->dma_addr = dma_addr;
+   xdp_tx->qidx = nicvf_netdev_qidx(nic, cqe_rx->rq_idx);
+
+   err = xdp_do_redirect(nic->pnicvf->netdev, &xdp, prog);
+   if (!err)
+   return true;
+
+   /* Free the page on error */
+   nicvf_unmap_page(nic, page, dma_addr);
+   put_page(page);
+   break;
default:
bpf_warn_invalid_xdp_action(action);
/* fall through */
@@ -571,18 +594,7 @@ static inline bool nicvf_xdp_rx(struct nicvf *nic, struct 
bpf_prog *prog,
trace_xdp_exception(nic->netdev, prog, action);
/* fall through */
case XDP_DROP:
-   /* Check if it's a recycled page, if not
-* unmap the DMA mapping.
-*
-* Recycled page holds an extra reference.
-*/
-   if (page_ref_count(page) == 1) {
-   dma_addr &a

[PATCH net v3] net: thunderx: Fix TCP/UDP checksum offload for IPv6 pkts

2017-11-23 Thread Aleksey Makarov
From: Sunil Goutham 

Don't offload IP header checksum to NIC.

This fixes a previous patch which enabled checksum offloading
for both IPv4 and IPv6 packets.  So L3 checksum offload was
getting enabled for IPv6 pkts.  And HW is dropping these pkts
as it assumes the pkt is IPv4 when IP csum offload is set
in the SQ descriptor.

Fixes:  3a9024f52c2e ("net: thunderx: Enable TSO and checksum offloads for 
ipv6")
Signed-off-by: Sunil Goutham 
Signed-off-by: Aleksey Makarov 
Reviewed-by: Eric Dumazet 
---
 drivers/net/ethernet/cavium/thunder/nicvf_queues.c | 1 -
 1 file changed, 1 deletion(-)

v3:
- fix the Fixes: tag (David Miller)
- add Reviewed-by Eric Dumazet

v2: https://lkml.kernel.org/r/20171123144158.26111-1-aleksey.maka...@auriga.com
- don't enable checksum offloading both for IPv4 and IPv6 (Eric Dumazet)

v1: https://lkml.kernel.org/r/20171122123727.23580-1-aleksey.maka...@auriga.com


diff --git a/drivers/net/ethernet/cavium/thunder/nicvf_queues.c 
b/drivers/net/ethernet/cavium/thunder/nicvf_queues.c
index d4496e9afcdf..8b2c31e2a2b0 100644
--- a/drivers/net/ethernet/cavium/thunder/nicvf_queues.c
+++ b/drivers/net/ethernet/cavium/thunder/nicvf_queues.c
@@ -1355,7 +1355,6 @@ nicvf_sq_add_hdr_subdesc(struct nicvf *nic, struct 
snd_queue *sq, int qentry,
 
/* Offload checksum calculation to HW */
if (skb->ip_summed == CHECKSUM_PARTIAL) {
-   hdr->csum_l3 = 1; /* Enable IP csum calculation */
hdr->l3_offset = skb_network_offset(skb);
hdr->l4_offset = skb_transport_offset(skb);
 
-- 
2.15.0



[PATCH net v3] net: thunderx: Fix TCP/UDP checksum offload for IPv6 pkts

2017-11-23 Thread Aleksey Makarov
From: Sunil Goutham 

Don't offload IP header checksum to NIC.

This fixes a previous patch which enabled checksum offloading
for both IPv4 and IPv6 packets.  So L3 checksum offload was
getting enabled for IPv6 pkts.  And HW is dropping these pkts
as it assumes the pkt is IPv4 when IP csum offload is set
in the SQ descriptor.

Fixes:  3a9024f52c2e ("net: thunderx: Enable TSO and checksum offloads for 
ipv6")
Signed-off-by: Sunil Goutham 
Signed-off-by: Aleksey Makarov 
---
 drivers/net/ethernet/cavium/thunder/nicvf_queues.c | 1 -
 1 file changed, 1 deletion(-)

v3:
- fix the Fixes: tag (David Miller)

v2: https://lkml.kernel.org/r/20171123144158.26111-1-aleksey.maka...@auriga.com
- don't enable checksum offloading both for IPv4 and IPv6 (Eric Dumazet)

v1: https://lkml.kernel.org/r/20171122123727.23580-1-aleksey.maka...@auriga.com


diff --git a/drivers/net/ethernet/cavium/thunder/nicvf_queues.c 
b/drivers/net/ethernet/cavium/thunder/nicvf_queues.c
index d4496e9afcdf..8b2c31e2a2b0 100644
--- a/drivers/net/ethernet/cavium/thunder/nicvf_queues.c
+++ b/drivers/net/ethernet/cavium/thunder/nicvf_queues.c
@@ -1355,7 +1355,6 @@ nicvf_sq_add_hdr_subdesc(struct nicvf *nic, struct 
snd_queue *sq, int qentry,
 
/* Offload checksum calculation to HW */
if (skb->ip_summed == CHECKSUM_PARTIAL) {
-   hdr->csum_l3 = 1; /* Enable IP csum calculation */
hdr->l3_offset = skb_network_offset(skb);
hdr->l4_offset = skb_transport_offset(skb);
 
-- 
2.15.0



[PATCH net v2] net: thunderx: Fix TCP/UDP checksum offload for IPv6 pkts

2017-11-23 Thread Aleksey Makarov
From: Sunil Goutham 

Don't offload IP header checksum to NIC.

This fixes a previous patch which enabled checksum offloading
for both IPv4 and IPv6 packets.  So L3 checksum offload was
getting enabled for IPv6 pkts.  And HW is dropping these pkts
as it assumes the pkt is IPv4 when IP csum offload is set
in the SQ descriptor.

Fixes: 494fd005 ("net: thunderx: Enable TSO and checksum offloads for ipv6")
Signed-off-by: Sunil Goutham 
Signed-off-by: Aleksey Makarov 
---
 drivers/net/ethernet/cavium/thunder/nicvf_queues.c | 1 -
 1 file changed, 1 deletion(-)

v2:
- Don't enable checksum offloading both for IPv4 and IPv6 (Eric Dumazet)

v1:
  https://lkml.kernel.org/r/20171122123727.23580-1-aleksey.maka...@auriga.com

diff --git a/drivers/net/ethernet/cavium/thunder/nicvf_queues.c 
b/drivers/net/ethernet/cavium/thunder/nicvf_queues.c
index d4496e9afcdf..8b2c31e2a2b0 100644
--- a/drivers/net/ethernet/cavium/thunder/nicvf_queues.c
+++ b/drivers/net/ethernet/cavium/thunder/nicvf_queues.c
@@ -1355,7 +1355,6 @@ nicvf_sq_add_hdr_subdesc(struct nicvf *nic, struct 
snd_queue *sq, int qentry,
 
/* Offload checksum calculation to HW */
if (skb->ip_summed == CHECKSUM_PARTIAL) {
-   hdr->csum_l3 = 1; /* Enable IP csum calculation */
hdr->l3_offset = skb_network_offset(skb);
hdr->l4_offset = skb_transport_offset(skb);
 
-- 
2.15.0



[PATCH net] net: thunderx: Fix TCP/UDP checksum offload for IPv6 pkts

2017-11-22 Thread Aleksey Makarov
From: Sunil Goutham 

This fixes a previous patch which missed some changes
and due to which L3 checksum offload was getting enabled
for IPv6 pkts. And HW is dropping these pkts as it assumes
the pkt is IPv4 when IP csum offload is set in the SQ
descriptor.

Fixes: 494fd005 ("net: thunderx: Enable TSO and checksum offloads for ipv6")
Signed-off-by: Sunil Goutham 
Signed-off-by: Aleksey Makarov 
---
 drivers/net/ethernet/cavium/thunder/nicvf_queues.c | 3 ++-
 1 file changed, 2 insertions(+), 1 deletion(-)

diff --git a/drivers/net/ethernet/cavium/thunder/nicvf_queues.c 
b/drivers/net/ethernet/cavium/thunder/nicvf_queues.c
index d4496e9afcdf..184d5bdbe7e0 100644
--- a/drivers/net/ethernet/cavium/thunder/nicvf_queues.c
+++ b/drivers/net/ethernet/cavium/thunder/nicvf_queues.c
@@ -1355,10 +1355,11 @@ nicvf_sq_add_hdr_subdesc(struct nicvf *nic, struct 
snd_queue *sq, int qentry,
 
/* Offload checksum calculation to HW */
if (skb->ip_summed == CHECKSUM_PARTIAL) {
-   hdr->csum_l3 = 1; /* Enable IP csum calculation */
hdr->l3_offset = skb_network_offset(skb);
hdr->l4_offset = skb_transport_offset(skb);
 
+   /* Enable IP HDR csum calculation for V4 pkts */
+   hdr->csum_l3 = (ip.v4->version == 4) ? 1 : 0;
proto = (ip.v4->version == 4) ? ip.v4->protocol :
ip.v6->nexthdr;
 
-- 
2.15.0



[PATCH net-next v2 2/2] net: thunderx: add timestamping support

2017-11-17 Thread Aleksey Makarov
From: Sunil Goutham 

This adds timestamping support for both receive and transmit
paths. On the receive side no filters are supported i.e either
all pkts will get a timestamp appended infront of the packet or none.
On the transmit side HW doesn't support timestamp insertion but
only generates a separate CQE with transmitted packet's timestamp.
Also HW supports only one packet at a time for timestamping on the
transmit side.

Signed-off-by: Sunil Goutham 
Signed-off-by: Aleksey Makarov 
---
 drivers/net/ethernet/cavium/Kconfig|   1 +
 drivers/net/ethernet/cavium/thunder/nic.h  |  15 ++
 drivers/net/ethernet/cavium/thunder/nic_main.c |  58 ++-
 drivers/net/ethernet/cavium/thunder/nic_reg.h  |   1 +
 .../net/ethernet/cavium/thunder/nicvf_ethtool.c|  29 +++-
 drivers/net/ethernet/cavium/thunder/nicvf_main.c   | 173 -
 drivers/net/ethernet/cavium/thunder/nicvf_queues.c |  26 
 drivers/net/ethernet/cavium/thunder/thunder_bgx.c  |  29 
 drivers/net/ethernet/cavium/thunder/thunder_bgx.h  |   4 +
 9 files changed, 330 insertions(+), 6 deletions(-)

diff --git a/drivers/net/ethernet/cavium/Kconfig 
b/drivers/net/ethernet/cavium/Kconfig
index fabe0ffcc2d4..6d003cbe197c 100644
--- a/drivers/net/ethernet/cavium/Kconfig
+++ b/drivers/net/ethernet/cavium/Kconfig
@@ -27,6 +27,7 @@ config THUNDER_NIC_PF
 
 config THUNDER_NIC_VF
tristate "Thunder Virtual function driver"
+   select CAVIUM_PTP
depends on 64BIT
---help---
  This driver supports Thunder's NIC virtual function
diff --git a/drivers/net/ethernet/cavium/thunder/nic.h 
b/drivers/net/ethernet/cavium/thunder/nic.h
index 4a02e618e318..204b234beb9d 100644
--- a/drivers/net/ethernet/cavium/thunder/nic.h
+++ b/drivers/net/ethernet/cavium/thunder/nic.h
@@ -263,6 +263,8 @@ struct nicvf_drv_stats {
struct u64_stats_sync   syncp;
 };
 
+struct cavium_ptp;
+
 struct nicvf {
struct nicvf*pnicvf;
struct net_device   *netdev;
@@ -312,6 +314,12 @@ struct nicvf {
struct tasklet_struct   qs_err_task;
struct work_struct  reset_task;
 
+   /* PTP timestamp */
+   struct cavium_ptp   *ptp_clock;
+   boolhw_rx_tstamp;
+   struct sk_buff  *ptp_skb;
+   atomic_ttx_ptp_skbs;
+
/* Interrupt coalescing settings */
u32 cq_coalesce_usecs;
u32 msg_enable;
@@ -371,6 +379,7 @@ struct nicvf {
 #defineNIC_MBOX_MSG_LOOPBACK   0x16/* Set interface in 
loopback */
 #defineNIC_MBOX_MSG_RESET_STAT_COUNTER 0x17/* Reset statistics 
counters */
 #defineNIC_MBOX_MSG_PFC0x18/* Pause frame control 
*/
+#defineNIC_MBOX_MSG_PTP_CFG0x19/* HW packet timestamp 
*/
 #defineNIC_MBOX_MSG_CFG_DONE   0xF0/* VF configuration 
done */
 #defineNIC_MBOX_MSG_SHUTDOWN   0xF1/* VF is being shutdown 
*/
 
@@ -521,6 +530,11 @@ struct pfc {
u8fc_tx;
 };
 
+struct set_ptp {
+   u8msg;
+   bool  enable;
+};
+
 /* 128 bit shared memory between PF and each VF */
 union nic_mbx {
struct { u8 msg; }  msg;
@@ -540,6 +554,7 @@ union nic_mbx {
struct set_loopback lbk;
struct reset_stat_cfg   reset_stat;
struct pfc  pfc;
+   struct set_ptp  ptp;
 };
 
 #define NIC_NODE_ID_MASK   0x03
diff --git a/drivers/net/ethernet/cavium/thunder/nic_main.c 
b/drivers/net/ethernet/cavium/thunder/nic_main.c
index 8f1dd55b3e08..4c1c5414a162 100644
--- a/drivers/net/ethernet/cavium/thunder/nic_main.c
+++ b/drivers/net/ethernet/cavium/thunder/nic_main.c
@@ -426,13 +426,22 @@ static void nic_init_hw(struct nicpf *nic)
/* Enable backpressure */
nic_reg_write(nic, NIC_PF_BP_CFG, (1ULL << 6) | 0x03);
 
-   /* TNS and TNS bypass modes are present only on 88xx */
+   /* TNS and TNS bypass modes are present only on 88xx
+* Also offset of this CSR has changed in 81xx and 83xx.
+*/
if (nic->pdev->subsystem_device == PCI_SUBSYS_DEVID_88XX_NIC_PF) {
/* Disable TNS mode on both interfaces */
nic_reg_write(nic, NIC_PF_INTF_0_1_SEND_CFG,
- (NIC_TNS_BYPASS_MODE << 7) | BGX0_BLOCK);
+ (NIC_TNS_BYPASS_MODE << 7) |
+ BGX0_BLOCK | (1ULL << 16));
nic_reg_write(nic, NIC_PF_INTF_0_1_SEND_CFG | (1 << 8),
- (NIC_TNS_BYPASS_MODE << 7) | BGX1_BLOCK);
+ (NIC_TNS_BYPASS_MODE << 7) |
+ BGX1_BLOCK | (1ULL << 16));
+   } else {
+   /* Configure timestamp generation timeout to 10us */
+   for (i = 0; i < nic->hw

[PATCH net-next v2 1/2] net: add support for Cavium PTP coprocessor

2017-11-17 Thread Aleksey Makarov
From: Radoslaw Biernacki 

This patch adds support for the Precision Time Protocol
Clocks and Timestamping hardware found on Cavium ThunderX
processors.

Signed-off-by: Radoslaw Biernacki 
Signed-off-by: Aleksey Makarov 
---
 drivers/net/ethernet/cavium/Kconfig |  13 +
 drivers/net/ethernet/cavium/Makefile|   1 +
 drivers/net/ethernet/cavium/common/Makefile |   1 +
 drivers/net/ethernet/cavium/common/cavium_ptp.c | 334 
 drivers/net/ethernet/cavium/common/cavium_ptp.h |  78 ++
 5 files changed, 427 insertions(+)
 create mode 100644 drivers/net/ethernet/cavium/common/Makefile
 create mode 100644 drivers/net/ethernet/cavium/common/cavium_ptp.c
 create mode 100644 drivers/net/ethernet/cavium/common/cavium_ptp.h

diff --git a/drivers/net/ethernet/cavium/Kconfig 
b/drivers/net/ethernet/cavium/Kconfig
index 63be75eb34d2..fabe0ffcc2d4 100644
--- a/drivers/net/ethernet/cavium/Kconfig
+++ b/drivers/net/ethernet/cavium/Kconfig
@@ -50,6 +50,19 @@ config   THUNDER_NIC_RGX
  This driver supports configuring XCV block of RGX interface
  present on CN81XX chip.
 
+config CAVIUM_PTP
+   tristate "Cavium PTP coprocessor as PTP clock"
+   depends on 64BIT
+   depends on PTP_1588_CLOCK
+   select CAVIUM_RST
+   default y
+   ---help---
+ This driver adds support for the Precision Time Protocol Clocks and
+ Timestamping coprocessor (PTP) found on Cavium processors.
+ PTP provides timestamping mechanism that is suitable for use in IEEE 
1588
+ Precision Time Protocol or other purposes.  Timestamps can be used in
+ BGX, TNS, GTI, and NIC blocks.
+
 config LIQUIDIO
tristate "Cavium LiquidIO support"
depends on 64BIT
diff --git a/drivers/net/ethernet/cavium/Makefile 
b/drivers/net/ethernet/cavium/Makefile
index 872da9f7c31a..946bba84e81d 100644
--- a/drivers/net/ethernet/cavium/Makefile
+++ b/drivers/net/ethernet/cavium/Makefile
@@ -1,6 +1,7 @@
 #
 # Makefile for the Cavium ethernet device drivers.
 #
+obj-$(CONFIG_NET_VENDOR_CAVIUM) += common/
 obj-$(CONFIG_NET_VENDOR_CAVIUM) += thunder/
 obj-$(CONFIG_NET_VENDOR_CAVIUM) += liquidio/
 obj-$(CONFIG_NET_VENDOR_CAVIUM) += octeon/
diff --git a/drivers/net/ethernet/cavium/common/Makefile 
b/drivers/net/ethernet/cavium/common/Makefile
new file mode 100644
index ..dd8561b8060b
--- /dev/null
+++ b/drivers/net/ethernet/cavium/common/Makefile
@@ -0,0 +1 @@
+obj-$(CONFIG_CAVIUM_PTP) += cavium_ptp.o
diff --git a/drivers/net/ethernet/cavium/common/cavium_ptp.c 
b/drivers/net/ethernet/cavium/common/cavium_ptp.c
new file mode 100644
index ..f4c738db27fd
--- /dev/null
+++ b/drivers/net/ethernet/cavium/common/cavium_ptp.c
@@ -0,0 +1,334 @@
+/*
+ * cavium_ptp.c - PTP 1588 clock on Cavium hardware
+ *
+ * Copyright (c) 2003-2015, 2017 Cavium, Inc.
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License.
+ *
+ * This file may also be available under a different license from Cavium.
+ * Contact Cavium, Inc. for more information
+ */
+
+#include 
+#include 
+#include 
+#include 
+
+#include "cavium_ptp.h"
+
+#define DRV_NAME   "Cavium PTP Driver"
+
+#define PCI_DEVICE_ID_CAVIUM_PTP   0xA00C
+#define PCI_DEVICE_ID_CAVIUM_RST   0xA00E
+
+#define PCI_PTP_BAR_NO 0
+#define PCI_RST_BAR_NO 0
+
+#define PTP_CLOCK_CFG  0xF00ULL
+#define  PTP_CLOCK_CFG_PTP_EN  BIT(0)
+#define PTP_CLOCK_LO   0xF08ULL
+#define PTP_CLOCK_HI   0xF10ULL
+#define PTP_CLOCK_COMP 0xF18ULL
+
+#define RST_BOOT   0x1600ULL
+#define CLOCK_BASE_RATE5000ULL
+
+static u64 ptp_cavium_clock_get(void)
+{
+   struct pci_dev *pdev;
+   void __iomem *base;
+   u64 ret = CLOCK_BASE_RATE * 16;
+
+   pdev = pci_get_device(PCI_VENDOR_ID_CAVIUM,
+ PCI_DEVICE_ID_CAVIUM_RST, NULL);
+   if (!pdev)
+   goto error;
+
+   base = pci_ioremap_bar(pdev, PCI_RST_BAR_NO);
+   if (!base)
+   goto error_put_pdev;
+
+   ret = CLOCK_BASE_RATE * ((readq(base + RST_BOOT) >> 33) & 0x3f);
+
+   iounmap(base);
+
+error_put_pdev:
+   pci_dev_put(pdev);
+
+error:
+   return ret;
+}
+
+struct cavium_ptp *cavium_ptp_get(void)
+{
+   struct cavium_ptp *ptp;
+   struct pci_dev *pdev;
+
+   pdev = pci_get_device(PCI_VENDOR_ID_CAVIUM,
+ PCI_DEVICE_ID_CAVIUM_PTP, NULL);
+   if (!pdev)
+   return ERR_PTR(-ENODEV);
+
+   ptp = pci_get_drvdata(pdev);
+   if (!ptp) {
+   pci_dev_put(pdev);
+   ptp = ERR_PTR(-EPROBE_DEFER);
+   }
+
+   return ptp;
+}
+EXPORT_SYMBOL(cavium_ptp_get);
+
+void cavium_ptp_put(struct cavium_ptp *ptp)
+{
+   pci_de

[PATCH net-next v2 0/2] net: thunderx: add support for PTP clock

2017-11-17 Thread Aleksey Makarov
This series adds support for IEEE 1588 Precision Time Protocol
to Cavium ethernet driver.

The first patch adds support for the Precision Time Protocol Clocks and
Timestamping coprocessor (PTP) found on Cavium processors.
It registers a new PTP clock in the PTP core and provides functions
to use the counter in BGX, TNS, GTI, and NIC blocks.

The second patch introduces support for the PTP protocol to the
Cavium ThunderX ethernet driver.

v2:
- use readq()/writeq() in place of cavium_ptp_reg_read()/cavium_ptp_reg_write(),
  don't use readq_relaxed()/writeq_relaxed() (David Daney)

v1:
  https://lkml.kernel.org/r/20171107190704.15458-1-aleksey.maka...@cavium.com

Radoslaw Biernacki (1):
  net: add support for Cavium PTP coprocessor

Sunil Goutham (1):
  net: thunderx: add timestamping support

 drivers/net/ethernet/cavium/Kconfig|  14 +
 drivers/net/ethernet/cavium/Makefile   |   1 +
 drivers/net/ethernet/cavium/common/Makefile|   1 +
 drivers/net/ethernet/cavium/common/cavium_ptp.c| 334 +
 drivers/net/ethernet/cavium/common/cavium_ptp.h|  78 +
 drivers/net/ethernet/cavium/thunder/nic.h  |  15 +
 drivers/net/ethernet/cavium/thunder/nic_main.c |  58 +++-
 drivers/net/ethernet/cavium/thunder/nic_reg.h  |   1 +
 .../net/ethernet/cavium/thunder/nicvf_ethtool.c|  29 +-
 drivers/net/ethernet/cavium/thunder/nicvf_main.c   | 173 ++-
 drivers/net/ethernet/cavium/thunder/nicvf_queues.c |  26 ++
 drivers/net/ethernet/cavium/thunder/thunder_bgx.c  |  29 ++
 drivers/net/ethernet/cavium/thunder/thunder_bgx.h  |   4 +
 13 files changed, 757 insertions(+), 6 deletions(-)
 create mode 100644 drivers/net/ethernet/cavium/common/Makefile
 create mode 100644 drivers/net/ethernet/cavium/common/cavium_ptp.c
 create mode 100644 drivers/net/ethernet/cavium/common/cavium_ptp.h

-- 
2.15.0



[PATCH net-next] net: thunderx: fix double free error

2017-11-09 Thread Aleksey Makarov
This patch fixes an error in memory allocation/freeing in
ThunderX PF driver.

I moved the allocation to the probe() function and made it managed.

>From the Colin's email:

While running static analysis on linux-next with CoverityScan I found 3
double free errors in the Cavium thunder driver.

The issue occurs on the err_disable_device: label of function nic_probe
when nic_free_lmacmem(nic) is called and a double free occurs on
nic->duplex, nic->link and nic->speed.  This occurs when nic_init_hw()
fails:

/* Initialize hardware */
err = nic_init_hw(nic);
if (err)
goto err_release_regions;

nic_init_hw() calls nic_get_hw_info() and this calls nic_free_lmacmem()
if any of the allocations fail. This free'ing occurs again by the call
to nic_free_lmacmem() on the err_release_regions exit path in nic_probe().

Reported-by: Colin Ian King 
Signed-off-by: Aleksey Makarov 
---
 drivers/net/ethernet/cavium/thunder/nic_main.c | 82 ++
 1 file changed, 30 insertions(+), 52 deletions(-)

diff --git a/drivers/net/ethernet/cavium/thunder/nic_main.c 
b/drivers/net/ethernet/cavium/thunder/nic_main.c
index c12ab7f1adb9..26309e209217 100644
--- a/drivers/net/ethernet/cavium/thunder/nic_main.c
+++ b/drivers/net/ethernet/cavium/thunder/nic_main.c
@@ -361,17 +361,8 @@ static void nic_set_lmac_vf_mapping(struct nicpf *nic)
}
 }
 
-static void nic_free_lmacmem(struct nicpf *nic)
+static void nic_get_hw_info(struct nicpf *nic)
 {
-   kfree(nic->vf_lmac_map);
-   kfree(nic->link);
-   kfree(nic->duplex);
-   kfree(nic->speed);
-}
-
-static int nic_get_hw_info(struct nicpf *nic)
-{
-   u8 max_lmac;
u16 sdevid;
struct hw_info *hw = nic->hw;
 
@@ -419,41 +410,16 @@ static int nic_get_hw_info(struct nicpf *nic)
break;
}
hw->tl4_cnt = MAX_QUEUES_PER_QSET * pci_sriov_get_totalvfs(nic->pdev);
-
-   /* Allocate memory for LMAC tracking elements */
-   max_lmac = hw->bgx_cnt * MAX_LMAC_PER_BGX;
-   nic->vf_lmac_map = kmalloc_array(max_lmac, sizeof(u8), GFP_KERNEL);
-   if (!nic->vf_lmac_map)
-   goto error;
-   nic->link = kmalloc_array(max_lmac, sizeof(u8), GFP_KERNEL);
-   if (!nic->link)
-   goto error;
-   nic->duplex = kmalloc_array(max_lmac, sizeof(u8), GFP_KERNEL);
-   if (!nic->duplex)
-   goto error;
-   nic->speed = kmalloc_array(max_lmac, sizeof(u32), GFP_KERNEL);
-   if (!nic->speed)
-   goto error;
-   return 0;
-
-error:
-   nic_free_lmacmem(nic);
-   return -ENOMEM;
 }
 
 #define BGX0_BLOCK 8
 #define BGX1_BLOCK 9
 
-static int nic_init_hw(struct nicpf *nic)
+static void nic_init_hw(struct nicpf *nic)
 {
-   int i, err;
+   int i;
u64 cqm_cfg;
 
-   /* Get HW capability info */
-   err = nic_get_hw_info(nic);
-   if (err)
-   return err;
-
/* Enable NIC HW block */
nic_reg_write(nic, NIC_PF_CFG, 0x3);
 
@@ -507,8 +473,6 @@ static int nic_init_hw(struct nicpf *nic)
cqm_cfg = nic_reg_read(nic, NIC_PF_CQM_CFG);
if (cqm_cfg < NICPF_CQM_MIN_DROP_LEVEL)
nic_reg_write(nic, NIC_PF_CQM_CFG, NICPF_CQM_MIN_DROP_LEVEL);
-
-   return 0;
 }
 
 /* Channel parse index configuration */
@@ -1325,6 +1289,7 @@ static int nic_probe(struct pci_dev *pdev, const struct 
pci_device_id *ent)
 {
struct device *dev = &pdev->dev;
struct nicpf *nic;
+   u8 max_lmac;
interr;
 
BUILD_BUG_ON(sizeof(union nic_mbx) > 16);
@@ -1334,10 +1299,8 @@ static int nic_probe(struct pci_dev *pdev, const struct 
pci_device_id *ent)
return -ENOMEM;
 
nic->hw = devm_kzalloc(dev, sizeof(struct hw_info), GFP_KERNEL);
-   if (!nic->hw) {
-   devm_kfree(dev, nic);
+   if (!nic->hw)
return -ENOMEM;
-   }
 
pci_set_drvdata(pdev, nic);
 
@@ -1378,11 +1341,33 @@ static int nic_probe(struct pci_dev *pdev, const struct 
pci_device_id *ent)
 
nic->node = nic_get_node_id(pdev);
 
-   /* Initialize hardware */
-   err = nic_init_hw(nic);
-   if (err)
+   /* Get HW capability info */
+   nic_get_hw_info(nic);
+
+   /* Allocate memory for LMAC tracking elements */
+   err = -ENOMEM;
+   max_lmac = nic->hw->bgx_cnt * MAX_LMAC_PER_BGX;
+
+   nic->vf_lmac_map = devm_kmalloc_array(dev, max_lmac, sizeof(u8),
+ GFP_KERNEL);
+   if (!nic->vf_lmac_map)
+   goto err_release_regions;
+
+   nic->link = devm_kmalloc_array(dev, max_lmac, sizeof(u8), GFP_KERNEL);
+   if (!nic->link)
goto err_release_regions;
 
+   nic->duplex = devm_kmalloc_array(dev, max_lmac, sizeof(u8), GFP_KERNEL);
+   if (!nic->duplex)
+  

Re: [PATCH net-next 1/2] net: add support for Cavium PTP coprocessor

2017-11-08 Thread Aleksey Makarov



On 11/07/2017 10:49 PM, David Daney wrote:

On 11/07/2017 11:07 AM, Aleksey Makarov wrote:

From: Radoslaw Biernacki 

This patch adds support for the Precision Time Protocol
Clocks and Timestamping hardware found on Cavium ThunderX
processors.

Signed-off-by: Radoslaw Biernacki 
Signed-off-by: Aleksey Makarov 
---
  drivers/net/ethernet/cavium/Kconfig |  13 +
  drivers/net/ethernet/cavium/Makefile    |   1 +
  drivers/net/ethernet/cavium/common/Makefile |   1 +
  drivers/net/ethernet/cavium/common/cavium_ptp.c | 353 
  drivers/net/ethernet/cavium/common/cavium_ptp.h |  78 ++
  5 files changed, 446 insertions(+)
  create mode 100644 drivers/net/ethernet/cavium/common/Makefile
  create mode 100644 drivers/net/ethernet/cavium/common/cavium_ptp.c
  create mode 100644 drivers/net/ethernet/cavium/common/cavium_ptp.h


[...]

+
+/* The Cavium PTP can *only* be found in SoCs containing the ThunderX
+ * ARM64 CPU implementation.  All accesses to the device registers on this
+ * platform are implicitly strongly ordered with respect to memory
+ * accesses.


I believe that is not correct.  I/O register accesses are implicitly
ordered with respect to other I/O register accesses.  However, with
respect to memory accesses, no ordering is imposed.  Therefore, one
must be very careful not to introduce subtile memory ordering bugs
with these things when using the unordered versions.


I will fix it in the next version.

Thank you
Aleksey Makarov


+ * So writeq_relaxed() and readq_relaxed() are safe to use with
+ * no memory barriers in this driver.  The readq()/writeq() functions add
+ * explicit ordering operation which in this case are redundant, and only
+ * add overhead.



Also it should be noted that on production silicon, the performance difference between 
the "relaxed" variant and the normal variant of read*/write* is often 
negligible.



+ */
+
+static u64 cavium_ptp_reg_read(struct cavium_ptp *clock, u64 offset)
+{
+    return readq_relaxed(clock->reg_base + offset);
+}
+
+static void cavium_ptp_reg_write(struct cavium_ptp *clock, u64 offset, u64 val)
+{
+    writeq_relaxed(val, clock->reg_base + offset);
+}
+


Are the PTP register access really so much in the hot path that using the 
relaxed variants can be measured here?  If not, would it make the driver look 
cleaner to remove these and just use readq/writeq calls directly  in the body 
of the driver?

David.


[PATCH net-next 1/2] net: add support for Cavium PTP coprocessor

2017-11-07 Thread Aleksey Makarov
From: Radoslaw Biernacki 

This patch adds support for the Precision Time Protocol
Clocks and Timestamping hardware found on Cavium ThunderX
processors.

Signed-off-by: Radoslaw Biernacki 
Signed-off-by: Aleksey Makarov 
---
 drivers/net/ethernet/cavium/Kconfig |  13 +
 drivers/net/ethernet/cavium/Makefile|   1 +
 drivers/net/ethernet/cavium/common/Makefile |   1 +
 drivers/net/ethernet/cavium/common/cavium_ptp.c | 353 
 drivers/net/ethernet/cavium/common/cavium_ptp.h |  78 ++
 5 files changed, 446 insertions(+)
 create mode 100644 drivers/net/ethernet/cavium/common/Makefile
 create mode 100644 drivers/net/ethernet/cavium/common/cavium_ptp.c
 create mode 100644 drivers/net/ethernet/cavium/common/cavium_ptp.h

diff --git a/drivers/net/ethernet/cavium/Kconfig 
b/drivers/net/ethernet/cavium/Kconfig
index dcbce6cac63e..634c79a8c812 100644
--- a/drivers/net/ethernet/cavium/Kconfig
+++ b/drivers/net/ethernet/cavium/Kconfig
@@ -50,6 +50,19 @@ config   THUNDER_NIC_RGX
  This driver supports configuring XCV block of RGX interface
  present on CN81XX chip.
 
+config CAVIUM_PTP
+   tristate "Cavium PTP coprocessor as PTP clock"
+   depends on 64BIT
+   depends on PTP_1588_CLOCK
+   select CAVIUM_RST
+   default y
+   ---help---
+ This driver adds support for the Precision Time Protocol Clocks and
+ Timestamping coprocessor (PTP) found on Cavium processors.
+ PTP provides timestamping mechanism that is suitable for use in IEEE 
1588
+ Precision Time Protocol or other purposes.  Timestamps can be used in
+ BGX, TNS, GTI, and NIC blocks.
+
 config LIQUIDIO
tristate "Cavium LiquidIO support"
depends on 64BIT
diff --git a/drivers/net/ethernet/cavium/Makefile 
b/drivers/net/ethernet/cavium/Makefile
index 872da9f7c31a..946bba84e81d 100644
--- a/drivers/net/ethernet/cavium/Makefile
+++ b/drivers/net/ethernet/cavium/Makefile
@@ -1,6 +1,7 @@
 #
 # Makefile for the Cavium ethernet device drivers.
 #
+obj-$(CONFIG_NET_VENDOR_CAVIUM) += common/
 obj-$(CONFIG_NET_VENDOR_CAVIUM) += thunder/
 obj-$(CONFIG_NET_VENDOR_CAVIUM) += liquidio/
 obj-$(CONFIG_NET_VENDOR_CAVIUM) += octeon/
diff --git a/drivers/net/ethernet/cavium/common/Makefile 
b/drivers/net/ethernet/cavium/common/Makefile
new file mode 100644
index ..dd8561b8060b
--- /dev/null
+++ b/drivers/net/ethernet/cavium/common/Makefile
@@ -0,0 +1 @@
+obj-$(CONFIG_CAVIUM_PTP) += cavium_ptp.o
diff --git a/drivers/net/ethernet/cavium/common/cavium_ptp.c 
b/drivers/net/ethernet/cavium/common/cavium_ptp.c
new file mode 100644
index ..6c6f162bedbf
--- /dev/null
+++ b/drivers/net/ethernet/cavium/common/cavium_ptp.c
@@ -0,0 +1,353 @@
+/*
+ * cavium_ptp.c - PTP 1588 clock on Cavium hardware
+ *
+ * Copyright (c) 2003-2015, 2017 Cavium, Inc.
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License.
+ *
+ * This file may also be available under a different license from Cavium.
+ * Contact Cavium, Inc. for more information
+ */
+
+#include 
+#include 
+#include 
+#include 
+
+#include "cavium_ptp.h"
+
+#define DRV_NAME   "Cavium PTP Driver"
+
+#define PCI_DEVICE_ID_CAVIUM_PTP   0xA00C
+#define PCI_DEVICE_ID_CAVIUM_RST   0xA00E
+
+#define PCI_PTP_BAR_NO 0
+#define PCI_RST_BAR_NO 0
+
+#define PTP_CLOCK_CFG  0xF00ULL
+#define  PTP_CLOCK_CFG_PTP_EN  BIT(0)
+#define PTP_CLOCK_LO   0xF08ULL
+#define PTP_CLOCK_HI   0xF10ULL
+#define PTP_CLOCK_COMP 0xF18ULL
+
+#define RST_BOOT   0x1600ULL
+#define CLOCK_BASE_RATE5000ULL
+
+static u64 ptp_cavium_clock_get(void)
+{
+   struct pci_dev *pdev;
+   void __iomem *base;
+   u64 ret = CLOCK_BASE_RATE * 16;
+
+   pdev = pci_get_device(PCI_VENDOR_ID_CAVIUM,
+ PCI_DEVICE_ID_CAVIUM_RST, NULL);
+   if (!pdev)
+   goto error;
+
+   base = pci_ioremap_bar(pdev, PCI_RST_BAR_NO);
+   if (!base)
+   goto error_put_pdev;
+
+   ret = CLOCK_BASE_RATE * ((readq_relaxed(base + RST_BOOT) >> 33) & 0x3f);
+
+   iounmap(base);
+
+error_put_pdev:
+   pci_dev_put(pdev);
+
+error:
+   return ret;
+}
+
+/* The Cavium PTP can *only* be found in SoCs containing the ThunderX
+ * ARM64 CPU implementation.  All accesses to the device registers on this
+ * platform are implicitly strongly ordered with respect to memory
+ * accesses. So writeq_relaxed() and readq_relaxed() are safe to use with
+ * no memory barriers in this driver.  The readq()/writeq() functions add
+ * explicit ordering operation which in this case are redundant, and only
+ * add overhead.
+ */
+
+static u64 cavium_ptp_reg_read(struct cavium_ptp *clock, u64 offset)
+{
+   return rea

[PATCH net-next 0/2] net: thunderx: add support for PTP clock

2017-11-07 Thread Aleksey Makarov
This series adds support for IEEE 1588 Precision Time Protocol
to Cavium ethernet driver.

The first patch adds support for the Precision Time Protocol Clocks and
Timestamping coprocessor (PTP) found on Cavium processors.
It registers a new PTP clock in the PTP core and provides functions
to use the counter in BGX, TNS, GTI, and NIC blocks.

The second patch introduces support for the PTP protocol to the
Cavium ThunderX ethernet driver.

Radoslaw Biernacki (1):
  net: add support for Cavium PTP coprocessor

Sunil Goutham (1):
  net: thunderx: add timestamping support

 drivers/net/ethernet/cavium/Kconfig|  14 +
 drivers/net/ethernet/cavium/Makefile   |   1 +
 drivers/net/ethernet/cavium/common/Makefile|   1 +
 drivers/net/ethernet/cavium/common/cavium_ptp.c| 353 +
 drivers/net/ethernet/cavium/common/cavium_ptp.h|  78 +
 drivers/net/ethernet/cavium/thunder/nic.h  |  15 +
 drivers/net/ethernet/cavium/thunder/nic_main.c |  58 +++-
 drivers/net/ethernet/cavium/thunder/nic_reg.h  |   1 +
 .../net/ethernet/cavium/thunder/nicvf_ethtool.c|  29 +-
 drivers/net/ethernet/cavium/thunder/nicvf_main.c   | 173 +-
 drivers/net/ethernet/cavium/thunder/nicvf_queues.c |  26 ++
 drivers/net/ethernet/cavium/thunder/thunder_bgx.c  |  29 ++
 drivers/net/ethernet/cavium/thunder/thunder_bgx.h  |   4 +
 13 files changed, 776 insertions(+), 6 deletions(-)
 create mode 100644 drivers/net/ethernet/cavium/common/Makefile
 create mode 100644 drivers/net/ethernet/cavium/common/cavium_ptp.c
 create mode 100644 drivers/net/ethernet/cavium/common/cavium_ptp.h

-- 
2.15.0



[PATCH net-next 2/2] net: thunderx: add timestamping support

2017-11-07 Thread Aleksey Makarov
From: Sunil Goutham 

This adds timestamping support for both receive and transmit
paths. On the receive side no filters are supported i.e either
all pkts will get a timestamp appended infront of the packet or none.
On the transmit side HW doesn't support timestamp insertion but
only generates a separate CQE with transmitted packet's timestamp.
Also HW supports only one packet at a time for timestamping on the
transmit side.

Signed-off-by: Sunil Goutham 
Signed-off-by: Aleksey Makarov 
---
 drivers/net/ethernet/cavium/Kconfig|   1 +
 drivers/net/ethernet/cavium/thunder/nic.h  |  15 ++
 drivers/net/ethernet/cavium/thunder/nic_main.c |  58 ++-
 drivers/net/ethernet/cavium/thunder/nic_reg.h  |   1 +
 .../net/ethernet/cavium/thunder/nicvf_ethtool.c|  29 +++-
 drivers/net/ethernet/cavium/thunder/nicvf_main.c   | 173 -
 drivers/net/ethernet/cavium/thunder/nicvf_queues.c |  26 
 drivers/net/ethernet/cavium/thunder/thunder_bgx.c  |  29 
 drivers/net/ethernet/cavium/thunder/thunder_bgx.h  |   4 +
 9 files changed, 330 insertions(+), 6 deletions(-)

diff --git a/drivers/net/ethernet/cavium/Kconfig 
b/drivers/net/ethernet/cavium/Kconfig
index 634c79a8c812..b61be4afc9b8 100644
--- a/drivers/net/ethernet/cavium/Kconfig
+++ b/drivers/net/ethernet/cavium/Kconfig
@@ -27,6 +27,7 @@ config THUNDER_NIC_PF
 
 config THUNDER_NIC_VF
tristate "Thunder Virtual function driver"
+   select CAVIUM_PTP
depends on 64BIT
---help---
  This driver supports Thunder's NIC virtual function
diff --git a/drivers/net/ethernet/cavium/thunder/nic.h 
b/drivers/net/ethernet/cavium/thunder/nic.h
index 4a02e618e318..204b234beb9d 100644
--- a/drivers/net/ethernet/cavium/thunder/nic.h
+++ b/drivers/net/ethernet/cavium/thunder/nic.h
@@ -263,6 +263,8 @@ struct nicvf_drv_stats {
struct u64_stats_sync   syncp;
 };
 
+struct cavium_ptp;
+
 struct nicvf {
struct nicvf*pnicvf;
struct net_device   *netdev;
@@ -312,6 +314,12 @@ struct nicvf {
struct tasklet_struct   qs_err_task;
struct work_struct  reset_task;
 
+   /* PTP timestamp */
+   struct cavium_ptp   *ptp_clock;
+   boolhw_rx_tstamp;
+   struct sk_buff  *ptp_skb;
+   atomic_ttx_ptp_skbs;
+
/* Interrupt coalescing settings */
u32 cq_coalesce_usecs;
u32 msg_enable;
@@ -371,6 +379,7 @@ struct nicvf {
 #defineNIC_MBOX_MSG_LOOPBACK   0x16/* Set interface in 
loopback */
 #defineNIC_MBOX_MSG_RESET_STAT_COUNTER 0x17/* Reset statistics 
counters */
 #defineNIC_MBOX_MSG_PFC0x18/* Pause frame control 
*/
+#defineNIC_MBOX_MSG_PTP_CFG0x19/* HW packet timestamp 
*/
 #defineNIC_MBOX_MSG_CFG_DONE   0xF0/* VF configuration 
done */
 #defineNIC_MBOX_MSG_SHUTDOWN   0xF1/* VF is being shutdown 
*/
 
@@ -521,6 +530,11 @@ struct pfc {
u8fc_tx;
 };
 
+struct set_ptp {
+   u8msg;
+   bool  enable;
+};
+
 /* 128 bit shared memory between PF and each VF */
 union nic_mbx {
struct { u8 msg; }  msg;
@@ -540,6 +554,7 @@ union nic_mbx {
struct set_loopback lbk;
struct reset_stat_cfg   reset_stat;
struct pfc  pfc;
+   struct set_ptp  ptp;
 };
 
 #define NIC_NODE_ID_MASK   0x03
diff --git a/drivers/net/ethernet/cavium/thunder/nic_main.c 
b/drivers/net/ethernet/cavium/thunder/nic_main.c
index fb770b0182d3..c12ab7f1adb9 100644
--- a/drivers/net/ethernet/cavium/thunder/nic_main.c
+++ b/drivers/net/ethernet/cavium/thunder/nic_main.c
@@ -460,13 +460,22 @@ static int nic_init_hw(struct nicpf *nic)
/* Enable backpressure */
nic_reg_write(nic, NIC_PF_BP_CFG, (1ULL << 6) | 0x03);
 
-   /* TNS and TNS bypass modes are present only on 88xx */
+   /* TNS and TNS bypass modes are present only on 88xx
+* Also offset of this CSR has changed in 81xx and 83xx.
+*/
if (nic->pdev->subsystem_device == PCI_SUBSYS_DEVID_88XX_NIC_PF) {
/* Disable TNS mode on both interfaces */
nic_reg_write(nic, NIC_PF_INTF_0_1_SEND_CFG,
- (NIC_TNS_BYPASS_MODE << 7) | BGX0_BLOCK);
+ (NIC_TNS_BYPASS_MODE << 7) |
+ BGX0_BLOCK | (1ULL << 16));
nic_reg_write(nic, NIC_PF_INTF_0_1_SEND_CFG | (1 << 8),
- (NIC_TNS_BYPASS_MODE << 7) | BGX1_BLOCK);
+ (NIC_TNS_BYPASS_MODE << 7) |
+ BGX1_BLOCK | (1ULL << 16));
+   } else {
+   /* Configure timestamp generation timeout to 10us */
+   for (i = 0; i < nic->hw

[PATCH net-next v2 8/8] net: thunderx: Support for internal loopback mode

2015-08-30 Thread Aleksey Makarov
From: Sunil Goutham 

Support for setting VF's corresponding BGX LMAC in internal
loopback mode. This mode can be used for verifying basic HW
functionality such as packet I/O, RX checksum validation,
CQ/RBDR interrupts, stats e.t.c. Useful when DUT has no external
network connectivity.

'loopback' mode can be enabled or disabled via ethtool.

Note: This feature is not supported when no of VFs enabled are
morethan no of physical interfaces i.e active BGX LMACs

Signed-off-by: Sunil Goutham 
Signed-off-by: Aleksey Makarov 
---
 drivers/net/ethernet/cavium/thunder/nic.h | 11 
 drivers/net/ethernet/cavium/thunder/nic_main.c| 21 +++
 drivers/net/ethernet/cavium/thunder/nicvf_main.c  | 30 ++
 drivers/net/ethernet/cavium/thunder/thunder_bgx.c | 31 +++
 drivers/net/ethernet/cavium/thunder/thunder_bgx.h |  4 +++
 5 files changed, 97 insertions(+)

diff --git a/drivers/net/ethernet/cavium/thunder/nic.h 
b/drivers/net/ethernet/cavium/thunder/nic.h
index 35b2ee1..d3950b2 100644
--- a/drivers/net/ethernet/cavium/thunder/nic.h
+++ b/drivers/net/ethernet/cavium/thunder/nic.h
@@ -265,6 +265,7 @@ struct nicvf {
u8  node;
u8  tns_mode:1;
u8  sqs_mode:1;
+   u8  loopback_supported:1;
u16 mtu;
struct queue_set*qs;
 #defineMAX_SQS_PER_VF_SINGLE_NODE  5
@@ -344,6 +345,7 @@ struct nicvf {
 #defineNIC_MBOX_MSG_NICVF_PTR  0x13/* Send nicvf ptr to PF 
*/
 #defineNIC_MBOX_MSG_PNICVF_PTR 0x14/* Get primary qset 
nicvf ptr */
 #defineNIC_MBOX_MSG_SNICVF_PTR 0x15/* Send sqet nicvf ptr 
to PVF */
+#defineNIC_MBOX_MSG_LOOPBACK   0x16/* Set interface in 
loopback */
 #defineNIC_MBOX_MSG_CFG_DONE   0xF0/* VF configuration 
done */
 #defineNIC_MBOX_MSG_SHUTDOWN   0xF1/* VF is being shutdown 
*/
 
@@ -353,6 +355,7 @@ struct nic_cfg_msg {
u8node_id;
u8tns_mode:1;
u8sqs_mode:1;
+   u8loopback_supported:1;
u8mac_addr[ETH_ALEN];
 };
 
@@ -452,6 +455,13 @@ struct nicvf_ptr {
u64   nicvf;
 };
 
+/* Set interface in loopback mode */
+struct set_loopback {
+   u8msg;
+   u8vf_id;
+   bool  enable;
+};
+
 /* 128 bit shared memory between PF and each VF */
 union nic_mbx {
struct { u8 msg; }  msg;
@@ -468,6 +478,7 @@ union nic_mbx {
struct bgx_link_status  link_status;
struct sqs_allocsqs_alloc;
struct nicvf_ptrnicvf;
+   struct set_loopback lbk;
 };
 
 #define NIC_NODE_ID_MASK   0x03
diff --git a/drivers/net/ethernet/cavium/thunder/nic_main.c 
b/drivers/net/ethernet/cavium/thunder/nic_main.c
index dac8094..b3a5947 100644
--- a/drivers/net/ethernet/cavium/thunder/nic_main.c
+++ b/drivers/net/ethernet/cavium/thunder/nic_main.c
@@ -154,6 +154,9 @@ static void nic_mbx_send_ready(struct nicpf *nic, int vf)
}
mbx.nic_cfg.sqs_mode = (vf >= nic->num_vf_en) ? true : false;
mbx.nic_cfg.node_id = nic->node;
+
+   mbx.nic_cfg.loopback_supported = vf < MAX_LMAC;
+
nic_send_msg_to_vf(nic, vf, &mbx);
 }
 
@@ -579,6 +582,21 @@ send_mbox:
nic_send_msg_to_vf(nic, sqs->vf_id, &mbx);
 }
 
+static int nic_config_loopback(struct nicpf *nic, struct set_loopback *lbk)
+{
+   int bgx_idx, lmac_idx;
+
+   if (lbk->vf_id > MAX_LMAC)
+   return -1;
+
+   bgx_idx = NIC_GET_BGX_FROM_VF_LMAC_MAP(nic->vf_lmac_map[lbk->vf_id]);
+   lmac_idx = NIC_GET_LMAC_FROM_VF_LMAC_MAP(nic->vf_lmac_map[lbk->vf_id]);
+
+   bgx_lmac_internal_loopback(nic->node, bgx_idx, lmac_idx, lbk->enable);
+
+   return 0;
+}
+
 /* Interrupt handler to handle mailbox messages from VFs */
 static void nic_handle_mbx_intr(struct nicpf *nic, int vf)
 {
@@ -702,6 +720,9 @@ static void nic_handle_mbx_intr(struct nicpf *nic, int vf)
case NIC_MBOX_MSG_BGX_STATS:
nic_get_bgx_stats(nic, &mbx.bgx_stats);
goto unlock;
+   case NIC_MBOX_MSG_LOOPBACK:
+   ret = nic_config_loopback(nic, &mbx.lbk);
+   break;
default:
dev_err(&nic->pdev->dev,
"Invalid msg from VF%d, msg 0x%x\n", vf, mbx.msg.msg);
diff --git a/drivers/net/ethernet/cavium/thunder/nicvf_main.c 
b/drivers/net/ethernet/cavium/thunder/nicvf_main.c
index 68b2dce..b63e579 100644
--- a/drivers/net/ethernet/cavium/thunder/nicvf_main.c
+++ b/drivers/net/ethernet/cavium/thunder/nicvf_main.c
@@ -202,6 +202,7 @@ static void  nicvf_handle_mbx_intr(struct nicvf *nic)
ether_addr_copy(nic->netdev->dev_addr,

[PATCH net-next v2 7/8] net: thunderx: Support for upto 96 queues for a VF

2015-08-30 Thread Aleksey Makarov
From: Sunil Goutham 

This patch adds support for handling multiple qsets assigned to a
single VF. There by increasing no of queues from earlier 8 to max
no of CPUs in the system i.e 48 queues on a single node and 96 on
dual node system. User doesn't have option to assign which Qsets/VFs
 to be merged. Upon request from VF, PF assigns next free Qsets as
secondary qsets. To maintain current behavior no of queues is kept
to 8 by default which can be increased via ethtool.

If user wants to unbind NICVF driver from a secondary Qset then it
should be done after tearing down primary VF's interface.

Signed-off-by: Sunil Goutham 
Signed-off-by: Aleksey Makarov 
Signed-off-by: Robert Richter 
---
 drivers/net/ethernet/cavium/thunder/nic.h  |  42 -
 drivers/net/ethernet/cavium/thunder/nic_main.c | 173 +++--
 .../net/ethernet/cavium/thunder/nicvf_ethtool.c| 134 +
 drivers/net/ethernet/cavium/thunder/nicvf_main.c   | 210 +++--
 drivers/net/ethernet/cavium/thunder/nicvf_queues.c |  30 ++-
 5 files changed, 505 insertions(+), 84 deletions(-)

diff --git a/drivers/net/ethernet/cavium/thunder/nic.h 
b/drivers/net/ethernet/cavium/thunder/nic.h
index 89b997e..35b2ee1 100644
--- a/drivers/net/ethernet/cavium/thunder/nic.h
+++ b/drivers/net/ethernet/cavium/thunder/nic.h
@@ -258,13 +258,23 @@ struct nicvf_drv_stats {
 };
 
 struct nicvf {
+   struct nicvf*pnicvf;
struct net_device   *netdev;
struct pci_dev  *pdev;
u8  vf_id;
u8  node;
-   u8  tns_mode;
+   u8  tns_mode:1;
+   u8  sqs_mode:1;
u16 mtu;
struct queue_set*qs;
+#defineMAX_SQS_PER_VF_SINGLE_NODE  5
+#defineMAX_SQS_PER_VF  11
+   u8  sqs_id;
+   u8  sqs_count; /* Secondary Qset count */
+   struct nicvf*snicvf[MAX_SQS_PER_VF];
+   u8  rx_queues;
+   u8  tx_queues;
+   u8  max_queues;
void __iomem*reg_base;
boollink_up;
u8  duplex;
@@ -330,14 +340,19 @@ struct nicvf {
 #defineNIC_MBOX_MSG_RQ_SW_SYNC 0x0F/* Flush inflight pkts 
to RQ */
 #defineNIC_MBOX_MSG_BGX_STATS  0x10/* Get stats from BGX */
 #defineNIC_MBOX_MSG_BGX_LINK_CHANGE0x11/* BGX:LMAC link status 
*/
-#define NIC_MBOX_MSG_CFG_DONE  0x12/* VF configuration done */
-#define NIC_MBOX_MSG_SHUTDOWN  0x13/* VF is being shutdown */
+#defineNIC_MBOX_MSG_ALLOC_SQS  0x12/* Allocate secondary 
Qset */
+#defineNIC_MBOX_MSG_NICVF_PTR  0x13/* Send nicvf ptr to PF 
*/
+#defineNIC_MBOX_MSG_PNICVF_PTR 0x14/* Get primary qset 
nicvf ptr */
+#defineNIC_MBOX_MSG_SNICVF_PTR 0x15/* Send sqet nicvf ptr 
to PVF */
+#defineNIC_MBOX_MSG_CFG_DONE   0xF0/* VF configuration 
done */
+#defineNIC_MBOX_MSG_SHUTDOWN   0xF1/* VF is being shutdown 
*/
 
 struct nic_cfg_msg {
u8msg;
u8vf_id;
-   u8tns_mode;
u8node_id;
+   u8tns_mode:1;
+   u8sqs_mode:1;
u8mac_addr[ETH_ALEN];
 };
 
@@ -345,6 +360,7 @@ struct nic_cfg_msg {
 struct qs_cfg_msg {
u8msg;
u8num;
+   u8sqs_count;
u64   cfg;
 };
 
@@ -361,6 +377,7 @@ struct sq_cfg_msg {
u8msg;
u8qs_num;
u8sq_num;
+   bool  sqs_mode;
u64   cfg;
 };
 
@@ -420,6 +437,21 @@ struct bgx_link_status {
u32   speed;
 };
 
+/* Get Extra Qset IDs */
+struct sqs_alloc {
+   u8msg;
+   u8vf_id;
+   u8qs_count;
+};
+
+struct nicvf_ptr {
+   u8msg;
+   u8vf_id;
+   bool  sqs_mode;
+   u8sqs_id;
+   u64   nicvf;
+};
+
 /* 128 bit shared memory between PF and each VF */
 union nic_mbx {
struct { u8 msg; }  msg;
@@ -434,6 +466,8 @@ union nic_mbx {
struct rss_cfg_msg  rss_cfg;
struct bgx_stats_msgbgx_stats;
struct bgx_link_status  link_status;
+   struct sqs_allocsqs_alloc;
+   struct nicvf_ptrnicvf;
 };
 
 #define NIC_NODE_ID_MASK   0x03
diff --git a/drivers/net/ethernet/cavium/thunder/nic_main.c 
b/drivers/net/ethernet/cavium/thunder/nic_main.c
index 7dfec4a..dac8094 100644
--- a/drivers/net/ethernet/cavium/thunder/nic_main.c
+++ b/drivers/net/ethernet/cavium/thunder/nic_main.c
@@ -28,6 +28,11 @@ struct nicpf {
u8  num_vf_en;  /* No of VF enabled */
boolvf_enabled[MAX_NUM_VFS_SUPPORTED];
void __iomem   

[PATCH net-next v2 6/8] net: thunderx: Rework interrupt handling

2015-08-30 Thread Aleksey Makarov
From: Sunil Goutham 

Rework interrupt handler to avoid checking IRQ affinity of
CQ interrupts. Now separate handlers are registered for each IRQ
including RBDR. Register interrupt handlers for only those
which are being used. Add nicvf_dump_intr_status() and use it
in irq handlers.

Signed-off-by: Sunil Goutham 
Signed-off-by: Aleksey Makarov 
---
 drivers/net/ethernet/cavium/thunder/nic.h  |   1 +
 drivers/net/ethernet/cavium/thunder/nicvf_main.c   | 172 -
 drivers/net/ethernet/cavium/thunder/nicvf_queues.h |   1 +
 3 files changed, 102 insertions(+), 72 deletions(-)

diff --git a/drivers/net/ethernet/cavium/thunder/nic.h 
b/drivers/net/ethernet/cavium/thunder/nic.h
index a83f567..89b997e 100644
--- a/drivers/net/ethernet/cavium/thunder/nic.h
+++ b/drivers/net/ethernet/cavium/thunder/nic.h
@@ -135,6 +135,7 @@
 #defineNICVF_TX_TIMEOUT(50 * HZ)
 
 struct nicvf_cq_poll {
+   struct  nicvf *nicvf;
u8  cq_idx; /* Completion queue index */
struct  napi_struct napi;
 };
diff --git a/drivers/net/ethernet/cavium/thunder/nicvf_main.c 
b/drivers/net/ethernet/cavium/thunder/nicvf_main.c
index de51828..85213f3 100644
--- a/drivers/net/ethernet/cavium/thunder/nicvf_main.c
+++ b/drivers/net/ethernet/cavium/thunder/nicvf_main.c
@@ -653,11 +653,20 @@ static void nicvf_handle_qs_err(unsigned long data)
nicvf_enable_intr(nic, NICVF_INTR_QS_ERR, 0);
 }
 
+static void nicvf_dump_intr_status(struct nicvf *nic)
+{
+   if (netif_msg_intr(nic))
+   netdev_info(nic->netdev, "%s: interrupt status 0x%llx\n",
+   nic->netdev->name, nicvf_reg_read(nic, NIC_VF_INT));
+}
+
 static irqreturn_t nicvf_misc_intr_handler(int irq, void *nicvf_irq)
 {
struct nicvf *nic = (struct nicvf *)nicvf_irq;
u64 intr;
 
+   nicvf_dump_intr_status(nic);
+
intr = nicvf_reg_read(nic, NIC_VF_INT);
/* Check for spurious interrupt */
if (!(intr & NICVF_INTR_MBOX_MASK))
@@ -668,59 +677,58 @@ static irqreturn_t nicvf_misc_intr_handler(int irq, void 
*nicvf_irq)
return IRQ_HANDLED;
 }
 
-static irqreturn_t nicvf_intr_handler(int irq, void *nicvf_irq)
+static irqreturn_t nicvf_intr_handler(int irq, void *cq_irq)
+{
+   struct nicvf_cq_poll *cq_poll = (struct nicvf_cq_poll *)cq_irq;
+   struct nicvf *nic = cq_poll->nicvf;
+   int qidx = cq_poll->cq_idx;
+
+   nicvf_dump_intr_status(nic);
+
+   /* Disable interrupts */
+   nicvf_disable_intr(nic, NICVF_INTR_CQ, qidx);
+
+   /* Schedule NAPI */
+   napi_schedule(&cq_poll->napi);
+
+   /* Clear interrupt */
+   nicvf_clear_intr(nic, NICVF_INTR_CQ, qidx);
+
+   return IRQ_HANDLED;
+}
+
+static irqreturn_t nicvf_rbdr_intr_handler(int irq, void *nicvf_irq)
 {
-   u64 qidx, intr, clear_intr = 0;
-   u64 cq_intr, rbdr_intr, qs_err_intr;
struct nicvf *nic = (struct nicvf *)nicvf_irq;
-   struct queue_set *qs = nic->qs;
-   struct nicvf_cq_poll *cq_poll = NULL;
+   u8 qidx;
 
-   intr = nicvf_reg_read(nic, NIC_VF_INT);
-   if (netif_msg_intr(nic))
-   netdev_info(nic->netdev, "%s: interrupt status 0x%llx\n",
-   nic->netdev->name, intr);
-
-   qs_err_intr = intr & NICVF_INTR_QS_ERR_MASK;
-   if (qs_err_intr) {
-   /* Disable Qset err interrupt and schedule softirq */
-   nicvf_disable_intr(nic, NICVF_INTR_QS_ERR, 0);
-   tasklet_hi_schedule(&nic->qs_err_task);
-   clear_intr |= qs_err_intr;
-   }
 
-   /* Disable interrupts and start polling */
-   cq_intr = (intr & NICVF_INTR_CQ_MASK) >> NICVF_INTR_CQ_SHIFT;
-   for (qidx = 0; qidx < qs->cq_cnt; qidx++) {
-   if (!(cq_intr & (1 << qidx)))
-   continue;
-   if (!nicvf_is_intr_enabled(nic, NICVF_INTR_CQ, qidx))
+   nicvf_dump_intr_status(nic);
+
+   /* Disable RBDR interrupt and schedule softirq */
+   for (qidx = 0; qidx < nic->qs->rbdr_cnt; qidx++) {
+   if (!nicvf_is_intr_enabled(nic, NICVF_INTR_RBDR, qidx))
continue;
+   nicvf_disable_intr(nic, NICVF_INTR_RBDR, qidx);
+   tasklet_hi_schedule(&nic->rbdr_task);
+   /* Clear interrupt */
+   nicvf_clear_intr(nic, NICVF_INTR_RBDR, qidx);
+   }
 
-   nicvf_disable_intr(nic, NICVF_INTR_CQ, qidx);
-   clear_intr |= ((1 << qidx) << NICVF_INTR_CQ_SHIFT);
+   return IRQ_HANDLED;
+}
 
-   cq_poll = nic->napi[qidx];
-   /* Schedule NAPI */
-   if (cq_poll)
-   napi_schedule(&cq_poll->napi);
-   }
+static irqreturn_t nicvf_qs_err_intr_handler(int irq, void *nicvf_irq)
+{
+   struct nicvf *nic = (struct

[PATCH net-next v2 4/8] net: thunderx: Receive hashing HW offload support

2015-08-30 Thread Aleksey Makarov
From: Sunil Goutham 

Adding support for receive hashing HW offload by using RSS_ALG
and RSS_TAG fields of CQE_RX descriptor. Also removed dependency
on minimum receive queue count to configure RSS so that hash is
always generated.

This hash is used by RPS logic to distribute flows across multiple
CPUs. Offload can be disabled via ethtool.

Signed-off-by: Robert Richter 
Signed-off-by: Sunil Goutham 
Signed-off-by: Aleksey Makarov 
---
 .../net/ethernet/cavium/thunder/nicvf_ethtool.c| 14 -
 drivers/net/ethernet/cavium/thunder/nicvf_main.c   | 35 --
 2 files changed, 39 insertions(+), 10 deletions(-)

diff --git a/drivers/net/ethernet/cavium/thunder/nicvf_ethtool.c 
b/drivers/net/ethernet/cavium/thunder/nicvf_ethtool.c
index a961aa3..1eec2cd 100644
--- a/drivers/net/ethernet/cavium/thunder/nicvf_ethtool.c
+++ b/drivers/net/ethernet/cavium/thunder/nicvf_ethtool.c
@@ -525,17 +525,15 @@ static int nicvf_set_rxfh(struct net_device *dev, const 
u32 *indir,
struct nicvf_rss_info *rss = &nic->rss_info;
int idx;
 
-   if ((nic->qs->rq_cnt <= 1) || (nic->cpi_alg != CPI_ALG_NONE)) {
-   rss->enable = false;
-   rss->hash_bits = 0;
-   return -EIO;
-   }
-
-   /* We do not allow change in unsupported parameters */
if (hfunc != ETH_RSS_HASH_NO_CHANGE && hfunc != ETH_RSS_HASH_TOP)
return -EOPNOTSUPP;
 
-   rss->enable = true;
+   if (!rss->enable) {
+   netdev_err(nic->netdev,
+  "RSS is disabled, cannot change settings\n");
+   return -EIO;
+   }
+
if (indir) {
for (idx = 0; idx < rss->rss_size; idx++)
rss->ind_tbl[idx] = indir[idx];
diff --git a/drivers/net/ethernet/cavium/thunder/nicvf_main.c 
b/drivers/net/ethernet/cavium/thunder/nicvf_main.c
index d4ad36e..afd8ad4 100644
--- a/drivers/net/ethernet/cavium/thunder/nicvf_main.c
+++ b/drivers/net/ethernet/cavium/thunder/nicvf_main.c
@@ -313,7 +313,7 @@ static int nicvf_rss_init(struct nicvf *nic)
 
nicvf_get_rss_size(nic);
 
-   if ((nic->qs->rq_cnt <= 1) || (cpi_alg != CPI_ALG_NONE)) {
+   if (cpi_alg != CPI_ALG_NONE) {
rss->enable = false;
rss->hash_bits = 0;
return 0;
@@ -416,6 +416,34 @@ static void nicvf_snd_pkt_handler(struct net_device 
*netdev,
}
 }
 
+static inline void nicvf_set_rxhash(struct net_device *netdev,
+   struct cqe_rx_t *cqe_rx,
+   struct sk_buff *skb)
+{
+   u8 hash_type;
+   u32 hash;
+
+   if (!(netdev->features & NETIF_F_RXHASH))
+   return;
+
+   switch (cqe_rx->rss_alg) {
+   case RSS_ALG_TCP_IP:
+   case RSS_ALG_UDP_IP:
+   hash_type = PKT_HASH_TYPE_L4;
+   hash = cqe_rx->rss_tag;
+   break;
+   case RSS_ALG_IP:
+   hash_type = PKT_HASH_TYPE_L3;
+   hash = cqe_rx->rss_tag;
+   break;
+   default:
+   hash_type = PKT_HASH_TYPE_NONE;
+   hash = 0;
+   }
+
+   skb_set_hash(skb, hash, hash_type);
+}
+
 static void nicvf_rcv_pkt_handler(struct net_device *netdev,
  struct napi_struct *napi,
  struct cmp_queue *cq,
@@ -451,6 +479,8 @@ static void nicvf_rcv_pkt_handler(struct net_device *netdev,
 
nicvf_set_rx_frame_cnt(nic, skb);
 
+   nicvf_set_rxhash(netdev, cqe_rx, skb);
+
skb_record_rx_queue(skb, cqe_rx->rq_idx);
if (netdev->hw_features & NETIF_F_RXCSUM) {
/* HW by default verifies TCP/UDP/SCTP checksums */
@@ -1272,7 +1302,8 @@ static int nicvf_probe(struct pci_dev *pdev, const struct 
pci_device_id *ent)
goto err_free_netdev;
 
netdev->features |= (NETIF_F_RXCSUM | NETIF_F_IP_CSUM | NETIF_F_SG |
-NETIF_F_TSO | NETIF_F_GRO);
+NETIF_F_TSO | NETIF_F_GRO | NETIF_F_RXHASH);
+
netdev->hw_features = netdev->features;
 
netdev->netdev_ops = &nicvf_netdev_ops;
-- 
2.5.0

--
To unsubscribe from this list: send the line "unsubscribe netdev" in
the body of a message to majord...@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html


[PATCH net-next v2 5/8] net: thunderx: Support for HW VLAN stripping

2015-08-30 Thread Aleksey Makarov
From: Sunil Goutham 

This patch configures HW to strip 802.1Q header if found in a
receiving packet. The stripped VLAN ID and TCI information is
passed on to software via CQE_RX. Also sets netdev's 'vlan_features'
so that other HW offload features can be used for tagged packets.

This offload feature can be enabled or disabled via ethtool.

Network stack normally ignores RPS for 802.1Q packets and hence low
throughput. With this offload enabled throughput for tagged packets
will be almost same as normal packets.

Note: This patch doesn't enable HW VLAN insertion for transmit packets.

Signed-off-by: Sunil Goutham 
Signed-off-by: Aleksey Makarov 
---
 drivers/net/ethernet/cavium/thunder/nic_main.c |  4 
 drivers/net/ethernet/cavium/thunder/nicvf_main.c   | 28 +++---
 drivers/net/ethernet/cavium/thunder/nicvf_queues.c | 28 ++
 drivers/net/ethernet/cavium/thunder/nicvf_queues.h |  2 ++
 4 files changed, 55 insertions(+), 7 deletions(-)

diff --git a/drivers/net/ethernet/cavium/thunder/nic_main.c 
b/drivers/net/ethernet/cavium/thunder/nic_main.c
index 6e0c031..7dfec4a 100644
--- a/drivers/net/ethernet/cavium/thunder/nic_main.c
+++ b/drivers/net/ethernet/cavium/thunder/nic_main.c
@@ -329,6 +329,10 @@ static void nic_init_hw(struct nicpf *nic)
 
/* Timer config */
nic_reg_write(nic, NIC_PF_INTR_TIMER_CFG, NICPF_CLK_PER_INT_TICK);
+
+   /* Enable VLAN ethertype matching and stripping */
+   nic_reg_write(nic, NIC_PF_RX_ETYPE_0_7,
+ (2 << 19) | (ETYPE_ALG_VLAN_STRIP << 16) | ETH_P_8021Q);
 }
 
 /* Channel parse index configuration */
diff --git a/drivers/net/ethernet/cavium/thunder/nicvf_main.c 
b/drivers/net/ethernet/cavium/thunder/nicvf_main.c
index afd8ad4..de51828 100644
--- a/drivers/net/ethernet/cavium/thunder/nicvf_main.c
+++ b/drivers/net/ethernet/cavium/thunder/nicvf_main.c
@@ -10,6 +10,7 @@
 #include 
 #include 
 #include 
+#include 
 #include 
 #include 
 #include 
@@ -491,6 +492,11 @@ static void nicvf_rcv_pkt_handler(struct net_device 
*netdev,
 
skb->protocol = eth_type_trans(skb, netdev);
 
+   /* Check for stripped VLAN */
+   if (cqe_rx->vlan_found && cqe_rx->vlan_stripped)
+   __vlan_hwaccel_put_tag(skb, htons(ETH_P_8021Q),
+  ntohs((__force __be16)cqe_rx->vlan_tci));
+
if (napi && (netdev->features & NETIF_F_GRO))
napi_gro_receive(napi, skb);
else
@@ -1220,6 +1226,18 @@ static void nicvf_reset_task(struct work_struct *work)
nic->netdev->trans_start = jiffies;
 }
 
+static int nicvf_set_features(struct net_device *netdev,
+ netdev_features_t features)
+{
+   struct nicvf *nic = netdev_priv(netdev);
+   netdev_features_t changed = features ^ netdev->features;
+
+   if (changed & NETIF_F_HW_VLAN_CTAG_RX)
+   nicvf_config_vlan_stripping(nic, features);
+
+   return 0;
+}
+
 static const struct net_device_ops nicvf_netdev_ops = {
.ndo_open   = nicvf_open,
.ndo_stop   = nicvf_stop,
@@ -1228,6 +1246,7 @@ static const struct net_device_ops nicvf_netdev_ops = {
.ndo_set_mac_address= nicvf_set_mac_address,
.ndo_get_stats64= nicvf_get_stats64,
.ndo_tx_timeout = nicvf_tx_timeout,
+   .ndo_set_features   = nicvf_set_features,
 };
 
 static int nicvf_probe(struct pci_dev *pdev, const struct pci_device_id *ent)
@@ -1301,10 +1320,13 @@ static int nicvf_probe(struct pci_dev *pdev, const 
struct pci_device_id *ent)
if (err)
goto err_free_netdev;
 
-   netdev->features |= (NETIF_F_RXCSUM | NETIF_F_IP_CSUM | NETIF_F_SG |
-NETIF_F_TSO | NETIF_F_GRO | NETIF_F_RXHASH);
+   netdev->hw_features = (NETIF_F_RXCSUM | NETIF_F_IP_CSUM | NETIF_F_SG |
+  NETIF_F_TSO | NETIF_F_GRO |
+  NETIF_F_HW_VLAN_CTAG_RX | NETIF_F_RXHASH);
+
+   netdev->features |= netdev->hw_features;
 
-   netdev->hw_features = netdev->features;
+   netdev->vlan_features = NETIF_F_SG | NETIF_F_IP_CSUM | NETIF_F_TSO;
 
netdev->netdev_ops = &nicvf_netdev_ops;
netdev->watchdog_timeo = NICVF_TX_TIMEOUT;
diff --git a/drivers/net/ethernet/cavium/thunder/nicvf_queues.c 
b/drivers/net/ethernet/cavium/thunder/nicvf_queues.c
index 4fc40d83..b294d67 100644
--- a/drivers/net/ethernet/cavium/thunder/nicvf_queues.c
+++ b/drivers/net/ethernet/cavium/thunder/nicvf_queues.c
@@ -475,6 +475,27 @@ static void nicvf_reclaim_rbdr(struct nicvf *nic,
return;
 }
 
+void nicvf_config_vlan_stripping(struct nicvf *nic, netdev_features_t features)
+{
+   u64 rq_cfg;
+   int sqs;
+
+   rq_cfg = nicvf_queue_reg_read(nic, NIC_QSET_RQ_GEN_CFG, 0);
+
+   /* Enabl

[PATCH net-next v2 2/8] net: thunderx: Add receive error stats reporting via ethtool

2015-08-30 Thread Aleksey Makarov
From: Sunil Goutham 

Added ethtool support to dump receive packet error statistics reported
in CQE. Also made some small fixes

Signed-off-by: Sunil Goutham 
Signed-off-by: Aleksey Makarov 
---
 drivers/net/ethernet/cavium/thunder/nic.h  | 36 +++--
 .../net/ethernet/cavium/thunder/nicvf_ethtool.c| 34 +++--
 drivers/net/ethernet/cavium/thunder/nicvf_main.c   | 26 ---
 drivers/net/ethernet/cavium/thunder/nicvf_queues.c | 86 +++---
 drivers/net/ethernet/cavium/thunder/nicvf_queues.h | 41 ---
 5 files changed, 103 insertions(+), 120 deletions(-)

diff --git a/drivers/net/ethernet/cavium/thunder/nic.h 
b/drivers/net/ethernet/cavium/thunder/nic.h
index 8aee250..58adfd6 100644
--- a/drivers/net/ethernet/cavium/thunder/nic.h
+++ b/drivers/net/ethernet/cavium/thunder/nic.h
@@ -190,10 +190,10 @@ enum tx_stats_reg_offset {
 };
 
 struct nicvf_hw_stats {
-   u64 rx_bytes_ok;
-   u64 rx_ucast_frames_ok;
-   u64 rx_bcast_frames_ok;
-   u64 rx_mcast_frames_ok;
+   u64 rx_bytes;
+   u64 rx_ucast_frames;
+   u64 rx_bcast_frames;
+   u64 rx_mcast_frames;
u64 rx_fcs_errors;
u64 rx_l2_errors;
u64 rx_drop_red;
@@ -204,6 +204,31 @@ struct nicvf_hw_stats {
u64 rx_drop_mcast;
u64 rx_drop_l3_bcast;
u64 rx_drop_l3_mcast;
+   u64 rx_bgx_truncated_pkts;
+   u64 rx_jabber_errs;
+   u64 rx_fcs_errs;
+   u64 rx_bgx_errs;
+   u64 rx_prel2_errs;
+   u64 rx_l2_hdr_malformed;
+   u64 rx_oversize;
+   u64 rx_undersize;
+   u64 rx_l2_len_mismatch;
+   u64 rx_l2_pclp;
+   u64 rx_ip_ver_errs;
+   u64 rx_ip_csum_errs;
+   u64 rx_ip_hdr_malformed;
+   u64 rx_ip_payload_malformed;
+   u64 rx_ip_ttl_errs;
+   u64 rx_l3_pclp;
+   u64 rx_l4_malformed;
+   u64 rx_l4_csum_errs;
+   u64 rx_udp_len_errs;
+   u64 rx_l4_port_errs;
+   u64 rx_tcp_flag_errs;
+   u64 rx_tcp_offset_errs;
+   u64 rx_l4_pclp;
+   u64 rx_truncated_pkts;
+
u64 tx_bytes_ok;
u64 tx_ucast_frames_ok;
u64 tx_bcast_frames_ok;
@@ -222,6 +247,7 @@ struct nicvf_drv_stats {
u64 rx_frames_1518;
u64 rx_frames_jumbo;
u64 rx_drops;
+
/* Tx */
u64 tx_frames_ok;
u64 tx_drops;
@@ -257,7 +283,7 @@ struct nicvf {
u32 cq_coalesce_usecs;
 
u32 msg_enable;
-   struct nicvf_hw_stats   stats;
+   struct nicvf_hw_stats   hw_stats;
struct nicvf_drv_stats  drv_stats;
struct bgx_statsbgx_stats;
struct work_struct  reset_task;
diff --git a/drivers/net/ethernet/cavium/thunder/nicvf_ethtool.c 
b/drivers/net/ethernet/cavium/thunder/nicvf_ethtool.c
index a4228e6..a961aa3 100644
--- a/drivers/net/ethernet/cavium/thunder/nicvf_ethtool.c
+++ b/drivers/net/ethernet/cavium/thunder/nicvf_ethtool.c
@@ -35,10 +35,10 @@ struct nicvf_stat {
 }
 
 static const struct nicvf_stat nicvf_hw_stats[] = {
-   NICVF_HW_STAT(rx_bytes_ok),
-   NICVF_HW_STAT(rx_ucast_frames_ok),
-   NICVF_HW_STAT(rx_bcast_frames_ok),
-   NICVF_HW_STAT(rx_mcast_frames_ok),
+   NICVF_HW_STAT(rx_bytes),
+   NICVF_HW_STAT(rx_ucast_frames),
+   NICVF_HW_STAT(rx_bcast_frames),
+   NICVF_HW_STAT(rx_mcast_frames),
NICVF_HW_STAT(rx_fcs_errors),
NICVF_HW_STAT(rx_l2_errors),
NICVF_HW_STAT(rx_drop_red),
@@ -49,6 +49,30 @@ static const struct nicvf_stat nicvf_hw_stats[] = {
NICVF_HW_STAT(rx_drop_mcast),
NICVF_HW_STAT(rx_drop_l3_bcast),
NICVF_HW_STAT(rx_drop_l3_mcast),
+   NICVF_HW_STAT(rx_bgx_truncated_pkts),
+   NICVF_HW_STAT(rx_jabber_errs),
+   NICVF_HW_STAT(rx_fcs_errs),
+   NICVF_HW_STAT(rx_bgx_errs),
+   NICVF_HW_STAT(rx_prel2_errs),
+   NICVF_HW_STAT(rx_l2_hdr_malformed),
+   NICVF_HW_STAT(rx_oversize),
+   NICVF_HW_STAT(rx_undersize),
+   NICVF_HW_STAT(rx_l2_len_mismatch),
+   NICVF_HW_STAT(rx_l2_pclp),
+   NICVF_HW_STAT(rx_ip_ver_errs),
+   NICVF_HW_STAT(rx_ip_csum_errs),
+   NICVF_HW_STAT(rx_ip_hdr_malformed),
+   NICVF_HW_STAT(rx_ip_payload_malformed),
+   NICVF_HW_STAT(rx_ip_ttl_errs),
+   NICVF_HW_STAT(rx_l3_pclp),
+   NICVF_HW_STAT(rx_l4_malformed),
+   NICVF_HW_STAT(rx_l4_csum_errs),
+   NICVF_HW_STAT(rx_udp_len_errs),
+   NICVF_HW_STAT(rx_l4_port_errs),
+   NICVF_HW_STAT(rx_tcp_flag_errs),
+   NICVF_HW_STAT(rx_tcp_offset_errs),
+   NICVF_HW_STAT(rx_l4_pclp),
+   NICVF_HW_STAT(rx_truncated_pkts),
NICVF_HW_STAT(tx_bytes_ok),
NICVF_HW_STAT(tx_ucast_frames_ok),
NICVF_HW_STAT(tx_bcast_frames_ok),
@@ -195,7 +219,7 @@ static void nicvf_get_ethtool_stats(struct net_device 
*netdev,
nicvf_update_lmac_stats(nic);
 
for (stat = 0; stat < nicvf_n_hw_stats; stat++)
-   *(data++) = ((u64 *)&nic->stats)
+   *(data++) = ((

[PATCH net-next v2 3/8] net: thunderx: mailboxes: remove code duplication

2015-08-30 Thread Aleksey Makarov
From: Sunil Goutham 

Use the nicvf_send_msg_to_pf() function in the mailbox code.

Signed-off-by: Sunil Goutham 
Signed-off-by: Robert Richter 
Signed-off-by: Aleksey Makarov 
---
 drivers/net/ethernet/cavium/thunder/nic.h|  3 +-
 drivers/net/ethernet/cavium/thunder/nicvf_main.c | 44 ++--
 2 files changed, 11 insertions(+), 36 deletions(-)

diff --git a/drivers/net/ethernet/cavium/thunder/nic.h 
b/drivers/net/ethernet/cavium/thunder/nic.h
index 58adfd6..a83f567 100644
--- a/drivers/net/ethernet/cavium/thunder/nic.h
+++ b/drivers/net/ethernet/cavium/thunder/nic.h
@@ -295,10 +295,9 @@ struct nicvf {
charirq_name[NIC_VF_MSIX_VECTORS][20];
boolirq_allocated[NIC_VF_MSIX_VECTORS];
 
-   boolpf_ready_to_rcv_msg;
+   /* VF <-> PF mailbox communication */
boolpf_acked;
boolpf_nacked;
-   boolbgx_stats_acked;
boolset_mac_pending;
 } cacheline_aligned_in_smp;
 
diff --git a/drivers/net/ethernet/cavium/thunder/nicvf_main.c 
b/drivers/net/ethernet/cavium/thunder/nicvf_main.c
index 670ff9b..d4ad36e 100644
--- a/drivers/net/ethernet/cavium/thunder/nicvf_main.c
+++ b/drivers/net/ethernet/cavium/thunder/nicvf_main.c
@@ -105,7 +105,6 @@ u64 nicvf_queue_reg_read(struct nicvf *nic, u64 offset, u64 
qidx)
 }
 
 /* VF -> PF mailbox communication */
-
 static void nicvf_write_to_mbx(struct nicvf *nic, union nic_mbx *mbx)
 {
u64 *msg = (u64 *)mbx;
@@ -147,26 +146,15 @@ int nicvf_send_msg_to_pf(struct nicvf *nic, union nic_mbx 
*mbx)
 */
 static int nicvf_check_pf_ready(struct nicvf *nic)
 {
-   int timeout = 5000, sleep = 20;
union nic_mbx mbx = {};
 
mbx.msg.msg = NIC_MBOX_MSG_READY;
-
-   nic->pf_ready_to_rcv_msg = false;
-
-   nicvf_write_to_mbx(nic, &mbx);
-
-   while (!nic->pf_ready_to_rcv_msg) {
-   msleep(sleep);
-   if (nic->pf_ready_to_rcv_msg)
-   break;
-   timeout -= sleep;
-   if (!timeout) {
-   netdev_err(nic->netdev,
-  "PF didn't respond to READY msg\n");
-   return 0;
-   }
+   if (nicvf_send_msg_to_pf(nic, &mbx)) {
+   netdev_err(nic->netdev,
+  "PF didn't respond to READY msg\n");
+   return 0;
}
+
return 1;
 }
 
@@ -197,7 +185,7 @@ static void  nicvf_handle_mbx_intr(struct nicvf *nic)
netdev_dbg(nic->netdev, "Mbox message: msg: 0x%x\n", mbx.msg.msg);
switch (mbx.msg.msg) {
case NIC_MBOX_MSG_READY:
-   nic->pf_ready_to_rcv_msg = true;
+   nic->pf_acked = true;
nic->vf_id = mbx.nic_cfg.vf_id & 0x7F;
nic->tns_mode = mbx.nic_cfg.tns_mode & 0x7F;
nic->node = mbx.nic_cfg.node_id;
@@ -221,7 +209,6 @@ static void  nicvf_handle_mbx_intr(struct nicvf *nic)
case NIC_MBOX_MSG_BGX_STATS:
nicvf_read_bgx_stats(nic, &mbx.bgx_stats);
nic->pf_acked = true;
-   nic->bgx_stats_acked = true;
break;
case NIC_MBOX_MSG_BGX_LINK_CHANGE:
nic->pf_acked = true;
@@ -1083,7 +1070,6 @@ void nicvf_update_lmac_stats(struct nicvf *nic)
 {
int stat = 0;
union nic_mbx mbx = {};
-   int timeout;
 
if (!netif_running(nic->netdev))
return;
@@ -1093,14 +1079,9 @@ void nicvf_update_lmac_stats(struct nicvf *nic)
/* Rx stats */
mbx.bgx_stats.rx = 1;
while (stat < BGX_RX_STATS_COUNT) {
-   nic->bgx_stats_acked = 0;
mbx.bgx_stats.idx = stat;
-   nicvf_send_msg_to_pf(nic, &mbx);
-   timeout = 0;
-   while ((!nic->bgx_stats_acked) && (timeout < 10)) {
-   msleep(2);
-   timeout++;
-   }
+   if (nicvf_send_msg_to_pf(nic, &mbx))
+   return;
stat++;
}
 
@@ -1109,14 +1090,9 @@ void nicvf_update_lmac_stats(struct nicvf *nic)
/* Tx stats */
mbx.bgx_stats.rx = 0;
while (stat < BGX_TX_STATS_COUNT) {
-   nic->bgx_stats_acked = 0;
mbx.bgx_stats.idx = stat;
-   nicvf_send_msg_to_pf(nic, &mbx);
-   timeout = 0;
-   while ((!nic->bgx_stats_acked) && (timeout < 10)) {
-   msleep(2);
-   timeout++;
-   }
+   if (nicvf_send_msg_to_pf(nic, &mbx))
+   return;
stat++;
}
 }
-- 
2.5.0

--
To unsubscribe from this list: send the line "unsubscribe netdev" in
the body of a message to majord...@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html


[PATCH net-next v2 1/8] net: thunderx: fix MAINTAINERS

2015-08-30 Thread Aleksey Makarov
From: Aleksey Makarov 

The liquidio and thunder drivers have different maintainers.

Signed-off-by: Aleksey Makarov 
---
 MAINTAINERS | 3 +--
 1 file changed, 1 insertion(+), 2 deletions(-)

diff --git a/MAINTAINERS b/MAINTAINERS
index 4e6dcb6..43cf79e 100644
--- a/MAINTAINERS
+++ b/MAINTAINERS
@@ -928,7 +928,7 @@ M:  Sunil Goutham 
 M: Robert Richter 
 L: linux-arm-ker...@lists.infradead.org (moderated for non-subscribers)
 S: Supported
-F: drivers/net/ethernet/cavium/
+F: drivers/net/ethernet/cavium/thunder/
 
 ARM/CIRRUS LOGIC CLPS711X ARM ARCHITECTURE
 M: Alexander Shiyan 
@@ -2543,7 +2543,6 @@ M: Raghu Vatsavayi 

 L: netdev@vger.kernel.org
 W: http://www.cavium.com
 S: Supported
-F: drivers/net/ethernet/cavium/
 F: drivers/net/ethernet/cavium/liquidio/
 
 CC2520 IEEE-802.15.4 RADIO DRIVER
-- 
2.5.0

--
To unsubscribe from this list: send the line "unsubscribe netdev" in
the body of a message to majord...@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html


[PATCH net-next v2 0/8] net: thunderx: New features and fixes

2015-08-30 Thread Aleksey Makarov
v2:
  - The unused affinity_mask field of the structure cmp_queue 
  has been deleted. (thanks to David Miller)
  - The unneeded initializers have been dropped. (thanks to Alexey Klimov)
  - The commit message "net: thunderx: Rework interrupt handling"
  has been fixed. (thanks to Alexey Klimov)

Aleksey Makarov (1):
  net: thunderx: fix MAINTAINERS

Sunil Goutham (7):
  net: thunderx: Add receive error stats reporting via ethtool
  net: thunderx: mailboxes: remove code duplication
  net: thunderx: Receive hashing HW offload support
  net: thunderx: Support for HW VLAN stripping
  net: thunderx: Rework interrupt handling
  net: thunderx: Support for upto 96 queues for a VF
  net: thunderx: Support for internal loopback mode

 MAINTAINERS|   3 +-
 drivers/net/ethernet/cavium/thunder/nic.h  |  93 +++-
 drivers/net/ethernet/cavium/thunder/nic_main.c | 198 +++-
 .../net/ethernet/cavium/thunder/nicvf_ethtool.c| 182 +--
 drivers/net/ethernet/cavium/thunder/nicvf_main.c   | 541 +++--
 drivers/net/ethernet/cavium/thunder/nicvf_queues.c | 144 +++---
 drivers/net/ethernet/cavium/thunder/nicvf_queues.h |  44 +-
 drivers/net/ethernet/cavium/thunder/thunder_bgx.c  |  31 ++
 drivers/net/ethernet/cavium/thunder/thunder_bgx.h  |   4 +
 9 files changed, 911 insertions(+), 329 deletions(-)

-- 
2.5.0

--
To unsubscribe from this list: send the line "unsubscribe netdev" in
the body of a message to majord...@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html


Re: [PATCH net-next 6/8] net: thunderx: Rework interrupt handler

2015-08-30 Thread Aleksey Makarov

On 29.08.2015 04:44, Alexey Klimov wrote:


-static irqreturn_t nicvf_intr_handler(int irq, void *nicvf_irq)
+static irqreturn_t nicvf_intr_handler(int irq, void *cq_irq)
+{
+   struct nicvf_cq_poll *cq_poll = (struct nicvf_cq_poll *)cq_irq;
+   struct nicvf *nic = cq_poll->nicvf;
+   int qidx = cq_poll->cq_idx;
+
+   nicvf_dump_intr_status(nic);
+
+   /* Disable interrupts */
+   nicvf_disable_intr(nic, NICVF_INTR_CQ, qidx);
+
+   /* Schedule NAPI */
+   napi_schedule(&cq_poll->napi);
+
+   /* Clear interrupt */
+   nicvf_clear_intr(nic, NICVF_INTR_CQ, qidx);
+
+   return IRQ_HANDLED;
+}


You're not considering spurious irqs in all new irq handlers here and
below and schedule napi/tasklets unconditionally. Is it correct?
For me it looks like previous implementation relied on reading of
NIC_VF_INT to understand irq type and what actions should be
performed. It generally had idea that no interrupt might occur.


1. The previous version of the handler did not handle spurious 
interrupts either.  Probably that means that the author of the patch 
knows for sure that they do not happen.


2. Instead of reading the status register new version registers 
different handlers for different irqs.  I don't see why it can be wrong.


I am going to address your other suggestions in the next version of the 
patchset.


Thank you
Aleksey Makarov


--
To unsubscribe from this list: send the line "unsubscribe netdev" in
the body of a message to majord...@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html


[PATCH net-next 4/8] net: thunderx: Receive hashing HW offload support

2015-08-28 Thread Aleksey Makarov
From: Sunil Goutham 

Adding support for receive hashing HW offload by using RSS_ALG
and RSS_TAG fields of CQE_RX descriptor. Also removed dependency
on minimum receive queue count to configure RSS so that hash is
always generated.

This hash is used by RPS logic to distribute flows across multiple
CPUs. Offload can be disabled via ethtool.

Signed-off-by: Robert Richter 
Signed-off-by: Sunil Goutham 
Signed-off-by: Aleksey Makarov 
---
 .../net/ethernet/cavium/thunder/nicvf_ethtool.c| 14 -
 drivers/net/ethernet/cavium/thunder/nicvf_main.c   | 35 --
 2 files changed, 39 insertions(+), 10 deletions(-)

diff --git a/drivers/net/ethernet/cavium/thunder/nicvf_ethtool.c 
b/drivers/net/ethernet/cavium/thunder/nicvf_ethtool.c
index a961aa3..1eec2cd 100644
--- a/drivers/net/ethernet/cavium/thunder/nicvf_ethtool.c
+++ b/drivers/net/ethernet/cavium/thunder/nicvf_ethtool.c
@@ -525,17 +525,15 @@ static int nicvf_set_rxfh(struct net_device *dev, const 
u32 *indir,
struct nicvf_rss_info *rss = &nic->rss_info;
int idx;
 
-   if ((nic->qs->rq_cnt <= 1) || (nic->cpi_alg != CPI_ALG_NONE)) {
-   rss->enable = false;
-   rss->hash_bits = 0;
-   return -EIO;
-   }
-
-   /* We do not allow change in unsupported parameters */
if (hfunc != ETH_RSS_HASH_NO_CHANGE && hfunc != ETH_RSS_HASH_TOP)
return -EOPNOTSUPP;
 
-   rss->enable = true;
+   if (!rss->enable) {
+   netdev_err(nic->netdev,
+  "RSS is disabled, cannot change settings\n");
+   return -EIO;
+   }
+
if (indir) {
for (idx = 0; idx < rss->rss_size; idx++)
rss->ind_tbl[idx] = indir[idx];
diff --git a/drivers/net/ethernet/cavium/thunder/nicvf_main.c 
b/drivers/net/ethernet/cavium/thunder/nicvf_main.c
index d4ad36e..afd8ad4 100644
--- a/drivers/net/ethernet/cavium/thunder/nicvf_main.c
+++ b/drivers/net/ethernet/cavium/thunder/nicvf_main.c
@@ -313,7 +313,7 @@ static int nicvf_rss_init(struct nicvf *nic)
 
nicvf_get_rss_size(nic);
 
-   if ((nic->qs->rq_cnt <= 1) || (cpi_alg != CPI_ALG_NONE)) {
+   if (cpi_alg != CPI_ALG_NONE) {
rss->enable = false;
rss->hash_bits = 0;
return 0;
@@ -416,6 +416,34 @@ static void nicvf_snd_pkt_handler(struct net_device 
*netdev,
}
 }
 
+static inline void nicvf_set_rxhash(struct net_device *netdev,
+   struct cqe_rx_t *cqe_rx,
+   struct sk_buff *skb)
+{
+   u8 hash_type;
+   u32 hash;
+
+   if (!(netdev->features & NETIF_F_RXHASH))
+   return;
+
+   switch (cqe_rx->rss_alg) {
+   case RSS_ALG_TCP_IP:
+   case RSS_ALG_UDP_IP:
+   hash_type = PKT_HASH_TYPE_L4;
+   hash = cqe_rx->rss_tag;
+   break;
+   case RSS_ALG_IP:
+   hash_type = PKT_HASH_TYPE_L3;
+   hash = cqe_rx->rss_tag;
+   break;
+   default:
+   hash_type = PKT_HASH_TYPE_NONE;
+   hash = 0;
+   }
+
+   skb_set_hash(skb, hash, hash_type);
+}
+
 static void nicvf_rcv_pkt_handler(struct net_device *netdev,
  struct napi_struct *napi,
  struct cmp_queue *cq,
@@ -451,6 +479,8 @@ static void nicvf_rcv_pkt_handler(struct net_device *netdev,
 
nicvf_set_rx_frame_cnt(nic, skb);
 
+   nicvf_set_rxhash(netdev, cqe_rx, skb);
+
skb_record_rx_queue(skb, cqe_rx->rq_idx);
if (netdev->hw_features & NETIF_F_RXCSUM) {
/* HW by default verifies TCP/UDP/SCTP checksums */
@@ -1272,7 +1302,8 @@ static int nicvf_probe(struct pci_dev *pdev, const struct 
pci_device_id *ent)
goto err_free_netdev;
 
netdev->features |= (NETIF_F_RXCSUM | NETIF_F_IP_CSUM | NETIF_F_SG |
-NETIF_F_TSO | NETIF_F_GRO);
+NETIF_F_TSO | NETIF_F_GRO | NETIF_F_RXHASH);
+
netdev->hw_features = netdev->features;
 
netdev->netdev_ops = &nicvf_netdev_ops;
-- 
2.5.0

--
To unsubscribe from this list: send the line "unsubscribe netdev" in
the body of a message to majord...@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html


[PATCH net-next 2/8] net: thunderx: Add receive error stats reporting via ethtool

2015-08-28 Thread Aleksey Makarov
From: Sunil Goutham 

Added ethtool support to dump receive packet error statistics reported
in CQE. Also made some small fixes

Signed-off-by: Sunil Goutham 
Signed-off-by: Aleksey Makarov 
---
 drivers/net/ethernet/cavium/thunder/nic.h  | 36 +++--
 .../net/ethernet/cavium/thunder/nicvf_ethtool.c| 34 +++--
 drivers/net/ethernet/cavium/thunder/nicvf_main.c   | 26 ---
 drivers/net/ethernet/cavium/thunder/nicvf_queues.c | 86 +++---
 drivers/net/ethernet/cavium/thunder/nicvf_queues.h | 41 ---
 5 files changed, 103 insertions(+), 120 deletions(-)

diff --git a/drivers/net/ethernet/cavium/thunder/nic.h 
b/drivers/net/ethernet/cavium/thunder/nic.h
index 8aee250..58adfd6 100644
--- a/drivers/net/ethernet/cavium/thunder/nic.h
+++ b/drivers/net/ethernet/cavium/thunder/nic.h
@@ -190,10 +190,10 @@ enum tx_stats_reg_offset {
 };
 
 struct nicvf_hw_stats {
-   u64 rx_bytes_ok;
-   u64 rx_ucast_frames_ok;
-   u64 rx_bcast_frames_ok;
-   u64 rx_mcast_frames_ok;
+   u64 rx_bytes;
+   u64 rx_ucast_frames;
+   u64 rx_bcast_frames;
+   u64 rx_mcast_frames;
u64 rx_fcs_errors;
u64 rx_l2_errors;
u64 rx_drop_red;
@@ -204,6 +204,31 @@ struct nicvf_hw_stats {
u64 rx_drop_mcast;
u64 rx_drop_l3_bcast;
u64 rx_drop_l3_mcast;
+   u64 rx_bgx_truncated_pkts;
+   u64 rx_jabber_errs;
+   u64 rx_fcs_errs;
+   u64 rx_bgx_errs;
+   u64 rx_prel2_errs;
+   u64 rx_l2_hdr_malformed;
+   u64 rx_oversize;
+   u64 rx_undersize;
+   u64 rx_l2_len_mismatch;
+   u64 rx_l2_pclp;
+   u64 rx_ip_ver_errs;
+   u64 rx_ip_csum_errs;
+   u64 rx_ip_hdr_malformed;
+   u64 rx_ip_payload_malformed;
+   u64 rx_ip_ttl_errs;
+   u64 rx_l3_pclp;
+   u64 rx_l4_malformed;
+   u64 rx_l4_csum_errs;
+   u64 rx_udp_len_errs;
+   u64 rx_l4_port_errs;
+   u64 rx_tcp_flag_errs;
+   u64 rx_tcp_offset_errs;
+   u64 rx_l4_pclp;
+   u64 rx_truncated_pkts;
+
u64 tx_bytes_ok;
u64 tx_ucast_frames_ok;
u64 tx_bcast_frames_ok;
@@ -222,6 +247,7 @@ struct nicvf_drv_stats {
u64 rx_frames_1518;
u64 rx_frames_jumbo;
u64 rx_drops;
+
/* Tx */
u64 tx_frames_ok;
u64 tx_drops;
@@ -257,7 +283,7 @@ struct nicvf {
u32 cq_coalesce_usecs;
 
u32 msg_enable;
-   struct nicvf_hw_stats   stats;
+   struct nicvf_hw_stats   hw_stats;
struct nicvf_drv_stats  drv_stats;
struct bgx_statsbgx_stats;
struct work_struct  reset_task;
diff --git a/drivers/net/ethernet/cavium/thunder/nicvf_ethtool.c 
b/drivers/net/ethernet/cavium/thunder/nicvf_ethtool.c
index a4228e6..a961aa3 100644
--- a/drivers/net/ethernet/cavium/thunder/nicvf_ethtool.c
+++ b/drivers/net/ethernet/cavium/thunder/nicvf_ethtool.c
@@ -35,10 +35,10 @@ struct nicvf_stat {
 }
 
 static const struct nicvf_stat nicvf_hw_stats[] = {
-   NICVF_HW_STAT(rx_bytes_ok),
-   NICVF_HW_STAT(rx_ucast_frames_ok),
-   NICVF_HW_STAT(rx_bcast_frames_ok),
-   NICVF_HW_STAT(rx_mcast_frames_ok),
+   NICVF_HW_STAT(rx_bytes),
+   NICVF_HW_STAT(rx_ucast_frames),
+   NICVF_HW_STAT(rx_bcast_frames),
+   NICVF_HW_STAT(rx_mcast_frames),
NICVF_HW_STAT(rx_fcs_errors),
NICVF_HW_STAT(rx_l2_errors),
NICVF_HW_STAT(rx_drop_red),
@@ -49,6 +49,30 @@ static const struct nicvf_stat nicvf_hw_stats[] = {
NICVF_HW_STAT(rx_drop_mcast),
NICVF_HW_STAT(rx_drop_l3_bcast),
NICVF_HW_STAT(rx_drop_l3_mcast),
+   NICVF_HW_STAT(rx_bgx_truncated_pkts),
+   NICVF_HW_STAT(rx_jabber_errs),
+   NICVF_HW_STAT(rx_fcs_errs),
+   NICVF_HW_STAT(rx_bgx_errs),
+   NICVF_HW_STAT(rx_prel2_errs),
+   NICVF_HW_STAT(rx_l2_hdr_malformed),
+   NICVF_HW_STAT(rx_oversize),
+   NICVF_HW_STAT(rx_undersize),
+   NICVF_HW_STAT(rx_l2_len_mismatch),
+   NICVF_HW_STAT(rx_l2_pclp),
+   NICVF_HW_STAT(rx_ip_ver_errs),
+   NICVF_HW_STAT(rx_ip_csum_errs),
+   NICVF_HW_STAT(rx_ip_hdr_malformed),
+   NICVF_HW_STAT(rx_ip_payload_malformed),
+   NICVF_HW_STAT(rx_ip_ttl_errs),
+   NICVF_HW_STAT(rx_l3_pclp),
+   NICVF_HW_STAT(rx_l4_malformed),
+   NICVF_HW_STAT(rx_l4_csum_errs),
+   NICVF_HW_STAT(rx_udp_len_errs),
+   NICVF_HW_STAT(rx_l4_port_errs),
+   NICVF_HW_STAT(rx_tcp_flag_errs),
+   NICVF_HW_STAT(rx_tcp_offset_errs),
+   NICVF_HW_STAT(rx_l4_pclp),
+   NICVF_HW_STAT(rx_truncated_pkts),
NICVF_HW_STAT(tx_bytes_ok),
NICVF_HW_STAT(tx_ucast_frames_ok),
NICVF_HW_STAT(tx_bcast_frames_ok),
@@ -195,7 +219,7 @@ static void nicvf_get_ethtool_stats(struct net_device 
*netdev,
nicvf_update_lmac_stats(nic);
 
for (stat = 0; stat < nicvf_n_hw_stats; stat++)
-   *(data++) = ((u64 *)&nic->stats)
+   *(data++) = ((

[PATCH net-next 1/8] net: thunderx: fix MAINTAINERS

2015-08-28 Thread Aleksey Makarov
From: Aleksey Makarov 

The liquidio and thunder drivers have different maintainers.

Signed-off-by: Aleksey Makarov 
---
 MAINTAINERS | 3 +--
 1 file changed, 1 insertion(+), 2 deletions(-)

diff --git a/MAINTAINERS b/MAINTAINERS
index 4e6dcb6..43cf79e 100644
--- a/MAINTAINERS
+++ b/MAINTAINERS
@@ -928,7 +928,7 @@ M:  Sunil Goutham 
 M: Robert Richter 
 L: linux-arm-ker...@lists.infradead.org (moderated for non-subscribers)
 S: Supported
-F: drivers/net/ethernet/cavium/
+F: drivers/net/ethernet/cavium/thunder/
 
 ARM/CIRRUS LOGIC CLPS711X ARM ARCHITECTURE
 M: Alexander Shiyan 
@@ -2543,7 +2543,6 @@ M: Raghu Vatsavayi 

 L: netdev@vger.kernel.org
 W: http://www.cavium.com
 S: Supported
-F: drivers/net/ethernet/cavium/
 F: drivers/net/ethernet/cavium/liquidio/
 
 CC2520 IEEE-802.15.4 RADIO DRIVER
-- 
2.5.0

--
To unsubscribe from this list: send the line "unsubscribe netdev" in
the body of a message to majord...@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html


[PATCH net-next 6/8] net: thunderx: Rework interrupt handler

2015-08-28 Thread Aleksey Makarov
From: Sunil Goutham 

Rework interrupt handler to avoid checking IRQ affinity of
CQ interrupts. Now separate handlers are registered for each IRQ
including RBDR. Also register interrupt handlers for only those
which are being used.

Signed-off-by: Sunil Goutham 
Signed-off-by: Aleksey Makarov 
---
 drivers/net/ethernet/cavium/thunder/nic.h  |   1 +
 drivers/net/ethernet/cavium/thunder/nicvf_main.c   | 172 -
 drivers/net/ethernet/cavium/thunder/nicvf_queues.h |   2 +
 3 files changed, 103 insertions(+), 72 deletions(-)

diff --git a/drivers/net/ethernet/cavium/thunder/nic.h 
b/drivers/net/ethernet/cavium/thunder/nic.h
index a83f567..89b997e 100644
--- a/drivers/net/ethernet/cavium/thunder/nic.h
+++ b/drivers/net/ethernet/cavium/thunder/nic.h
@@ -135,6 +135,7 @@
 #defineNICVF_TX_TIMEOUT(50 * HZ)
 
 struct nicvf_cq_poll {
+   struct  nicvf *nicvf;
u8  cq_idx; /* Completion queue index */
struct  napi_struct napi;
 };
diff --git a/drivers/net/ethernet/cavium/thunder/nicvf_main.c 
b/drivers/net/ethernet/cavium/thunder/nicvf_main.c
index de51828..2198f61 100644
--- a/drivers/net/ethernet/cavium/thunder/nicvf_main.c
+++ b/drivers/net/ethernet/cavium/thunder/nicvf_main.c
@@ -653,11 +653,20 @@ static void nicvf_handle_qs_err(unsigned long data)
nicvf_enable_intr(nic, NICVF_INTR_QS_ERR, 0);
 }
 
+static inline void nicvf_dump_intr_status(struct nicvf *nic)
+{
+   if (netif_msg_intr(nic))
+   netdev_info(nic->netdev, "%s: interrupt status 0x%llx\n",
+   nic->netdev->name, nicvf_reg_read(nic, NIC_VF_INT));
+}
+
 static irqreturn_t nicvf_misc_intr_handler(int irq, void *nicvf_irq)
 {
struct nicvf *nic = (struct nicvf *)nicvf_irq;
u64 intr;
 
+   nicvf_dump_intr_status(nic);
+
intr = nicvf_reg_read(nic, NIC_VF_INT);
/* Check for spurious interrupt */
if (!(intr & NICVF_INTR_MBOX_MASK))
@@ -668,59 +677,58 @@ static irqreturn_t nicvf_misc_intr_handler(int irq, void 
*nicvf_irq)
return IRQ_HANDLED;
 }
 
-static irqreturn_t nicvf_intr_handler(int irq, void *nicvf_irq)
+static irqreturn_t nicvf_intr_handler(int irq, void *cq_irq)
+{
+   struct nicvf_cq_poll *cq_poll = (struct nicvf_cq_poll *)cq_irq;
+   struct nicvf *nic = cq_poll->nicvf;
+   int qidx = cq_poll->cq_idx;
+
+   nicvf_dump_intr_status(nic);
+
+   /* Disable interrupts */
+   nicvf_disable_intr(nic, NICVF_INTR_CQ, qidx);
+
+   /* Schedule NAPI */
+   napi_schedule(&cq_poll->napi);
+
+   /* Clear interrupt */
+   nicvf_clear_intr(nic, NICVF_INTR_CQ, qidx);
+
+   return IRQ_HANDLED;
+}
+
+static irqreturn_t nicvf_rbdr_intr_handler(int irq, void *nicvf_irq)
 {
-   u64 qidx, intr, clear_intr = 0;
-   u64 cq_intr, rbdr_intr, qs_err_intr;
struct nicvf *nic = (struct nicvf *)nicvf_irq;
-   struct queue_set *qs = nic->qs;
-   struct nicvf_cq_poll *cq_poll = NULL;
+   u8 qidx;
 
-   intr = nicvf_reg_read(nic, NIC_VF_INT);
-   if (netif_msg_intr(nic))
-   netdev_info(nic->netdev, "%s: interrupt status 0x%llx\n",
-   nic->netdev->name, intr);
-
-   qs_err_intr = intr & NICVF_INTR_QS_ERR_MASK;
-   if (qs_err_intr) {
-   /* Disable Qset err interrupt and schedule softirq */
-   nicvf_disable_intr(nic, NICVF_INTR_QS_ERR, 0);
-   tasklet_hi_schedule(&nic->qs_err_task);
-   clear_intr |= qs_err_intr;
-   }
 
-   /* Disable interrupts and start polling */
-   cq_intr = (intr & NICVF_INTR_CQ_MASK) >> NICVF_INTR_CQ_SHIFT;
-   for (qidx = 0; qidx < qs->cq_cnt; qidx++) {
-   if (!(cq_intr & (1 << qidx)))
-   continue;
-   if (!nicvf_is_intr_enabled(nic, NICVF_INTR_CQ, qidx))
+   nicvf_dump_intr_status(nic);
+
+   /* Disable RBDR interrupt and schedule softirq */
+   for (qidx = 0; qidx < nic->qs->rbdr_cnt; qidx++) {
+   if (!nicvf_is_intr_enabled(nic, NICVF_INTR_RBDR, qidx))
continue;
+   nicvf_disable_intr(nic, NICVF_INTR_RBDR, qidx);
+   tasklet_hi_schedule(&nic->rbdr_task);
+   /* Clear interrupt */
+   nicvf_clear_intr(nic, NICVF_INTR_RBDR, qidx);
+   }
 
-   nicvf_disable_intr(nic, NICVF_INTR_CQ, qidx);
-   clear_intr |= ((1 << qidx) << NICVF_INTR_CQ_SHIFT);
+   return IRQ_HANDLED;
+}
 
-   cq_poll = nic->napi[qidx];
-   /* Schedule NAPI */
-   if (cq_poll)
-   napi_schedule(&cq_poll->napi);
-   }
+static irqreturn_t nicvf_qs_err_intr_handler(int irq, void *nicvf_irq)
+{
+   struct nicvf *nic = (struct nicvf *)nicvf_irq;
 
-

[PATCH net-next 5/8] net: thunderx: Support for HW VLAN stripping

2015-08-28 Thread Aleksey Makarov
From: Sunil Goutham 

This patch configures HW to strip 802.1Q header if found in a
receiving packet. The stripped VLAN ID and TCI information is
passed on to software via CQE_RX. Also sets netdev's 'vlan_features'
so that other HW offload features can be used for tagged packets.

This offload feature can be enabled or disabled via ethtool.

Network stack normally ignores RPS for 802.1Q packets and hence low
throughput. With this offload enabled throughput for tagged packets
will be almost same as normal packets.

Note: This patch doesn't enable HW VLAN insertion for transmit packets.

Signed-off-by: Sunil Goutham 
Signed-off-by: Aleksey Makarov 
---
 drivers/net/ethernet/cavium/thunder/nic_main.c |  4 
 drivers/net/ethernet/cavium/thunder/nicvf_main.c   | 28 +++---
 drivers/net/ethernet/cavium/thunder/nicvf_queues.c | 28 ++
 drivers/net/ethernet/cavium/thunder/nicvf_queues.h |  2 ++
 4 files changed, 55 insertions(+), 7 deletions(-)

diff --git a/drivers/net/ethernet/cavium/thunder/nic_main.c 
b/drivers/net/ethernet/cavium/thunder/nic_main.c
index 6e0c031..7dfec4a 100644
--- a/drivers/net/ethernet/cavium/thunder/nic_main.c
+++ b/drivers/net/ethernet/cavium/thunder/nic_main.c
@@ -329,6 +329,10 @@ static void nic_init_hw(struct nicpf *nic)
 
/* Timer config */
nic_reg_write(nic, NIC_PF_INTR_TIMER_CFG, NICPF_CLK_PER_INT_TICK);
+
+   /* Enable VLAN ethertype matching and stripping */
+   nic_reg_write(nic, NIC_PF_RX_ETYPE_0_7,
+ (2 << 19) | (ETYPE_ALG_VLAN_STRIP << 16) | ETH_P_8021Q);
 }
 
 /* Channel parse index configuration */
diff --git a/drivers/net/ethernet/cavium/thunder/nicvf_main.c 
b/drivers/net/ethernet/cavium/thunder/nicvf_main.c
index afd8ad4..de51828 100644
--- a/drivers/net/ethernet/cavium/thunder/nicvf_main.c
+++ b/drivers/net/ethernet/cavium/thunder/nicvf_main.c
@@ -10,6 +10,7 @@
 #include 
 #include 
 #include 
+#include 
 #include 
 #include 
 #include 
@@ -491,6 +492,11 @@ static void nicvf_rcv_pkt_handler(struct net_device 
*netdev,
 
skb->protocol = eth_type_trans(skb, netdev);
 
+   /* Check for stripped VLAN */
+   if (cqe_rx->vlan_found && cqe_rx->vlan_stripped)
+   __vlan_hwaccel_put_tag(skb, htons(ETH_P_8021Q),
+  ntohs((__force __be16)cqe_rx->vlan_tci));
+
if (napi && (netdev->features & NETIF_F_GRO))
napi_gro_receive(napi, skb);
else
@@ -1220,6 +1226,18 @@ static void nicvf_reset_task(struct work_struct *work)
nic->netdev->trans_start = jiffies;
 }
 
+static int nicvf_set_features(struct net_device *netdev,
+ netdev_features_t features)
+{
+   struct nicvf *nic = netdev_priv(netdev);
+   netdev_features_t changed = features ^ netdev->features;
+
+   if (changed & NETIF_F_HW_VLAN_CTAG_RX)
+   nicvf_config_vlan_stripping(nic, features);
+
+   return 0;
+}
+
 static const struct net_device_ops nicvf_netdev_ops = {
.ndo_open   = nicvf_open,
.ndo_stop   = nicvf_stop,
@@ -1228,6 +1246,7 @@ static const struct net_device_ops nicvf_netdev_ops = {
.ndo_set_mac_address= nicvf_set_mac_address,
.ndo_get_stats64= nicvf_get_stats64,
.ndo_tx_timeout = nicvf_tx_timeout,
+   .ndo_set_features   = nicvf_set_features,
 };
 
 static int nicvf_probe(struct pci_dev *pdev, const struct pci_device_id *ent)
@@ -1301,10 +1320,13 @@ static int nicvf_probe(struct pci_dev *pdev, const 
struct pci_device_id *ent)
if (err)
goto err_free_netdev;
 
-   netdev->features |= (NETIF_F_RXCSUM | NETIF_F_IP_CSUM | NETIF_F_SG |
-NETIF_F_TSO | NETIF_F_GRO | NETIF_F_RXHASH);
+   netdev->hw_features = (NETIF_F_RXCSUM | NETIF_F_IP_CSUM | NETIF_F_SG |
+  NETIF_F_TSO | NETIF_F_GRO |
+  NETIF_F_HW_VLAN_CTAG_RX | NETIF_F_RXHASH);
+
+   netdev->features |= netdev->hw_features;
 
-   netdev->hw_features = netdev->features;
+   netdev->vlan_features = NETIF_F_SG | NETIF_F_IP_CSUM | NETIF_F_TSO;
 
netdev->netdev_ops = &nicvf_netdev_ops;
netdev->watchdog_timeo = NICVF_TX_TIMEOUT;
diff --git a/drivers/net/ethernet/cavium/thunder/nicvf_queues.c 
b/drivers/net/ethernet/cavium/thunder/nicvf_queues.c
index 4fc40d83..b294d67 100644
--- a/drivers/net/ethernet/cavium/thunder/nicvf_queues.c
+++ b/drivers/net/ethernet/cavium/thunder/nicvf_queues.c
@@ -475,6 +475,27 @@ static void nicvf_reclaim_rbdr(struct nicvf *nic,
return;
 }
 
+void nicvf_config_vlan_stripping(struct nicvf *nic, netdev_features_t features)
+{
+   u64 rq_cfg;
+   int sqs;
+
+   rq_cfg = nicvf_queue_reg_read(nic, NIC_QSET_RQ_GEN_CFG, 0);
+
+   /* Enabl

[PATCH net-next 3/8] net: thunderx: mailboxes: remove code duplication

2015-08-28 Thread Aleksey Makarov
From: Sunil Goutham 

Use the nicvf_send_msg_to_pf() function in the mailbox code.

Signed-off-by: Sunil Goutham 
Signed-off-by: Robert Richter 
Signed-off-by: Aleksey Makarov 
---
 drivers/net/ethernet/cavium/thunder/nic.h|  3 +-
 drivers/net/ethernet/cavium/thunder/nicvf_main.c | 44 ++--
 2 files changed, 11 insertions(+), 36 deletions(-)

diff --git a/drivers/net/ethernet/cavium/thunder/nic.h 
b/drivers/net/ethernet/cavium/thunder/nic.h
index 58adfd6..a83f567 100644
--- a/drivers/net/ethernet/cavium/thunder/nic.h
+++ b/drivers/net/ethernet/cavium/thunder/nic.h
@@ -295,10 +295,9 @@ struct nicvf {
charirq_name[NIC_VF_MSIX_VECTORS][20];
boolirq_allocated[NIC_VF_MSIX_VECTORS];
 
-   boolpf_ready_to_rcv_msg;
+   /* VF <-> PF mailbox communication */
boolpf_acked;
boolpf_nacked;
-   boolbgx_stats_acked;
boolset_mac_pending;
 } cacheline_aligned_in_smp;
 
diff --git a/drivers/net/ethernet/cavium/thunder/nicvf_main.c 
b/drivers/net/ethernet/cavium/thunder/nicvf_main.c
index 670ff9b..d4ad36e 100644
--- a/drivers/net/ethernet/cavium/thunder/nicvf_main.c
+++ b/drivers/net/ethernet/cavium/thunder/nicvf_main.c
@@ -105,7 +105,6 @@ u64 nicvf_queue_reg_read(struct nicvf *nic, u64 offset, u64 
qidx)
 }
 
 /* VF -> PF mailbox communication */
-
 static void nicvf_write_to_mbx(struct nicvf *nic, union nic_mbx *mbx)
 {
u64 *msg = (u64 *)mbx;
@@ -147,26 +146,15 @@ int nicvf_send_msg_to_pf(struct nicvf *nic, union nic_mbx 
*mbx)
 */
 static int nicvf_check_pf_ready(struct nicvf *nic)
 {
-   int timeout = 5000, sleep = 20;
union nic_mbx mbx = {};
 
mbx.msg.msg = NIC_MBOX_MSG_READY;
-
-   nic->pf_ready_to_rcv_msg = false;
-
-   nicvf_write_to_mbx(nic, &mbx);
-
-   while (!nic->pf_ready_to_rcv_msg) {
-   msleep(sleep);
-   if (nic->pf_ready_to_rcv_msg)
-   break;
-   timeout -= sleep;
-   if (!timeout) {
-   netdev_err(nic->netdev,
-  "PF didn't respond to READY msg\n");
-   return 0;
-   }
+   if (nicvf_send_msg_to_pf(nic, &mbx)) {
+   netdev_err(nic->netdev,
+  "PF didn't respond to READY msg\n");
+   return 0;
}
+
return 1;
 }
 
@@ -197,7 +185,7 @@ static void  nicvf_handle_mbx_intr(struct nicvf *nic)
netdev_dbg(nic->netdev, "Mbox message: msg: 0x%x\n", mbx.msg.msg);
switch (mbx.msg.msg) {
case NIC_MBOX_MSG_READY:
-   nic->pf_ready_to_rcv_msg = true;
+   nic->pf_acked = true;
nic->vf_id = mbx.nic_cfg.vf_id & 0x7F;
nic->tns_mode = mbx.nic_cfg.tns_mode & 0x7F;
nic->node = mbx.nic_cfg.node_id;
@@ -221,7 +209,6 @@ static void  nicvf_handle_mbx_intr(struct nicvf *nic)
case NIC_MBOX_MSG_BGX_STATS:
nicvf_read_bgx_stats(nic, &mbx.bgx_stats);
nic->pf_acked = true;
-   nic->bgx_stats_acked = true;
break;
case NIC_MBOX_MSG_BGX_LINK_CHANGE:
nic->pf_acked = true;
@@ -1083,7 +1070,6 @@ void nicvf_update_lmac_stats(struct nicvf *nic)
 {
int stat = 0;
union nic_mbx mbx = {};
-   int timeout;
 
if (!netif_running(nic->netdev))
return;
@@ -1093,14 +1079,9 @@ void nicvf_update_lmac_stats(struct nicvf *nic)
/* Rx stats */
mbx.bgx_stats.rx = 1;
while (stat < BGX_RX_STATS_COUNT) {
-   nic->bgx_stats_acked = 0;
mbx.bgx_stats.idx = stat;
-   nicvf_send_msg_to_pf(nic, &mbx);
-   timeout = 0;
-   while ((!nic->bgx_stats_acked) && (timeout < 10)) {
-   msleep(2);
-   timeout++;
-   }
+   if (nicvf_send_msg_to_pf(nic, &mbx))
+   return;
stat++;
}
 
@@ -1109,14 +1090,9 @@ void nicvf_update_lmac_stats(struct nicvf *nic)
/* Tx stats */
mbx.bgx_stats.rx = 0;
while (stat < BGX_TX_STATS_COUNT) {
-   nic->bgx_stats_acked = 0;
mbx.bgx_stats.idx = stat;
-   nicvf_send_msg_to_pf(nic, &mbx);
-   timeout = 0;
-   while ((!nic->bgx_stats_acked) && (timeout < 10)) {
-   msleep(2);
-   timeout++;
-   }
+   if (nicvf_send_msg_to_pf(nic, &mbx))
+   return;
stat++;
}
 }
-- 
2.5.0

--
To unsubscribe from this list: send the line "unsubscribe netdev" in
the body of a message to majord...@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html


[PATCH net-next 7/8] net: thunderx: Support for upto 96 queues for a VF

2015-08-28 Thread Aleksey Makarov
From: Sunil Goutham 

This patch adds support for handling multiple qsets assigned to a
single VF. There by increasing no of queues from earlier 8 to max
no of CPUs in the system i.e 48 queues on a single node and 96 on
dual node system. User doesn't have option to assign which Qsets/VFs
 to be merged. Upon request from VF, PF assigns next free Qsets as
secondary qsets. To maintain current behavior no of queues is kept
to 8 by default which can be increased via ethtool.

If user wants to unbind NICVF driver from a secondary Qset then it
should be done after tearing down primary VF's interface.

Signed-off-by: Sunil Goutham 
Signed-off-by: Aleksey Makarov 
Signed-off-by: Robert Richter 
---
 drivers/net/ethernet/cavium/thunder/nic.h  |  42 -
 drivers/net/ethernet/cavium/thunder/nic_main.c | 173 +++--
 .../net/ethernet/cavium/thunder/nicvf_ethtool.c| 136 +
 drivers/net/ethernet/cavium/thunder/nicvf_main.c   | 210 +++--
 drivers/net/ethernet/cavium/thunder/nicvf_queues.c |  32 +++-
 5 files changed, 507 insertions(+), 86 deletions(-)

diff --git a/drivers/net/ethernet/cavium/thunder/nic.h 
b/drivers/net/ethernet/cavium/thunder/nic.h
index 89b997e..35b2ee1 100644
--- a/drivers/net/ethernet/cavium/thunder/nic.h
+++ b/drivers/net/ethernet/cavium/thunder/nic.h
@@ -258,13 +258,23 @@ struct nicvf_drv_stats {
 };
 
 struct nicvf {
+   struct nicvf*pnicvf;
struct net_device   *netdev;
struct pci_dev  *pdev;
u8  vf_id;
u8  node;
-   u8  tns_mode;
+   u8  tns_mode:1;
+   u8  sqs_mode:1;
u16 mtu;
struct queue_set*qs;
+#defineMAX_SQS_PER_VF_SINGLE_NODE  5
+#defineMAX_SQS_PER_VF  11
+   u8  sqs_id;
+   u8  sqs_count; /* Secondary Qset count */
+   struct nicvf*snicvf[MAX_SQS_PER_VF];
+   u8  rx_queues;
+   u8  tx_queues;
+   u8  max_queues;
void __iomem*reg_base;
boollink_up;
u8  duplex;
@@ -330,14 +340,19 @@ struct nicvf {
 #defineNIC_MBOX_MSG_RQ_SW_SYNC 0x0F/* Flush inflight pkts 
to RQ */
 #defineNIC_MBOX_MSG_BGX_STATS  0x10/* Get stats from BGX */
 #defineNIC_MBOX_MSG_BGX_LINK_CHANGE0x11/* BGX:LMAC link status 
*/
-#define NIC_MBOX_MSG_CFG_DONE  0x12/* VF configuration done */
-#define NIC_MBOX_MSG_SHUTDOWN  0x13/* VF is being shutdown */
+#defineNIC_MBOX_MSG_ALLOC_SQS  0x12/* Allocate secondary 
Qset */
+#defineNIC_MBOX_MSG_NICVF_PTR  0x13/* Send nicvf ptr to PF 
*/
+#defineNIC_MBOX_MSG_PNICVF_PTR 0x14/* Get primary qset 
nicvf ptr */
+#defineNIC_MBOX_MSG_SNICVF_PTR 0x15/* Send sqet nicvf ptr 
to PVF */
+#defineNIC_MBOX_MSG_CFG_DONE   0xF0/* VF configuration 
done */
+#defineNIC_MBOX_MSG_SHUTDOWN   0xF1/* VF is being shutdown 
*/
 
 struct nic_cfg_msg {
u8msg;
u8vf_id;
-   u8tns_mode;
u8node_id;
+   u8tns_mode:1;
+   u8sqs_mode:1;
u8mac_addr[ETH_ALEN];
 };
 
@@ -345,6 +360,7 @@ struct nic_cfg_msg {
 struct qs_cfg_msg {
u8msg;
u8num;
+   u8sqs_count;
u64   cfg;
 };
 
@@ -361,6 +377,7 @@ struct sq_cfg_msg {
u8msg;
u8qs_num;
u8sq_num;
+   bool  sqs_mode;
u64   cfg;
 };
 
@@ -420,6 +437,21 @@ struct bgx_link_status {
u32   speed;
 };
 
+/* Get Extra Qset IDs */
+struct sqs_alloc {
+   u8msg;
+   u8vf_id;
+   u8qs_count;
+};
+
+struct nicvf_ptr {
+   u8msg;
+   u8vf_id;
+   bool  sqs_mode;
+   u8sqs_id;
+   u64   nicvf;
+};
+
 /* 128 bit shared memory between PF and each VF */
 union nic_mbx {
struct { u8 msg; }  msg;
@@ -434,6 +466,8 @@ union nic_mbx {
struct rss_cfg_msg  rss_cfg;
struct bgx_stats_msgbgx_stats;
struct bgx_link_status  link_status;
+   struct sqs_allocsqs_alloc;
+   struct nicvf_ptrnicvf;
 };
 
 #define NIC_NODE_ID_MASK   0x03
diff --git a/drivers/net/ethernet/cavium/thunder/nic_main.c 
b/drivers/net/ethernet/cavium/thunder/nic_main.c
index 7dfec4a..51f3048 100644
--- a/drivers/net/ethernet/cavium/thunder/nic_main.c
+++ b/drivers/net/ethernet/cavium/thunder/nic_main.c
@@ -28,6 +28,11 @@ struct nicpf {
u8  num_vf_en;  /* No of VF enabled */
boolvf_enabled[MAX_NUM_VFS_SUPPORTED];
void __iomem   

[PATCH net-next 8/8] net: thunderx: Support for internal loopback mode

2015-08-28 Thread Aleksey Makarov
From: Sunil Goutham 

Support for setting VF's corresponding BGX LMAC in internal
loopback mode. This mode can be used for verifying basic HW
functionality such as packet I/O, RX checksum validation,
CQ/RBDR interrupts, stats e.t.c. Useful when DUT has no external
network connectivity.

'loopback' mode can be enabled or disabled via ethtool.

Note: This feature is not supported when no of VFs enabled are
morethan no of physical interfaces i.e active BGX LMACs

Signed-off-by: Sunil Goutham 
Signed-off-by: Aleksey Makarov 
---
 drivers/net/ethernet/cavium/thunder/nic.h | 11 
 drivers/net/ethernet/cavium/thunder/nic_main.c| 21 +++
 drivers/net/ethernet/cavium/thunder/nicvf_main.c  | 30 ++
 drivers/net/ethernet/cavium/thunder/thunder_bgx.c | 31 +++
 drivers/net/ethernet/cavium/thunder/thunder_bgx.h |  4 +++
 5 files changed, 97 insertions(+)

diff --git a/drivers/net/ethernet/cavium/thunder/nic.h 
b/drivers/net/ethernet/cavium/thunder/nic.h
index 35b2ee1..d3950b2 100644
--- a/drivers/net/ethernet/cavium/thunder/nic.h
+++ b/drivers/net/ethernet/cavium/thunder/nic.h
@@ -265,6 +265,7 @@ struct nicvf {
u8  node;
u8  tns_mode:1;
u8  sqs_mode:1;
+   u8  loopback_supported:1;
u16 mtu;
struct queue_set*qs;
 #defineMAX_SQS_PER_VF_SINGLE_NODE  5
@@ -344,6 +345,7 @@ struct nicvf {
 #defineNIC_MBOX_MSG_NICVF_PTR  0x13/* Send nicvf ptr to PF 
*/
 #defineNIC_MBOX_MSG_PNICVF_PTR 0x14/* Get primary qset 
nicvf ptr */
 #defineNIC_MBOX_MSG_SNICVF_PTR 0x15/* Send sqet nicvf ptr 
to PVF */
+#defineNIC_MBOX_MSG_LOOPBACK   0x16/* Set interface in 
loopback */
 #defineNIC_MBOX_MSG_CFG_DONE   0xF0/* VF configuration 
done */
 #defineNIC_MBOX_MSG_SHUTDOWN   0xF1/* VF is being shutdown 
*/
 
@@ -353,6 +355,7 @@ struct nic_cfg_msg {
u8node_id;
u8tns_mode:1;
u8sqs_mode:1;
+   u8loopback_supported:1;
u8mac_addr[ETH_ALEN];
 };
 
@@ -452,6 +455,13 @@ struct nicvf_ptr {
u64   nicvf;
 };
 
+/* Set interface in loopback mode */
+struct set_loopback {
+   u8msg;
+   u8vf_id;
+   bool  enable;
+};
+
 /* 128 bit shared memory between PF and each VF */
 union nic_mbx {
struct { u8 msg; }  msg;
@@ -468,6 +478,7 @@ union nic_mbx {
struct bgx_link_status  link_status;
struct sqs_allocsqs_alloc;
struct nicvf_ptrnicvf;
+   struct set_loopback lbk;
 };
 
 #define NIC_NODE_ID_MASK   0x03
diff --git a/drivers/net/ethernet/cavium/thunder/nic_main.c 
b/drivers/net/ethernet/cavium/thunder/nic_main.c
index 51f3048..fd36820 100644
--- a/drivers/net/ethernet/cavium/thunder/nic_main.c
+++ b/drivers/net/ethernet/cavium/thunder/nic_main.c
@@ -154,6 +154,9 @@ static void nic_mbx_send_ready(struct nicpf *nic, int vf)
}
mbx.nic_cfg.sqs_mode = (vf >= nic->num_vf_en) ? true : false;
mbx.nic_cfg.node_id = nic->node;
+
+   mbx.nic_cfg.loopback_supported = vf < MAX_LMAC;
+
nic_send_msg_to_vf(nic, vf, &mbx);
 }
 
@@ -579,6 +582,21 @@ send_mbox:
nic_send_msg_to_vf(nic, sqs->vf_id, &mbx);
 }
 
+static int nic_config_loopback(struct nicpf *nic, struct set_loopback *lbk)
+{
+   int bgx_idx, lmac_idx;
+
+   if (lbk->vf_id > MAX_LMAC)
+   return -1;
+
+   bgx_idx = NIC_GET_BGX_FROM_VF_LMAC_MAP(nic->vf_lmac_map[lbk->vf_id]);
+   lmac_idx = NIC_GET_LMAC_FROM_VF_LMAC_MAP(nic->vf_lmac_map[lbk->vf_id]);
+
+   bgx_lmac_internal_loopback(nic->node, bgx_idx, lmac_idx, lbk->enable);
+
+   return 0;
+}
+
 /* Interrupt handler to handle mailbox messages from VFs */
 static void nic_handle_mbx_intr(struct nicpf *nic, int vf)
 {
@@ -702,6 +720,9 @@ static void nic_handle_mbx_intr(struct nicpf *nic, int vf)
case NIC_MBOX_MSG_BGX_STATS:
nic_get_bgx_stats(nic, &mbx.bgx_stats);
goto unlock;
+   case NIC_MBOX_MSG_LOOPBACK:
+   ret = nic_config_loopback(nic, &mbx.lbk);
+   break;
default:
dev_err(&nic->pdev->dev,
"Invalid msg from VF%d, msg 0x%x\n", vf, mbx.msg.msg);
diff --git a/drivers/net/ethernet/cavium/thunder/nicvf_main.c 
b/drivers/net/ethernet/cavium/thunder/nicvf_main.c
index 9a1091a..49228b6 100644
--- a/drivers/net/ethernet/cavium/thunder/nicvf_main.c
+++ b/drivers/net/ethernet/cavium/thunder/nicvf_main.c
@@ -202,6 +202,7 @@ static void  nicvf_handle_mbx_intr(struct nicvf *nic)
ether_addr_copy(nic->netdev->dev_addr,

[PATCH net 06/11] net: thunderx: Suppress alloc_pages() failure warnings

2015-07-29 Thread Aleksey Makarov
From: Sunil Goutham 

Suppressing standard alloc_pages() warnings. Some kernel configs limit
alloc size and the network driver may fail. Do not drop a kernel
warning in this case, instead just drop a oneliner that the network
driver could not be loaded since the buffer could not be allocated.

Signed-off-by: Sunil Goutham 
Signed-off-by: Aleksey Makarov 
---
 drivers/net/ethernet/cavium/thunder/nicvf_queues.c | 6 --
 1 file changed, 4 insertions(+), 2 deletions(-)

diff --git a/drivers/net/ethernet/cavium/thunder/nicvf_queues.c 
b/drivers/net/ethernet/cavium/thunder/nicvf_queues.c
index 500fdbe..ca4240a 100644
--- a/drivers/net/ethernet/cavium/thunder/nicvf_queues.c
+++ b/drivers/net/ethernet/cavium/thunder/nicvf_queues.c
@@ -103,9 +103,11 @@ static inline int nicvf_alloc_rcv_buffer(struct nicvf 
*nic, gfp_t gfp,
 
/* Allocate a new page */
if (!nic->rb_page) {
-   nic->rb_page = alloc_pages(gfp | __GFP_COMP, order);
+   nic->rb_page = alloc_pages(gfp | __GFP_COMP | __GFP_NOWARN,
+  order);
if (!nic->rb_page) {
-   netdev_err(nic->netdev, "Failed to allocate new rcv 
buffer\n");
+   netdev_err(nic->netdev,
+  "Failed to allocate new rcv buffer\n");
return -ENOMEM;
}
nic->rb_page_offset = 0;
-- 
2.4.6

--
To unsubscribe from this list: send the line "unsubscribe netdev" in
the body of a message to majord...@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html


[PATCH net 07/11] net: thunderx: Wakeup TXQ only if CQE_TX are processed

2015-07-29 Thread Aleksey Makarov
From: Sunil Goutham 

Previously TXQ is wakedup whenever napi is executed
and irrespective of if any CQE_TX are processed or not.
Added 'txq_stop' and 'txq_wake' counters to aid in debugging
if there are any future issues.

Signed-off-by: Sunil Goutham 
Signed-off-by: Aleksey Makarov 
---
 drivers/net/ethernet/cavium/thunder/nic.h  |  3 +-
 .../net/ethernet/cavium/thunder/nicvf_ethtool.c|  3 +-
 drivers/net/ethernet/cavium/thunder/nicvf_main.c   | 40 +++---
 3 files changed, 31 insertions(+), 15 deletions(-)

diff --git a/drivers/net/ethernet/cavium/thunder/nic.h 
b/drivers/net/ethernet/cavium/thunder/nic.h
index dda8a02..a0be076 100644
--- a/drivers/net/ethernet/cavium/thunder/nic.h
+++ b/drivers/net/ethernet/cavium/thunder/nic.h
@@ -216,8 +216,9 @@ struct nicvf_drv_stats {
/* Tx */
u64 tx_frames_ok;
u64 tx_drops;
-   u64 tx_busy;
u64 tx_tso;
+   u64 txq_stop;
+   u64 txq_wake;
 };
 
 struct nicvf {
diff --git a/drivers/net/ethernet/cavium/thunder/nicvf_ethtool.c 
b/drivers/net/ethernet/cavium/thunder/nicvf_ethtool.c
index b22dee6..a4228e6 100644
--- a/drivers/net/ethernet/cavium/thunder/nicvf_ethtool.c
+++ b/drivers/net/ethernet/cavium/thunder/nicvf_ethtool.c
@@ -66,9 +66,10 @@ static const struct nicvf_stat nicvf_drv_stats[] = {
NICVF_DRV_STAT(rx_frames_jumbo),
NICVF_DRV_STAT(rx_drops),
NICVF_DRV_STAT(tx_frames_ok),
-   NICVF_DRV_STAT(tx_busy),
NICVF_DRV_STAT(tx_tso),
NICVF_DRV_STAT(tx_drops),
+   NICVF_DRV_STAT(txq_stop),
+   NICVF_DRV_STAT(txq_wake),
 };
 
 static const struct nicvf_stat nicvf_queue_stats[] = {
diff --git a/drivers/net/ethernet/cavium/thunder/nicvf_main.c 
b/drivers/net/ethernet/cavium/thunder/nicvf_main.c
index 2890cd6..422d46e 100644
--- a/drivers/net/ethernet/cavium/thunder/nicvf_main.c
+++ b/drivers/net/ethernet/cavium/thunder/nicvf_main.c
@@ -477,12 +477,13 @@ static void nicvf_rcv_pkt_handler(struct net_device 
*netdev,
 static int nicvf_cq_intr_handler(struct net_device *netdev, u8 cq_idx,
 struct napi_struct *napi, int budget)
 {
-   int processed_cqe, work_done = 0;
+   int processed_cqe, work_done = 0, tx_done = 0;
int cqe_count, cqe_head;
struct nicvf *nic = netdev_priv(netdev);
struct queue_set *qs = nic->qs;
struct cmp_queue *cq = &qs->cq[cq_idx];
struct cqe_rx_t *cq_desc;
+   struct netdev_queue *txq;
 
spin_lock_bh(&cq->lock);
 loop:
@@ -497,8 +498,8 @@ loop:
cqe_head = nicvf_queue_reg_read(nic, NIC_QSET_CQ_0_7_HEAD, cq_idx) >> 9;
cqe_head &= 0x;
 
-   netdev_dbg(nic->netdev, "%s cqe_count %d cqe_head %d\n",
-  __func__, cqe_count, cqe_head);
+   netdev_dbg(nic->netdev, "%s CQ%d cqe_count %d cqe_head %d\n",
+  __func__, cq_idx, cqe_count, cqe_head);
while (processed_cqe < cqe_count) {
/* Get the CQ descriptor */
cq_desc = (struct cqe_rx_t *)GET_CQ_DESC(cq, cqe_head);
@@ -512,8 +513,8 @@ loop:
break;
}
 
-   netdev_dbg(nic->netdev, "cq_desc->cqe_type %d\n",
-  cq_desc->cqe_type);
+   netdev_dbg(nic->netdev, "CQ%d cq_desc->cqe_type %d\n",
+  cq_idx, cq_desc->cqe_type);
switch (cq_desc->cqe_type) {
case CQE_TYPE_RX:
nicvf_rcv_pkt_handler(netdev, napi, cq,
@@ -523,6 +524,7 @@ loop:
case CQE_TYPE_SEND:
nicvf_snd_pkt_handler(netdev, cq,
  (void *)cq_desc, CQE_TYPE_SEND);
+   tx_done++;
break;
case CQE_TYPE_INVALID:
case CQE_TYPE_RX_SPLIT:
@@ -533,8 +535,9 @@ loop:
}
processed_cqe++;
}
-   netdev_dbg(nic->netdev, "%s processed_cqe %d work_done %d budget %d\n",
-  __func__, processed_cqe, work_done, budget);
+   netdev_dbg(nic->netdev,
+  "%s CQ%d processed_cqe %d work_done %d budget %d\n",
+  __func__, cq_idx, processed_cqe, work_done, budget);
 
/* Ring doorbell to inform H/W to reuse processed CQEs */
nicvf_queue_reg_write(nic, NIC_QSET_CQ_0_7_DOOR,
@@ -544,6 +547,19 @@ loop:
goto loop;
 
 done:
+   /* Wakeup TXQ if its stopped earlier due to SQ full */
+   if (tx_done) {
+   txq = netdev_get_tx_queue(netdev, cq_idx);
+   if (netif_tx_queue_stopped(txq)) {
+   netif_tx_wake_queue(txq);
+   nic->drv_stats.txq_wake++;
+   if (netif_msg_tx_err(nic))
+   netdev_war

[PATCH net 00/11] net: thunderx: Misc fixes

2015-07-29 Thread Aleksey Makarov
Miscellaneous fixes for the ThunderX VNIC driver

All the patches can be applied individually.
It's ok to drop some if the maintainer feels uncomfortable
with applying for 4.2.

Sunil Goutham (10):
  net: thunderx: Fix data integrity issues with LDWB
  net: thunderx: Fix memory leak while tearing down interface
  net: thunderx: Fix RQ_DROP miscalculation
  net: thunderx: Fix memory leak when changing queue count
  net: thunderx: Fix TSO packet statistic
  net: thunderx: Suppress alloc_pages() failure warnings
  net: thunderx: Wakeup TXQ only if CQE_TX are processed
  net: thunderx: Set watchdog timeout value
  net: thunderx: Fix crash when changing rss with mutliple traffic flows
  net: thunderx: Add PCI driver shutdown routine

Thanneeru Srinivasulu (1):
  net: thunderx: Fix for crash while BGX teardown

 drivers/net/ethernet/cavium/thunder/nic.h  | 12 -
 .../net/ethernet/cavium/thunder/nicvf_ethtool.c| 26 ++
 drivers/net/ethernet/cavium/thunder/nicvf_main.c   | 55 +++---
 drivers/net/ethernet/cavium/thunder/nicvf_queues.c | 17 ---
 drivers/net/ethernet/cavium/thunder/nicvf_queues.h | 14 --
 drivers/net/ethernet/cavium/thunder/thunder_bgx.c  |  5 +-
 6 files changed, 92 insertions(+), 37 deletions(-)

-- 
2.4.6

--
To unsubscribe from this list: send the line "unsubscribe netdev" in
the body of a message to majord...@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html


[PATCH net 02/11] net: thunderx: Fix memory leak while tearing down interface

2015-07-29 Thread Aleksey Makarov
From: Sunil Goutham 

Fixed 'tso_hdrs' memory not being freed properly.
Also fixed SQ skbuff maintenance issues.

Signed-off-by: Sunil Goutham 
Signed-off-by: Aleksey Makarov 
---
 drivers/net/ethernet/cavium/thunder/nicvf_main.c   | 1 +
 drivers/net/ethernet/cavium/thunder/nicvf_queues.c | 8 +---
 2 files changed, 6 insertions(+), 3 deletions(-)

diff --git a/drivers/net/ethernet/cavium/thunder/nicvf_main.c 
b/drivers/net/ethernet/cavium/thunder/nicvf_main.c
index 8b119a0..2890cd6 100644
--- a/drivers/net/ethernet/cavium/thunder/nicvf_main.c
+++ b/drivers/net/ethernet/cavium/thunder/nicvf_main.c
@@ -425,6 +425,7 @@ static void nicvf_snd_pkt_handler(struct net_device *netdev,
if (skb) {
prefetch(skb);
dev_consume_skb_any(skb);
+   sq->skbuff[cqe_tx->sqe_ptr] = (u64)NULL;
}
 }
 
diff --git a/drivers/net/ethernet/cavium/thunder/nicvf_queues.c 
b/drivers/net/ethernet/cavium/thunder/nicvf_queues.c
index 4dae6aa..4c91959 100644
--- a/drivers/net/ethernet/cavium/thunder/nicvf_queues.c
+++ b/drivers/net/ethernet/cavium/thunder/nicvf_queues.c
@@ -382,7 +382,8 @@ static void nicvf_free_snd_queue(struct nicvf *nic, struct 
snd_queue *sq)
return;
 
if (sq->tso_hdrs)
-   dma_free_coherent(&nic->pdev->dev, sq->dmem.q_len,
+   dma_free_coherent(&nic->pdev->dev,
+ sq->dmem.q_len * TSO_HEADER_SIZE,
  sq->tso_hdrs, sq->tso_hdrs_phys);
 
kfree(sq->skbuff);
@@ -863,10 +864,11 @@ void nicvf_sq_free_used_descs(struct net_device *netdev, 
struct snd_queue *sq,
continue;
}
skb = (struct sk_buff *)sq->skbuff[sq->head];
+   if (skb)
+   dev_kfree_skb_any(skb);
atomic64_add(1, (atomic64_t *)&netdev->stats.tx_packets);
atomic64_add(hdr->tot_len,
 (atomic64_t *)&netdev->stats.tx_bytes);
-   dev_kfree_skb_any(skb);
nicvf_put_sq_desc(sq, hdr->subdesc_cnt + 1);
}
 }
@@ -1048,7 +1050,7 @@ static int nicvf_sq_append_tso(struct nicvf *nic, struct 
snd_queue *sq,
}
nicvf_sq_add_hdr_subdesc(sq, hdr_qentry,
 seg_subdescs - 1, skb, seg_len);
-   sq->skbuff[hdr_qentry] = 0;
+   sq->skbuff[hdr_qentry] = (u64)NULL;
qentry = nicvf_get_nxt_sqentry(sq, qentry);
 
desc_cnt += seg_subdescs;
-- 
2.4.6

--
To unsubscribe from this list: send the line "unsubscribe netdev" in
the body of a message to majord...@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html


[PATCH net 04/11] net: thunderx: Fix memory leak when changing queue count

2015-07-29 Thread Aleksey Makarov
From: Sunil Goutham 

Fix for memory leak when changing queue/channel count via ethtool

Signed-off-by: Sunil Goutham 
Signed-off-by: Aleksey Makarov 
---
 .../net/ethernet/cavium/thunder/nicvf_ethtool.c| 23 +-
 1 file changed, 14 insertions(+), 9 deletions(-)

diff --git a/drivers/net/ethernet/cavium/thunder/nicvf_ethtool.c 
b/drivers/net/ethernet/cavium/thunder/nicvf_ethtool.c
index 16bd2d7..b22dee6 100644
--- a/drivers/net/ethernet/cavium/thunder/nicvf_ethtool.c
+++ b/drivers/net/ethernet/cavium/thunder/nicvf_ethtool.c
@@ -126,6 +126,7 @@ static void nicvf_set_msglevel(struct net_device *netdev, 
u32 lvl)
 
 static void nicvf_get_strings(struct net_device *netdev, u32 sset, u8 *data)
 {
+   struct nicvf *nic = netdev_priv(netdev);
int stats, qidx;
 
if (sset != ETH_SS_STATS)
@@ -141,7 +142,7 @@ static void nicvf_get_strings(struct net_device *netdev, 
u32 sset, u8 *data)
data += ETH_GSTRING_LEN;
}
 
-   for (qidx = 0; qidx < MAX_RCV_QUEUES_PER_QS; qidx++) {
+   for (qidx = 0; qidx < nic->qs->rq_cnt; qidx++) {
for (stats = 0; stats < nicvf_n_queue_stats; stats++) {
sprintf(data, "rxq%d: %s", qidx,
nicvf_queue_stats[stats].name);
@@ -149,7 +150,7 @@ static void nicvf_get_strings(struct net_device *netdev, 
u32 sset, u8 *data)
}
}
 
-   for (qidx = 0; qidx < MAX_SND_QUEUES_PER_QS; qidx++) {
+   for (qidx = 0; qidx < nic->qs->sq_cnt; qidx++) {
for (stats = 0; stats < nicvf_n_queue_stats; stats++) {
sprintf(data, "txq%d: %s", qidx,
nicvf_queue_stats[stats].name);
@@ -170,12 +171,14 @@ static void nicvf_get_strings(struct net_device *netdev, 
u32 sset, u8 *data)
 
 static int nicvf_get_sset_count(struct net_device *netdev, int sset)
 {
+   struct nicvf *nic = netdev_priv(netdev);
+
if (sset != ETH_SS_STATS)
return -EINVAL;
 
return nicvf_n_hw_stats + nicvf_n_drv_stats +
(nicvf_n_queue_stats *
-(MAX_RCV_QUEUES_PER_QS + MAX_SND_QUEUES_PER_QS)) +
+(nic->qs->rq_cnt + nic->qs->sq_cnt)) +
BGX_RX_STATS_COUNT + BGX_TX_STATS_COUNT;
 }
 
@@ -197,13 +200,13 @@ static void nicvf_get_ethtool_stats(struct net_device 
*netdev,
*(data++) = ((u64 *)&nic->drv_stats)
[nicvf_drv_stats[stat].index];
 
-   for (qidx = 0; qidx < MAX_RCV_QUEUES_PER_QS; qidx++) {
+   for (qidx = 0; qidx < nic->qs->rq_cnt; qidx++) {
for (stat = 0; stat < nicvf_n_queue_stats; stat++)
*(data++) = ((u64 *)&nic->qs->rq[qidx].stats)
[nicvf_queue_stats[stat].index];
}
 
-   for (qidx = 0; qidx < MAX_SND_QUEUES_PER_QS; qidx++) {
+   for (qidx = 0; qidx < nic->qs->sq_cnt; qidx++) {
for (stat = 0; stat < nicvf_n_queue_stats; stat++)
*(data++) = ((u64 *)&nic->qs->sq[qidx].stats)
[nicvf_queue_stats[stat].index];
@@ -543,6 +546,7 @@ static int nicvf_set_channels(struct net_device *dev,
 {
struct nicvf *nic = netdev_priv(dev);
int err = 0;
+   bool if_up = netif_running(dev);
 
if (!channel->rx_count || !channel->tx_count)
return -EINVAL;
@@ -551,6 +555,9 @@ static int nicvf_set_channels(struct net_device *dev,
if (channel->tx_count > MAX_SND_QUEUES_PER_QS)
return -EINVAL;
 
+   if (if_up)
+   nicvf_stop(dev);
+
nic->qs->rq_cnt = channel->rx_count;
nic->qs->sq_cnt = channel->tx_count;
nic->qs->cq_cnt = max(nic->qs->rq_cnt, nic->qs->sq_cnt);
@@ -559,11 +566,9 @@ static int nicvf_set_channels(struct net_device *dev,
if (err)
return err;
 
-   if (!netif_running(dev))
-   return err;
+   if (if_up)
+   nicvf_open(dev);
 
-   nicvf_stop(dev);
-   nicvf_open(dev);
netdev_info(dev, "Setting num Tx rings to %d, Rx rings to %d success\n",
nic->qs->sq_cnt, nic->qs->rq_cnt);
 
-- 
2.4.6

--
To unsubscribe from this list: send the line "unsubscribe netdev" in
the body of a message to majord...@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html


[PATCH net 09/11] net: thunderx: Fix crash when changing rss with mutliple traffic flows

2015-07-29 Thread Aleksey Makarov
From: Sunil Goutham 

This fixes a crash when changing rss with multiple traffic flows.

While interface teardown, disable tx queues after all NAPI threads
are done. If done otherwise tx queues might be woken up inside NAPI
if any CQE_TX are processed.

Signed-off-by: Sunil Goutham 
Signed-off-by: Aleksey Makarov 
---
 drivers/net/ethernet/cavium/thunder/nicvf_main.c | 9 +
 1 file changed, 5 insertions(+), 4 deletions(-)

diff --git a/drivers/net/ethernet/cavium/thunder/nicvf_main.c 
b/drivers/net/ethernet/cavium/thunder/nicvf_main.c
index abee2d7..c7a29a3 100644
--- a/drivers/net/ethernet/cavium/thunder/nicvf_main.c
+++ b/drivers/net/ethernet/cavium/thunder/nicvf_main.c
@@ -234,7 +234,7 @@ static void  nicvf_handle_mbx_intr(struct nicvf *nic)
nic->duplex == DUPLEX_FULL ?
"Full duplex" : "Half duplex");
netif_carrier_on(nic->netdev);
-   netif_tx_wake_all_queues(nic->netdev);
+   netif_tx_start_all_queues(nic->netdev);
} else {
netdev_info(nic->netdev, "%s: Link is Down\n",
nic->netdev->name);
@@ -551,7 +551,7 @@ done:
if (tx_done) {
txq = netdev_get_tx_queue(netdev, cq_idx);
if (netif_tx_queue_stopped(txq)) {
-   netif_tx_wake_queue(txq);
+   netif_tx_start_queue(txq);
nic->drv_stats.txq_wake++;
if (netif_msg_tx_err(nic))
netdev_warn(netdev,
@@ -845,7 +845,7 @@ static netdev_tx_t nicvf_xmit(struct sk_buff *skb, struct 
net_device *netdev)
return NETDEV_TX_OK;
}
 
-   if (!nicvf_sq_append_skb(nic, skb) && !netif_tx_queue_stopped(txq)) {
+   if (!netif_tx_queue_stopped(txq) && !nicvf_sq_append_skb(nic, skb)) {
netif_tx_stop_queue(txq);
nic->drv_stats.txq_stop++;
if (netif_msg_tx_err(nic))
@@ -871,7 +871,6 @@ int nicvf_stop(struct net_device *netdev)
nicvf_send_msg_to_pf(nic, &mbx);
 
netif_carrier_off(netdev);
-   netif_tx_disable(netdev);
 
/* Disable RBDR & QS error interrupts */
for (qidx = 0; qidx < qs->rbdr_cnt; qidx++) {
@@ -906,6 +905,8 @@ int nicvf_stop(struct net_device *netdev)
kfree(cq_poll);
}
 
+   netif_tx_disable(netdev);
+
/* Free resources */
nicvf_config_data_transfer(nic, false);
 
-- 
2.4.6

--
To unsubscribe from this list: send the line "unsubscribe netdev" in
the body of a message to majord...@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html


[PATCH net 05/11] net: thunderx: Fix TSO packet statistic

2015-07-29 Thread Aleksey Makarov
From: Sunil Goutham 

Fixing TSO packages not being counted.

Signed-off-by: Sunil Goutham 
Signed-off-by: Aleksey Makarov 
---
 drivers/net/ethernet/cavium/thunder/nicvf_queues.c | 1 +
 1 file changed, 1 insertion(+)

diff --git a/drivers/net/ethernet/cavium/thunder/nicvf_queues.c 
b/drivers/net/ethernet/cavium/thunder/nicvf_queues.c
index 4c91959..500fdbe 100644
--- a/drivers/net/ethernet/cavium/thunder/nicvf_queues.c
+++ b/drivers/net/ethernet/cavium/thunder/nicvf_queues.c
@@ -1064,6 +1064,7 @@ static int nicvf_sq_append_tso(struct nicvf *nic, struct 
snd_queue *sq,
/* Inform HW to xmit all TSO segments */
nicvf_queue_reg_write(nic, NIC_QSET_SQ_0_7_DOOR,
  skb_get_queue_mapping(skb), desc_cnt);
+   nic->drv_stats.tx_tso++;
return 1;
 }
 
-- 
2.4.6

--
To unsubscribe from this list: send the line "unsubscribe netdev" in
the body of a message to majord...@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html


[PATCH net 11/11] net: thunderx: Fix for crash while BGX teardown

2015-07-29 Thread Aleksey Makarov
From: Thanneeru Srinivasulu 

Cortina phy does not have kernel driver and we don't attach
device with phy layer for intefaces like XFI, XLAUI etc,
Hence check for interface type before calling disconnect.

Signed-off-by: Thanneeru Srinivasulu 
Signed-off-by: Aleksey Makarov 
---
 drivers/net/ethernet/cavium/thunder/thunder_bgx.c | 5 -
 1 file changed, 4 insertions(+), 1 deletion(-)

diff --git a/drivers/net/ethernet/cavium/thunder/thunder_bgx.c 
b/drivers/net/ethernet/cavium/thunder/thunder_bgx.c
index 633ec05..b961a89 100644
--- a/drivers/net/ethernet/cavium/thunder/thunder_bgx.c
+++ b/drivers/net/ethernet/cavium/thunder/thunder_bgx.c
@@ -673,7 +673,10 @@ static void bgx_lmac_disable(struct bgx *bgx, u8 lmacid)
bgx_reg_write(bgx, lmacid, BGX_CMRX_CFG, cmrx_cfg);
bgx_flush_dmac_addrs(bgx, lmacid);
 
-   if (lmac->phydev)
+   if ((bgx->lmac_type != BGX_MODE_XFI) &&
+   (bgx->lmac_type != BGX_MODE_XLAUI) &&
+   (bgx->lmac_type != BGX_MODE_40G_KR) &&
+   (bgx->lmac_type != BGX_MODE_10G_KR) && lmac->phydev)
phy_disconnect(lmac->phydev);
 
lmac->phydev = NULL;
-- 
2.4.6

--
To unsubscribe from this list: send the line "unsubscribe netdev" in
the body of a message to majord...@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html


[PATCH net 01/11] net: thunderx: Fix data integrity issues with LDWB

2015-07-29 Thread Aleksey Makarov
From: Sunil Goutham 

Switching back to LDD transactions from LDWB.

While transmitting packets out with LDWB transactions
data integrity issues are seen very frequently.
hence switching back to LDD.

Signed-off-by: Sunil Goutham 
Signed-off-by: Robert Richter 
Signed-off-by: Aleksey Makarov 
---
 drivers/net/ethernet/cavium/thunder/nicvf_queues.c | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/drivers/net/ethernet/cavium/thunder/nicvf_queues.c 
b/drivers/net/ethernet/cavium/thunder/nicvf_queues.c
index d69d228..4dae6aa 100644
--- a/drivers/net/ethernet/cavium/thunder/nicvf_queues.c
+++ b/drivers/net/ethernet/cavium/thunder/nicvf_queues.c
@@ -992,7 +992,7 @@ static inline void nicvf_sq_add_gather_subdesc(struct 
snd_queue *sq, int qentry,
 
memset(gather, 0, SND_QUEUE_DESC_SIZE);
gather->subdesc_type = SQ_DESC_TYPE_GATHER;
-   gather->ld_type = NIC_SEND_LD_TYPE_E_LDWB;
+   gather->ld_type = NIC_SEND_LD_TYPE_E_LDD;
gather->size = size;
gather->addr = data;
 }
-- 
2.4.6

--
To unsubscribe from this list: send the line "unsubscribe netdev" in
the body of a message to majord...@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html


[PATCH net 03/11] net: thunderx: Fix RQ_DROP miscalculation

2015-07-29 Thread Aleksey Makarov
From: Sunil Goutham 

With earlier configured value sufficient number of CQEs are not
being reserved for transmitted packets. Hence under heavy incoming
traffic load, receive notifications will take away most of the CQ
thus transmit notifications will be lost resulting in tx skbs not
being freed.

Finally SQ will be full and it will be stopped, watchdog timer
will kick in. After this fix receive notifications will not take
morethan half of CQ reserving the rest for transmit notifications.

Also changed CQ & SQ sizes from 16k to 4k.
This is also due to the receive notifications taking first half of
CQ under heavy load and time taken by NAPI to clear transmit notifications
will increase with higher queue sizes. Again results in SQ being stopped.

Signed-off-by: Sunil Goutham 
Signed-off-by: Aleksey Makarov 
---
 drivers/net/ethernet/cavium/thunder/nicvf_queues.h | 14 +++---
 1 file changed, 11 insertions(+), 3 deletions(-)

diff --git a/drivers/net/ethernet/cavium/thunder/nicvf_queues.h 
b/drivers/net/ethernet/cavium/thunder/nicvf_queues.h
index 8341bdf..f0937b7 100644
--- a/drivers/net/ethernet/cavium/thunder/nicvf_queues.h
+++ b/drivers/net/ethernet/cavium/thunder/nicvf_queues.h
@@ -62,7 +62,7 @@
 #define SND_QUEUE_CNT  8
 #define CMP_QUEUE_CNT  8 /* Max of RCV and SND qcount */
 
-#define SND_QSIZE  SND_QUEUE_SIZE4
+#define SND_QSIZE  SND_QUEUE_SIZE2
 #define SND_QUEUE_LEN  (1ULL << (SND_QSIZE + 10))
 #define MAX_SND_QUEUE_LEN  (1ULL << (SND_QUEUE_SIZE6 + 10))
 #define SND_QUEUE_THRESH   2ULL
@@ -70,7 +70,10 @@
 /* Since timestamp not enabled, otherwise 2 */
 #define MAX_CQE_PER_PKT_XMIT   1
 
-#define CMP_QSIZE  CMP_QUEUE_SIZE4
+/* Keep CQ and SQ sizes same, if timestamping
+ * is enabled this equation will change.
+ */
+#define CMP_QSIZE  CMP_QUEUE_SIZE2
 #define CMP_QUEUE_LEN  (1ULL << (CMP_QSIZE + 10))
 #define CMP_QUEUE_CQE_THRESH   0
 #define CMP_QUEUE_TIMER_THRESH 220 /* 10usec */
@@ -87,7 +90,12 @@
 
 #define MAX_CQES_FOR_TX((SND_QUEUE_LEN / 
MIN_SQ_DESC_PER_PKT_XMIT) * \
 MAX_CQE_PER_PKT_XMIT)
-#define RQ_CQ_DROP ((CMP_QUEUE_LEN - MAX_CQES_FOR_TX) / 256)
+/* Calculate number of CQEs to reserve for all SQEs.
+ * Its 1/256th level of CQ size.
+ * '+ 1' to account for pipelining
+ */
+#define RQ_CQ_DROP ((256 / (CMP_QUEUE_LEN / \
+(CMP_QUEUE_LEN - MAX_CQES_FOR_TX))) + 1)
 
 /* Descriptor size in bytes */
 #define SND_QUEUE_DESC_SIZE16
-- 
2.4.6

--
To unsubscribe from this list: send the line "unsubscribe netdev" in
the body of a message to majord...@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html


[PATCH net 10/11] net: thunderx: Add PCI driver shutdown routine

2015-07-29 Thread Aleksey Makarov
From: Sunil Goutham 

Signed-off-by: Sunil Goutham 
Signed-off-by: Aleksey Makarov 
---
 drivers/net/ethernet/cavium/thunder/nicvf_main.c | 6 ++
 1 file changed, 6 insertions(+)

diff --git a/drivers/net/ethernet/cavium/thunder/nicvf_main.c 
b/drivers/net/ethernet/cavium/thunder/nicvf_main.c
index c7a29a3..3b90afb 100644
--- a/drivers/net/ethernet/cavium/thunder/nicvf_main.c
+++ b/drivers/net/ethernet/cavium/thunder/nicvf_main.c
@@ -1335,11 +1335,17 @@ static void nicvf_remove(struct pci_dev *pdev)
pci_disable_device(pdev);
 }
 
+static void nicvf_shutdown(struct pci_dev *pdev)
+{
+   nicvf_remove(pdev);
+}
+
 static struct pci_driver nicvf_driver = {
.name = DRV_NAME,
.id_table = nicvf_id_table,
.probe = nicvf_probe,
.remove = nicvf_remove,
+   .shutdown = nicvf_shutdown,
 };
 
 static int __init nicvf_init_module(void)
-- 
2.4.6

--
To unsubscribe from this list: send the line "unsubscribe netdev" in
the body of a message to majord...@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html


[PATCH net 08/11] net: thunderx: Set watchdog timeout value

2015-07-29 Thread Aleksey Makarov
From: Sunil Goutham 

If a txq (SQ) remains in stopped state after this timeout its
considered as stuck and interface is reinited.

Signed-off-by: Sunil Goutham 
Signed-off-by: Aleksey Makarov 
---
 drivers/net/ethernet/cavium/thunder/nic.h| 9 +
 drivers/net/ethernet/cavium/thunder/nicvf_main.c | 1 +
 2 files changed, 10 insertions(+)

diff --git a/drivers/net/ethernet/cavium/thunder/nic.h 
b/drivers/net/ethernet/cavium/thunder/nic.h
index a0be076..8aee250 100644
--- a/drivers/net/ethernet/cavium/thunder/nic.h
+++ b/drivers/net/ethernet/cavium/thunder/nic.h
@@ -125,6 +125,15 @@
  */
 #define NICPF_CLK_PER_INT_TICK 2
 
+/* Time to wait before we decide that a SQ is stuck.
+ *
+ * Since both pkt rx and tx notifications are done with same CQ,
+ * when packets are being received at very high rate (eg: L2 forwarding)
+ * then freeing transmitted skbs will be delayed and watchdog
+ * will kick in, resetting interface. Hence keeping this value high.
+ */
+#defineNICVF_TX_TIMEOUT(50 * HZ)
+
 struct nicvf_cq_poll {
u8  cq_idx; /* Completion queue index */
struct  napi_struct napi;
diff --git a/drivers/net/ethernet/cavium/thunder/nicvf_main.c 
b/drivers/net/ethernet/cavium/thunder/nicvf_main.c
index 422d46e..abee2d7 100644
--- a/drivers/net/ethernet/cavium/thunder/nicvf_main.c
+++ b/drivers/net/ethernet/cavium/thunder/nicvf_main.c
@@ -1293,6 +1293,7 @@ static int nicvf_probe(struct pci_dev *pdev, const struct 
pci_device_id *ent)
netdev->hw_features = netdev->features;
 
netdev->netdev_ops = &nicvf_netdev_ops;
+   netdev->watchdog_timeo = NICVF_TX_TIMEOUT;
 
INIT_WORK(&nic->reset_task, nicvf_reset_task);
 
-- 
2.4.6

--
To unsubscribe from this list: send the line "unsubscribe netdev" in
the body of a message to majord...@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html


[PATCH 01/10] net: thunderx: Cleanup duplicate NODE_ID macros, add nic_get_node_id()

2015-06-02 Thread Aleksey Makarov
From: Robert Richter 

There are duplicate NODE_ID macro definitions. Move all of them to
nic.h for usage in nic and bgx driver and introduce nic_get_node_id()
helper function.

This patch also fixes 64bit mask which should have been ULL by
reworking the node calculation.

Signed-off-by: Robert Richter 
---
 drivers/net/ethernet/cavium/thunder/nic.h | 10 ++
 drivers/net/ethernet/cavium/thunder/nic_main.c|  4 +---
 drivers/net/ethernet/cavium/thunder/thunder_bgx.c |  4 ++--
 drivers/net/ethernet/cavium/thunder/thunder_bgx.h |  3 ---
 4 files changed, 13 insertions(+), 8 deletions(-)

diff --git a/drivers/net/ethernet/cavium/thunder/nic.h 
b/drivers/net/ethernet/cavium/thunder/nic.h
index 9b0be52..4f426db 100644
--- a/drivers/net/ethernet/cavium/thunder/nic.h
+++ b/drivers/net/ethernet/cavium/thunder/nic.h
@@ -11,6 +11,7 @@
 
 #include 
 #include 
+#include 
 #include "thunder_bgx.h"
 
 /* PCI device IDs */
@@ -398,6 +399,15 @@ union nic_mbx {
struct bgx_link_status  link_status;
 };
 
+#define NIC_NODE_ID_MASK   0x03
+#define NIC_NODE_ID_SHIFT  44
+
+static inline int nic_get_node_id(struct pci_dev *pdev)
+{
+   u64 addr = pci_resource_start(pdev, PCI_CFG_REG_BAR_NUM);
+   return ((addr >> NIC_NODE_ID_SHIFT) & NIC_NODE_ID_MASK);
+}
+
 int nicvf_set_real_num_queues(struct net_device *netdev,
  int tx_queues, int rx_queues);
 int nicvf_open(struct net_device *netdev);
diff --git a/drivers/net/ethernet/cavium/thunder/nic_main.c 
b/drivers/net/ethernet/cavium/thunder/nic_main.c
index 0f1f58b..3ca7ad8 100644
--- a/drivers/net/ethernet/cavium/thunder/nic_main.c
+++ b/drivers/net/ethernet/cavium/thunder/nic_main.c
@@ -23,8 +23,6 @@
 struct nicpf {
struct pci_dev  *pdev;
u8  rev_id;
-#define NIC_NODE_ID_MASK   0x3000
-#define NIC_NODE_ID(x) ((x & NODE_ID_MASK) >> 44)
u8  node;
unsigned intflags;
u8  num_vf_en;  /* No of VF enabled */
@@ -851,7 +849,7 @@ static int nic_probe(struct pci_dev *pdev, const struct 
pci_device_id *ent)
 
pci_read_config_byte(pdev, PCI_REVISION_ID, &nic->rev_id);
 
-   nic->node = NIC_NODE_ID(pci_resource_start(pdev, PCI_CFG_REG_BAR_NUM));
+   nic->node = nic_get_node_id(pdev);
 
nic_set_lmac_vf_mapping(nic);
 
diff --git a/drivers/net/ethernet/cavium/thunder/thunder_bgx.c 
b/drivers/net/ethernet/cavium/thunder/thunder_bgx.c
index 020e11c..cde604a 100644
--- a/drivers/net/ethernet/cavium/thunder/thunder_bgx.c
+++ b/drivers/net/ethernet/cavium/thunder/thunder_bgx.c
@@ -894,8 +894,8 @@ static int bgx_probe(struct pci_dev *pdev, const struct 
pci_device_id *ent)
goto err_release_regions;
}
bgx->bgx_id = (pci_resource_start(pdev, PCI_CFG_REG_BAR_NUM) >> 24) & 1;
-   bgx->bgx_id += NODE_ID(pci_resource_start(pdev, PCI_CFG_REG_BAR_NUM))
-   * MAX_BGX_PER_CN88XX;
+   bgx->bgx_id += nic_get_node_id(pdev) * MAX_BGX_PER_CN88XX;
+
bgx_vnic[bgx->bgx_id] = bgx;
bgx_get_qlm_mode(bgx);
 
diff --git a/drivers/net/ethernet/cavium/thunder/thunder_bgx.h 
b/drivers/net/ethernet/cavium/thunder/thunder_bgx.h
index 9d91ce4..f9e2170 100644
--- a/drivers/net/ethernet/cavium/thunder/thunder_bgx.h
+++ b/drivers/net/ethernet/cavium/thunder/thunder_bgx.h
@@ -20,9 +20,6 @@
 
 #defineMAX_LMAC(MAX_BGX_PER_CN88XX * MAX_LMAC_PER_BGX)
 
-#defineNODE_ID_MASK0x3000
-#defineNODE_ID(x)  ((x & NODE_ID_MASK) >> 44)
-
 /* Registers */
 #define BGX_CMRX_CFG   0x00
 #define  CMR_PKT_TX_EN BIT_ULL(13)
-- 
2.4.1

--
To unsubscribe from this list: send the line "unsubscribe netdev" in
the body of a message to majord...@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html


[PATCH 02/10] net: thunderx: fix constants

2015-06-02 Thread Aleksey Makarov
This fixes sparse messages like this:

drivers/net/ethernet/cavium/thunder/thunder_bgx.c:897:24: sparse:
constant 0x3000 is so big it is long

Reported-by: kbuild test robot 
Signed-off-by: Aleksey Makarov 
---
 drivers/net/ethernet/cavium/thunder/nicvf_main.c | 10 +-
 1 file changed, 5 insertions(+), 5 deletions(-)

diff --git a/drivers/net/ethernet/cavium/thunder/nicvf_main.c 
b/drivers/net/ethernet/cavium/thunder/nicvf_main.c
index abd446e6..f81182c 100644
--- a/drivers/net/ethernet/cavium/thunder/nicvf_main.c
+++ b/drivers/net/ethernet/cavium/thunder/nicvf_main.c
@@ -326,11 +326,11 @@ static int nicvf_rss_init(struct nicvf *nic)
rss->enable = true;
 
/* Using the HW reset value for now */
-   rss->key[0] = 0xFEED0BADFEED0BAD;
-   rss->key[1] = 0xFEED0BADFEED0BAD;
-   rss->key[2] = 0xFEED0BADFEED0BAD;
-   rss->key[3] = 0xFEED0BADFEED0BAD;
-   rss->key[4] = 0xFEED0BADFEED0BAD;
+   rss->key[0] = 0xFEED0BADFEED0BADULL;
+   rss->key[1] = 0xFEED0BADFEED0BADULL;
+   rss->key[2] = 0xFEED0BADFEED0BADULL;
+   rss->key[3] = 0xFEED0BADFEED0BADULL;
+   rss->key[4] = 0xFEED0BADFEED0BADULL;
 
nicvf_set_rss_key(nic);
 
-- 
2.4.1

--
To unsubscribe from this list: send the line "unsubscribe netdev" in
the body of a message to majord...@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html


[PATCH 06/10] net: thunderx: add static

2015-06-02 Thread Aleksey Makarov
This fixes sparse messages like this:

drivers/net/ethernet/cavium/thunder/nicvf_main.c:1141:26: sparse: symbol
'nicvf_get_stats64' was not declared. Should it be static?

Also remove unused declarations

Reported-by: kbuild test robot 
Signed-off-by: Aleksey Makarov 
---
 drivers/net/ethernet/cavium/thunder/nic.h  |  2 --
 drivers/net/ethernet/cavium/thunder/nicvf_main.c   | 28 ++
 drivers/net/ethernet/cavium/thunder/nicvf_queues.c |  2 +-
 drivers/net/ethernet/cavium/thunder/thunder_bgx.c  |  6 ++---
 4 files changed, 16 insertions(+), 22 deletions(-)

diff --git a/drivers/net/ethernet/cavium/thunder/nic.h 
b/drivers/net/ethernet/cavium/thunder/nic.h
index 6479ce2..a3b43e5 100644
--- a/drivers/net/ethernet/cavium/thunder/nic.h
+++ b/drivers/net/ethernet/cavium/thunder/nic.h
@@ -413,10 +413,8 @@ int nicvf_set_real_num_queues(struct net_device *netdev,
 int nicvf_open(struct net_device *netdev);
 int nicvf_stop(struct net_device *netdev);
 int nicvf_send_msg_to_pf(struct nicvf *vf, union nic_mbx *mbx);
-void nicvf_config_cpi(struct nicvf *nic);
 void nicvf_config_rss(struct nicvf *nic);
 void nicvf_set_rss_key(struct nicvf *nic);
-void nicvf_free_skb(struct nicvf *nic, struct sk_buff *skb);
 void nicvf_set_ethtool_ops(struct net_device *netdev);
 void nicvf_update_stats(struct nicvf *nic);
 void nicvf_update_lmac_stats(struct nicvf *nic);
diff --git a/drivers/net/ethernet/cavium/thunder/nicvf_main.c 
b/drivers/net/ethernet/cavium/thunder/nicvf_main.c
index 54bba86..02da802 100644
--- a/drivers/net/ethernet/cavium/thunder/nicvf_main.c
+++ b/drivers/net/ethernet/cavium/thunder/nicvf_main.c
@@ -50,10 +50,6 @@ module_param(cpi_alg, int, S_IRUGO);
 MODULE_PARM_DESC(cpi_alg,
 "PFC algorithm (0=none, 1=VLAN, 2=VLAN16, 3=IP Diffserv)");
 
-static int nicvf_enable_msix(struct nicvf *nic);
-static netdev_tx_t nicvf_xmit(struct sk_buff *skb, struct net_device *netdev);
-static void nicvf_read_bgx_stats(struct nicvf *nic, struct bgx_stats_msg *bgx);
-
 static inline void nicvf_set_rx_frame_cnt(struct nicvf *nic,
  struct sk_buff *skb)
 {
@@ -174,6 +170,14 @@ static int nicvf_check_pf_ready(struct nicvf *nic)
return 1;
 }
 
+static void nicvf_read_bgx_stats(struct nicvf *nic, struct bgx_stats_msg *bgx)
+{
+   if (bgx->rx)
+   nic->bgx_stats.rx_stats[bgx->idx] = bgx->stats;
+   else
+   nic->bgx_stats.tx_stats[bgx->idx] = bgx->stats;
+}
+
 static void  nicvf_handle_mbx_intr(struct nicvf *nic)
 {
union nic_mbx mbx = {};
@@ -255,7 +259,7 @@ static int nicvf_hw_set_mac_addr(struct nicvf *nic, struct 
net_device *netdev)
return nicvf_send_msg_to_pf(nic, &mbx);
 }
 
-void nicvf_config_cpi(struct nicvf *nic)
+static void nicvf_config_cpi(struct nicvf *nic)
 {
union nic_mbx mbx = {};
 
@@ -267,7 +271,7 @@ void nicvf_config_cpi(struct nicvf *nic)
nicvf_send_msg_to_pf(nic, &mbx);
 }
 
-void nicvf_get_rss_size(struct nicvf *nic)
+static void nicvf_get_rss_size(struct nicvf *nic)
 {
union nic_mbx mbx = {};
 
@@ -575,7 +579,7 @@ static int nicvf_poll(struct napi_struct *napi, int budget)
  *
  * As of now only CQ errors are handled
  */
-void nicvf_handle_qs_err(unsigned long data)
+static void nicvf_handle_qs_err(unsigned long data)
 {
struct nicvf *nic = (struct nicvf *)data;
struct queue_set *qs = nic->qs;
@@ -1043,14 +1047,6 @@ static int nicvf_set_mac_address(struct net_device 
*netdev, void *p)
return 0;
 }
 
-static void nicvf_read_bgx_stats(struct nicvf *nic, struct bgx_stats_msg *bgx)
-{
-   if (bgx->rx)
-   nic->bgx_stats.rx_stats[bgx->idx] = bgx->stats;
-   else
-   nic->bgx_stats.tx_stats[bgx->idx] = bgx->stats;
-}
-
 void nicvf_update_lmac_stats(struct nicvf *nic)
 {
int stat = 0;
@@ -1141,7 +1137,7 @@ void nicvf_update_stats(struct nicvf *nic)
nicvf_update_sq_stats(nic, qidx);
 }
 
-struct rtnl_link_stats64 *nicvf_get_stats64(struct net_device *netdev,
+static struct rtnl_link_stats64 *nicvf_get_stats64(struct net_device *netdev,
struct rtnl_link_stats64 *stats)
 {
struct nicvf *nic = netdev_priv(netdev);
diff --git a/drivers/net/ethernet/cavium/thunder/nicvf_queues.c 
b/drivers/net/ethernet/cavium/thunder/nicvf_queues.c
index 1962466..7f0e108 100644
--- a/drivers/net/ethernet/cavium/thunder/nicvf_queues.c
+++ b/drivers/net/ethernet/cavium/thunder/nicvf_queues.c
@@ -228,7 +228,7 @@ static void nicvf_free_rbdr(struct nicvf *nic, struct rbdr 
*rbdr)
 
 /* Refill receive buffer descriptors with new buffers.
  */
-void nicvf_refill_rbdr(struct nicvf *nic, gfp_t gfp)
+static void nicvf_refill_rbdr(struct nicvf *nic, gfp_t gfp)
 {
struct queue_set *qs = nic->qs;
int rbdr_idx = qs->rbdr_cnt;
diff --git a/drivers/net/ethernet/cavium/t

[PATCH 09/10] net: thunderx: check if memory allocation was successful

2015-06-02 Thread Aleksey Makarov
This fixes a coccinelle warning:

coccinelle warnings: (new ones prefixed by >>)

>> drivers/net/ethernet/cavium/thunder/nicvf_queues.c:360:1-11: alloc
>> with no test, possible model on line 367

vim +360 drivers/net/ethernet/cavium/thunder/nicvf_queues.c

   354  err = nicvf_alloc_q_desc_mem(nic, &sq->dmem, q_len,
SND_QUEUE_DESC_SIZE,
   355   NICVF_SQ_BASE_ALIGN_BYTES);
   356  if (err)
   357  return err;
   358
   359  sq->desc = sq->dmem.base;
 > 360  sq->skbuff = kcalloc(q_len, sizeof(u64), GFP_ATOMIC);
   361  sq->head = 0;
   362  sq->tail = 0;
   363  atomic_set(&sq->free_cnt, q_len - 1);
   364  sq->thresh = SND_QUEUE_THRESH;
   365
   366  /* Preallocate memory for TSO segment's header */
 > 367  sq->tso_hdrs = dma_alloc_coherent(&nic->pdev->dev,
   368q_len *
TSO_HEADER_SIZE,
   369&sq->tso_hdrs_phys,
GFP_KERNEL);
   370      if (!sq->tso_hdrs)

Reported-by: kbuild test robot 
Signed-off-by: Aleksey Makarov 
---
 drivers/net/ethernet/cavium/thunder/nicvf_queues.c | 2 ++
 1 file changed, 2 insertions(+)

diff --git a/drivers/net/ethernet/cavium/thunder/nicvf_queues.c 
b/drivers/net/ethernet/cavium/thunder/nicvf_queues.c
index 8929029..2ed7d1b 100644
--- a/drivers/net/ethernet/cavium/thunder/nicvf_queues.c
+++ b/drivers/net/ethernet/cavium/thunder/nicvf_queues.c
@@ -357,6 +357,8 @@ static int nicvf_init_snd_queue(struct nicvf *nic,
 
sq->desc = sq->dmem.base;
sq->skbuff = kcalloc(q_len, sizeof(u64), GFP_ATOMIC);
+   if (!sq->skbuff)
+   return -ENOMEM;
sq->head = 0;
sq->tail = 0;
atomic_set(&sq->free_cnt, q_len - 1);
-- 
2.4.1

--
To unsubscribe from this list: send the line "unsubscribe netdev" in
the body of a message to majord...@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html


[PATCH 10/10] net: thunderx: use GFP_KERNEL in thread context

2015-06-02 Thread Aleksey Makarov
GFP_KERNEL should be used in the thread context

Signed-off-by: Aleksey Makarov 
---
 drivers/net/ethernet/cavium/thunder/nicvf_queues.c | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/drivers/net/ethernet/cavium/thunder/nicvf_queues.c 
b/drivers/net/ethernet/cavium/thunder/nicvf_queues.c
index 2ed7d1b..d69d228 100644
--- a/drivers/net/ethernet/cavium/thunder/nicvf_queues.c
+++ b/drivers/net/ethernet/cavium/thunder/nicvf_queues.c
@@ -356,7 +356,7 @@ static int nicvf_init_snd_queue(struct nicvf *nic,
return err;
 
sq->desc = sq->dmem.base;
-   sq->skbuff = kcalloc(q_len, sizeof(u64), GFP_ATOMIC);
+   sq->skbuff = kcalloc(q_len, sizeof(u64), GFP_KERNEL);
if (!sq->skbuff)
return -ENOMEM;
sq->head = 0;
-- 
2.4.1

--
To unsubscribe from this list: send the line "unsubscribe netdev" in
the body of a message to majord...@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html


[PATCH 08/10] net: thunderx: remove unneeded type conversions

2015-06-02 Thread Aleksey Makarov
No need to cast void* to u8*: pointer arithmetics
works same way for both.

Signed-off-by: Aleksey Makarov 
---
 drivers/net/ethernet/cavium/thunder/nicvf_queues.c | 3 +--
 1 file changed, 1 insertion(+), 2 deletions(-)

diff --git a/drivers/net/ethernet/cavium/thunder/nicvf_queues.c 
b/drivers/net/ethernet/cavium/thunder/nicvf_queues.c
index 7f0e108..8929029 100644
--- a/drivers/net/ethernet/cavium/thunder/nicvf_queues.c
+++ b/drivers/net/ethernet/cavium/thunder/nicvf_queues.c
@@ -62,8 +62,7 @@ static int nicvf_alloc_q_desc_mem(struct nicvf *nic, struct 
q_desc_mem *dmem,
 
/* Align memory address for 'align_bytes' */
dmem->phys_base = NICVF_ALIGNED_ADDR((u64)dmem->dma, align_bytes);
-   dmem->base = (void *)((u8 *)dmem->unalign_base +
- (dmem->phys_base - dmem->dma));
+   dmem->base = dmem->unalign_base + (dmem->phys_base - dmem->dma);
return 0;
 }
 
-- 
2.4.1

--
To unsubscribe from this list: send the line "unsubscribe netdev" in
the body of a message to majord...@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html


[PATCH 05/10] net: thunderx: delete unused variables

2015-06-02 Thread Aleksey Makarov
They were left from development stage

Reported-by: kbuild test robot 
Signed-off-by: Aleksey Makarov 
---
 drivers/net/ethernet/cavium/thunder/thunder_bgx.c | 4 ++--
 1 file changed, 2 insertions(+), 2 deletions(-)

diff --git a/drivers/net/ethernet/cavium/thunder/thunder_bgx.c 
b/drivers/net/ethernet/cavium/thunder/thunder_bgx.c
index a58924c..83476f0 100644
--- a/drivers/net/ethernet/cavium/thunder/thunder_bgx.c
+++ b/drivers/net/ethernet/cavium/thunder/thunder_bgx.c
@@ -38,7 +38,7 @@ struct lmac {
boolis_sgmii;
struct delayed_work dwork;
struct workqueue_struct *check_link;
-} lmac;
+};
 
 struct bgx {
u8  bgx_id;
@@ -50,7 +50,7 @@ struct bgx {
int use_training;
void __iomem*reg_base;
struct pci_dev  *pdev;
-} bgx;
+};
 
 struct bgx *bgx_vnic[MAX_BGX_THUNDER];
 static int lmac_count; /* Total no of LMACs in system */
-- 
2.4.1

--
To unsubscribe from this list: send the line "unsubscribe netdev" in
the body of a message to majord...@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html


[PATCH 04/10] net: thunderx: rework mac address handling

2015-06-02 Thread Aleksey Makarov
This fixes sparse message:

drivers/net/ethernet/cavium/thunder/nicvf_main.c:385:40: sparse: cast to
restricted __le64

Reported-by: kbuild test robot 
Signed-off-by: Aleksey Makarov 
---
 drivers/net/ethernet/cavium/thunder/nic.h | 4 ++--
 drivers/net/ethernet/cavium/thunder/nic_main.c| 8 +---
 drivers/net/ethernet/cavium/thunder/nicvf_main.c  | 8 ++--
 drivers/net/ethernet/cavium/thunder/thunder_bgx.c | 4 ++--
 drivers/net/ethernet/cavium/thunder/thunder_bgx.h | 4 ++--
 5 files changed, 9 insertions(+), 19 deletions(-)

diff --git a/drivers/net/ethernet/cavium/thunder/nic.h 
b/drivers/net/ethernet/cavium/thunder/nic.h
index 4f426db..6479ce2 100644
--- a/drivers/net/ethernet/cavium/thunder/nic.h
+++ b/drivers/net/ethernet/cavium/thunder/nic.h
@@ -301,7 +301,7 @@ struct nic_cfg_msg {
u8vf_id;
u8tns_mode;
u8node_id;
-   u64   mac_addr;
+   u8mac_addr[ETH_ALEN];
 };
 
 /* Qset configuration */
@@ -331,7 +331,7 @@ struct sq_cfg_msg {
 struct set_mac_msg {
u8msg;
u8vf_id;
-   u64   addr;
+   u8mac_addr[ETH_ALEN];
 };
 
 /* Set Maximum frame size */
diff --git a/drivers/net/ethernet/cavium/thunder/nic_main.c 
b/drivers/net/ethernet/cavium/thunder/nic_main.c
index 3ca7ad8..6e0c031 100644
--- a/drivers/net/ethernet/cavium/thunder/nic_main.c
+++ b/drivers/net/ethernet/cavium/thunder/nic_main.c
@@ -492,7 +492,6 @@ static void nic_handle_mbx_intr(struct nicpf *nic, int vf)
u64 *mbx_data;
u64 mbx_addr;
u64 reg_addr;
-   u64 mac_addr;
int bgx, lmac;
int i;
int ret = 0;
@@ -555,12 +554,7 @@ static void nic_handle_mbx_intr(struct nicpf *nic, int vf)
lmac = mbx.mac.vf_id;
bgx = NIC_GET_BGX_FROM_VF_LMAC_MAP(nic->vf_lmac_map[lmac]);
lmac = NIC_GET_LMAC_FROM_VF_LMAC_MAP(nic->vf_lmac_map[lmac]);
-#ifdef __BIG_ENDIAN
-   mac_addr = cpu_to_be64(mbx.nic_cfg.mac_addr) << 16;
-#else
-   mac_addr = cpu_to_be64(mbx.nic_cfg.mac_addr) >> 16;
-#endif
-   bgx_set_lmac_mac(nic->node, bgx, lmac, (u8 *)&mac_addr);
+   bgx_set_lmac_mac(nic->node, bgx, lmac, mbx.mac.mac_addr);
break;
case NIC_MBOX_MSG_SET_MAX_FRS:
ret = nic_update_hw_frs(nic, mbx.frs.max_frs,
diff --git a/drivers/net/ethernet/cavium/thunder/nicvf_main.c 
b/drivers/net/ethernet/cavium/thunder/nicvf_main.c
index 989f005..54bba86 100644
--- a/drivers/net/ethernet/cavium/thunder/nicvf_main.c
+++ b/drivers/net/ethernet/cavium/thunder/nicvf_main.c
@@ -197,8 +197,7 @@ static void  nicvf_handle_mbx_intr(struct nicvf *nic)
nic->vf_id = mbx.nic_cfg.vf_id & 0x7F;
nic->tns_mode = mbx.nic_cfg.tns_mode & 0x7F;
nic->node = mbx.nic_cfg.node_id;
-   ether_addr_copy(nic->netdev->dev_addr,
-   (u8 *)&mbx.nic_cfg.mac_addr);
+   ether_addr_copy(nic->netdev->dev_addr, mbx.nic_cfg.mac_addr);
nic->link_up = false;
nic->duplex = 0;
nic->speed = 0;
@@ -248,13 +247,10 @@ static void  nicvf_handle_mbx_intr(struct nicvf *nic)
 static int nicvf_hw_set_mac_addr(struct nicvf *nic, struct net_device *netdev)
 {
union nic_mbx mbx = {};
-   int i;
 
mbx.mac.msg = NIC_MBOX_MSG_SET_MAC;
mbx.mac.vf_id = nic->vf_id;
-   for (i = 0; i < ETH_ALEN; i++)
-   mbx.mac.addr = (mbx.mac.addr << 8) |
-netdev->dev_addr[i];
+   ether_addr_copy(mbx.mac.mac_addr, netdev->dev_addr);
 
return nicvf_send_msg_to_pf(nic, &mbx);
 }
diff --git a/drivers/net/ethernet/cavium/thunder/thunder_bgx.c 
b/drivers/net/ethernet/cavium/thunder/thunder_bgx.c
index cde604a..a58924c 100644
--- a/drivers/net/ethernet/cavium/thunder/thunder_bgx.c
+++ b/drivers/net/ethernet/cavium/thunder/thunder_bgx.c
@@ -163,7 +163,7 @@ void bgx_get_lmac_link_state(int node, int bgx_idx, int 
lmacid, void *status)
 }
 EXPORT_SYMBOL(bgx_get_lmac_link_state);
 
-const char *bgx_get_lmac_mac(int node, int bgx_idx, int lmacid)
+const u8 *bgx_get_lmac_mac(int node, int bgx_idx, int lmacid)
 {
struct bgx *bgx = bgx_vnic[(node * MAX_BGX_PER_CN88XX) + bgx_idx];
 
@@ -174,7 +174,7 @@ const char *bgx_get_lmac_mac(int node, int bgx_idx, int 
lmacid)
 }
 EXPORT_SYMBOL(bgx_get_lmac_mac);
 
-void bgx_set_lmac_mac(int node, int bgx_idx, int lmacid, const char *mac)
+void bgx_set_lmac_mac(int node, int bgx_idx, int lmacid, const u8 *mac)
 {
struct bgx *bgx = bgx_vnic[(node * MAX_BGX_PER_CN88XX) + bgx_idx];
 
diff --git a/drivers/net/ethernet/cavium/thunder/thunder_bgx.h 
b/drivers/net/ethernet/cavium/thunder/thunder_bgx.h
index f9e2170..ba4f53b 100644
--- a/drivers/net/ethernet/cavium/thunder/thunder_bgx.h
+++ b/drivers/net/ethernet/cavium/thunder/th

[PATCH 07/10] net: thunderx: fix nicvf_set_rxfh()

2015-06-02 Thread Aleksey Makarov
This fixes a copypaste bug that was discovered by a static analysis
tool:

The patch 4863dea3fab0: "net: Adding support for Cavium ThunderX
network controller" from May 26, 2015, leads to the following static
checker warning:

drivers/net/ethernet/cavium/thunder/nicvf_ethtool.c:517
nicvf_set_rxfh()
warn: we tested 'hkey' before and it was 'false'

drivers/net/ethernet/cavium/thunder/nicvf_ethtool.c
   506  /* We do not allow change in unsupported parameters */
   507  if (hkey ||

We return here.

   508  (hfunc != ETH_RSS_HASH_NO_CHANGE && hfunc !=
ETH_RSS_HASH_TOP))
   509  return -EOPNOTSUPP;
   510
   511  rss->enable = true;
   512  if (indir) {
   513  for (idx = 0; idx < rss->rss_size; idx++)
   514  rss->ind_tbl[idx] = indir[idx];
   515  }
   516
   517  if (hkey) {

So this is dead code.

   518  memcpy(rss->key, hkey, RSS_HASH_KEY_SIZE *
sizeof(u64));
   519  nicvf_set_rss_key(nic);
   520  }
   521
   522  nicvf_config_rss(nic);
   523  return 0;
   524  }

regards,
dan carpenter

Reported-by: Dan Carpenter 
Signed-off-by: Aleksey Makarov 
---
 drivers/net/ethernet/cavium/thunder/nicvf_ethtool.c | 3 +--
 1 file changed, 1 insertion(+), 2 deletions(-)

diff --git a/drivers/net/ethernet/cavium/thunder/nicvf_ethtool.c 
b/drivers/net/ethernet/cavium/thunder/nicvf_ethtool.c
index 0fc4a53..16bd2d7 100644
--- a/drivers/net/ethernet/cavium/thunder/nicvf_ethtool.c
+++ b/drivers/net/ethernet/cavium/thunder/nicvf_ethtool.c
@@ -504,8 +504,7 @@ static int nicvf_set_rxfh(struct net_device *dev, const u32 
*indir,
}
 
/* We do not allow change in unsupported parameters */
-   if (hkey ||
-   (hfunc != ETH_RSS_HASH_NO_CHANGE && hfunc != ETH_RSS_HASH_TOP))
+   if (hfunc != ETH_RSS_HASH_NO_CHANGE && hfunc != ETH_RSS_HASH_TOP)
return -EOPNOTSUPP;
 
rss->enable = true;
-- 
2.4.1

--
To unsubscribe from this list: send the line "unsubscribe netdev" in
the body of a message to majord...@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html


[PATCH 03/10] net: thunderx: introduce a function for mailbox access

2015-06-02 Thread Aleksey Makarov
This fixes sparse message:

drivers/net/ethernet/cavium/thunder/nicvf_main.c:153:25: sparse: cast to
restricted __le64

Reported-by: kbuild test robot 
Signed-off-by: Aleksey Makarov 
---
 drivers/net/ethernet/cavium/thunder/nicvf_main.c | 27 +++-
 1 file changed, 17 insertions(+), 10 deletions(-)

diff --git a/drivers/net/ethernet/cavium/thunder/nicvf_main.c 
b/drivers/net/ethernet/cavium/thunder/nicvf_main.c
index f81182c..989f005 100644
--- a/drivers/net/ethernet/cavium/thunder/nicvf_main.c
+++ b/drivers/net/ethernet/cavium/thunder/nicvf_main.c
@@ -110,17 +110,23 @@ u64 nicvf_queue_reg_read(struct nicvf *nic, u64 offset, 
u64 qidx)
 
 /* VF -> PF mailbox communication */
 
+static void nicvf_write_to_mbx(struct nicvf *nic, union nic_mbx *mbx)
+{
+   u64 *msg = (u64 *)mbx;
+
+   nicvf_reg_write(nic, NIC_VF_PF_MAILBOX_0_1 + 0, msg[0]);
+   nicvf_reg_write(nic, NIC_VF_PF_MAILBOX_0_1 + 8, msg[1]);
+}
+
 int nicvf_send_msg_to_pf(struct nicvf *nic, union nic_mbx *mbx)
 {
int timeout = NIC_MBOX_MSG_TIMEOUT;
int sleep = 10;
-   u64 *msg = (u64 *)mbx;
 
nic->pf_acked = false;
nic->pf_nacked = false;
 
-   nicvf_reg_write(nic, NIC_VF_PF_MAILBOX_0_1 + 0, msg[0]);
-   nicvf_reg_write(nic, NIC_VF_PF_MAILBOX_0_1 + 8, msg[1]);
+   nicvf_write_to_mbx(nic, mbx);
 
/* Wait for previous message to be acked, timeout 2sec */
while (!nic->pf_acked) {
@@ -146,12 +152,13 @@ int nicvf_send_msg_to_pf(struct nicvf *nic, union nic_mbx 
*mbx)
 static int nicvf_check_pf_ready(struct nicvf *nic)
 {
int timeout = 5000, sleep = 20;
+   union nic_mbx mbx = {};
+
+   mbx.msg.msg = NIC_MBOX_MSG_READY;
 
nic->pf_ready_to_rcv_msg = false;
 
-   nicvf_reg_write(nic, NIC_VF_PF_MAILBOX_0_1 + 0,
-   le64_to_cpu(NIC_MBOX_MSG_READY));
-   nicvf_reg_write(nic, NIC_VF_PF_MAILBOX_0_1 + 8, 1ULL);
+   nicvf_write_to_mbx(nic, &mbx);
 
while (!nic->pf_ready_to_rcv_msg) {
msleep(sleep);
@@ -368,7 +375,9 @@ int nicvf_set_real_num_queues(struct net_device *netdev,
 static int nicvf_init_resources(struct nicvf *nic)
 {
int err;
-   u64 mbx_addr = NIC_VF_PF_MAILBOX_0_1;
+   union nic_mbx mbx = {};
+
+   mbx.msg.msg = NIC_MBOX_MSG_CFG_DONE;
 
/* Enable Qset */
nicvf_qset_config(nic, true);
@@ -382,9 +391,7 @@ static int nicvf_init_resources(struct nicvf *nic)
}
 
/* Send VF config done msg to PF */
-   nicvf_reg_write(nic, mbx_addr, le64_to_cpu(NIC_MBOX_MSG_CFG_DONE));
-   mbx_addr += (NIC_PF_VF_MAILBOX_SIZE - 1) * 8;
-   nicvf_reg_write(nic, mbx_addr, 1ULL);
+   nicvf_write_to_mbx(nic, &mbx);
 
return 0;
 }
-- 
2.4.1

--
To unsubscribe from this list: send the line "unsubscribe netdev" in
the body of a message to majord...@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html


[PATCH 00/10] net: thunderx: fix problems reported by static check tools

2015-06-02 Thread Aleksey Makarov
These are fixes for the problems that were reported by static check tools.

Aleksey Makarov (9):
  net: thunderx: fix constants
  net: thunderx: introduce a function for mailbox access
  net: thunderx: rework mac address handling
  net: thunderx: delete unused variables
  net: thunderx: add static
  net: thunderx: fix nicvf_set_rxfh()
  net: thunderx: remove unneeded type conversions
  net: thunderx: check if memory allocation was successful
  net: thunderx: use GFP_KERNEL in thread context

Robert Richter (1):
  net: thunderx: Cleanup duplicate NODE_ID macros, add nic_get_node_id()

 drivers/net/ethernet/cavium/thunder/nic.h  | 16 +++--
 drivers/net/ethernet/cavium/thunder/nic_main.c | 12 +---
 .../net/ethernet/cavium/thunder/nicvf_ethtool.c|  3 +-
 drivers/net/ethernet/cavium/thunder/nicvf_main.c   | 73 +++---
 drivers/net/ethernet/cavium/thunder/nicvf_queues.c |  9 +--
 drivers/net/ethernet/cavium/thunder/thunder_bgx.c  | 18 +++---
 drivers/net/ethernet/cavium/thunder/thunder_bgx.h  |  7 +--
 7 files changed, 67 insertions(+), 71 deletions(-)

-- 
2.4.1

--
To unsubscribe from this list: send the line "unsubscribe netdev" in
the body of a message to majord...@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html


[PATCH net-next v6 1/2] pci: Add Cavium PCI vendor id

2015-05-26 Thread Aleksey Makarov
From: Sunil Goutham 

This vendor id will be used by network (vNIC), USB (xHCI),
SATA (AHCI), GPIO, I2C, MMC and maybe other drivers
for ThunderX SoC.

Acked-by: Bjorn Helgaas 
Signed-off-by: Sunil Goutham 
Signed-off-by: Aleksey Makarov 
---
 include/linux/pci_ids.h | 2 ++
 1 file changed, 2 insertions(+)

diff --git a/include/linux/pci_ids.h b/include/linux/pci_ids.h
index 1fa99a3..80bd333 100644
--- a/include/linux/pci_ids.h
+++ b/include/linux/pci_ids.h
@@ -2324,6 +2324,8 @@
 #define PCI_DEVICE_ID_ALTIMA_AC91000x03ea
 #define PCI_DEVICE_ID_ALTIMA_AC10030x03eb
 
+#define PCI_VENDOR_ID_CAVIUM   0x177d
+
 #define PCI_VENDOR_ID_BELKIN   0x1799
 #define PCI_DEVICE_ID_BELKIN_F5D7010V7 0x701f
 
-- 
2.4.1

--
To unsubscribe from this list: send the line "unsubscribe netdev" in
the body of a message to majord...@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html


[PATCH net-next v6 0/2] Adding support for Cavium ThunderX network controller

2015-05-26 Thread Aleksey Makarov
This patchset adds support for the Cavium ThunderX network controller.

changes in v6:
 * unused preprocessor symbols were removed
 * reduce no of atomic operations in SQ maintenance
 * support for TCP segmentation at driver level
 * reset RBDR if fifo state is FAIL
 * fixed an issue with link state mailbox message

changes in v5:
 * __packed were removed.  now we rely on C language ABI
 * nic_dbg() -> netdev_dbg()
 * fixes for a typo, constant spelling and using BIT_ULL
 * use print_hex_dump()
 * unnecessary conditions in a long if() chain were removed

changes in v4:
 * the patch "pci: Add Cavium PCI vendor id" was attributed correctly
 * a note that Cavium id is used in many drivers was added
 * the license comments now match MODULE_LICENSE
 * a comment explaining usage of writeq_relaxed()/readq_relaxed() was added

changes in v3:
 * code cleanup
 * issues discovered by reviewers were addressed

changes in v2:
 * non-generic module parameters removed
 * ethtool support added (nicvf_set_rxnfc())

v5: 
https://lkml.kernel.org/g/<1432344498-17131-1-git-send-email-aleksey.maka...@caviumnetworks.com>
v4: 
https://lkml.kernel.org/g/<1432000757-28700-1-git-send-email-aleksey.maka...@auriga.com>
v3: 
https://lkml.kernel.org/g/<1431747401-20847-1-git-send-email-aleksey.maka...@auriga.com>
v2: 
https://lkml.kernel.org/g/<1415596445-10061-1-git-send-email-r...@kernel.org>
v1: https://lkml.kernel.org/g/<20141030165434.GW20170@rric.localhost>

Sunil Goutham (2):
  pci: Add Cavium PCI vendor id
  net: Adding support for Cavium ThunderX network controller

 MAINTAINERS|7 +
 drivers/net/ethernet/Kconfig   |1 +
 drivers/net/ethernet/Makefile  |1 +
 drivers/net/ethernet/cavium/Kconfig|   40 +
 drivers/net/ethernet/cavium/Makefile   |5 +
 drivers/net/ethernet/cavium/thunder/Makefile   |   11 +
 drivers/net/ethernet/cavium/thunder/nic.h  |  414 ++
 drivers/net/ethernet/cavium/thunder/nic_main.c |  940 
 drivers/net/ethernet/cavium/thunder/nic_reg.h  |  213 +++
 .../net/ethernet/cavium/thunder/nicvf_ethtool.c|  601 
 drivers/net/ethernet/cavium/thunder/nicvf_main.c   | 1332 +
 drivers/net/ethernet/cavium/thunder/nicvf_queues.c | 1544 
 drivers/net/ethernet/cavium/thunder/nicvf_queues.h |  381 +
 drivers/net/ethernet/cavium/thunder/q_struct.h |  701 +
 drivers/net/ethernet/cavium/thunder/thunder_bgx.c  |  966 
 drivers/net/ethernet/cavium/thunder/thunder_bgx.h  |  223 +++
 include/linux/pci_ids.h|2 +
 17 files changed, 7382 insertions(+)
 create mode 100644 drivers/net/ethernet/cavium/Kconfig
 create mode 100644 drivers/net/ethernet/cavium/Makefile
 create mode 100644 drivers/net/ethernet/cavium/thunder/Makefile
 create mode 100644 drivers/net/ethernet/cavium/thunder/nic.h
 create mode 100644 drivers/net/ethernet/cavium/thunder/nic_main.c
 create mode 100644 drivers/net/ethernet/cavium/thunder/nic_reg.h
 create mode 100644 drivers/net/ethernet/cavium/thunder/nicvf_ethtool.c
 create mode 100644 drivers/net/ethernet/cavium/thunder/nicvf_main.c
 create mode 100644 drivers/net/ethernet/cavium/thunder/nicvf_queues.c
 create mode 100644 drivers/net/ethernet/cavium/thunder/nicvf_queues.h
 create mode 100644 drivers/net/ethernet/cavium/thunder/q_struct.h
 create mode 100644 drivers/net/ethernet/cavium/thunder/thunder_bgx.c
 create mode 100644 drivers/net/ethernet/cavium/thunder/thunder_bgx.h

-- 
2.4.1

--
To unsubscribe from this list: send the line "unsubscribe netdev" in
the body of a message to majord...@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html


[PATCH net-next v5 0/2] Adding support for Cavium ThunderX network controller

2015-05-22 Thread Aleksey Makarov
This patchset adds support for the Cavium ThunderX network controller.

changes in v5:
 * __packed were removed.  now we rely on C language ABI
 * nic_dbg() -> netdev_dbg()
 * fixes for a typo, constant spelling and using BIT_ULL
 * use print_hex_dump()
 * unnecessary conditions in a long if() chain were removed

changes in v4:
 * the patch "pci: Add Cavium PCI vendor id" was attributed correctly
 * a note that Cavium id is used in many drivers was added
 * the license comments now match MODULE_LICENSE
 * a comment explaining usage of writeq_relaxed()/readq_relaxed() was added

changes in v3:
 * code cleanup
 * issues discovered by reviewers were addressed

changes in v2:
 * non-generic module parameters removed
 * ethtool support added (nicvf_set_rxnfc())

Sunil Goutham (2):
  pci: Add Cavium PCI vendor id
  net: Adding support for Cavium ThunderX network controller

 MAINTAINERS|7 +
 drivers/net/ethernet/Kconfig   |1 +
 drivers/net/ethernet/Makefile  |1 +
 drivers/net/ethernet/cavium/Kconfig|   40 +
 drivers/net/ethernet/cavium/Makefile   |5 +
 drivers/net/ethernet/cavium/thunder/Makefile   |   11 +
 drivers/net/ethernet/cavium/thunder/nic.h  |  419 ++
 drivers/net/ethernet/cavium/thunder/nic_main.c |  940 +
 drivers/net/ethernet/cavium/thunder/nic_reg.h  |  213 +++
 .../net/ethernet/cavium/thunder/nicvf_ethtool.c|  624 +
 drivers/net/ethernet/cavium/thunder/nicvf_main.c   | 1324 ++
 drivers/net/ethernet/cavium/thunder/nicvf_queues.c | 1413 
 drivers/net/ethernet/cavium/thunder/nicvf_queues.h |  375 ++
 drivers/net/ethernet/cavium/thunder/q_struct.h |  701 ++
 drivers/net/ethernet/cavium/thunder/thunder_bgx.c  |  966 +
 drivers/net/ethernet/cavium/thunder/thunder_bgx.h  |  223 +++
 include/linux/pci_ids.h|2 +
 17 files changed, 7265 insertions(+)
 create mode 100644 drivers/net/ethernet/cavium/Kconfig
 create mode 100644 drivers/net/ethernet/cavium/Makefile
 create mode 100644 drivers/net/ethernet/cavium/thunder/Makefile
 create mode 100644 drivers/net/ethernet/cavium/thunder/nic.h
 create mode 100644 drivers/net/ethernet/cavium/thunder/nic_main.c
 create mode 100644 drivers/net/ethernet/cavium/thunder/nic_reg.h
 create mode 100644 drivers/net/ethernet/cavium/thunder/nicvf_ethtool.c
 create mode 100644 drivers/net/ethernet/cavium/thunder/nicvf_main.c
 create mode 100644 drivers/net/ethernet/cavium/thunder/nicvf_queues.c
 create mode 100644 drivers/net/ethernet/cavium/thunder/nicvf_queues.h
 create mode 100644 drivers/net/ethernet/cavium/thunder/q_struct.h
 create mode 100644 drivers/net/ethernet/cavium/thunder/thunder_bgx.c
 create mode 100644 drivers/net/ethernet/cavium/thunder/thunder_bgx.h

-- 
2.4.1

--
To unsubscribe from this list: send the line "unsubscribe netdev" in
the body of a message to majord...@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html


[PATCH net-next v5 1/2] pci: Add Cavium PCI vendor id

2015-05-22 Thread Aleksey Makarov
From: Sunil Goutham 

This vendor id will be used by network (vNIC), USB (xHCI),
SATA (AHCI), GPIO, I2C, MMC and maybe other drivers
for ThunderX SoC.

Acked-by: Bjorn Helgaas 
Signed-off-by: Sunil Goutham 
Signed-off-by: Aleksey Makarov 
---
 include/linux/pci_ids.h | 2 ++
 1 file changed, 2 insertions(+)

diff --git a/include/linux/pci_ids.h b/include/linux/pci_ids.h
index 1fa99a3..80bd333 100644
--- a/include/linux/pci_ids.h
+++ b/include/linux/pci_ids.h
@@ -2324,6 +2324,8 @@
 #define PCI_DEVICE_ID_ALTIMA_AC91000x03ea
 #define PCI_DEVICE_ID_ALTIMA_AC10030x03eb
 
+#define PCI_VENDOR_ID_CAVIUM   0x177d
+
 #define PCI_VENDOR_ID_BELKIN   0x1799
 #define PCI_DEVICE_ID_BELKIN_F5D7010V7 0x701f
 
-- 
2.4.1

--
To unsubscribe from this list: send the line "unsubscribe netdev" in
the body of a message to majord...@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html


Re: [PATCH net-next v3 1/2] pci: Add Cavium PCI vendor id

2015-05-18 Thread Aleksey Makarov


Author of this patch is

Author: Sunil Goutham 

Sorry for this.  It will be fixed in next versions.

On 05/15/2015 08:36 PM, Aleksey Makarov wrote:

Signed-off-by: Aleksey Makarov 
---
  include/linux/pci_ids.h | 2 ++
  1 file changed, 2 insertions(+)

diff --git a/include/linux/pci_ids.h b/include/linux/pci_ids.h
index e63c02a..3633cc6 100644
--- a/include/linux/pci_ids.h
+++ b/include/linux/pci_ids.h
@@ -2327,6 +2327,8 @@
  #define PCI_DEVICE_ID_ALTIMA_AC9100   0x03ea
  #define PCI_DEVICE_ID_ALTIMA_AC1003   0x03eb

+#define PCI_VENDOR_ID_CAVIUM   0x177d
+
  #define PCI_VENDOR_ID_BELKIN  0x1799
  #define PCI_DEVICE_ID_BELKIN_F5D7010V70x701f



--
To unsubscribe from this list: send the line "unsubscribe netdev" in
the body of a message to majord...@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html


[PATCH net-next v3 1/2] pci: Add Cavium PCI vendor id

2015-05-15 Thread Aleksey Makarov
Signed-off-by: Aleksey Makarov 
---
 include/linux/pci_ids.h | 2 ++
 1 file changed, 2 insertions(+)

diff --git a/include/linux/pci_ids.h b/include/linux/pci_ids.h
index e63c02a..3633cc6 100644
--- a/include/linux/pci_ids.h
+++ b/include/linux/pci_ids.h
@@ -2327,6 +2327,8 @@
 #define PCI_DEVICE_ID_ALTIMA_AC91000x03ea
 #define PCI_DEVICE_ID_ALTIMA_AC10030x03eb
 
+#define PCI_VENDOR_ID_CAVIUM   0x177d
+
 #define PCI_VENDOR_ID_BELKIN   0x1799
 #define PCI_DEVICE_ID_BELKIN_F5D7010V7 0x701f
 
-- 
2.4.0

--
To unsubscribe from this list: send the line "unsubscribe netdev" in
the body of a message to majord...@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html