2008-04-27 15:55:59 +04:00
/****************************************************************************
* Driver for Solarflare Solarstorm network controllers and boards
* 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_MDIO_10G_H
# define EFX_MDIO_10G_H
2009-04-29 12:05:08 +04:00
# include <linux/mdio.h>
2008-04-27 15:55:59 +04:00
/*
2009-04-29 12:05:08 +04:00
* Helper functions for doing 10 G MDIO as specified in IEEE 802.3 clause 45.
2008-04-27 15:55:59 +04:00
*/
# include "efx.h"
# include "boards.h"
2009-04-29 12:05:08 +04:00
static inline unsigned efx_mdio_id_rev ( u32 id ) { return id & 0xf ; }
static inline unsigned efx_mdio_id_model ( u32 id ) { return ( id > > 4 ) & 0x3f ; }
extern unsigned efx_mdio_id_oui ( u32 id ) ;
2008-04-27 15:55:59 +04:00
2009-04-29 12:05:08 +04:00
static inline int efx_mdio_read ( struct efx_nic * efx , int devad , int addr )
2008-04-27 15:55:59 +04:00
{
2009-04-29 12:05:08 +04:00
return efx - > mdio . mdio_read ( efx - > net_dev , efx - > mdio . prtad , devad , addr ) ;
2008-04-27 15:55:59 +04:00
}
2009-04-29 12:05:08 +04:00
static inline void
efx_mdio_write ( struct efx_nic * efx , int devad , int addr , int value )
2008-04-27 15:55:59 +04:00
{
2009-04-29 12:05:08 +04:00
efx - > mdio . mdio_write ( efx - > net_dev , efx - > mdio . prtad , devad , addr , value ) ;
2008-04-27 15:55:59 +04:00
}
2009-04-29 12:05:08 +04:00
static inline u32 efx_mdio_read_id ( struct efx_nic * efx , int mmd )
2008-04-27 15:55:59 +04:00
{
2009-04-29 12:05:08 +04:00
u16 id_low = efx_mdio_read ( efx , mmd , MDIO_DEVID2 ) ;
u16 id_hi = efx_mdio_read ( efx , mmd , MDIO_DEVID1 ) ;
2008-04-27 15:55:59 +04:00
return ( id_hi < < 16 ) | ( id_low ) ;
}
2009-04-29 12:05:08 +04:00
static inline bool efx_mdio_phyxgxs_lane_sync ( struct efx_nic * efx )
2008-04-27 15:55:59 +04:00
{
2008-09-01 15:46:50 +04:00
int i , lane_status ;
bool sync ;
2008-04-27 15:55:59 +04:00
for ( i = 0 ; i < 2 ; + + i )
2009-04-29 12:05:08 +04:00
lane_status = efx_mdio_read ( efx , MDIO_MMD_PHYXS ,
MDIO_PHYXS_LNSTAT ) ;
2008-04-27 15:55:59 +04:00
2009-04-29 12:05:08 +04:00
sync = ! ! ( lane_status & MDIO_PHYXS_LNSTAT_ALIGN ) ;
2008-04-27 15:55:59 +04:00
if ( ! sync )
2008-09-01 15:46:25 +04:00
EFX_LOG ( efx , " XGXS lane status: %x \n " , lane_status ) ;
2008-04-27 15:55:59 +04:00
return sync ;
}
2009-04-29 12:05:08 +04:00
extern const char * efx_mdio_mmd_name ( int mmd ) ;
2008-04-27 15:55:59 +04:00
/*
* Reset a specific MMD and wait for reset to clear .
* Return number of spins left ( > 0 ) on success , - % ETIMEDOUT on failure .
*
* This function will sleep
*/
2009-04-29 12:05:08 +04:00
extern int efx_mdio_reset_mmd ( struct efx_nic * efx , int mmd ,
int spins , int spintime ) ;
2008-04-27 15:55:59 +04:00
2009-04-29 12:05:08 +04:00
/* As efx_mdio_check_mmd but for multiple MMDs */
int efx_mdio_check_mmds ( struct efx_nic * efx ,
unsigned int mmd_mask , unsigned int fatal_mask ) ;
2008-04-27 15:55:59 +04:00
/* Check the link status of specified mmds in bit mask */
2009-04-29 12:05:08 +04:00
extern bool efx_mdio_links_ok ( struct efx_nic * efx , unsigned int mmd_mask ) ;
2008-04-27 15:55:59 +04:00
2008-05-07 16:36:19 +04:00
/* Generic transmit disable support though PMAPMD */
2009-04-29 12:05:08 +04:00
extern void efx_mdio_transmit_disable ( struct efx_nic * efx ) ;
2008-05-07 16:36:19 +04:00
/* Generic part of reconfigure: set/clear loopback bits */
2009-04-29 12:05:08 +04:00
extern void efx_mdio_phy_reconfigure ( struct efx_nic * efx ) ;
2008-05-07 16:36:19 +04:00
2008-11-04 23:34:56 +03:00
/* Set the power state of the specified MMDs */
2009-04-29 12:05:08 +04:00
extern void efx_mdio_set_mmds_lpower ( struct efx_nic * efx ,
int low_power , unsigned int mmd_mask ) ;
2008-12-13 08:50:46 +03:00
2008-04-27 15:55:59 +04:00
/* Set (some of) the PHY settings over MDIO */
2009-04-29 12:05:08 +04:00
extern int efx_mdio_set_settings ( struct efx_nic * efx , struct ethtool_cmd * ecmd ) ;
2008-04-27 15:55:59 +04:00
2008-12-13 08:50:46 +03:00
/* Get pause parameters from AN if available (otherwise return
* requested pause parameters )
*/
2009-04-29 12:05:08 +04:00
enum efx_fc_type efx_mdio_get_pause ( struct efx_nic * efx ) ;
2008-12-13 08:50:46 +03:00
2008-04-27 15:55:59 +04:00
/* Wait for specified MMDs to exit reset within a timeout */
2009-04-29 12:05:08 +04:00
extern int efx_mdio_wait_reset_mmds ( struct efx_nic * efx ,
unsigned int mmd_mask ) ;
2008-04-27 15:55:59 +04:00
2008-12-13 08:48:57 +03:00
/* Set or clear flag, debouncing */
2009-04-29 12:05:08 +04:00
static inline void
efx_mdio_set_flag ( struct efx_nic * efx , int devad , int addr ,
int mask , bool state )
{
mdio_set_flag ( & efx - > mdio , efx - > mdio . prtad , devad , addr , mask , state ) ;
}
2008-12-13 08:48:57 +03:00
2008-04-27 15:55:59 +04:00
# endif /* EFX_MDIO_10G_H */