mirror of
https://github.com/AuxXxilium/linux_dsm_epyc7002.git
synced 2024-12-26 04:45:36 +07:00
936bd48656
Until now, in order to offload a FIB entry to HW we use switchdev op. Use the newly introduced FIB notifier infrasturucture to process FIB entries to offload the in HW. Abort mechanism is now handled within the rocker driver. Signed-off-by: Jiri Pirko <jiri@mellanox.com> Signed-off-by: David S. Miller <davem@davemloft.net>
154 lines
4.8 KiB
C
154 lines
4.8 KiB
C
/*
|
|
* drivers/net/ethernet/rocker/rocker.h - Rocker switch device driver
|
|
* Copyright (c) 2014-2016 Jiri Pirko <jiri@mellanox.com>
|
|
* Copyright (c) 2014 Scott Feldman <sfeldma@gmail.com>
|
|
*
|
|
* 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, or
|
|
* (at your option) any later version.
|
|
*/
|
|
|
|
#ifndef _ROCKER_H
|
|
#define _ROCKER_H
|
|
|
|
#include <linux/kernel.h>
|
|
#include <linux/types.h>
|
|
#include <linux/netdevice.h>
|
|
#include <linux/notifier.h>
|
|
#include <net/neighbour.h>
|
|
#include <net/switchdev.h>
|
|
|
|
#include "rocker_hw.h"
|
|
|
|
struct rocker_desc_info {
|
|
char *data; /* mapped */
|
|
size_t data_size;
|
|
size_t tlv_size;
|
|
struct rocker_desc *desc;
|
|
dma_addr_t mapaddr;
|
|
};
|
|
|
|
struct rocker_dma_ring_info {
|
|
size_t size;
|
|
u32 head;
|
|
u32 tail;
|
|
struct rocker_desc *desc; /* mapped */
|
|
dma_addr_t mapaddr;
|
|
struct rocker_desc_info *desc_info;
|
|
unsigned int type;
|
|
};
|
|
|
|
struct rocker;
|
|
|
|
struct rocker_port {
|
|
struct net_device *dev;
|
|
struct rocker *rocker;
|
|
void *wpriv;
|
|
unsigned int port_number;
|
|
u32 pport;
|
|
struct napi_struct napi_tx;
|
|
struct napi_struct napi_rx;
|
|
struct rocker_dma_ring_info tx_ring;
|
|
struct rocker_dma_ring_info rx_ring;
|
|
};
|
|
|
|
struct rocker_port *rocker_port_dev_lower_find(struct net_device *dev,
|
|
struct rocker *rocker);
|
|
|
|
struct rocker_world_ops;
|
|
|
|
struct rocker {
|
|
struct pci_dev *pdev;
|
|
u8 __iomem *hw_addr;
|
|
struct msix_entry *msix_entries;
|
|
unsigned int port_count;
|
|
struct rocker_port **ports;
|
|
struct {
|
|
u64 id;
|
|
} hw;
|
|
spinlock_t cmd_ring_lock; /* for cmd ring accesses */
|
|
struct rocker_dma_ring_info cmd_ring;
|
|
struct rocker_dma_ring_info event_ring;
|
|
struct notifier_block fib_nb;
|
|
struct rocker_world_ops *wops;
|
|
void *wpriv;
|
|
};
|
|
|
|
typedef int (*rocker_cmd_prep_cb_t)(const struct rocker_port *rocker_port,
|
|
struct rocker_desc_info *desc_info,
|
|
void *priv);
|
|
|
|
typedef int (*rocker_cmd_proc_cb_t)(const struct rocker_port *rocker_port,
|
|
const struct rocker_desc_info *desc_info,
|
|
void *priv);
|
|
|
|
int rocker_cmd_exec(struct rocker_port *rocker_port, bool nowait,
|
|
rocker_cmd_prep_cb_t prepare, void *prepare_priv,
|
|
rocker_cmd_proc_cb_t process, void *process_priv);
|
|
|
|
int rocker_port_set_learning(struct rocker_port *rocker_port,
|
|
bool learning);
|
|
|
|
struct rocker_world_ops {
|
|
const char *kind;
|
|
size_t priv_size;
|
|
size_t port_priv_size;
|
|
u8 mode;
|
|
int (*init)(struct rocker *rocker);
|
|
void (*fini)(struct rocker *rocker);
|
|
int (*port_pre_init)(struct rocker_port *rocker_port);
|
|
int (*port_init)(struct rocker_port *rocker_port);
|
|
void (*port_fini)(struct rocker_port *rocker_port);
|
|
void (*port_post_fini)(struct rocker_port *rocker_port);
|
|
int (*port_open)(struct rocker_port *rocker_port);
|
|
void (*port_stop)(struct rocker_port *rocker_port);
|
|
int (*port_attr_stp_state_set)(struct rocker_port *rocker_port,
|
|
u8 state,
|
|
struct switchdev_trans *trans);
|
|
int (*port_attr_bridge_flags_set)(struct rocker_port *rocker_port,
|
|
unsigned long brport_flags,
|
|
struct switchdev_trans *trans);
|
|
int (*port_attr_bridge_flags_get)(const struct rocker_port *rocker_port,
|
|
unsigned long *p_brport_flags);
|
|
int (*port_attr_bridge_ageing_time_set)(struct rocker_port *rocker_port,
|
|
u32 ageing_time,
|
|
struct switchdev_trans *trans);
|
|
int (*port_obj_vlan_add)(struct rocker_port *rocker_port,
|
|
const struct switchdev_obj_port_vlan *vlan,
|
|
struct switchdev_trans *trans);
|
|
int (*port_obj_vlan_del)(struct rocker_port *rocker_port,
|
|
const struct switchdev_obj_port_vlan *vlan);
|
|
int (*port_obj_vlan_dump)(const struct rocker_port *rocker_port,
|
|
struct switchdev_obj_port_vlan *vlan,
|
|
switchdev_obj_dump_cb_t *cb);
|
|
int (*port_obj_fdb_add)(struct rocker_port *rocker_port,
|
|
const struct switchdev_obj_port_fdb *fdb,
|
|
struct switchdev_trans *trans);
|
|
int (*port_obj_fdb_del)(struct rocker_port *rocker_port,
|
|
const struct switchdev_obj_port_fdb *fdb);
|
|
int (*port_obj_fdb_dump)(const struct rocker_port *rocker_port,
|
|
struct switchdev_obj_port_fdb *fdb,
|
|
switchdev_obj_dump_cb_t *cb);
|
|
int (*port_master_linked)(struct rocker_port *rocker_port,
|
|
struct net_device *master);
|
|
int (*port_master_unlinked)(struct rocker_port *rocker_port,
|
|
struct net_device *master);
|
|
int (*port_neigh_update)(struct rocker_port *rocker_port,
|
|
struct neighbour *n);
|
|
int (*port_neigh_destroy)(struct rocker_port *rocker_port,
|
|
struct neighbour *n);
|
|
int (*port_ev_mac_vlan_seen)(struct rocker_port *rocker_port,
|
|
const unsigned char *addr,
|
|
__be16 vlan_id);
|
|
int (*fib4_add)(struct rocker *rocker,
|
|
const struct fib_entry_notifier_info *fen_info);
|
|
int (*fib4_del)(struct rocker *rocker,
|
|
const struct fib_entry_notifier_info *fen_info);
|
|
void (*fib4_abort)(struct rocker *rocker);
|
|
};
|
|
|
|
extern struct rocker_world_ops rocker_ofdpa_ops;
|
|
|
|
#endif
|