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