cachepc-linux

Fork of AMDESE/linux with modifications for CachePC side-channel attack
git clone https://git.sinitax.com/sinitax/cachepc-linux
Log | Files | Refs | README | LICENSE | sfeed.txt

lio_core.c (48313B)


      1/**********************************************************************
      2 * Author: Cavium, Inc.
      3 *
      4 * Contact: support@cavium.com
      5 *          Please include "LiquidIO" in the subject.
      6 *
      7 * Copyright (c) 2003-2016 Cavium, Inc.
      8 *
      9 * This file is free software; you can redistribute it and/or modify
     10 * it under the terms of the GNU General Public License, Version 2, as
     11 * published by the Free Software Foundation.
     12 *
     13 * This file is distributed in the hope that it will be useful, but
     14 * AS-IS and WITHOUT ANY WARRANTY; without even the implied warranty
     15 * of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE, TITLE, or
     16 * NONINFRINGEMENT.  See the GNU General Public License for more details.
     17 ***********************************************************************/
     18#include <linux/pci.h>
     19#include <linux/if_vlan.h>
     20#include "liquidio_common.h"
     21#include "octeon_droq.h"
     22#include "octeon_iq.h"
     23#include "response_manager.h"
     24#include "octeon_device.h"
     25#include "octeon_nic.h"
     26#include "octeon_main.h"
     27#include "octeon_network.h"
     28
     29/* OOM task polling interval */
     30#define LIO_OOM_POLL_INTERVAL_MS 250
     31
     32#define OCTNIC_MAX_SG  MAX_SKB_FRAGS
     33
     34/**
     35 * lio_delete_glists - Delete gather lists
     36 * @lio: per-network private data
     37 */
     38void lio_delete_glists(struct lio *lio)
     39{
     40	struct octnic_gather *g;
     41	int i;
     42
     43	kfree(lio->glist_lock);
     44	lio->glist_lock = NULL;
     45
     46	if (!lio->glist)
     47		return;
     48
     49	for (i = 0; i < lio->oct_dev->num_iqs; i++) {
     50		do {
     51			g = (struct octnic_gather *)
     52			    lio_list_delete_head(&lio->glist[i]);
     53			kfree(g);
     54		} while (g);
     55
     56		if (lio->glists_virt_base && lio->glists_virt_base[i] &&
     57		    lio->glists_dma_base && lio->glists_dma_base[i]) {
     58			lio_dma_free(lio->oct_dev,
     59				     lio->glist_entry_size * lio->tx_qsize,
     60				     lio->glists_virt_base[i],
     61				     lio->glists_dma_base[i]);
     62		}
     63	}
     64
     65	kfree(lio->glists_virt_base);
     66	lio->glists_virt_base = NULL;
     67
     68	kfree(lio->glists_dma_base);
     69	lio->glists_dma_base = NULL;
     70
     71	kfree(lio->glist);
     72	lio->glist = NULL;
     73}
     74
     75/**
     76 * lio_setup_glists - Setup gather lists
     77 * @oct: octeon_device
     78 * @lio: per-network private data
     79 * @num_iqs: count of iqs to allocate
     80 */
     81int lio_setup_glists(struct octeon_device *oct, struct lio *lio, int num_iqs)
     82{
     83	struct octnic_gather *g;
     84	int i, j;
     85
     86	lio->glist_lock =
     87	    kcalloc(num_iqs, sizeof(*lio->glist_lock), GFP_KERNEL);
     88	if (!lio->glist_lock)
     89		return -ENOMEM;
     90
     91	lio->glist =
     92	    kcalloc(num_iqs, sizeof(*lio->glist), GFP_KERNEL);
     93	if (!lio->glist) {
     94		kfree(lio->glist_lock);
     95		lio->glist_lock = NULL;
     96		return -ENOMEM;
     97	}
     98
     99	lio->glist_entry_size =
    100		ROUNDUP8((ROUNDUP4(OCTNIC_MAX_SG) >> 2) * OCT_SG_ENTRY_SIZE);
    101
    102	/* allocate memory to store virtual and dma base address of
    103	 * per glist consistent memory
    104	 */
    105	lio->glists_virt_base = kcalloc(num_iqs, sizeof(*lio->glists_virt_base),
    106					GFP_KERNEL);
    107	lio->glists_dma_base = kcalloc(num_iqs, sizeof(*lio->glists_dma_base),
    108				       GFP_KERNEL);
    109
    110	if (!lio->glists_virt_base || !lio->glists_dma_base) {
    111		lio_delete_glists(lio);
    112		return -ENOMEM;
    113	}
    114
    115	for (i = 0; i < num_iqs; i++) {
    116		int numa_node = dev_to_node(&oct->pci_dev->dev);
    117
    118		spin_lock_init(&lio->glist_lock[i]);
    119
    120		INIT_LIST_HEAD(&lio->glist[i]);
    121
    122		lio->glists_virt_base[i] =
    123			lio_dma_alloc(oct,
    124				      lio->glist_entry_size * lio->tx_qsize,
    125				      &lio->glists_dma_base[i]);
    126
    127		if (!lio->glists_virt_base[i]) {
    128			lio_delete_glists(lio);
    129			return -ENOMEM;
    130		}
    131
    132		for (j = 0; j < lio->tx_qsize; j++) {
    133			g = kzalloc_node(sizeof(*g), GFP_KERNEL,
    134					 numa_node);
    135			if (!g)
    136				g = kzalloc(sizeof(*g), GFP_KERNEL);
    137			if (!g)
    138				break;
    139
    140			g->sg = lio->glists_virt_base[i] +
    141				(j * lio->glist_entry_size);
    142
    143			g->sg_dma_ptr = lio->glists_dma_base[i] +
    144					(j * lio->glist_entry_size);
    145
    146			list_add_tail(&g->list, &lio->glist[i]);
    147		}
    148
    149		if (j != lio->tx_qsize) {
    150			lio_delete_glists(lio);
    151			return -ENOMEM;
    152		}
    153	}
    154
    155	return 0;
    156}
    157
    158int liquidio_set_feature(struct net_device *netdev, int cmd, u16 param1)
    159{
    160	struct lio *lio = GET_LIO(netdev);
    161	struct octeon_device *oct = lio->oct_dev;
    162	struct octnic_ctrl_pkt nctrl;
    163	int ret = 0;
    164
    165	memset(&nctrl, 0, sizeof(struct octnic_ctrl_pkt));
    166
    167	nctrl.ncmd.u64 = 0;
    168	nctrl.ncmd.s.cmd = cmd;
    169	nctrl.ncmd.s.param1 = param1;
    170	nctrl.iq_no = lio->linfo.txpciq[0].s.q_no;
    171	nctrl.netpndev = (u64)netdev;
    172	nctrl.cb_fn = liquidio_link_ctrl_cmd_completion;
    173
    174	ret = octnet_send_nic_ctrl_pkt(lio->oct_dev, &nctrl);
    175	if (ret) {
    176		dev_err(&oct->pci_dev->dev, "Feature change failed in core (ret: 0x%x)\n",
    177			ret);
    178		if (ret > 0)
    179			ret = -EIO;
    180	}
    181	return ret;
    182}
    183
    184void octeon_report_tx_completion_to_bql(void *txq, unsigned int pkts_compl,
    185					unsigned int bytes_compl)
    186{
    187	struct netdev_queue *netdev_queue = txq;
    188
    189	netdev_tx_completed_queue(netdev_queue, pkts_compl, bytes_compl);
    190}
    191
    192void octeon_update_tx_completion_counters(void *buf, int reqtype,
    193					  unsigned int *pkts_compl,
    194					  unsigned int *bytes_compl)
    195{
    196	struct octnet_buf_free_info *finfo;
    197	struct sk_buff *skb = NULL;
    198	struct octeon_soft_command *sc;
    199
    200	switch (reqtype) {
    201	case REQTYPE_NORESP_NET:
    202	case REQTYPE_NORESP_NET_SG:
    203		finfo = buf;
    204		skb = finfo->skb;
    205		break;
    206
    207	case REQTYPE_RESP_NET_SG:
    208	case REQTYPE_RESP_NET:
    209		sc = buf;
    210		skb = sc->callback_arg;
    211		break;
    212
    213	default:
    214		return;
    215	}
    216
    217	(*pkts_compl)++;
    218	*bytes_compl += skb->len;
    219}
    220
    221int octeon_report_sent_bytes_to_bql(void *buf, int reqtype)
    222{
    223	struct octnet_buf_free_info *finfo;
    224	struct sk_buff *skb;
    225	struct octeon_soft_command *sc;
    226	struct netdev_queue *txq;
    227
    228	switch (reqtype) {
    229	case REQTYPE_NORESP_NET:
    230	case REQTYPE_NORESP_NET_SG:
    231		finfo = buf;
    232		skb = finfo->skb;
    233		break;
    234
    235	case REQTYPE_RESP_NET_SG:
    236	case REQTYPE_RESP_NET:
    237		sc = buf;
    238		skb = sc->callback_arg;
    239		break;
    240
    241	default:
    242		return 0;
    243	}
    244
    245	txq = netdev_get_tx_queue(skb->dev, skb_get_queue_mapping(skb));
    246	netdev_tx_sent_queue(txq, skb->len);
    247
    248	return netif_xmit_stopped(txq);
    249}
    250
    251void liquidio_link_ctrl_cmd_completion(void *nctrl_ptr)
    252{
    253	struct octnic_ctrl_pkt *nctrl = (struct octnic_ctrl_pkt *)nctrl_ptr;
    254	struct net_device *netdev = (struct net_device *)nctrl->netpndev;
    255	struct lio *lio = GET_LIO(netdev);
    256	struct octeon_device *oct = lio->oct_dev;
    257	u8 *mac;
    258
    259	if (nctrl->sc_status)
    260		return;
    261
    262	switch (nctrl->ncmd.s.cmd) {
    263	case OCTNET_CMD_CHANGE_DEVFLAGS:
    264	case OCTNET_CMD_SET_MULTI_LIST:
    265	case OCTNET_CMD_SET_UC_LIST:
    266		break;
    267
    268	case OCTNET_CMD_CHANGE_MACADDR:
    269		mac = ((u8 *)&nctrl->udd[0]) + 2;
    270		if (nctrl->ncmd.s.param1) {
    271			/* vfidx is 0 based, but vf_num (param1) is 1 based */
    272			int vfidx = nctrl->ncmd.s.param1 - 1;
    273			bool mac_is_admin_assigned = nctrl->ncmd.s.param2;
    274
    275			if (mac_is_admin_assigned)
    276				netif_info(lio, probe, lio->netdev,
    277					   "MAC Address %pM is configured for VF %d\n",
    278					   mac, vfidx);
    279		} else {
    280			netif_info(lio, probe, lio->netdev,
    281				   " MACAddr changed to %pM\n",
    282				   mac);
    283		}
    284		break;
    285
    286	case OCTNET_CMD_GPIO_ACCESS:
    287		netif_info(lio, probe, lio->netdev, "LED Flashing visual identification\n");
    288
    289		break;
    290
    291	case OCTNET_CMD_ID_ACTIVE:
    292		netif_info(lio, probe, lio->netdev, "LED Flashing visual identification\n");
    293
    294		break;
    295
    296	case OCTNET_CMD_LRO_ENABLE:
    297		dev_info(&oct->pci_dev->dev, "%s LRO Enabled\n", netdev->name);
    298		break;
    299
    300	case OCTNET_CMD_LRO_DISABLE:
    301		dev_info(&oct->pci_dev->dev, "%s LRO Disabled\n",
    302			 netdev->name);
    303		break;
    304
    305	case OCTNET_CMD_VERBOSE_ENABLE:
    306		dev_info(&oct->pci_dev->dev, "%s Firmware debug enabled\n",
    307			 netdev->name);
    308		break;
    309
    310	case OCTNET_CMD_VERBOSE_DISABLE:
    311		dev_info(&oct->pci_dev->dev, "%s Firmware debug disabled\n",
    312			 netdev->name);
    313		break;
    314
    315	case OCTNET_CMD_VLAN_FILTER_CTL:
    316		if (nctrl->ncmd.s.param1)
    317			dev_info(&oct->pci_dev->dev,
    318				 "%s VLAN filter enabled\n", netdev->name);
    319		else
    320			dev_info(&oct->pci_dev->dev,
    321				 "%s VLAN filter disabled\n", netdev->name);
    322		break;
    323
    324	case OCTNET_CMD_ADD_VLAN_FILTER:
    325		dev_info(&oct->pci_dev->dev, "%s VLAN filter %d added\n",
    326			 netdev->name, nctrl->ncmd.s.param1);
    327		break;
    328
    329	case OCTNET_CMD_DEL_VLAN_FILTER:
    330		dev_info(&oct->pci_dev->dev, "%s VLAN filter %d removed\n",
    331			 netdev->name, nctrl->ncmd.s.param1);
    332		break;
    333
    334	case OCTNET_CMD_SET_SETTINGS:
    335		dev_info(&oct->pci_dev->dev, "%s settings changed\n",
    336			 netdev->name);
    337
    338		break;
    339
    340	/* Case to handle "OCTNET_CMD_TNL_RX_CSUM_CTL"
    341	 * Command passed by NIC driver
    342	 */
    343	case OCTNET_CMD_TNL_RX_CSUM_CTL:
    344		if (nctrl->ncmd.s.param1 == OCTNET_CMD_RXCSUM_ENABLE) {
    345			netif_info(lio, probe, lio->netdev,
    346				   "RX Checksum Offload Enabled\n");
    347		} else if (nctrl->ncmd.s.param1 ==
    348			   OCTNET_CMD_RXCSUM_DISABLE) {
    349			netif_info(lio, probe, lio->netdev,
    350				   "RX Checksum Offload Disabled\n");
    351		}
    352		break;
    353
    354		/* Case to handle "OCTNET_CMD_TNL_TX_CSUM_CTL"
    355		 * Command passed by NIC driver
    356		 */
    357	case OCTNET_CMD_TNL_TX_CSUM_CTL:
    358		if (nctrl->ncmd.s.param1 == OCTNET_CMD_TXCSUM_ENABLE) {
    359			netif_info(lio, probe, lio->netdev,
    360				   "TX Checksum Offload Enabled\n");
    361		} else if (nctrl->ncmd.s.param1 ==
    362			   OCTNET_CMD_TXCSUM_DISABLE) {
    363			netif_info(lio, probe, lio->netdev,
    364				   "TX Checksum Offload Disabled\n");
    365		}
    366		break;
    367
    368		/* Case to handle "OCTNET_CMD_VXLAN_PORT_CONFIG"
    369		 * Command passed by NIC driver
    370		 */
    371	case OCTNET_CMD_VXLAN_PORT_CONFIG:
    372		if (nctrl->ncmd.s.more == OCTNET_CMD_VXLAN_PORT_ADD) {
    373			netif_info(lio, probe, lio->netdev,
    374				   "VxLAN Destination UDP PORT:%d ADDED\n",
    375				   nctrl->ncmd.s.param1);
    376		} else if (nctrl->ncmd.s.more ==
    377			   OCTNET_CMD_VXLAN_PORT_DEL) {
    378			netif_info(lio, probe, lio->netdev,
    379				   "VxLAN Destination UDP PORT:%d DELETED\n",
    380				   nctrl->ncmd.s.param1);
    381		}
    382		break;
    383
    384	case OCTNET_CMD_SET_FLOW_CTL:
    385		netif_info(lio, probe, lio->netdev, "Set RX/TX flow control parameters\n");
    386		break;
    387
    388	case OCTNET_CMD_QUEUE_COUNT_CTL:
    389		netif_info(lio, probe, lio->netdev, "Queue count updated to %d\n",
    390			   nctrl->ncmd.s.param1);
    391		break;
    392
    393	default:
    394		dev_err(&oct->pci_dev->dev, "%s Unknown cmd %d\n", __func__,
    395			nctrl->ncmd.s.cmd);
    396	}
    397}
    398
    399void octeon_pf_changed_vf_macaddr(struct octeon_device *oct, u8 *mac)
    400{
    401	bool macaddr_changed = false;
    402	struct net_device *netdev;
    403	struct lio *lio;
    404
    405	rtnl_lock();
    406
    407	netdev = oct->props[0].netdev;
    408	lio = GET_LIO(netdev);
    409
    410	lio->linfo.macaddr_is_admin_asgnd = true;
    411
    412	if (!ether_addr_equal(netdev->dev_addr, mac)) {
    413		macaddr_changed = true;
    414		eth_hw_addr_set(netdev, mac);
    415		ether_addr_copy(((u8 *)&lio->linfo.hw_addr) + 2, mac);
    416		call_netdevice_notifiers(NETDEV_CHANGEADDR, netdev);
    417	}
    418
    419	rtnl_unlock();
    420
    421	if (macaddr_changed)
    422		dev_info(&oct->pci_dev->dev,
    423			 "PF changed VF's MAC address to %pM\n", mac);
    424
    425	/* no need to notify the firmware of the macaddr change because
    426	 * the PF did that already
    427	 */
    428}
    429
    430void octeon_schedule_rxq_oom_work(struct octeon_device *oct,
    431				  struct octeon_droq *droq)
    432{
    433	struct net_device *netdev = oct->props[0].netdev;
    434	struct lio *lio = GET_LIO(netdev);
    435	struct cavium_wq *wq = &lio->rxq_status_wq[droq->q_no];
    436
    437	queue_delayed_work(wq->wq, &wq->wk.work,
    438			   msecs_to_jiffies(LIO_OOM_POLL_INTERVAL_MS));
    439}
    440
    441static void octnet_poll_check_rxq_oom_status(struct work_struct *work)
    442{
    443	struct cavium_wk *wk = (struct cavium_wk *)work;
    444	struct lio *lio = (struct lio *)wk->ctxptr;
    445	struct octeon_device *oct = lio->oct_dev;
    446	int q_no = wk->ctxul;
    447	struct octeon_droq *droq = oct->droq[q_no];
    448
    449	if (!ifstate_check(lio, LIO_IFSTATE_RUNNING) || !droq)
    450		return;
    451
    452	if (octeon_retry_droq_refill(droq))
    453		octeon_schedule_rxq_oom_work(oct, droq);
    454}
    455
    456int setup_rx_oom_poll_fn(struct net_device *netdev)
    457{
    458	struct lio *lio = GET_LIO(netdev);
    459	struct octeon_device *oct = lio->oct_dev;
    460	struct cavium_wq *wq;
    461	int q, q_no;
    462
    463	for (q = 0; q < oct->num_oqs; q++) {
    464		q_no = lio->linfo.rxpciq[q].s.q_no;
    465		wq = &lio->rxq_status_wq[q_no];
    466		wq->wq = alloc_workqueue("rxq-oom-status",
    467					 WQ_MEM_RECLAIM, 0);
    468		if (!wq->wq) {
    469			dev_err(&oct->pci_dev->dev, "unable to create cavium rxq oom status wq\n");
    470			return -ENOMEM;
    471		}
    472
    473		INIT_DELAYED_WORK(&wq->wk.work,
    474				  octnet_poll_check_rxq_oom_status);
    475		wq->wk.ctxptr = lio;
    476		wq->wk.ctxul = q_no;
    477	}
    478
    479	return 0;
    480}
    481
    482void cleanup_rx_oom_poll_fn(struct net_device *netdev)
    483{
    484	struct lio *lio = GET_LIO(netdev);
    485	struct octeon_device *oct = lio->oct_dev;
    486	struct cavium_wq *wq;
    487	int q_no;
    488
    489	for (q_no = 0; q_no < oct->num_oqs; q_no++) {
    490		wq = &lio->rxq_status_wq[q_no];
    491		if (wq->wq) {
    492			cancel_delayed_work_sync(&wq->wk.work);
    493			destroy_workqueue(wq->wq);
    494			wq->wq = NULL;
    495		}
    496	}
    497}
    498
    499/* Runs in interrupt context. */
    500static void lio_update_txq_status(struct octeon_device *oct, int iq_num)
    501{
    502	struct octeon_instr_queue *iq = oct->instr_queue[iq_num];
    503	struct net_device *netdev;
    504	struct lio *lio;
    505
    506	netdev = oct->props[iq->ifidx].netdev;
    507
    508	/* This is needed because the first IQ does not have
    509	 * a netdev associated with it.
    510	 */
    511	if (!netdev)
    512		return;
    513
    514	lio = GET_LIO(netdev);
    515	if (__netif_subqueue_stopped(netdev, iq->q_index) &&
    516	    lio->linfo.link.s.link_up &&
    517	    (!octnet_iq_is_full(oct, iq_num))) {
    518		netif_wake_subqueue(netdev, iq->q_index);
    519		INCR_INSTRQUEUE_PKT_COUNT(lio->oct_dev, iq_num,
    520					  tx_restart, 1);
    521	}
    522}
    523
    524/**
    525 * octeon_setup_droq - Setup output queue
    526 * @oct: octeon device
    527 * @q_no: which queue
    528 * @num_descs: how many descriptors
    529 * @desc_size: size of each descriptor
    530 * @app_ctx: application context
    531 */
    532static int octeon_setup_droq(struct octeon_device *oct, int q_no, int num_descs,
    533			     int desc_size, void *app_ctx)
    534{
    535	int ret_val;
    536
    537	dev_dbg(&oct->pci_dev->dev, "Creating Droq: %d\n", q_no);
    538	/* droq creation and local register settings. */
    539	ret_val = octeon_create_droq(oct, q_no, num_descs, desc_size, app_ctx);
    540	if (ret_val < 0)
    541		return ret_val;
    542
    543	if (ret_val == 1) {
    544		dev_dbg(&oct->pci_dev->dev, "Using default droq %d\n", q_no);
    545		return 0;
    546	}
    547
    548	/* Enable the droq queues */
    549	octeon_set_droq_pkt_op(oct, q_no, 1);
    550
    551	/* Send Credit for Octeon Output queues. Credits are always
    552	 * sent after the output queue is enabled.
    553	 */
    554	writel(oct->droq[q_no]->max_count, oct->droq[q_no]->pkts_credit_reg);
    555
    556	return ret_val;
    557}
    558
    559/**
    560 * liquidio_push_packet - Routine to push packets arriving on Octeon interface upto network layer.
    561 * @octeon_id:octeon device id.
    562 * @skbuff:   skbuff struct to be passed to network layer.
    563 * @len:      size of total data received.
    564 * @rh:       Control header associated with the packet
    565 * @param:    additional control data with the packet
    566 * @arg:      farg registered in droq_ops
    567 */
    568static void
    569liquidio_push_packet(u32 __maybe_unused octeon_id,
    570		     void *skbuff,
    571		     u32 len,
    572		     union octeon_rh *rh,
    573		     void *param,
    574		     void *arg)
    575{
    576	struct net_device *netdev = (struct net_device *)arg;
    577	struct octeon_droq *droq =
    578	    container_of(param, struct octeon_droq, napi);
    579	struct sk_buff *skb = (struct sk_buff *)skbuff;
    580	struct skb_shared_hwtstamps *shhwtstamps;
    581	struct napi_struct *napi = param;
    582	u16 vtag = 0;
    583	u32 r_dh_off;
    584	u64 ns;
    585
    586	if (netdev) {
    587		struct lio *lio = GET_LIO(netdev);
    588		struct octeon_device *oct = lio->oct_dev;
    589
    590		/* Do not proceed if the interface is not in RUNNING state. */
    591		if (!ifstate_check(lio, LIO_IFSTATE_RUNNING)) {
    592			recv_buffer_free(skb);
    593			droq->stats.rx_dropped++;
    594			return;
    595		}
    596
    597		skb->dev = netdev;
    598
    599		skb_record_rx_queue(skb, droq->q_no);
    600		if (likely(len > MIN_SKB_SIZE)) {
    601			struct octeon_skb_page_info *pg_info;
    602			unsigned char *va;
    603
    604			pg_info = ((struct octeon_skb_page_info *)(skb->cb));
    605			if (pg_info->page) {
    606				/* For Paged allocation use the frags */
    607				va = page_address(pg_info->page) +
    608					pg_info->page_offset;
    609				memcpy(skb->data, va, MIN_SKB_SIZE);
    610				skb_put(skb, MIN_SKB_SIZE);
    611				skb_add_rx_frag(skb, skb_shinfo(skb)->nr_frags,
    612						pg_info->page,
    613						pg_info->page_offset +
    614						MIN_SKB_SIZE,
    615						len - MIN_SKB_SIZE,
    616						LIO_RXBUFFER_SZ);
    617			}
    618		} else {
    619			struct octeon_skb_page_info *pg_info =
    620				((struct octeon_skb_page_info *)(skb->cb));
    621			skb_copy_to_linear_data(skb, page_address(pg_info->page)
    622						+ pg_info->page_offset, len);
    623			skb_put(skb, len);
    624			put_page(pg_info->page);
    625		}
    626
    627		r_dh_off = (rh->r_dh.len - 1) * BYTES_PER_DHLEN_UNIT;
    628
    629		if (oct->ptp_enable) {
    630			if (rh->r_dh.has_hwtstamp) {
    631				/* timestamp is included from the hardware at
    632				 * the beginning of the packet.
    633				 */
    634				if (ifstate_check
    635					(lio,
    636					 LIO_IFSTATE_RX_TIMESTAMP_ENABLED)) {
    637					/* Nanoseconds are in the first 64-bits
    638					 * of the packet.
    639					 */
    640					memcpy(&ns, (skb->data + r_dh_off),
    641					       sizeof(ns));
    642					r_dh_off -= BYTES_PER_DHLEN_UNIT;
    643					shhwtstamps = skb_hwtstamps(skb);
    644					shhwtstamps->hwtstamp =
    645						ns_to_ktime(ns +
    646							    lio->ptp_adjust);
    647				}
    648			}
    649		}
    650
    651		if (rh->r_dh.has_hash) {
    652			__be32 *hash_be = (__be32 *)(skb->data + r_dh_off);
    653			u32 hash = be32_to_cpu(*hash_be);
    654
    655			skb_set_hash(skb, hash, PKT_HASH_TYPE_L4);
    656			r_dh_off -= BYTES_PER_DHLEN_UNIT;
    657		}
    658
    659		skb_pull(skb, rh->r_dh.len * BYTES_PER_DHLEN_UNIT);
    660		skb->protocol = eth_type_trans(skb, skb->dev);
    661
    662		if ((netdev->features & NETIF_F_RXCSUM) &&
    663		    (((rh->r_dh.encap_on) &&
    664		      (rh->r_dh.csum_verified & CNNIC_TUN_CSUM_VERIFIED)) ||
    665		     (!(rh->r_dh.encap_on) &&
    666		      ((rh->r_dh.csum_verified & CNNIC_CSUM_VERIFIED) ==
    667			CNNIC_CSUM_VERIFIED))))
    668			/* checksum has already been verified */
    669			skb->ip_summed = CHECKSUM_UNNECESSARY;
    670		else
    671			skb->ip_summed = CHECKSUM_NONE;
    672
    673		/* Setting Encapsulation field on basis of status received
    674		 * from the firmware
    675		 */
    676		if (rh->r_dh.encap_on) {
    677			skb->encapsulation = 1;
    678			skb->csum_level = 1;
    679			droq->stats.rx_vxlan++;
    680		}
    681
    682		/* inbound VLAN tag */
    683		if ((netdev->features & NETIF_F_HW_VLAN_CTAG_RX) &&
    684		    rh->r_dh.vlan) {
    685			u16 priority = rh->r_dh.priority;
    686			u16 vid = rh->r_dh.vlan;
    687
    688			vtag = (priority << VLAN_PRIO_SHIFT) | vid;
    689			__vlan_hwaccel_put_tag(skb, htons(ETH_P_8021Q), vtag);
    690		}
    691
    692		napi_gro_receive(napi, skb);
    693
    694		droq->stats.rx_bytes_received += len -
    695			rh->r_dh.len * BYTES_PER_DHLEN_UNIT;
    696		droq->stats.rx_pkts_received++;
    697	} else {
    698		recv_buffer_free(skb);
    699	}
    700}
    701
    702/**
    703 * napi_schedule_wrapper - wrapper for calling napi_schedule
    704 * @param: parameters to pass to napi_schedule
    705 *
    706 * Used when scheduling on different CPUs
    707 */
    708static void napi_schedule_wrapper(void *param)
    709{
    710	struct napi_struct *napi = param;
    711
    712	napi_schedule(napi);
    713}
    714
    715/**
    716 * liquidio_napi_drv_callback - callback when receive interrupt occurs and we are in NAPI mode
    717 * @arg: pointer to octeon output queue
    718 */
    719static void liquidio_napi_drv_callback(void *arg)
    720{
    721	struct octeon_device *oct;
    722	struct octeon_droq *droq = arg;
    723	int this_cpu = smp_processor_id();
    724
    725	oct = droq->oct_dev;
    726
    727	if (OCTEON_CN23XX_PF(oct) || OCTEON_CN23XX_VF(oct) ||
    728	    droq->cpu_id == this_cpu) {
    729		napi_schedule_irqoff(&droq->napi);
    730	} else {
    731		INIT_CSD(&droq->csd, napi_schedule_wrapper, &droq->napi);
    732		smp_call_function_single_async(droq->cpu_id, &droq->csd);
    733	}
    734}
    735
    736/**
    737 * liquidio_napi_poll - Entry point for NAPI polling
    738 * @napi: NAPI structure
    739 * @budget: maximum number of items to process
    740 */
    741static int liquidio_napi_poll(struct napi_struct *napi, int budget)
    742{
    743	struct octeon_instr_queue *iq;
    744	struct octeon_device *oct;
    745	struct octeon_droq *droq;
    746	int tx_done = 0, iq_no;
    747	int work_done;
    748
    749	droq = container_of(napi, struct octeon_droq, napi);
    750	oct = droq->oct_dev;
    751	iq_no = droq->q_no;
    752
    753	/* Handle Droq descriptors */
    754	work_done = octeon_droq_process_poll_pkts(oct, droq, budget);
    755
    756	/* Flush the instruction queue */
    757	iq = oct->instr_queue[iq_no];
    758	if (iq) {
    759		/* TODO: move this check to inside octeon_flush_iq,
    760		 * once check_db_timeout is removed
    761		 */
    762		if (atomic_read(&iq->instr_pending))
    763			/* Process iq buffers with in the budget limits */
    764			tx_done = octeon_flush_iq(oct, iq, budget);
    765		else
    766			tx_done = 1;
    767		/* Update iq read-index rather than waiting for next interrupt.
    768		 * Return back if tx_done is false.
    769		 */
    770		/* sub-queue status update */
    771		lio_update_txq_status(oct, iq_no);
    772	} else {
    773		dev_err(&oct->pci_dev->dev, "%s:  iq (%d) num invalid\n",
    774			__func__, iq_no);
    775	}
    776
    777#define MAX_REG_CNT  2000000U
    778	/* force enable interrupt if reg cnts are high to avoid wraparound */
    779	if ((work_done < budget && tx_done) ||
    780	    (iq && iq->pkt_in_done >= MAX_REG_CNT) ||
    781	    (droq->pkt_count >= MAX_REG_CNT)) {
    782		napi_complete_done(napi, work_done);
    783
    784		octeon_enable_irq(droq->oct_dev, droq->q_no);
    785		return 0;
    786	}
    787
    788	return (!tx_done) ? (budget) : (work_done);
    789}
    790
    791/**
    792 * liquidio_setup_io_queues - Setup input and output queues
    793 * @octeon_dev: octeon device
    794 * @ifidx: Interface index
    795 * @num_iqs: input io queue count
    796 * @num_oqs: output io queue count
    797 *
    798 * Note: Queues are with respect to the octeon device. Thus
    799 * an input queue is for egress packets, and output queues
    800 * are for ingress packets.
    801 */
    802int liquidio_setup_io_queues(struct octeon_device *octeon_dev, int ifidx,
    803			     u32 num_iqs, u32 num_oqs)
    804{
    805	struct octeon_droq_ops droq_ops;
    806	struct net_device *netdev;
    807	struct octeon_droq *droq;
    808	struct napi_struct *napi;
    809	int cpu_id_modulus;
    810	int num_tx_descs;
    811	struct lio *lio;
    812	int retval = 0;
    813	int q, q_no;
    814	int cpu_id;
    815
    816	netdev = octeon_dev->props[ifidx].netdev;
    817
    818	lio = GET_LIO(netdev);
    819
    820	memset(&droq_ops, 0, sizeof(struct octeon_droq_ops));
    821
    822	droq_ops.fptr = liquidio_push_packet;
    823	droq_ops.farg = netdev;
    824
    825	droq_ops.poll_mode = 1;
    826	droq_ops.napi_fn = liquidio_napi_drv_callback;
    827	cpu_id = 0;
    828	cpu_id_modulus = num_present_cpus();
    829
    830	/* set up DROQs. */
    831	for (q = 0; q < num_oqs; q++) {
    832		q_no = lio->linfo.rxpciq[q].s.q_no;
    833		dev_dbg(&octeon_dev->pci_dev->dev,
    834			"%s index:%d linfo.rxpciq.s.q_no:%d\n",
    835			__func__, q, q_no);
    836		retval = octeon_setup_droq(
    837		    octeon_dev, q_no,
    838		    CFG_GET_NUM_RX_DESCS_NIC_IF(octeon_get_conf(octeon_dev),
    839						lio->ifidx),
    840		    CFG_GET_NUM_RX_BUF_SIZE_NIC_IF(octeon_get_conf(octeon_dev),
    841						   lio->ifidx),
    842		    NULL);
    843		if (retval) {
    844			dev_err(&octeon_dev->pci_dev->dev,
    845				"%s : Runtime DROQ(RxQ) creation failed.\n",
    846				__func__);
    847			return 1;
    848		}
    849
    850		droq = octeon_dev->droq[q_no];
    851		napi = &droq->napi;
    852		dev_dbg(&octeon_dev->pci_dev->dev, "netif_napi_add netdev:%llx oct:%llx\n",
    853			(u64)netdev, (u64)octeon_dev);
    854		netif_napi_add(netdev, napi, liquidio_napi_poll, 64);
    855
    856		/* designate a CPU for this droq */
    857		droq->cpu_id = cpu_id;
    858		cpu_id++;
    859		if (cpu_id >= cpu_id_modulus)
    860			cpu_id = 0;
    861
    862		octeon_register_droq_ops(octeon_dev, q_no, &droq_ops);
    863	}
    864
    865	if (OCTEON_CN23XX_PF(octeon_dev) || OCTEON_CN23XX_VF(octeon_dev)) {
    866		/* 23XX PF/VF can send/recv control messages (via the first
    867		 * PF/VF-owned droq) from the firmware even if the ethX
    868		 * interface is down, so that's why poll_mode must be off
    869		 * for the first droq.
    870		 */
    871		octeon_dev->droq[0]->ops.poll_mode = 0;
    872	}
    873
    874	/* set up IQs. */
    875	for (q = 0; q < num_iqs; q++) {
    876		num_tx_descs = CFG_GET_NUM_TX_DESCS_NIC_IF(
    877		    octeon_get_conf(octeon_dev), lio->ifidx);
    878		retval = octeon_setup_iq(octeon_dev, ifidx, q,
    879					 lio->linfo.txpciq[q], num_tx_descs,
    880					 netdev_get_tx_queue(netdev, q));
    881		if (retval) {
    882			dev_err(&octeon_dev->pci_dev->dev,
    883				" %s : Runtime IQ(TxQ) creation failed.\n",
    884				__func__);
    885			return 1;
    886		}
    887
    888		/* XPS */
    889		if (!OCTEON_CN23XX_VF(octeon_dev) && octeon_dev->msix_on &&
    890		    octeon_dev->ioq_vector) {
    891			struct octeon_ioq_vector    *ioq_vector;
    892
    893			ioq_vector = &octeon_dev->ioq_vector[q];
    894			netif_set_xps_queue(netdev,
    895					    &ioq_vector->affinity_mask,
    896					    ioq_vector->iq_index);
    897		}
    898	}
    899
    900	return 0;
    901}
    902
    903static
    904int liquidio_schedule_msix_droq_pkt_handler(struct octeon_droq *droq, u64 ret)
    905{
    906	struct octeon_device *oct = droq->oct_dev;
    907	struct octeon_device_priv *oct_priv =
    908	    (struct octeon_device_priv *)oct->priv;
    909
    910	if (droq->ops.poll_mode) {
    911		droq->ops.napi_fn(droq);
    912	} else {
    913		if (ret & MSIX_PO_INT) {
    914			if (OCTEON_CN23XX_VF(oct))
    915				dev_err(&oct->pci_dev->dev,
    916					"should not come here should not get rx when poll mode = 0 for vf\n");
    917			tasklet_schedule(&oct_priv->droq_tasklet);
    918			return 1;
    919		}
    920		/* this will be flushed periodically by check iq db */
    921		if (ret & MSIX_PI_INT)
    922			return 0;
    923	}
    924
    925	return 0;
    926}
    927
    928irqreturn_t
    929liquidio_msix_intr_handler(int __maybe_unused irq, void *dev)
    930{
    931	struct octeon_ioq_vector *ioq_vector = (struct octeon_ioq_vector *)dev;
    932	struct octeon_device *oct = ioq_vector->oct_dev;
    933	struct octeon_droq *droq = oct->droq[ioq_vector->droq_index];
    934	u64 ret;
    935
    936	ret = oct->fn_list.msix_interrupt_handler(ioq_vector);
    937
    938	if (ret & MSIX_PO_INT || ret & MSIX_PI_INT)
    939		liquidio_schedule_msix_droq_pkt_handler(droq, ret);
    940
    941	return IRQ_HANDLED;
    942}
    943
    944/**
    945 * liquidio_schedule_droq_pkt_handlers - Droq packet processor sceduler
    946 * @oct: octeon device
    947 */
    948static void liquidio_schedule_droq_pkt_handlers(struct octeon_device *oct)
    949{
    950	struct octeon_device_priv *oct_priv =
    951		(struct octeon_device_priv *)oct->priv;
    952	struct octeon_droq *droq;
    953	u64 oq_no;
    954
    955	if (oct->int_status & OCT_DEV_INTR_PKT_DATA) {
    956		for (oq_no = 0; oq_no < MAX_OCTEON_OUTPUT_QUEUES(oct);
    957		     oq_no++) {
    958			if (!(oct->droq_intr & BIT_ULL(oq_no)))
    959				continue;
    960
    961			droq = oct->droq[oq_no];
    962
    963			if (droq->ops.poll_mode) {
    964				droq->ops.napi_fn(droq);
    965				oct_priv->napi_mask |= BIT_ULL(oq_no);
    966			} else {
    967				tasklet_schedule(&oct_priv->droq_tasklet);
    968			}
    969		}
    970	}
    971}
    972
    973/**
    974 * liquidio_legacy_intr_handler - Interrupt handler for octeon
    975 * @irq: unused
    976 * @dev: octeon device
    977 */
    978static
    979irqreturn_t liquidio_legacy_intr_handler(int __maybe_unused irq, void *dev)
    980{
    981	struct octeon_device *oct = (struct octeon_device *)dev;
    982	irqreturn_t ret;
    983
    984	/* Disable our interrupts for the duration of ISR */
    985	oct->fn_list.disable_interrupt(oct, OCTEON_ALL_INTR);
    986
    987	ret = oct->fn_list.process_interrupt_regs(oct);
    988
    989	if (ret == IRQ_HANDLED)
    990		liquidio_schedule_droq_pkt_handlers(oct);
    991
    992	/* Re-enable our interrupts  */
    993	if (!(atomic_read(&oct->status) == OCT_DEV_IN_RESET))
    994		oct->fn_list.enable_interrupt(oct, OCTEON_ALL_INTR);
    995
    996	return ret;
    997}
    998
    999/**
   1000 * octeon_setup_interrupt - Setup interrupt for octeon device
   1001 * @oct: octeon device
   1002 * @num_ioqs: number of queues
   1003 *
   1004 *  Enable interrupt in Octeon device as given in the PCI interrupt mask.
   1005 */
   1006int octeon_setup_interrupt(struct octeon_device *oct, u32 num_ioqs)
   1007{
   1008	struct msix_entry *msix_entries;
   1009	char *queue_irq_names = NULL;
   1010	int i, num_interrupts = 0;
   1011	int num_alloc_ioq_vectors;
   1012	char *aux_irq_name = NULL;
   1013	int num_ioq_vectors;
   1014	int irqret, err;
   1015
   1016	if (oct->msix_on) {
   1017		oct->num_msix_irqs = num_ioqs;
   1018		if (OCTEON_CN23XX_PF(oct)) {
   1019			num_interrupts = MAX_IOQ_INTERRUPTS_PER_PF + 1;
   1020
   1021			/* one non ioq interrupt for handling
   1022			 * sli_mac_pf_int_sum
   1023			 */
   1024			oct->num_msix_irqs += 1;
   1025		} else if (OCTEON_CN23XX_VF(oct)) {
   1026			num_interrupts = MAX_IOQ_INTERRUPTS_PER_VF;
   1027		}
   1028
   1029		/* allocate storage for the names assigned to each irq */
   1030		oct->irq_name_storage =
   1031			kcalloc(num_interrupts, INTRNAMSIZ, GFP_KERNEL);
   1032		if (!oct->irq_name_storage) {
   1033			dev_err(&oct->pci_dev->dev, "Irq name storage alloc failed...\n");
   1034			return -ENOMEM;
   1035		}
   1036
   1037		queue_irq_names = oct->irq_name_storage;
   1038
   1039		if (OCTEON_CN23XX_PF(oct))
   1040			aux_irq_name = &queue_irq_names
   1041				[IRQ_NAME_OFF(MAX_IOQ_INTERRUPTS_PER_PF)];
   1042
   1043		oct->msix_entries = kcalloc(oct->num_msix_irqs,
   1044					    sizeof(struct msix_entry),
   1045					    GFP_KERNEL);
   1046		if (!oct->msix_entries) {
   1047			dev_err(&oct->pci_dev->dev, "Memory Alloc failed...\n");
   1048			kfree(oct->irq_name_storage);
   1049			oct->irq_name_storage = NULL;
   1050			return -ENOMEM;
   1051		}
   1052
   1053		msix_entries = (struct msix_entry *)oct->msix_entries;
   1054
   1055		/*Assumption is that pf msix vectors start from pf srn to pf to
   1056		 * trs and not from 0. if not change this code
   1057		 */
   1058		if (OCTEON_CN23XX_PF(oct)) {
   1059			for (i = 0; i < oct->num_msix_irqs - 1; i++)
   1060				msix_entries[i].entry =
   1061					oct->sriov_info.pf_srn + i;
   1062
   1063			msix_entries[oct->num_msix_irqs - 1].entry =
   1064				oct->sriov_info.trs;
   1065		} else if (OCTEON_CN23XX_VF(oct)) {
   1066			for (i = 0; i < oct->num_msix_irqs; i++)
   1067				msix_entries[i].entry = i;
   1068		}
   1069		num_alloc_ioq_vectors = pci_enable_msix_range(
   1070						oct->pci_dev, msix_entries,
   1071						oct->num_msix_irqs,
   1072						oct->num_msix_irqs);
   1073		if (num_alloc_ioq_vectors < 0) {
   1074			dev_err(&oct->pci_dev->dev, "unable to Allocate MSI-X interrupts\n");
   1075			kfree(oct->msix_entries);
   1076			oct->msix_entries = NULL;
   1077			kfree(oct->irq_name_storage);
   1078			oct->irq_name_storage = NULL;
   1079			return num_alloc_ioq_vectors;
   1080		}
   1081
   1082		dev_dbg(&oct->pci_dev->dev, "OCTEON: Enough MSI-X interrupts are allocated...\n");
   1083
   1084		num_ioq_vectors = oct->num_msix_irqs;
   1085		/* For PF, there is one non-ioq interrupt handler */
   1086		if (OCTEON_CN23XX_PF(oct)) {
   1087			num_ioq_vectors -= 1;
   1088
   1089			snprintf(aux_irq_name, INTRNAMSIZ,
   1090				 "LiquidIO%u-pf%u-aux", oct->octeon_id,
   1091				 oct->pf_num);
   1092			irqret = request_irq(
   1093					msix_entries[num_ioq_vectors].vector,
   1094					liquidio_legacy_intr_handler, 0,
   1095					aux_irq_name, oct);
   1096			if (irqret) {
   1097				dev_err(&oct->pci_dev->dev,
   1098					"Request_irq failed for MSIX interrupt Error: %d\n",
   1099					irqret);
   1100				pci_disable_msix(oct->pci_dev);
   1101				kfree(oct->msix_entries);
   1102				kfree(oct->irq_name_storage);
   1103				oct->irq_name_storage = NULL;
   1104				oct->msix_entries = NULL;
   1105				return irqret;
   1106			}
   1107		}
   1108		for (i = 0 ; i < num_ioq_vectors ; i++) {
   1109			if (OCTEON_CN23XX_PF(oct))
   1110				snprintf(&queue_irq_names[IRQ_NAME_OFF(i)],
   1111					 INTRNAMSIZ, "LiquidIO%u-pf%u-rxtx-%u",
   1112					 oct->octeon_id, oct->pf_num, i);
   1113
   1114			if (OCTEON_CN23XX_VF(oct))
   1115				snprintf(&queue_irq_names[IRQ_NAME_OFF(i)],
   1116					 INTRNAMSIZ, "LiquidIO%u-vf%u-rxtx-%u",
   1117					 oct->octeon_id, oct->vf_num, i);
   1118
   1119			irqret = request_irq(msix_entries[i].vector,
   1120					     liquidio_msix_intr_handler, 0,
   1121					     &queue_irq_names[IRQ_NAME_OFF(i)],
   1122					     &oct->ioq_vector[i]);
   1123
   1124			if (irqret) {
   1125				dev_err(&oct->pci_dev->dev,
   1126					"Request_irq failed for MSIX interrupt Error: %d\n",
   1127					irqret);
   1128				/* Freeing the non-ioq irq vector here . */
   1129				free_irq(msix_entries[num_ioq_vectors].vector,
   1130					 oct);
   1131
   1132				while (i) {
   1133					i--;
   1134					/* clearing affinity mask. */
   1135					irq_set_affinity_hint(
   1136						      msix_entries[i].vector,
   1137						      NULL);
   1138					free_irq(msix_entries[i].vector,
   1139						 &oct->ioq_vector[i]);
   1140				}
   1141				pci_disable_msix(oct->pci_dev);
   1142				kfree(oct->msix_entries);
   1143				kfree(oct->irq_name_storage);
   1144				oct->irq_name_storage = NULL;
   1145				oct->msix_entries = NULL;
   1146				return irqret;
   1147			}
   1148			oct->ioq_vector[i].vector = msix_entries[i].vector;
   1149			/* assign the cpu mask for this msix interrupt vector */
   1150			irq_set_affinity_hint(msix_entries[i].vector,
   1151					      &oct->ioq_vector[i].affinity_mask
   1152					      );
   1153		}
   1154		dev_dbg(&oct->pci_dev->dev, "OCTEON[%d]: MSI-X enabled\n",
   1155			oct->octeon_id);
   1156	} else {
   1157		err = pci_enable_msi(oct->pci_dev);
   1158		if (err)
   1159			dev_warn(&oct->pci_dev->dev, "Reverting to legacy interrupts. Error: %d\n",
   1160				 err);
   1161		else
   1162			oct->flags |= LIO_FLAG_MSI_ENABLED;
   1163
   1164		/* allocate storage for the names assigned to the irq */
   1165		oct->irq_name_storage = kzalloc(INTRNAMSIZ, GFP_KERNEL);
   1166		if (!oct->irq_name_storage)
   1167			return -ENOMEM;
   1168
   1169		queue_irq_names = oct->irq_name_storage;
   1170
   1171		if (OCTEON_CN23XX_PF(oct))
   1172			snprintf(&queue_irq_names[IRQ_NAME_OFF(0)], INTRNAMSIZ,
   1173				 "LiquidIO%u-pf%u-rxtx-%u",
   1174				 oct->octeon_id, oct->pf_num, 0);
   1175
   1176		if (OCTEON_CN23XX_VF(oct))
   1177			snprintf(&queue_irq_names[IRQ_NAME_OFF(0)], INTRNAMSIZ,
   1178				 "LiquidIO%u-vf%u-rxtx-%u",
   1179				 oct->octeon_id, oct->vf_num, 0);
   1180
   1181		irqret = request_irq(oct->pci_dev->irq,
   1182				     liquidio_legacy_intr_handler,
   1183				     IRQF_SHARED,
   1184				     &queue_irq_names[IRQ_NAME_OFF(0)], oct);
   1185		if (irqret) {
   1186			if (oct->flags & LIO_FLAG_MSI_ENABLED)
   1187				pci_disable_msi(oct->pci_dev);
   1188			dev_err(&oct->pci_dev->dev, "Request IRQ failed with code: %d\n",
   1189				irqret);
   1190			kfree(oct->irq_name_storage);
   1191			oct->irq_name_storage = NULL;
   1192			return irqret;
   1193		}
   1194	}
   1195	return 0;
   1196}
   1197
   1198/**
   1199 * liquidio_change_mtu - Net device change_mtu
   1200 * @netdev: network device
   1201 * @new_mtu: the new max transmit unit size
   1202 */
   1203int liquidio_change_mtu(struct net_device *netdev, int new_mtu)
   1204{
   1205	struct lio *lio = GET_LIO(netdev);
   1206	struct octeon_device *oct = lio->oct_dev;
   1207	struct octeon_soft_command *sc;
   1208	union octnet_cmd *ncmd;
   1209	int ret = 0;
   1210
   1211	sc = (struct octeon_soft_command *)
   1212		octeon_alloc_soft_command(oct, OCTNET_CMD_SIZE, 16, 0);
   1213	if (!sc) {
   1214		netif_info(lio, rx_err, lio->netdev,
   1215			   "Failed to allocate soft command\n");
   1216		return -ENOMEM;
   1217	}
   1218
   1219	ncmd = (union octnet_cmd *)sc->virtdptr;
   1220
   1221	init_completion(&sc->complete);
   1222	sc->sc_status = OCTEON_REQUEST_PENDING;
   1223
   1224	ncmd->u64 = 0;
   1225	ncmd->s.cmd = OCTNET_CMD_CHANGE_MTU;
   1226	ncmd->s.param1 = new_mtu;
   1227
   1228	octeon_swap_8B_data((u64 *)ncmd, (OCTNET_CMD_SIZE >> 3));
   1229
   1230	sc->iq_no = lio->linfo.txpciq[0].s.q_no;
   1231
   1232	octeon_prepare_soft_command(oct, sc, OPCODE_NIC,
   1233				    OPCODE_NIC_CMD, 0, 0, 0);
   1234
   1235	ret = octeon_send_soft_command(oct, sc);
   1236	if (ret == IQ_SEND_FAILED) {
   1237		netif_info(lio, rx_err, lio->netdev, "Failed to change MTU\n");
   1238		octeon_free_soft_command(oct, sc);
   1239		return -EINVAL;
   1240	}
   1241	/* Sleep on a wait queue till the cond flag indicates that the
   1242	 * response arrived or timed-out.
   1243	 */
   1244	ret = wait_for_sc_completion_timeout(oct, sc, 0);
   1245	if (ret)
   1246		return ret;
   1247
   1248	if (sc->sc_status) {
   1249		WRITE_ONCE(sc->caller_is_done, true);
   1250		return -EINVAL;
   1251	}
   1252
   1253	netdev->mtu = new_mtu;
   1254	lio->mtu = new_mtu;
   1255
   1256	WRITE_ONCE(sc->caller_is_done, true);
   1257	return 0;
   1258}
   1259
   1260int lio_wait_for_clean_oq(struct octeon_device *oct)
   1261{
   1262	int retry = 100, pending_pkts = 0;
   1263	int idx;
   1264
   1265	do {
   1266		pending_pkts = 0;
   1267
   1268		for (idx = 0; idx < MAX_OCTEON_OUTPUT_QUEUES(oct); idx++) {
   1269			if (!(oct->io_qmask.oq & BIT_ULL(idx)))
   1270				continue;
   1271			pending_pkts +=
   1272				atomic_read(&oct->droq[idx]->pkts_pending);
   1273		}
   1274
   1275		if (pending_pkts > 0)
   1276			schedule_timeout_uninterruptible(1);
   1277
   1278	} while (retry-- && pending_pkts);
   1279
   1280	return pending_pkts;
   1281}
   1282
   1283static void
   1284octnet_nic_stats_callback(struct octeon_device *oct_dev,
   1285			  u32 status, void *ptr)
   1286{
   1287	struct octeon_soft_command *sc = (struct octeon_soft_command *)ptr;
   1288	struct oct_nic_stats_resp *resp =
   1289	    (struct oct_nic_stats_resp *)sc->virtrptr;
   1290	struct nic_rx_stats *rsp_rstats = &resp->stats.fromwire;
   1291	struct nic_tx_stats *rsp_tstats = &resp->stats.fromhost;
   1292	struct nic_rx_stats *rstats = &oct_dev->link_stats.fromwire;
   1293	struct nic_tx_stats *tstats = &oct_dev->link_stats.fromhost;
   1294
   1295	if (status != OCTEON_REQUEST_TIMEOUT && !resp->status) {
   1296		octeon_swap_8B_data((u64 *)&resp->stats,
   1297				    (sizeof(struct oct_link_stats)) >> 3);
   1298
   1299		/* RX link-level stats */
   1300		rstats->total_rcvd = rsp_rstats->total_rcvd;
   1301		rstats->bytes_rcvd = rsp_rstats->bytes_rcvd;
   1302		rstats->total_bcst = rsp_rstats->total_bcst;
   1303		rstats->total_mcst = rsp_rstats->total_mcst;
   1304		rstats->runts      = rsp_rstats->runts;
   1305		rstats->ctl_rcvd   = rsp_rstats->ctl_rcvd;
   1306		/* Accounts for over/under-run of buffers */
   1307		rstats->fifo_err  = rsp_rstats->fifo_err;
   1308		rstats->dmac_drop = rsp_rstats->dmac_drop;
   1309		rstats->fcs_err   = rsp_rstats->fcs_err;
   1310		rstats->jabber_err = rsp_rstats->jabber_err;
   1311		rstats->l2_err    = rsp_rstats->l2_err;
   1312		rstats->frame_err = rsp_rstats->frame_err;
   1313		rstats->red_drops = rsp_rstats->red_drops;
   1314
   1315		/* RX firmware stats */
   1316		rstats->fw_total_rcvd = rsp_rstats->fw_total_rcvd;
   1317		rstats->fw_total_fwd = rsp_rstats->fw_total_fwd;
   1318		rstats->fw_total_mcast = rsp_rstats->fw_total_mcast;
   1319		rstats->fw_total_bcast = rsp_rstats->fw_total_bcast;
   1320		rstats->fw_err_pko = rsp_rstats->fw_err_pko;
   1321		rstats->fw_err_link = rsp_rstats->fw_err_link;
   1322		rstats->fw_err_drop = rsp_rstats->fw_err_drop;
   1323		rstats->fw_rx_vxlan = rsp_rstats->fw_rx_vxlan;
   1324		rstats->fw_rx_vxlan_err = rsp_rstats->fw_rx_vxlan_err;
   1325
   1326		/* Number of packets that are LROed      */
   1327		rstats->fw_lro_pkts = rsp_rstats->fw_lro_pkts;
   1328		/* Number of octets that are LROed       */
   1329		rstats->fw_lro_octs = rsp_rstats->fw_lro_octs;
   1330		/* Number of LRO packets formed          */
   1331		rstats->fw_total_lro = rsp_rstats->fw_total_lro;
   1332		/* Number of times lRO of packet aborted */
   1333		rstats->fw_lro_aborts = rsp_rstats->fw_lro_aborts;
   1334		rstats->fw_lro_aborts_port = rsp_rstats->fw_lro_aborts_port;
   1335		rstats->fw_lro_aborts_seq = rsp_rstats->fw_lro_aborts_seq;
   1336		rstats->fw_lro_aborts_tsval = rsp_rstats->fw_lro_aborts_tsval;
   1337		rstats->fw_lro_aborts_timer = rsp_rstats->fw_lro_aborts_timer;
   1338		/* intrmod: packet forward rate */
   1339		rstats->fwd_rate = rsp_rstats->fwd_rate;
   1340
   1341		/* TX link-level stats */
   1342		tstats->total_pkts_sent = rsp_tstats->total_pkts_sent;
   1343		tstats->total_bytes_sent = rsp_tstats->total_bytes_sent;
   1344		tstats->mcast_pkts_sent = rsp_tstats->mcast_pkts_sent;
   1345		tstats->bcast_pkts_sent = rsp_tstats->bcast_pkts_sent;
   1346		tstats->ctl_sent = rsp_tstats->ctl_sent;
   1347		/* Packets sent after one collision*/
   1348		tstats->one_collision_sent = rsp_tstats->one_collision_sent;
   1349		/* Packets sent after multiple collision*/
   1350		tstats->multi_collision_sent = rsp_tstats->multi_collision_sent;
   1351		/* Packets not sent due to max collisions */
   1352		tstats->max_collision_fail = rsp_tstats->max_collision_fail;
   1353		/* Packets not sent due to max deferrals */
   1354		tstats->max_deferral_fail = rsp_tstats->max_deferral_fail;
   1355		/* Accounts for over/under-run of buffers */
   1356		tstats->fifo_err = rsp_tstats->fifo_err;
   1357		tstats->runts = rsp_tstats->runts;
   1358		/* Total number of collisions detected */
   1359		tstats->total_collisions = rsp_tstats->total_collisions;
   1360
   1361		/* firmware stats */
   1362		tstats->fw_total_sent = rsp_tstats->fw_total_sent;
   1363		tstats->fw_total_fwd = rsp_tstats->fw_total_fwd;
   1364		tstats->fw_total_mcast_sent = rsp_tstats->fw_total_mcast_sent;
   1365		tstats->fw_total_bcast_sent = rsp_tstats->fw_total_bcast_sent;
   1366		tstats->fw_err_pko = rsp_tstats->fw_err_pko;
   1367		tstats->fw_err_pki = rsp_tstats->fw_err_pki;
   1368		tstats->fw_err_link = rsp_tstats->fw_err_link;
   1369		tstats->fw_err_drop = rsp_tstats->fw_err_drop;
   1370		tstats->fw_tso = rsp_tstats->fw_tso;
   1371		tstats->fw_tso_fwd = rsp_tstats->fw_tso_fwd;
   1372		tstats->fw_err_tso = rsp_tstats->fw_err_tso;
   1373		tstats->fw_tx_vxlan = rsp_tstats->fw_tx_vxlan;
   1374
   1375		resp->status = 1;
   1376	} else {
   1377		dev_err(&oct_dev->pci_dev->dev, "sc OPCODE_NIC_PORT_STATS command failed\n");
   1378		resp->status = -1;
   1379	}
   1380}
   1381
   1382static int lio_fetch_vf_stats(struct lio *lio)
   1383{
   1384	struct octeon_device *oct_dev = lio->oct_dev;
   1385	struct octeon_soft_command *sc;
   1386	struct oct_nic_vf_stats_resp *resp;
   1387
   1388	int retval;
   1389
   1390	/* Alloc soft command */
   1391	sc = (struct octeon_soft_command *)
   1392		octeon_alloc_soft_command(oct_dev,
   1393					  0,
   1394					  sizeof(struct oct_nic_vf_stats_resp),
   1395					  0);
   1396
   1397	if (!sc) {
   1398		dev_err(&oct_dev->pci_dev->dev, "Soft command allocation failed\n");
   1399		retval = -ENOMEM;
   1400		goto lio_fetch_vf_stats_exit;
   1401	}
   1402
   1403	resp = (struct oct_nic_vf_stats_resp *)sc->virtrptr;
   1404	memset(resp, 0, sizeof(struct oct_nic_vf_stats_resp));
   1405
   1406	init_completion(&sc->complete);
   1407	sc->sc_status = OCTEON_REQUEST_PENDING;
   1408
   1409	sc->iq_no = lio->linfo.txpciq[0].s.q_no;
   1410
   1411	octeon_prepare_soft_command(oct_dev, sc, OPCODE_NIC,
   1412				    OPCODE_NIC_VF_PORT_STATS, 0, 0, 0);
   1413
   1414	retval = octeon_send_soft_command(oct_dev, sc);
   1415	if (retval == IQ_SEND_FAILED) {
   1416		octeon_free_soft_command(oct_dev, sc);
   1417		goto lio_fetch_vf_stats_exit;
   1418	}
   1419
   1420	retval =
   1421		wait_for_sc_completion_timeout(oct_dev, sc,
   1422					       (2 * LIO_SC_MAX_TMO_MS));
   1423	if (retval)  {
   1424		dev_err(&oct_dev->pci_dev->dev,
   1425			"sc OPCODE_NIC_VF_PORT_STATS command failed\n");
   1426		goto lio_fetch_vf_stats_exit;
   1427	}
   1428
   1429	if (sc->sc_status != OCTEON_REQUEST_TIMEOUT && !resp->status) {
   1430		octeon_swap_8B_data((u64 *)&resp->spoofmac_cnt,
   1431				    (sizeof(u64)) >> 3);
   1432
   1433		if (resp->spoofmac_cnt != 0) {
   1434			dev_warn(&oct_dev->pci_dev->dev,
   1435				 "%llu Spoofed packets detected\n",
   1436				 resp->spoofmac_cnt);
   1437		}
   1438	}
   1439	WRITE_ONCE(sc->caller_is_done, 1);
   1440
   1441lio_fetch_vf_stats_exit:
   1442	return retval;
   1443}
   1444
   1445void lio_fetch_stats(struct work_struct *work)
   1446{
   1447	struct cavium_wk *wk = (struct cavium_wk *)work;
   1448	struct lio *lio = wk->ctxptr;
   1449	struct octeon_device *oct_dev = lio->oct_dev;
   1450	struct octeon_soft_command *sc;
   1451	struct oct_nic_stats_resp *resp;
   1452	unsigned long time_in_jiffies;
   1453	int retval;
   1454
   1455	if (OCTEON_CN23XX_PF(oct_dev)) {
   1456		/* report spoofchk every 2 seconds */
   1457		if (!(oct_dev->vfstats_poll % LIO_VFSTATS_POLL) &&
   1458		    (oct_dev->fw_info.app_cap_flags & LIQUIDIO_SPOOFCHK_CAP) &&
   1459		    oct_dev->sriov_info.num_vfs_alloced) {
   1460			lio_fetch_vf_stats(lio);
   1461		}
   1462
   1463		oct_dev->vfstats_poll++;
   1464	}
   1465
   1466	/* Alloc soft command */
   1467	sc = (struct octeon_soft_command *)
   1468		octeon_alloc_soft_command(oct_dev,
   1469					  0,
   1470					  sizeof(struct oct_nic_stats_resp),
   1471					  0);
   1472
   1473	if (!sc) {
   1474		dev_err(&oct_dev->pci_dev->dev, "Soft command allocation failed\n");
   1475		goto lio_fetch_stats_exit;
   1476	}
   1477
   1478	resp = (struct oct_nic_stats_resp *)sc->virtrptr;
   1479	memset(resp, 0, sizeof(struct oct_nic_stats_resp));
   1480
   1481	init_completion(&sc->complete);
   1482	sc->sc_status = OCTEON_REQUEST_PENDING;
   1483
   1484	sc->iq_no = lio->linfo.txpciq[0].s.q_no;
   1485
   1486	octeon_prepare_soft_command(oct_dev, sc, OPCODE_NIC,
   1487				    OPCODE_NIC_PORT_STATS, 0, 0, 0);
   1488
   1489	retval = octeon_send_soft_command(oct_dev, sc);
   1490	if (retval == IQ_SEND_FAILED) {
   1491		octeon_free_soft_command(oct_dev, sc);
   1492		goto lio_fetch_stats_exit;
   1493	}
   1494
   1495	retval = wait_for_sc_completion_timeout(oct_dev, sc,
   1496						(2 * LIO_SC_MAX_TMO_MS));
   1497	if (retval)  {
   1498		dev_err(&oct_dev->pci_dev->dev, "sc OPCODE_NIC_PORT_STATS command failed\n");
   1499		goto lio_fetch_stats_exit;
   1500	}
   1501
   1502	octnet_nic_stats_callback(oct_dev, sc->sc_status, sc);
   1503	WRITE_ONCE(sc->caller_is_done, true);
   1504
   1505lio_fetch_stats_exit:
   1506	time_in_jiffies = msecs_to_jiffies(LIQUIDIO_NDEV_STATS_POLL_TIME_MS);
   1507	if (ifstate_check(lio, LIO_IFSTATE_RUNNING))
   1508		schedule_delayed_work(&lio->stats_wk.work, time_in_jiffies);
   1509
   1510	return;
   1511}
   1512
   1513int liquidio_set_speed(struct lio *lio, int speed)
   1514{
   1515	struct octeon_device *oct = lio->oct_dev;
   1516	struct oct_nic_seapi_resp *resp;
   1517	struct octeon_soft_command *sc;
   1518	union octnet_cmd *ncmd;
   1519	int retval;
   1520	u32 var;
   1521
   1522	if (oct->speed_setting == speed)
   1523		return 0;
   1524
   1525	if (!OCTEON_CN23XX_PF(oct)) {
   1526		dev_err(&oct->pci_dev->dev, "%s: SET SPEED only for PF\n",
   1527			__func__);
   1528		return -EOPNOTSUPP;
   1529	}
   1530
   1531	sc = octeon_alloc_soft_command(oct, OCTNET_CMD_SIZE,
   1532				       sizeof(struct oct_nic_seapi_resp),
   1533				       0);
   1534	if (!sc)
   1535		return -ENOMEM;
   1536
   1537	ncmd = sc->virtdptr;
   1538	resp = sc->virtrptr;
   1539	memset(resp, 0, sizeof(struct oct_nic_seapi_resp));
   1540
   1541	init_completion(&sc->complete);
   1542	sc->sc_status = OCTEON_REQUEST_PENDING;
   1543
   1544	ncmd->u64 = 0;
   1545	ncmd->s.cmd = SEAPI_CMD_SPEED_SET;
   1546	ncmd->s.param1 = speed;
   1547
   1548	octeon_swap_8B_data((u64 *)ncmd, (OCTNET_CMD_SIZE >> 3));
   1549
   1550	sc->iq_no = lio->linfo.txpciq[0].s.q_no;
   1551
   1552	octeon_prepare_soft_command(oct, sc, OPCODE_NIC,
   1553				    OPCODE_NIC_UBOOT_CTL, 0, 0, 0);
   1554
   1555	retval = octeon_send_soft_command(oct, sc);
   1556	if (retval == IQ_SEND_FAILED) {
   1557		dev_info(&oct->pci_dev->dev, "Failed to send soft command\n");
   1558		octeon_free_soft_command(oct, sc);
   1559		retval = -EBUSY;
   1560	} else {
   1561		/* Wait for response or timeout */
   1562		retval = wait_for_sc_completion_timeout(oct, sc, 0);
   1563		if (retval)
   1564			return retval;
   1565
   1566		retval = resp->status;
   1567
   1568		if (retval) {
   1569			dev_err(&oct->pci_dev->dev, "%s failed, retval=%d\n",
   1570				__func__, retval);
   1571			WRITE_ONCE(sc->caller_is_done, true);
   1572
   1573			return -EIO;
   1574		}
   1575
   1576		var = be32_to_cpu((__force __be32)resp->speed);
   1577		if (var != speed) {
   1578			dev_err(&oct->pci_dev->dev,
   1579				"%s: setting failed speed= %x, expect %x\n",
   1580				__func__, var, speed);
   1581		}
   1582
   1583		oct->speed_setting = var;
   1584		WRITE_ONCE(sc->caller_is_done, true);
   1585	}
   1586
   1587	return retval;
   1588}
   1589
   1590int liquidio_get_speed(struct lio *lio)
   1591{
   1592	struct octeon_device *oct = lio->oct_dev;
   1593	struct oct_nic_seapi_resp *resp;
   1594	struct octeon_soft_command *sc;
   1595	union octnet_cmd *ncmd;
   1596	int retval;
   1597
   1598	sc = octeon_alloc_soft_command(oct, OCTNET_CMD_SIZE,
   1599				       sizeof(struct oct_nic_seapi_resp),
   1600				       0);
   1601	if (!sc)
   1602		return -ENOMEM;
   1603
   1604	ncmd = sc->virtdptr;
   1605	resp = sc->virtrptr;
   1606	memset(resp, 0, sizeof(struct oct_nic_seapi_resp));
   1607
   1608	init_completion(&sc->complete);
   1609	sc->sc_status = OCTEON_REQUEST_PENDING;
   1610
   1611	ncmd->u64 = 0;
   1612	ncmd->s.cmd = SEAPI_CMD_SPEED_GET;
   1613
   1614	octeon_swap_8B_data((u64 *)ncmd, (OCTNET_CMD_SIZE >> 3));
   1615
   1616	sc->iq_no = lio->linfo.txpciq[0].s.q_no;
   1617
   1618	octeon_prepare_soft_command(oct, sc, OPCODE_NIC,
   1619				    OPCODE_NIC_UBOOT_CTL, 0, 0, 0);
   1620
   1621	retval = octeon_send_soft_command(oct, sc);
   1622	if (retval == IQ_SEND_FAILED) {
   1623		dev_info(&oct->pci_dev->dev, "Failed to send soft command\n");
   1624		octeon_free_soft_command(oct, sc);
   1625		retval = -EIO;
   1626	} else {
   1627		retval = wait_for_sc_completion_timeout(oct, sc, 0);
   1628		if (retval)
   1629			return retval;
   1630
   1631		retval = resp->status;
   1632		if (retval) {
   1633			dev_err(&oct->pci_dev->dev,
   1634				"%s failed retval=%d\n", __func__, retval);
   1635			retval = -EIO;
   1636		} else {
   1637			u32 var;
   1638
   1639			var = be32_to_cpu((__force __be32)resp->speed);
   1640			oct->speed_setting = var;
   1641			if (var == 0xffff) {
   1642				/* unable to access boot variables
   1643				 * get the default value based on the NIC type
   1644				 */
   1645				if (oct->subsystem_id ==
   1646						OCTEON_CN2350_25GB_SUBSYS_ID ||
   1647				    oct->subsystem_id ==
   1648						OCTEON_CN2360_25GB_SUBSYS_ID) {
   1649					oct->no_speed_setting = 1;
   1650					oct->speed_setting = 25;
   1651				} else {
   1652					oct->speed_setting = 10;
   1653				}
   1654			}
   1655
   1656		}
   1657		WRITE_ONCE(sc->caller_is_done, true);
   1658	}
   1659
   1660	return retval;
   1661}
   1662
   1663int liquidio_set_fec(struct lio *lio, int on_off)
   1664{
   1665	struct oct_nic_seapi_resp *resp;
   1666	struct octeon_soft_command *sc;
   1667	struct octeon_device *oct;
   1668	union octnet_cmd *ncmd;
   1669	int retval;
   1670	u32 var;
   1671
   1672	oct = lio->oct_dev;
   1673
   1674	if (oct->props[lio->ifidx].fec == on_off)
   1675		return 0;
   1676
   1677	if (!OCTEON_CN23XX_PF(oct)) {
   1678		dev_err(&oct->pci_dev->dev, "%s: SET FEC only for PF\n",
   1679			__func__);
   1680		return -1;
   1681	}
   1682
   1683	if (oct->speed_boot != 25)  {
   1684		dev_err(&oct->pci_dev->dev,
   1685			"Set FEC only when link speed is 25G during insmod\n");
   1686		return -1;
   1687	}
   1688
   1689	sc = octeon_alloc_soft_command(oct, OCTNET_CMD_SIZE,
   1690				       sizeof(struct oct_nic_seapi_resp), 0);
   1691	if (!sc) {
   1692		dev_err(&oct->pci_dev->dev,
   1693			"Failed to allocate soft command\n");
   1694		return -ENOMEM;
   1695	}
   1696
   1697	ncmd = sc->virtdptr;
   1698	resp = sc->virtrptr;
   1699	memset(resp, 0, sizeof(struct oct_nic_seapi_resp));
   1700
   1701	init_completion(&sc->complete);
   1702	sc->sc_status = OCTEON_REQUEST_PENDING;
   1703
   1704	ncmd->u64 = 0;
   1705	ncmd->s.cmd = SEAPI_CMD_FEC_SET;
   1706	ncmd->s.param1 = on_off;
   1707	/* SEAPI_CMD_FEC_DISABLE(0) or SEAPI_CMD_FEC_RS(1) */
   1708
   1709	octeon_swap_8B_data((u64 *)ncmd, (OCTNET_CMD_SIZE >> 3));
   1710
   1711	sc->iq_no = lio->linfo.txpciq[0].s.q_no;
   1712
   1713	octeon_prepare_soft_command(oct, sc, OPCODE_NIC,
   1714				    OPCODE_NIC_UBOOT_CTL, 0, 0, 0);
   1715
   1716	retval = octeon_send_soft_command(oct, sc);
   1717	if (retval == IQ_SEND_FAILED) {
   1718		dev_info(&oct->pci_dev->dev, "Failed to send soft command\n");
   1719		octeon_free_soft_command(oct, sc);
   1720		return -EIO;
   1721	}
   1722
   1723	retval = wait_for_sc_completion_timeout(oct, sc, 0);
   1724	if (retval)
   1725		return (-EIO);
   1726
   1727	var = be32_to_cpu(resp->fec_setting);
   1728	resp->fec_setting = var;
   1729	if (var != on_off) {
   1730		dev_err(&oct->pci_dev->dev,
   1731			"Setting failed fec= %x, expect %x\n",
   1732			var, on_off);
   1733		oct->props[lio->ifidx].fec = var;
   1734		if (resp->fec_setting == SEAPI_CMD_FEC_SET_RS)
   1735			oct->props[lio->ifidx].fec = 1;
   1736		else
   1737			oct->props[lio->ifidx].fec = 0;
   1738	}
   1739
   1740	WRITE_ONCE(sc->caller_is_done, true);
   1741
   1742	if (oct->props[lio->ifidx].fec !=
   1743	    oct->props[lio->ifidx].fec_boot) {
   1744		dev_dbg(&oct->pci_dev->dev,
   1745			"Reload driver to change fec to %s\n",
   1746			oct->props[lio->ifidx].fec ? "on" : "off");
   1747	}
   1748
   1749	return retval;
   1750}
   1751
   1752int liquidio_get_fec(struct lio *lio)
   1753{
   1754	struct oct_nic_seapi_resp *resp;
   1755	struct octeon_soft_command *sc;
   1756	struct octeon_device *oct;
   1757	union octnet_cmd *ncmd;
   1758	int retval;
   1759	u32 var;
   1760
   1761	oct = lio->oct_dev;
   1762
   1763	sc = octeon_alloc_soft_command(oct, OCTNET_CMD_SIZE,
   1764				       sizeof(struct oct_nic_seapi_resp), 0);
   1765	if (!sc)
   1766		return -ENOMEM;
   1767
   1768	ncmd = sc->virtdptr;
   1769	resp = sc->virtrptr;
   1770	memset(resp, 0, sizeof(struct oct_nic_seapi_resp));
   1771
   1772	init_completion(&sc->complete);
   1773	sc->sc_status = OCTEON_REQUEST_PENDING;
   1774
   1775	ncmd->u64 = 0;
   1776	ncmd->s.cmd = SEAPI_CMD_FEC_GET;
   1777
   1778	octeon_swap_8B_data((u64 *)ncmd, (OCTNET_CMD_SIZE >> 3));
   1779
   1780	sc->iq_no = lio->linfo.txpciq[0].s.q_no;
   1781
   1782	octeon_prepare_soft_command(oct, sc, OPCODE_NIC,
   1783				    OPCODE_NIC_UBOOT_CTL, 0, 0, 0);
   1784
   1785	retval = octeon_send_soft_command(oct, sc);
   1786	if (retval == IQ_SEND_FAILED) {
   1787		dev_info(&oct->pci_dev->dev,
   1788			 "%s: Failed to send soft command\n", __func__);
   1789		octeon_free_soft_command(oct, sc);
   1790		return -EIO;
   1791	}
   1792
   1793	retval = wait_for_sc_completion_timeout(oct, sc, 0);
   1794	if (retval)
   1795		return retval;
   1796
   1797	var = be32_to_cpu(resp->fec_setting);
   1798	resp->fec_setting = var;
   1799	if (resp->fec_setting == SEAPI_CMD_FEC_SET_RS)
   1800		oct->props[lio->ifidx].fec = 1;
   1801	else
   1802		oct->props[lio->ifidx].fec = 0;
   1803
   1804	WRITE_ONCE(sc->caller_is_done, true);
   1805
   1806	if (oct->props[lio->ifidx].fec !=
   1807	    oct->props[lio->ifidx].fec_boot) {
   1808		dev_dbg(&oct->pci_dev->dev,
   1809			"Reload driver to change fec to %s\n",
   1810			oct->props[lio->ifidx].fec ? "on" : "off");
   1811	}
   1812
   1813	return retval;
   1814}