2008-04-27 12:55:59 +01:00
/****************************************************************************
* Driver for Solarflare Solarstorm network controllers and boards
* Copyright 2005 - 2006 Fen Systems Ltd .
* Copyright 2006 - 2008 Solarflare Communications Inc .
*
* This program is free software ; you can redistribute it and / or modify it
* under the terms of the GNU General Public License version 2 as published
* by the Free Software Foundation , incorporated herein by reference .
*/
# ifndef EFX_FALCON_H
# define EFX_FALCON_H
2009-11-23 16:05:28 +00:00
# include <linux/i2c-algo-bit.h>
2008-04-27 12:55:59 +01:00
# include "net_driver.h"
2008-12-12 21:50:08 -08:00
# include "efx.h"
2008-04-27 12:55:59 +01:00
/*
* Falcon hardware control
*/
enum falcon_revision {
FALCON_REV_A0 = 0 ,
FALCON_REV_A1 = 1 ,
FALCON_REV_B0 = 2 ,
} ;
2008-05-16 21:16:10 +01:00
static inline int falcon_rev ( struct efx_nic * efx )
{
return efx - > pci_dev - > revision ;
}
2008-04-27 12:55:59 +01:00
2009-11-23 16:05:45 +00:00
/**
2009-11-25 16:09:41 +00:00
* struct falcon_board_type - board operations and type information
* @ id : Board type id , as found in NVRAM
* @ ref_model : Model number of Solarflare reference design
* @ gen_type : Generic board type description
2009-11-23 16:05:45 +00:00
* @ init : Allocate resources and initialise peripheral hardware
* @ init_phy : Do board - specific PHY initialisation
2009-11-25 16:09:41 +00:00
* @ fini : Shut down hardware and free resources
2009-11-23 16:05:45 +00:00
* @ set_id_led : Set state of identifying LED or revert to automatic function
* @ monitor : Board - specific health check function
2009-11-25 16:09:41 +00:00
*/
struct falcon_board_type {
u8 id ;
const char * ref_model ;
const char * gen_type ;
int ( * init ) ( struct efx_nic * nic ) ;
void ( * init_phy ) ( struct efx_nic * efx ) ;
void ( * fini ) ( struct efx_nic * nic ) ;
void ( * set_id_led ) ( struct efx_nic * efx , enum efx_led_mode mode ) ;
int ( * monitor ) ( struct efx_nic * nic ) ;
} ;
/**
* struct falcon_board - board information
* @ type : Type of board
* @ major : Major rev . ( ' A ' , ' B ' . . . )
* @ minor : Minor rev . ( 0 , 1 , . . . )
2009-11-23 16:06:02 +00:00
* @ i2c_adap : I2C adapter for on - board peripherals
* @ i2c_data : Data for bit - banging algorithm
2009-11-23 16:05:45 +00:00
* @ hwmon_client : I2C client for hardware monitor
* @ ioexp_client : I2C client for power / port control
*/
struct falcon_board {
2009-11-25 16:09:41 +00:00
const struct falcon_board_type * type ;
2009-11-23 16:05:45 +00:00
int major ;
int minor ;
2009-11-23 16:06:02 +00:00
struct i2c_adapter i2c_adap ;
struct i2c_algo_bit_data i2c_data ;
2009-11-23 16:05:45 +00:00
struct i2c_client * hwmon_client , * ioexp_client ;
} ;
2009-11-23 16:05:28 +00:00
/**
* struct falcon_nic_data - Falcon NIC state
2009-11-25 16:09:04 +00:00
* @ pci_dev2 : Secondary function of Falcon A
2009-11-23 16:05:45 +00:00
* @ board : Board state and functions
2009-11-23 16:05:28 +00:00
*/
struct falcon_nic_data {
struct pci_dev * pci_dev2 ;
2009-11-23 16:05:45 +00:00
struct falcon_board board ;
2009-11-23 16:05:28 +00:00
} ;
2009-11-23 16:05:12 +00:00
static inline struct falcon_board * falcon_board ( struct efx_nic * efx )
{
2009-11-23 16:05:45 +00:00
struct falcon_nic_data * data = efx - > nic_data ;
return & data - > board ;
2009-11-23 16:05:12 +00:00
}
2008-04-27 12:55:59 +01:00
extern struct efx_nic_type falcon_a_nic_type ;
extern struct efx_nic_type falcon_b_nic_type ;
/**************************************************************************
*
* Externs
*
* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
*/
2009-10-23 08:29:51 +00:00
extern void falcon_probe_board ( struct efx_nic * efx , u16 revision_info ) ;
2008-04-27 12:55:59 +01:00
/* TX data path */
extern int falcon_probe_tx ( struct efx_tx_queue * tx_queue ) ;
2008-09-01 12:48:46 +01:00
extern void falcon_init_tx ( struct efx_tx_queue * tx_queue ) ;
2008-04-27 12:55:59 +01:00
extern void falcon_fini_tx ( struct efx_tx_queue * tx_queue ) ;
extern void falcon_remove_tx ( struct efx_tx_queue * tx_queue ) ;
extern void falcon_push_buffers ( struct efx_tx_queue * tx_queue ) ;
/* RX data path */
extern int falcon_probe_rx ( struct efx_rx_queue * rx_queue ) ;
2008-09-01 12:48:46 +01:00
extern void falcon_init_rx ( struct efx_rx_queue * rx_queue ) ;
2008-04-27 12:55:59 +01:00
extern void falcon_fini_rx ( struct efx_rx_queue * rx_queue ) ;
extern void falcon_remove_rx ( struct efx_rx_queue * rx_queue ) ;
extern void falcon_notify_rx_desc ( struct efx_rx_queue * rx_queue ) ;
/* Event data path */
extern int falcon_probe_eventq ( struct efx_channel * channel ) ;
2008-09-01 12:48:46 +01:00
extern void falcon_init_eventq ( struct efx_channel * channel ) ;
2008-04-27 12:55:59 +01:00
extern void falcon_fini_eventq ( struct efx_channel * channel ) ;
extern void falcon_remove_eventq ( struct efx_channel * channel ) ;
2008-09-01 12:48:08 +01:00
extern int falcon_process_eventq ( struct efx_channel * channel , int rx_quota ) ;
2008-04-27 12:55:59 +01:00
extern void falcon_eventq_read_ack ( struct efx_channel * channel ) ;
/* Ports */
extern int falcon_probe_port ( struct efx_nic * efx ) ;
extern void falcon_remove_port ( struct efx_nic * efx ) ;
/* MAC/PHY */
2008-12-12 21:50:08 -08:00
extern int falcon_switch_mac ( struct efx_nic * efx ) ;
2008-09-01 12:46:50 +01:00
extern bool falcon_xaui_link_ok ( struct efx_nic * efx ) ;
2008-04-27 12:55:59 +01:00
extern int falcon_dma_stats ( struct efx_nic * efx ,
unsigned int done_offset ) ;
extern void falcon_drain_tx_fifo ( struct efx_nic * efx ) ;
extern void falcon_deconfigure_mac_wrapper ( struct efx_nic * efx ) ;
extern void falcon_reconfigure_mac_wrapper ( struct efx_nic * efx ) ;
/* Interrupts and test events */
extern int falcon_init_interrupt ( struct efx_nic * efx ) ;
extern void falcon_enable_interrupts ( struct efx_nic * efx ) ;
extern void falcon_generate_test_event ( struct efx_channel * channel ,
unsigned int magic ) ;
2008-12-12 21:50:08 -08:00
extern void falcon_sim_phy_event ( struct efx_nic * efx ) ;
2008-04-27 12:55:59 +01:00
extern void falcon_generate_interrupt ( struct efx_nic * efx ) ;
extern void falcon_set_int_moderation ( struct efx_channel * channel ) ;
extern void falcon_disable_interrupts ( struct efx_nic * efx ) ;
extern void falcon_fini_interrupt ( struct efx_nic * efx ) ;
2009-03-20 13:30:37 +00:00
# define FALCON_IRQ_MOD_RESOLUTION 5
2008-04-27 12:55:59 +01:00
/* Global Resources */
extern int falcon_probe_nic ( struct efx_nic * efx ) ;
extern int falcon_init_nic ( struct efx_nic * efx ) ;
2008-09-01 12:49:37 +01:00
extern int falcon_flush_queues ( struct efx_nic * efx ) ;
2008-04-27 12:55:59 +01:00
extern int falcon_reset_hw ( struct efx_nic * efx , enum reset_type method ) ;
extern void falcon_remove_nic ( struct efx_nic * efx ) ;
extern void falcon_update_nic_stats ( struct efx_nic * efx ) ;
extern void falcon_set_multicast_hash ( struct efx_nic * efx ) ;
extern int falcon_reset_xaui ( struct efx_nic * efx ) ;
2008-09-01 12:49:02 +01:00
/* Tests */
struct falcon_nvconfig ;
extern int falcon_read_nvram ( struct efx_nic * efx ,
struct falcon_nvconfig * nvconfig ) ;
extern int falcon_test_registers ( struct efx_nic * efx ) ;
2008-04-27 12:55:59 +01:00
/**************************************************************************
*
* Falcon MAC stats
*
* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
*/
# define FALCON_STAT_OFFSET(falcon_stat) EFX_VAL(falcon_stat, offset)
# define FALCON_STAT_WIDTH(falcon_stat) EFX_VAL(falcon_stat, WIDTH)
/* Retrieve statistic from statistics block */
# define FALCON_STAT(efx, falcon_stat, efx_stat) do { \
if ( FALCON_STAT_WIDTH ( falcon_stat ) = = 16 ) \
( efx ) - > mac_stats . efx_stat + = le16_to_cpu ( \
* ( ( __force __le16 * ) \
( efx - > stats_buffer . addr + \
FALCON_STAT_OFFSET ( falcon_stat ) ) ) ) ; \
else if ( FALCON_STAT_WIDTH ( falcon_stat ) = = 32 ) \
( efx ) - > mac_stats . efx_stat + = le32_to_cpu ( \
* ( ( __force __le32 * ) \
( efx - > stats_buffer . addr + \
FALCON_STAT_OFFSET ( falcon_stat ) ) ) ) ; \
else \
( efx ) - > mac_stats . efx_stat + = le64_to_cpu ( \
* ( ( __force __le64 * ) \
( efx - > stats_buffer . addr + \
FALCON_STAT_OFFSET ( falcon_stat ) ) ) ) ; \
} while ( 0 )
# define FALCON_MAC_STATS_SIZE 0x100
# define MAC_DATA_LBN 0
# define MAC_DATA_WIDTH 32
extern void falcon_generate_event ( struct efx_channel * channel ,
efx_qword_t * event ) ;
# endif /* EFX_FALCON_H */