dsa_priv.h 3.4 KB
Newer Older
1 2
/*
 * net/dsa/dsa_priv.h - Hardware switch handling
3
 * Copyright (c) 2008-2009 Marvell Semiconductor
4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21
 *
 * 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 __DSA_PRIV_H
#define __DSA_PRIV_H

#include <linux/list.h>
#include <linux/phy.h>
#include <linux/timer.h>
#include <linux/workqueue.h>
#include <net/dsa.h>

struct dsa_switch {
	/*
22
	 * Parent switch tree, and switch index.
23
	 */
24 25
	struct dsa_switch_tree	*dst;
	int			index;
26 27

	/*
28
	 * Configuration data for this switch.
29
	 */
30
	struct dsa_chip_data	*pd;
31 32

	/*
33
	 * The used switch driver.
34 35
	 */
	struct dsa_switch_driver	*drv;
36 37 38 39 40

	/*
	 * Reference to mii bus to use.
	 */
	struct mii_bus		*master_mii_bus;
41 42 43 44

	/*
	 * Slave mii_bus and devices for the individual ports.
	 */
45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71
	u32			dsa_port_mask;
	u32			phys_port_mask;
	struct mii_bus		*slave_mii_bus;
	struct net_device	*ports[DSA_MAX_PORTS];
};

static inline bool dsa_is_cpu_port(struct dsa_switch *ds, int p)
{
	return !!(ds->index == ds->dst->cpu_switch && p == ds->dst->cpu_port);
}

static inline u8 dsa_upstream_port(struct dsa_switch *ds)
{
	struct dsa_switch_tree *dst = ds->dst;

	/*
	 * If this is the root switch (i.e. the switch that connects
	 * to the CPU), return the cpu port number on this switch.
	 * Else return the (DSA) port number that connects to the
	 * switch that is one hop closer to the cpu.
	 */
	if (dst->cpu_switch == ds->index)
		return dst->cpu_port;
	else
		return ds->pd->rtable[dst->cpu_switch];
}

72
struct dsa_slave_priv {
73 74 75 76
	/*
	 * The linux network interface corresponding to this
	 * switch port.
	 */
77
	struct net_device	*dev;
78 79 80 81 82

	/*
	 * Which switch this port is a part of, and the port index
	 * for this port.
	 */
83
	struct dsa_switch	*parent;
84 85 86 87 88 89
	u8			port;

	/*
	 * The phylib phy_device pointer for the PHY connected
	 * to this port.
	 */
90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137
	struct phy_device	*phy;
};

struct dsa_switch_driver {
	struct list_head	list;

	__be16			tag_protocol;
	int			priv_size;

	/*
	 * Probing and setup.
	 */
	char	*(*probe)(struct mii_bus *bus, int sw_addr);
	int	(*setup)(struct dsa_switch *ds);
	int	(*set_addr)(struct dsa_switch *ds, u8 *addr);

	/*
	 * Access to the switch's PHY registers.
	 */
	int	(*phy_read)(struct dsa_switch *ds, int port, int regnum);
	int	(*phy_write)(struct dsa_switch *ds, int port,
			     int regnum, u16 val);

	/*
	 * Link state polling and IRQ handling.
	 */
	void	(*poll_link)(struct dsa_switch *ds);

	/*
	 * ethtool hardware statistics.
	 */
	void	(*get_strings)(struct dsa_switch *ds, int port, uint8_t *data);
	void	(*get_ethtool_stats)(struct dsa_switch *ds,
				     int port, uint64_t *data);
	int	(*get_sset_count)(struct dsa_switch *ds);
};

/* dsa.c */
extern char dsa_driver_version[];
void register_switch_driver(struct dsa_switch_driver *type);
void unregister_switch_driver(struct dsa_switch_driver *type);

/* slave.c */
void dsa_slave_mii_bus_init(struct dsa_switch *ds);
struct net_device *dsa_slave_create(struct dsa_switch *ds,
				    struct device *parent,
				    int port, char *name);

138
/* tag_dsa.c */
139
netdev_tx_t dsa_xmit(struct sk_buff *skb, struct net_device *dev);
140

141
/* tag_edsa.c */
142
netdev_tx_t edsa_xmit(struct sk_buff *skb, struct net_device *dev);
143

144
/* tag_trailer.c */
145
netdev_tx_t trailer_xmit(struct sk_buff *skb, struct net_device *dev);
146

147 148

#endif