Skip to content
Snippets Groups Projects
dsa_priv.h 2.6 KiB
Newer Older
  • Learn to ignore specific revisions
  • /*
     * net/dsa/dsa_priv.h - Hardware switch handling
     * Copyright (c) 2008 Marvell Semiconductor
     *
     * 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 {
    	/*
    	 * Configuration data for the platform device that owns
    	 * this dsa switch instance.
    	 */
    	struct dsa_platform_data	*pd;
    
    	/*
    	 * References to network device and mii bus to use.
    	 */
    	struct net_device		*master_netdev;
    	struct mii_bus			*master_mii_bus;
    
    	/*
    	 * The used switch driver and frame tagging type.
    	 */
    	struct dsa_switch_driver	*drv;
    	__be16				tag_protocol;
    
    	/*
    	 * Slave mii_bus and devices for the individual ports.
    	 */
    	int				cpu_port;
    	u32				valid_port_mask;
    	struct mii_bus			*slave_mii_bus;
    	struct net_device		*ports[DSA_MAX_PORTS];
    
    	/*
    	 * Link state polling.
    	 */
    	struct work_struct		link_poll_work;
    	struct timer_list		link_poll_timer;
    };
    
    struct dsa_slave_priv {
    	struct net_device	*dev;
    	struct dsa_switch	*parent;
    	int			port;
    	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);
    
    
    /* tag_dsa.c */
    int dsa_xmit(struct sk_buff *skb, struct net_device *dev);
    
    
    /* tag_edsa.c */
    int edsa_xmit(struct sk_buff *skb, struct net_device *dev);
    
    
    #endif