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_vf_rep.c (16680B)


      1/**********************************************************************
      2 * Author: Cavium, Inc.
      3 *
      4 * Contact: support@cavium.com
      5 *          Please include "LiquidIO" in the subject.
      6 *
      7 * Copyright (c) 2003-2017 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#include "lio_vf_rep.h"
     29
     30static int lio_vf_rep_open(struct net_device *ndev);
     31static int lio_vf_rep_stop(struct net_device *ndev);
     32static netdev_tx_t lio_vf_rep_pkt_xmit(struct sk_buff *skb,
     33				       struct net_device *ndev);
     34static void lio_vf_rep_tx_timeout(struct net_device *netdev, unsigned int txqueue);
     35static int lio_vf_rep_phys_port_name(struct net_device *dev,
     36				     char *buf, size_t len);
     37static void lio_vf_rep_get_stats64(struct net_device *dev,
     38				   struct rtnl_link_stats64 *stats64);
     39static int lio_vf_rep_change_mtu(struct net_device *ndev, int new_mtu);
     40static int lio_vf_get_port_parent_id(struct net_device *dev,
     41				     struct netdev_phys_item_id *ppid);
     42
     43static const struct net_device_ops lio_vf_rep_ndev_ops = {
     44	.ndo_open = lio_vf_rep_open,
     45	.ndo_stop = lio_vf_rep_stop,
     46	.ndo_start_xmit = lio_vf_rep_pkt_xmit,
     47	.ndo_tx_timeout = lio_vf_rep_tx_timeout,
     48	.ndo_get_phys_port_name = lio_vf_rep_phys_port_name,
     49	.ndo_get_stats64 = lio_vf_rep_get_stats64,
     50	.ndo_change_mtu = lio_vf_rep_change_mtu,
     51	.ndo_get_port_parent_id = lio_vf_get_port_parent_id,
     52};
     53
     54static int
     55lio_vf_rep_send_soft_command(struct octeon_device *oct,
     56			     void *req, int req_size,
     57			     void *resp, int resp_size)
     58{
     59	int tot_resp_size = sizeof(struct lio_vf_rep_resp) + resp_size;
     60	struct octeon_soft_command *sc = NULL;
     61	struct lio_vf_rep_resp *rep_resp;
     62	void *sc_req;
     63	int err;
     64
     65	sc = (struct octeon_soft_command *)
     66		octeon_alloc_soft_command(oct, req_size,
     67					  tot_resp_size, 0);
     68	if (!sc)
     69		return -ENOMEM;
     70
     71	init_completion(&sc->complete);
     72	sc->sc_status = OCTEON_REQUEST_PENDING;
     73
     74	sc_req = (struct lio_vf_rep_req *)sc->virtdptr;
     75	memcpy(sc_req, req, req_size);
     76
     77	rep_resp = (struct lio_vf_rep_resp *)sc->virtrptr;
     78	memset(rep_resp, 0, tot_resp_size);
     79	WRITE_ONCE(rep_resp->status, 1);
     80
     81	sc->iq_no = 0;
     82	octeon_prepare_soft_command(oct, sc, OPCODE_NIC,
     83				    OPCODE_NIC_VF_REP_CMD, 0, 0, 0);
     84
     85	err = octeon_send_soft_command(oct, sc);
     86	if (err == IQ_SEND_FAILED)
     87		goto free_buff;
     88
     89	err = wait_for_sc_completion_timeout(oct, sc, 0);
     90	if (err)
     91		return err;
     92
     93	err = READ_ONCE(rep_resp->status) ? -EBUSY : 0;
     94	if (err)
     95		dev_err(&oct->pci_dev->dev, "VF rep send config failed\n");
     96	else if (resp)
     97		memcpy(resp, (rep_resp + 1), resp_size);
     98
     99	WRITE_ONCE(sc->caller_is_done, true);
    100	return err;
    101
    102free_buff:
    103	octeon_free_soft_command(oct, sc);
    104
    105	return err;
    106}
    107
    108static int
    109lio_vf_rep_open(struct net_device *ndev)
    110{
    111	struct lio_vf_rep_desc *vf_rep = netdev_priv(ndev);
    112	struct lio_vf_rep_req rep_cfg;
    113	struct octeon_device *oct;
    114	int ret;
    115
    116	oct = vf_rep->oct;
    117
    118	memset(&rep_cfg, 0, sizeof(rep_cfg));
    119	rep_cfg.req_type = LIO_VF_REP_REQ_STATE;
    120	rep_cfg.ifidx = vf_rep->ifidx;
    121	rep_cfg.rep_state.state = LIO_VF_REP_STATE_UP;
    122
    123	ret = lio_vf_rep_send_soft_command(oct, &rep_cfg,
    124					   sizeof(rep_cfg), NULL, 0);
    125
    126	if (ret) {
    127		dev_err(&oct->pci_dev->dev,
    128			"VF_REP open failed with err %d\n", ret);
    129		return -EIO;
    130	}
    131
    132	atomic_set(&vf_rep->ifstate, (atomic_read(&vf_rep->ifstate) |
    133				      LIO_IFSTATE_RUNNING));
    134
    135	netif_carrier_on(ndev);
    136	netif_start_queue(ndev);
    137
    138	return 0;
    139}
    140
    141static int
    142lio_vf_rep_stop(struct net_device *ndev)
    143{
    144	struct lio_vf_rep_desc *vf_rep = netdev_priv(ndev);
    145	struct lio_vf_rep_req rep_cfg;
    146	struct octeon_device *oct;
    147	int ret;
    148
    149	oct = vf_rep->oct;
    150
    151	memset(&rep_cfg, 0, sizeof(rep_cfg));
    152	rep_cfg.req_type = LIO_VF_REP_REQ_STATE;
    153	rep_cfg.ifidx = vf_rep->ifidx;
    154	rep_cfg.rep_state.state = LIO_VF_REP_STATE_DOWN;
    155
    156	ret = lio_vf_rep_send_soft_command(oct, &rep_cfg,
    157					   sizeof(rep_cfg), NULL, 0);
    158
    159	if (ret) {
    160		dev_err(&oct->pci_dev->dev,
    161			"VF_REP dev stop failed with err %d\n", ret);
    162		return -EIO;
    163	}
    164
    165	atomic_set(&vf_rep->ifstate, (atomic_read(&vf_rep->ifstate) &
    166				      ~LIO_IFSTATE_RUNNING));
    167
    168	netif_tx_disable(ndev);
    169	netif_carrier_off(ndev);
    170
    171	return 0;
    172}
    173
    174static void
    175lio_vf_rep_tx_timeout(struct net_device *ndev, unsigned int txqueue)
    176{
    177	netif_trans_update(ndev);
    178
    179	netif_wake_queue(ndev);
    180}
    181
    182static void
    183lio_vf_rep_get_stats64(struct net_device *dev,
    184		       struct rtnl_link_stats64 *stats64)
    185{
    186	struct lio_vf_rep_desc *vf_rep = netdev_priv(dev);
    187
    188	/* Swap tx and rx stats as VF rep is a switch port */
    189	stats64->tx_packets = vf_rep->stats.rx_packets;
    190	stats64->tx_bytes   = vf_rep->stats.rx_bytes;
    191	stats64->tx_dropped = vf_rep->stats.rx_dropped;
    192
    193	stats64->rx_packets = vf_rep->stats.tx_packets;
    194	stats64->rx_bytes   = vf_rep->stats.tx_bytes;
    195	stats64->rx_dropped = vf_rep->stats.tx_dropped;
    196}
    197
    198static int
    199lio_vf_rep_change_mtu(struct net_device *ndev, int new_mtu)
    200{
    201	struct lio_vf_rep_desc *vf_rep = netdev_priv(ndev);
    202	struct lio_vf_rep_req rep_cfg;
    203	struct octeon_device *oct;
    204	int ret;
    205
    206	oct = vf_rep->oct;
    207
    208	memset(&rep_cfg, 0, sizeof(rep_cfg));
    209	rep_cfg.req_type = LIO_VF_REP_REQ_MTU;
    210	rep_cfg.ifidx = vf_rep->ifidx;
    211	rep_cfg.rep_mtu.mtu = cpu_to_be32(new_mtu);
    212
    213	ret = lio_vf_rep_send_soft_command(oct, &rep_cfg,
    214					   sizeof(rep_cfg), NULL, 0);
    215	if (ret) {
    216		dev_err(&oct->pci_dev->dev,
    217			"Change MTU failed with err %d\n", ret);
    218		return -EIO;
    219	}
    220
    221	ndev->mtu = new_mtu;
    222
    223	return 0;
    224}
    225
    226static int
    227lio_vf_rep_phys_port_name(struct net_device *dev,
    228			  char *buf, size_t len)
    229{
    230	struct lio_vf_rep_desc *vf_rep = netdev_priv(dev);
    231	struct octeon_device *oct = vf_rep->oct;
    232	int ret;
    233
    234	ret = snprintf(buf, len, "pf%dvf%d", oct->pf_num,
    235		       vf_rep->ifidx - oct->pf_num * 64 - 1);
    236	if (ret >= len)
    237		return -EOPNOTSUPP;
    238
    239	return 0;
    240}
    241
    242static struct net_device *
    243lio_vf_rep_get_ndev(struct octeon_device *oct, int ifidx)
    244{
    245	int vf_id, max_vfs = CN23XX_MAX_VFS_PER_PF + 1;
    246	int vfid_mask = max_vfs - 1;
    247
    248	if (ifidx <= oct->pf_num * max_vfs ||
    249	    ifidx >= oct->pf_num * max_vfs + max_vfs)
    250		return NULL;
    251
    252	/* ifidx 1-63 for PF0 VFs
    253	 * ifidx 65-127 for PF1 VFs
    254	 */
    255	vf_id = (ifidx & vfid_mask) - 1;
    256
    257	return oct->vf_rep_list.ndev[vf_id];
    258}
    259
    260static void
    261lio_vf_rep_copy_packet(struct octeon_device *oct,
    262		       struct sk_buff *skb,
    263		       int len)
    264{
    265	if (likely(len > MIN_SKB_SIZE)) {
    266		struct octeon_skb_page_info *pg_info;
    267		unsigned char *va;
    268
    269		pg_info = ((struct octeon_skb_page_info *)(skb->cb));
    270		if (pg_info->page) {
    271			va = page_address(pg_info->page) +
    272				pg_info->page_offset;
    273			memcpy(skb->data, va, MIN_SKB_SIZE);
    274			skb_put(skb, MIN_SKB_SIZE);
    275		}
    276
    277		skb_add_rx_frag(skb, skb_shinfo(skb)->nr_frags,
    278				pg_info->page,
    279				pg_info->page_offset + MIN_SKB_SIZE,
    280				len - MIN_SKB_SIZE,
    281				LIO_RXBUFFER_SZ);
    282	} else {
    283		struct octeon_skb_page_info *pg_info =
    284			((struct octeon_skb_page_info *)(skb->cb));
    285
    286		skb_copy_to_linear_data(skb, page_address(pg_info->page) +
    287					pg_info->page_offset, len);
    288		skb_put(skb, len);
    289		put_page(pg_info->page);
    290	}
    291}
    292
    293static int
    294lio_vf_rep_pkt_recv(struct octeon_recv_info *recv_info, void *buf)
    295{
    296	struct octeon_recv_pkt *recv_pkt = recv_info->recv_pkt;
    297	struct lio_vf_rep_desc *vf_rep;
    298	struct net_device *vf_ndev;
    299	struct octeon_device *oct;
    300	union octeon_rh *rh;
    301	struct sk_buff *skb;
    302	int i, ifidx;
    303
    304	oct = lio_get_device(recv_pkt->octeon_id);
    305	if (!oct)
    306		goto free_buffers;
    307
    308	skb = recv_pkt->buffer_ptr[0];
    309	rh = &recv_pkt->rh;
    310	ifidx = rh->r.ossp;
    311
    312	vf_ndev = lio_vf_rep_get_ndev(oct, ifidx);
    313	if (!vf_ndev)
    314		goto free_buffers;
    315
    316	vf_rep = netdev_priv(vf_ndev);
    317	if (!(atomic_read(&vf_rep->ifstate) & LIO_IFSTATE_RUNNING) ||
    318	    recv_pkt->buffer_count > 1)
    319		goto free_buffers;
    320
    321	skb->dev = vf_ndev;
    322
    323	/* Multiple buffers are not used for vf_rep packets.
    324	 * So just buffer_size[0] is valid.
    325	 */
    326	lio_vf_rep_copy_packet(oct, skb, recv_pkt->buffer_size[0]);
    327
    328	skb_pull(skb, rh->r_dh.len * BYTES_PER_DHLEN_UNIT);
    329	skb->protocol = eth_type_trans(skb, skb->dev);
    330	skb->ip_summed = CHECKSUM_NONE;
    331
    332	netif_rx(skb);
    333
    334	octeon_free_recv_info(recv_info);
    335
    336	return 0;
    337
    338free_buffers:
    339	for (i = 0; i < recv_pkt->buffer_count; i++)
    340		recv_buffer_free(recv_pkt->buffer_ptr[i]);
    341
    342	octeon_free_recv_info(recv_info);
    343
    344	return 0;
    345}
    346
    347static void
    348lio_vf_rep_packet_sent_callback(struct octeon_device *oct,
    349				u32 status, void *buf)
    350{
    351	struct octeon_soft_command *sc = (struct octeon_soft_command *)buf;
    352	struct sk_buff *skb = sc->ctxptr;
    353	struct net_device *ndev = skb->dev;
    354	u32 iq_no;
    355
    356	dma_unmap_single(&oct->pci_dev->dev, sc->dmadptr,
    357			 sc->datasize, DMA_TO_DEVICE);
    358	dev_kfree_skb_any(skb);
    359	iq_no = sc->iq_no;
    360	octeon_free_soft_command(oct, sc);
    361
    362	if (octnet_iq_is_full(oct, iq_no))
    363		return;
    364
    365	if (netif_queue_stopped(ndev))
    366		netif_wake_queue(ndev);
    367}
    368
    369static netdev_tx_t
    370lio_vf_rep_pkt_xmit(struct sk_buff *skb, struct net_device *ndev)
    371{
    372	struct lio_vf_rep_desc *vf_rep = netdev_priv(ndev);
    373	struct net_device *parent_ndev = vf_rep->parent_ndev;
    374	struct octeon_device *oct = vf_rep->oct;
    375	struct octeon_instr_pki_ih3 *pki_ih3;
    376	struct octeon_soft_command *sc;
    377	struct lio *parent_lio;
    378	int status;
    379
    380	parent_lio = GET_LIO(parent_ndev);
    381
    382	if (!(atomic_read(&vf_rep->ifstate) & LIO_IFSTATE_RUNNING) ||
    383	    skb->len <= 0)
    384		goto xmit_failed;
    385
    386	if (octnet_iq_is_full(vf_rep->oct, parent_lio->txq)) {
    387		dev_err(&oct->pci_dev->dev, "VF rep: Device IQ full\n");
    388		netif_stop_queue(ndev);
    389		return NETDEV_TX_BUSY;
    390	}
    391
    392	sc = (struct octeon_soft_command *)
    393		octeon_alloc_soft_command(oct, 0, 16, 0);
    394	if (!sc) {
    395		dev_err(&oct->pci_dev->dev, "VF rep: Soft command alloc failed\n");
    396		goto xmit_failed;
    397	}
    398
    399	/* Multiple buffers are not used for vf_rep packets. */
    400	if (skb_shinfo(skb)->nr_frags != 0) {
    401		dev_err(&oct->pci_dev->dev, "VF rep: nr_frags != 0. Dropping packet\n");
    402		octeon_free_soft_command(oct, sc);
    403		goto xmit_failed;
    404	}
    405
    406	sc->dmadptr = dma_map_single(&oct->pci_dev->dev,
    407				     skb->data, skb->len, DMA_TO_DEVICE);
    408	if (dma_mapping_error(&oct->pci_dev->dev, sc->dmadptr)) {
    409		dev_err(&oct->pci_dev->dev, "VF rep: DMA mapping failed\n");
    410		octeon_free_soft_command(oct, sc);
    411		goto xmit_failed;
    412	}
    413
    414	sc->virtdptr = skb->data;
    415	sc->datasize = skb->len;
    416	sc->ctxptr = skb;
    417	sc->iq_no = parent_lio->txq;
    418
    419	octeon_prepare_soft_command(oct, sc, OPCODE_NIC, OPCODE_NIC_VF_REP_PKT,
    420				    vf_rep->ifidx, 0, 0);
    421	pki_ih3 = (struct octeon_instr_pki_ih3 *)&sc->cmd.cmd3.pki_ih3;
    422	pki_ih3->tagtype = ORDERED_TAG;
    423
    424	sc->callback = lio_vf_rep_packet_sent_callback;
    425	sc->callback_arg = sc;
    426
    427	status = octeon_send_soft_command(oct, sc);
    428	if (status == IQ_SEND_FAILED) {
    429		dma_unmap_single(&oct->pci_dev->dev, sc->dmadptr,
    430				 sc->datasize, DMA_TO_DEVICE);
    431		octeon_free_soft_command(oct, sc);
    432		goto xmit_failed;
    433	}
    434
    435	if (status == IQ_SEND_STOP)
    436		netif_stop_queue(ndev);
    437
    438	netif_trans_update(ndev);
    439
    440	return NETDEV_TX_OK;
    441
    442xmit_failed:
    443	dev_kfree_skb_any(skb);
    444
    445	return NETDEV_TX_OK;
    446}
    447
    448static int lio_vf_get_port_parent_id(struct net_device *dev,
    449				     struct netdev_phys_item_id *ppid)
    450{
    451	struct lio_vf_rep_desc *vf_rep = netdev_priv(dev);
    452	struct net_device *parent_ndev = vf_rep->parent_ndev;
    453	struct lio *lio = GET_LIO(parent_ndev);
    454
    455	ppid->id_len = ETH_ALEN;
    456	ether_addr_copy(ppid->id, (void *)&lio->linfo.hw_addr + 2);
    457
    458	return 0;
    459}
    460
    461static void
    462lio_vf_rep_fetch_stats(struct work_struct *work)
    463{
    464	struct cavium_wk *wk = (struct cavium_wk *)work;
    465	struct lio_vf_rep_desc *vf_rep = wk->ctxptr;
    466	struct lio_vf_rep_stats stats;
    467	struct lio_vf_rep_req rep_cfg;
    468	struct octeon_device *oct;
    469	int ret;
    470
    471	oct = vf_rep->oct;
    472
    473	memset(&rep_cfg, 0, sizeof(rep_cfg));
    474	rep_cfg.req_type = LIO_VF_REP_REQ_STATS;
    475	rep_cfg.ifidx = vf_rep->ifidx;
    476
    477	ret = lio_vf_rep_send_soft_command(oct, &rep_cfg, sizeof(rep_cfg),
    478					   &stats, sizeof(stats));
    479
    480	if (!ret) {
    481		octeon_swap_8B_data((u64 *)&stats, (sizeof(stats) >> 3));
    482		memcpy(&vf_rep->stats, &stats, sizeof(stats));
    483	}
    484
    485	schedule_delayed_work(&vf_rep->stats_wk.work,
    486			      msecs_to_jiffies(LIO_VF_REP_STATS_POLL_TIME_MS));
    487}
    488
    489int
    490lio_vf_rep_create(struct octeon_device *oct)
    491{
    492	struct lio_vf_rep_desc *vf_rep;
    493	struct net_device *ndev;
    494	int i, num_vfs;
    495
    496	if (oct->eswitch_mode != DEVLINK_ESWITCH_MODE_SWITCHDEV)
    497		return 0;
    498
    499	if (!oct->sriov_info.sriov_enabled)
    500		return 0;
    501
    502	num_vfs = oct->sriov_info.num_vfs_alloced;
    503
    504	oct->vf_rep_list.num_vfs = 0;
    505	for (i = 0; i < num_vfs; i++) {
    506		ndev = alloc_etherdev(sizeof(struct lio_vf_rep_desc));
    507
    508		if (!ndev) {
    509			dev_err(&oct->pci_dev->dev,
    510				"VF rep device %d creation failed\n", i);
    511			goto cleanup;
    512		}
    513
    514		ndev->min_mtu = LIO_MIN_MTU_SIZE;
    515		ndev->max_mtu = LIO_MAX_MTU_SIZE;
    516		ndev->netdev_ops = &lio_vf_rep_ndev_ops;
    517
    518		vf_rep = netdev_priv(ndev);
    519		memset(vf_rep, 0, sizeof(*vf_rep));
    520
    521		vf_rep->ndev = ndev;
    522		vf_rep->oct = oct;
    523		vf_rep->parent_ndev = oct->props[0].netdev;
    524		vf_rep->ifidx = (oct->pf_num * 64) + i + 1;
    525
    526		eth_hw_addr_random(ndev);
    527
    528		if (register_netdev(ndev)) {
    529			dev_err(&oct->pci_dev->dev, "VF rep nerdev registration failed\n");
    530
    531			free_netdev(ndev);
    532			goto cleanup;
    533		}
    534
    535		netif_carrier_off(ndev);
    536
    537		INIT_DELAYED_WORK(&vf_rep->stats_wk.work,
    538				  lio_vf_rep_fetch_stats);
    539		vf_rep->stats_wk.ctxptr = (void *)vf_rep;
    540		schedule_delayed_work(&vf_rep->stats_wk.work,
    541				      msecs_to_jiffies
    542				      (LIO_VF_REP_STATS_POLL_TIME_MS));
    543		oct->vf_rep_list.num_vfs++;
    544		oct->vf_rep_list.ndev[i] = ndev;
    545	}
    546
    547	if (octeon_register_dispatch_fn(oct, OPCODE_NIC,
    548					OPCODE_NIC_VF_REP_PKT,
    549					lio_vf_rep_pkt_recv, oct)) {
    550		dev_err(&oct->pci_dev->dev, "VF rep Dispatch func registration failed\n");
    551
    552		goto cleanup;
    553	}
    554
    555	return 0;
    556
    557cleanup:
    558	for (i = 0; i < oct->vf_rep_list.num_vfs; i++) {
    559		ndev = oct->vf_rep_list.ndev[i];
    560		oct->vf_rep_list.ndev[i] = NULL;
    561		if (ndev) {
    562			vf_rep = netdev_priv(ndev);
    563			cancel_delayed_work_sync
    564				(&vf_rep->stats_wk.work);
    565			unregister_netdev(ndev);
    566			free_netdev(ndev);
    567		}
    568	}
    569
    570	oct->vf_rep_list.num_vfs = 0;
    571
    572	return -1;
    573}
    574
    575void
    576lio_vf_rep_destroy(struct octeon_device *oct)
    577{
    578	struct lio_vf_rep_desc *vf_rep;
    579	struct net_device *ndev;
    580	int i;
    581
    582	if (oct->eswitch_mode != DEVLINK_ESWITCH_MODE_SWITCHDEV)
    583		return;
    584
    585	if (!oct->sriov_info.sriov_enabled)
    586		return;
    587
    588	for (i = 0; i < oct->vf_rep_list.num_vfs; i++) {
    589		ndev = oct->vf_rep_list.ndev[i];
    590		oct->vf_rep_list.ndev[i] = NULL;
    591		if (ndev) {
    592			vf_rep = netdev_priv(ndev);
    593			cancel_delayed_work_sync
    594				(&vf_rep->stats_wk.work);
    595			netif_tx_disable(ndev);
    596			netif_carrier_off(ndev);
    597
    598			unregister_netdev(ndev);
    599			free_netdev(ndev);
    600		}
    601	}
    602
    603	oct->vf_rep_list.num_vfs = 0;
    604}
    605
    606static int
    607lio_vf_rep_netdev_event(struct notifier_block *nb,
    608			unsigned long event, void *ptr)
    609{
    610	struct net_device *ndev = netdev_notifier_info_to_dev(ptr);
    611	struct lio_vf_rep_desc *vf_rep;
    612	struct lio_vf_rep_req rep_cfg;
    613	struct octeon_device *oct;
    614	int ret;
    615
    616	switch (event) {
    617	case NETDEV_REGISTER:
    618	case NETDEV_CHANGENAME:
    619		break;
    620
    621	default:
    622		return NOTIFY_DONE;
    623	}
    624
    625	if (ndev->netdev_ops != &lio_vf_rep_ndev_ops)
    626		return NOTIFY_DONE;
    627
    628	vf_rep = netdev_priv(ndev);
    629	oct = vf_rep->oct;
    630
    631	if (strlen(ndev->name) > LIO_IF_NAME_SIZE) {
    632		dev_err(&oct->pci_dev->dev,
    633			"Device name change sync failed as the size is > %d\n",
    634			LIO_IF_NAME_SIZE);
    635		return NOTIFY_DONE;
    636	}
    637
    638	memset(&rep_cfg, 0, sizeof(rep_cfg));
    639	rep_cfg.req_type = LIO_VF_REP_REQ_DEVNAME;
    640	rep_cfg.ifidx = vf_rep->ifidx;
    641	strncpy(rep_cfg.rep_name.name, ndev->name, LIO_IF_NAME_SIZE);
    642
    643	ret = lio_vf_rep_send_soft_command(oct, &rep_cfg,
    644					   sizeof(rep_cfg), NULL, 0);
    645	if (ret)
    646		dev_err(&oct->pci_dev->dev,
    647			"vf_rep netdev name change failed with err %d\n", ret);
    648
    649	return NOTIFY_DONE;
    650}
    651
    652static struct notifier_block lio_vf_rep_netdev_notifier = {
    653	.notifier_call = lio_vf_rep_netdev_event,
    654};
    655
    656int
    657lio_vf_rep_modinit(void)
    658{
    659	if (register_netdevice_notifier(&lio_vf_rep_netdev_notifier)) {
    660		pr_err("netdev notifier registration failed\n");
    661		return -EFAULT;
    662	}
    663
    664	return 0;
    665}
    666
    667void
    668lio_vf_rep_modexit(void)
    669{
    670	if (unregister_netdevice_notifier(&lio_vf_rep_netdev_notifier))
    671		pr_err("netdev notifier unregister failed\n");
    672}