The Injection Frame Header and Extraction Frame Header that the switch prepends to frames over the NPI port is also prepended to frames delivered over the CPU port module's queues. Let's unify the handling of the frame headers by making the ocelot driver call some helpers exported by the DSA tagger. Among other things, this allows us to get rid of the strange cpu_to_be32 when transmitting the Injection Frame Header on ocelot, since the packing API uses network byte order natively (when "quirks" is 0). The comments above ocelot_gen_ifh talk about setting pop_cnt to 3, and the cpu extraction queue mask to something, but the code doesn't do it, so we don't do it either. Signed-off-by: Vladimir Oltean <vladimir.oltean@nxp.com> Reviewed-by: Florian Fainelli <f.fainelli@gmail.com> Signed-off-by: David S. Miller <davem@davemloft.net>
123 lines
3.4 KiB
C
123 lines
3.4 KiB
C
/* SPDX-License-Identifier: (GPL-2.0 OR MIT) */
|
|
/*
|
|
* Microsemi Ocelot Switch driver
|
|
*
|
|
* Copyright (c) 2017 Microsemi Corporation
|
|
*/
|
|
|
|
#ifndef _MSCC_OCELOT_H_
|
|
#define _MSCC_OCELOT_H_
|
|
|
|
#include <linux/bitops.h>
|
|
#include <linux/etherdevice.h>
|
|
#include <linux/if_vlan.h>
|
|
#include <linux/net_tstamp.h>
|
|
#include <linux/phy.h>
|
|
#include <linux/phy/phy.h>
|
|
#include <linux/platform_device.h>
|
|
#include <linux/regmap.h>
|
|
|
|
#include <soc/mscc/ocelot_qsys.h>
|
|
#include <soc/mscc/ocelot_sys.h>
|
|
#include <soc/mscc/ocelot_dev.h>
|
|
#include <soc/mscc/ocelot_ana.h>
|
|
#include <soc/mscc/ocelot_ptp.h>
|
|
#include <soc/mscc/ocelot.h>
|
|
#include "ocelot_rew.h"
|
|
#include "ocelot_qs.h"
|
|
|
|
#define OCELOT_BUFFER_CELL_SZ 60
|
|
|
|
#define OCELOT_STATS_CHECK_DELAY (2 * HZ)
|
|
|
|
#define OCELOT_PTP_QUEUE_SZ 128
|
|
|
|
struct ocelot_port_tc {
|
|
bool block_shared;
|
|
unsigned long offload_cnt;
|
|
|
|
unsigned long police_id;
|
|
};
|
|
|
|
struct ocelot_port_private {
|
|
struct ocelot_port port;
|
|
struct net_device *dev;
|
|
struct phy_device *phy;
|
|
u8 chip_port;
|
|
|
|
struct phy *serdes;
|
|
|
|
struct ocelot_port_tc tc;
|
|
};
|
|
|
|
struct ocelot_dump_ctx {
|
|
struct net_device *dev;
|
|
struct sk_buff *skb;
|
|
struct netlink_callback *cb;
|
|
int idx;
|
|
};
|
|
|
|
/* MAC table entry types.
|
|
* ENTRYTYPE_NORMAL is subject to aging.
|
|
* ENTRYTYPE_LOCKED is not subject to aging.
|
|
* ENTRYTYPE_MACv4 is not subject to aging. For IPv4 multicast.
|
|
* ENTRYTYPE_MACv6 is not subject to aging. For IPv6 multicast.
|
|
*/
|
|
enum macaccess_entry_type {
|
|
ENTRYTYPE_NORMAL = 0,
|
|
ENTRYTYPE_LOCKED,
|
|
ENTRYTYPE_MACv4,
|
|
ENTRYTYPE_MACv6,
|
|
};
|
|
|
|
/* A (PGID) port mask structure, encoding the 2^ocelot->num_phys_ports
|
|
* possibilities of egress port masks for L2 multicast traffic.
|
|
* For a switch with 9 user ports, there are 512 possible port masks, but the
|
|
* hardware only has 46 individual PGIDs that it can forward multicast traffic
|
|
* to. So we need a structure that maps the limited PGID indices to the port
|
|
* destinations requested by the user for L2 multicast.
|
|
*/
|
|
struct ocelot_pgid {
|
|
unsigned long ports;
|
|
int index;
|
|
refcount_t refcount;
|
|
struct list_head list;
|
|
};
|
|
|
|
struct ocelot_multicast {
|
|
struct list_head list;
|
|
enum macaccess_entry_type entry_type;
|
|
unsigned char addr[ETH_ALEN];
|
|
u16 vid;
|
|
u16 ports;
|
|
struct ocelot_pgid *pgid;
|
|
};
|
|
|
|
int ocelot_port_fdb_do_dump(const unsigned char *addr, u16 vid,
|
|
bool is_static, void *data);
|
|
int ocelot_mact_learn(struct ocelot *ocelot, int port,
|
|
const unsigned char mac[ETH_ALEN],
|
|
unsigned int vid, enum macaccess_entry_type type);
|
|
int ocelot_mact_forget(struct ocelot *ocelot,
|
|
const unsigned char mac[ETH_ALEN], unsigned int vid);
|
|
struct net_device *ocelot_port_to_netdev(struct ocelot *ocelot, int port);
|
|
int ocelot_netdev_to_port(struct net_device *dev);
|
|
|
|
u32 ocelot_port_readl(struct ocelot_port *port, u32 reg);
|
|
void ocelot_port_writel(struct ocelot_port *port, u32 val, u32 reg);
|
|
|
|
int ocelot_probe_port(struct ocelot *ocelot, int port, struct regmap *target,
|
|
struct phy_device *phy);
|
|
void ocelot_release_port(struct ocelot_port *ocelot_port);
|
|
int ocelot_devlink_init(struct ocelot *ocelot);
|
|
void ocelot_devlink_teardown(struct ocelot *ocelot);
|
|
int ocelot_port_devlink_init(struct ocelot *ocelot, int port,
|
|
enum devlink_port_flavour flavour);
|
|
void ocelot_port_devlink_teardown(struct ocelot *ocelot, int port);
|
|
|
|
extern struct notifier_block ocelot_netdevice_nb;
|
|
extern struct notifier_block ocelot_switchdev_nb;
|
|
extern struct notifier_block ocelot_switchdev_blocking_nb;
|
|
extern const struct devlink_ops ocelot_devlink_ops;
|
|
|
|
#endif
|