You've already forked linux-rockchip
mirror of
https://github.com/armbian/linux-rockchip.git
synced 2026-01-06 11:08:10 -08:00
i40e: Add macvlan support on i40e
This patch enables macvlan offloads for i40e. The idea is to use channels as macvlan interfaces. The channels are VSIs of type VMDQ. When the first macvlan is created, the maximum number of channels possible are created. From then on, as a macvlan interface is created, a macvlan filter is added to these already created channels (VSIs). This patch utilizes subordinate device traffic classes to make queue groups(channels) available for an upper device like a macvlan. Steps to configure macvlan offloads: 1. ethtool -K ethx l2-fwd-offload on 2. ip link add link ethx name macvlan1 type macvlan 3. ip addr add <address> dev macvlan1 4. ip link set macvlan1 up Signed-off-by: Harshitha Ramamurthy <harshitha.ramamurthy@intel.com> Tested-by: Andrew Bowers <andrewx.bowers@intel.com> Signed-off-by: Jeff Kirsher <jeffrey.t.kirsher@intel.com>
This commit is contained in:
committed by
Jeff Kirsher
parent
1e1b0c658d
commit
1d8d80b4e4
@@ -27,6 +27,7 @@
|
||||
#include <net/ip6_checksum.h>
|
||||
#include <linux/ethtool.h>
|
||||
#include <linux/if_vlan.h>
|
||||
#include <linux/if_macvlan.h>
|
||||
#include <linux/if_bridge.h>
|
||||
#include <linux/clocksource.h>
|
||||
#include <linux/net_tstamp.h>
|
||||
@@ -412,6 +413,11 @@ struct i40e_flex_pit {
|
||||
u8 pit_index;
|
||||
};
|
||||
|
||||
struct i40e_fwd_adapter {
|
||||
struct net_device *netdev;
|
||||
int bit_no;
|
||||
};
|
||||
|
||||
struct i40e_channel {
|
||||
struct list_head list;
|
||||
bool initialized;
|
||||
@@ -426,11 +432,25 @@ struct i40e_channel {
|
||||
struct i40e_aqc_vsi_properties_data info;
|
||||
|
||||
u64 max_tx_rate;
|
||||
struct i40e_fwd_adapter *fwd;
|
||||
|
||||
/* track this channel belongs to which VSI */
|
||||
struct i40e_vsi *parent_vsi;
|
||||
};
|
||||
|
||||
static inline bool i40e_is_channel_macvlan(struct i40e_channel *ch)
|
||||
{
|
||||
return !!ch->fwd;
|
||||
}
|
||||
|
||||
static inline u8 *i40e_channel_mac(struct i40e_channel *ch)
|
||||
{
|
||||
if (i40e_is_channel_macvlan(ch))
|
||||
return ch->fwd->netdev->dev_addr;
|
||||
else
|
||||
return NULL;
|
||||
}
|
||||
|
||||
/* struct that defines the Ethernet device */
|
||||
struct i40e_pf {
|
||||
struct pci_dev *pdev;
|
||||
@@ -813,6 +833,13 @@ struct i40e_vsi {
|
||||
struct list_head ch_list;
|
||||
u16 tc_seid_map[I40E_MAX_TRAFFIC_CLASS];
|
||||
|
||||
/* macvlan fields */
|
||||
#define I40E_MAX_MACVLANS 128 /* Max HW vectors - 1 on FVL */
|
||||
#define I40E_MIN_MACVLAN_VECTORS 2 /* Min vectors to enable macvlans */
|
||||
DECLARE_BITMAP(fwd_bitmask, I40E_MAX_MACVLANS);
|
||||
struct list_head macvlan_list;
|
||||
int macvlan_cnt;
|
||||
|
||||
void *priv; /* client driver data reference. */
|
||||
|
||||
/* VSI specific handlers */
|
||||
|
||||
File diff suppressed because it is too large
Load Diff
Reference in New Issue
Block a user