1422d97b8SChris Packham /* SPDX-License-Identifier: GPL-2.0 */
2422d97b8SChris Packham /*
3422d97b8SChris Packham  * This file is based on code from OCTEON SDK by Cavium Networks.
4422d97b8SChris Packham  *
5422d97b8SChris Packham  * Copyright (c) 2003-2010 Cavium Networks
6422d97b8SChris Packham  */
7422d97b8SChris Packham 
8422d97b8SChris Packham /*
9422d97b8SChris Packham  * External interface for the Cavium Octeon ethernet driver.
10422d97b8SChris Packham  */
11422d97b8SChris Packham #ifndef OCTEON_ETHERNET_H
12422d97b8SChris Packham #define OCTEON_ETHERNET_H
13422d97b8SChris Packham 
14422d97b8SChris Packham #include <linux/of.h>
15422d97b8SChris Packham #include <linux/phy.h>
16422d97b8SChris Packham 
17422d97b8SChris Packham #ifdef CONFIG_CAVIUM_OCTEON_SOC
18422d97b8SChris Packham 
19422d97b8SChris Packham #include <asm/octeon/octeon.h>
20422d97b8SChris Packham 
21422d97b8SChris Packham #include <asm/octeon/cvmx-asxx-defs.h>
22422d97b8SChris Packham #include <asm/octeon/cvmx-config.h>
23422d97b8SChris Packham #include <asm/octeon/cvmx-fau.h>
24422d97b8SChris Packham #include <asm/octeon/cvmx-gmxx-defs.h>
25422d97b8SChris Packham #include <asm/octeon/cvmx-helper.h>
26422d97b8SChris Packham #include <asm/octeon/cvmx-helper-util.h>
27422d97b8SChris Packham #include <asm/octeon/cvmx-ipd.h>
28422d97b8SChris Packham #include <asm/octeon/cvmx-ipd-defs.h>
29422d97b8SChris Packham #include <asm/octeon/cvmx-npi-defs.h>
30422d97b8SChris Packham #include <asm/octeon/cvmx-pip.h>
31422d97b8SChris Packham #include <asm/octeon/cvmx-pko.h>
32422d97b8SChris Packham #include <asm/octeon/cvmx-pow.h>
33422d97b8SChris Packham #include <asm/octeon/cvmx-scratch.h>
34422d97b8SChris Packham #include <asm/octeon/cvmx-spi.h>
35422d97b8SChris Packham #include <asm/octeon/cvmx-spxx-defs.h>
36422d97b8SChris Packham #include <asm/octeon/cvmx-stxx-defs.h>
37422d97b8SChris Packham #include <asm/octeon/cvmx-wqe.h>
38422d97b8SChris Packham 
39422d97b8SChris Packham #else
40422d97b8SChris Packham 
41422d97b8SChris Packham #include "octeon-stubs.h"
42422d97b8SChris Packham 
43422d97b8SChris Packham #endif
44422d97b8SChris Packham 
45422d97b8SChris Packham /**
46422d97b8SChris Packham  * This is the definition of the Ethernet driver's private
47422d97b8SChris Packham  * driver state stored in netdev_priv(dev).
48422d97b8SChris Packham  */
49422d97b8SChris Packham struct octeon_ethernet {
50422d97b8SChris Packham 	/* PKO hardware output port */
51422d97b8SChris Packham 	int port;
52422d97b8SChris Packham 	/* PKO hardware queue for the port */
53422d97b8SChris Packham 	int queue;
54422d97b8SChris Packham 	/* Hardware fetch and add to count outstanding tx buffers */
55422d97b8SChris Packham 	int fau;
56422d97b8SChris Packham 	/* My netdev. */
57422d97b8SChris Packham 	struct net_device *netdev;
58422d97b8SChris Packham 	/*
59422d97b8SChris Packham 	 * Type of port. This is one of the enums in
60422d97b8SChris Packham 	 * cvmx_helper_interface_mode_t
61422d97b8SChris Packham 	 */
62422d97b8SChris Packham 	int imode;
63422d97b8SChris Packham 	/* PHY mode */
64422d97b8SChris Packham 	phy_interface_t phy_mode;
65422d97b8SChris Packham 	/* List of outstanding tx buffers per queue */
66422d97b8SChris Packham 	struct sk_buff_head tx_free_list[16];
67422d97b8SChris Packham 	unsigned int last_speed;
68422d97b8SChris Packham 	unsigned int last_link;
69422d97b8SChris Packham 	/* Last negotiated link state */
70422d97b8SChris Packham 	u64 link_info;
71422d97b8SChris Packham 	/* Called periodically to check link status */
72422d97b8SChris Packham 	void (*poll)(struct net_device *dev);
73422d97b8SChris Packham 	struct delayed_work	port_periodic_work;
74422d97b8SChris Packham 	struct device_node	*of_node;
75422d97b8SChris Packham };
76422d97b8SChris Packham 
77422d97b8SChris Packham int cvm_oct_free_work(void *work_queue_entry);
78422d97b8SChris Packham 
79422d97b8SChris Packham int cvm_oct_rgmii_open(struct net_device *dev);
80422d97b8SChris Packham 
81422d97b8SChris Packham int cvm_oct_sgmii_init(struct net_device *dev);
82422d97b8SChris Packham int cvm_oct_sgmii_open(struct net_device *dev);
83422d97b8SChris Packham 
84422d97b8SChris Packham int cvm_oct_spi_init(struct net_device *dev);
85422d97b8SChris Packham void cvm_oct_spi_uninit(struct net_device *dev);
86422d97b8SChris Packham 
87422d97b8SChris Packham int cvm_oct_common_init(struct net_device *dev);
88422d97b8SChris Packham void cvm_oct_common_uninit(struct net_device *dev);
89422d97b8SChris Packham void cvm_oct_adjust_link(struct net_device *dev);
90422d97b8SChris Packham int cvm_oct_common_stop(struct net_device *dev);
91422d97b8SChris Packham int cvm_oct_common_open(struct net_device *dev,
92422d97b8SChris Packham 			void (*link_poll)(struct net_device *));
93422d97b8SChris Packham void cvm_oct_note_carrier(struct octeon_ethernet *priv,
94422d97b8SChris Packham 			  union cvmx_helper_link_info li);
95422d97b8SChris Packham void cvm_oct_link_poll(struct net_device *dev);
96422d97b8SChris Packham 
97422d97b8SChris Packham extern int always_use_pow;
98422d97b8SChris Packham extern int pow_send_group;
99422d97b8SChris Packham extern int pow_receive_groups;
100422d97b8SChris Packham extern char pow_send_list[];
101422d97b8SChris Packham extern struct net_device *cvm_oct_device[];
102422d97b8SChris Packham extern atomic_t cvm_oct_poll_queue_stopping;
103422d97b8SChris Packham extern u64 cvm_oct_tx_poll_interval;
104422d97b8SChris Packham 
105422d97b8SChris Packham extern int rx_napi_weight;
106422d97b8SChris Packham 
107422d97b8SChris Packham #endif
108