diff options
Diffstat (limited to 'drivers/net/igb/igb_ethtool.c')
| -rw-r--r-- | drivers/net/igb/igb_ethtool.c | 52 | 
1 files changed, 52 insertions, 0 deletions
diff --git a/drivers/net/igb/igb_ethtool.c b/drivers/net/igb/igb_ethtool.c index a4cead12fd9..1b8fd7f4064 100644 --- a/drivers/net/igb/igb_ethtool.c +++ b/drivers/net/igb/igb_ethtool.c @@ -35,6 +35,7 @@  #include <linux/if_ether.h>  #include <linux/ethtool.h>  #include <linux/sched.h> +#include <linux/slab.h>  #include "igb.h" @@ -901,6 +902,49 @@ struct igb_reg_test {  #define TABLE64_TEST_LO	5  #define TABLE64_TEST_HI	6 +/* i350 reg test */ +static struct igb_reg_test reg_test_i350[] = { +	{ E1000_FCAL,	   0x100, 1,  PATTERN_TEST, 0xFFFFFFFF, 0xFFFFFFFF }, +	{ E1000_FCAH,	   0x100, 1,  PATTERN_TEST, 0x0000FFFF, 0xFFFFFFFF }, +	{ E1000_FCT,	   0x100, 1,  PATTERN_TEST, 0x0000FFFF, 0xFFFFFFFF }, +	{ E1000_VET,	   0x100, 1,  PATTERN_TEST, 0xFFFF0000, 0xFFFF0000 }, +	{ E1000_RDBAL(0),  0x100, 4,  PATTERN_TEST, 0xFFFFFF80, 0xFFFFFFFF }, +	{ E1000_RDBAH(0),  0x100, 4,  PATTERN_TEST, 0xFFFFFFFF, 0xFFFFFFFF }, +	{ E1000_RDLEN(0),  0x100, 4,  PATTERN_TEST, 0x000FFF80, 0x000FFFFF }, +	{ E1000_RDBAL(4),  0x40,  4,  PATTERN_TEST, 0xFFFFFF80, 0xFFFFFFFF }, +	{ E1000_RDBAH(4),  0x40,  4,  PATTERN_TEST, 0xFFFFFFFF, 0xFFFFFFFF }, +	{ E1000_RDLEN(4),  0x40,  4,  PATTERN_TEST, 0x000FFF80, 0x000FFFFF }, +	/* RDH is read-only for i350, only test RDT. */ +	{ E1000_RDT(0),	   0x100, 4,  PATTERN_TEST, 0x0000FFFF, 0x0000FFFF }, +	{ E1000_RDT(4),	   0x40,  4,  PATTERN_TEST, 0x0000FFFF, 0x0000FFFF }, +	{ E1000_FCRTH,	   0x100, 1,  PATTERN_TEST, 0x0000FFF0, 0x0000FFF0 }, +	{ E1000_FCTTV,	   0x100, 1,  PATTERN_TEST, 0x0000FFFF, 0x0000FFFF }, +	{ E1000_TIPG,	   0x100, 1,  PATTERN_TEST, 0x3FFFFFFF, 0x3FFFFFFF }, +	{ E1000_TDBAL(0),  0x100, 4,  PATTERN_TEST, 0xFFFFFF80, 0xFFFFFFFF }, +	{ E1000_TDBAH(0),  0x100, 4,  PATTERN_TEST, 0xFFFFFFFF, 0xFFFFFFFF }, +	{ E1000_TDLEN(0),  0x100, 4,  PATTERN_TEST, 0x000FFF80, 0x000FFFFF }, +	{ E1000_TDBAL(4),  0x40,  4,  PATTERN_TEST, 0xFFFFFF80, 0xFFFFFFFF }, +	{ E1000_TDBAH(4),  0x40,  4,  PATTERN_TEST, 0xFFFFFFFF, 0xFFFFFFFF }, +	{ E1000_TDLEN(4),  0x40,  4,  PATTERN_TEST, 0x000FFF80, 0x000FFFFF }, +	{ E1000_TDT(0),	   0x100, 4,  PATTERN_TEST, 0x0000FFFF, 0x0000FFFF }, +	{ E1000_TDT(4),	   0x40,  4,  PATTERN_TEST, 0x0000FFFF, 0x0000FFFF }, +	{ E1000_RCTL,	   0x100, 1,  SET_READ_TEST, 0xFFFFFFFF, 0x00000000 }, +	{ E1000_RCTL, 	   0x100, 1,  SET_READ_TEST, 0x04CFB0FE, 0x003FFFFB }, +	{ E1000_RCTL, 	   0x100, 1,  SET_READ_TEST, 0x04CFB0FE, 0xFFFFFFFF }, +	{ E1000_TCTL,	   0x100, 1,  SET_READ_TEST, 0xFFFFFFFF, 0x00000000 }, +	{ E1000_RA,	   0, 16, TABLE64_TEST_LO, +						0xFFFFFFFF, 0xFFFFFFFF }, +	{ E1000_RA,	   0, 16, TABLE64_TEST_HI, +						0xC3FFFFFF, 0xFFFFFFFF }, +	{ E1000_RA2,	   0, 16, TABLE64_TEST_LO, +						0xFFFFFFFF, 0xFFFFFFFF }, +	{ E1000_RA2,	   0, 16, TABLE64_TEST_HI, +						0xC3FFFFFF, 0xFFFFFFFF }, +	{ E1000_MTA,	   0, 128, TABLE32_TEST, +						0xFFFFFFFF, 0xFFFFFFFF }, +	{ 0, 0, 0, 0 } +}; +  /* 82580 reg test */  static struct igb_reg_test reg_test_82580[] = {  	{ E1000_FCAL,	   0x100, 1,  PATTERN_TEST, 0xFFFFFFFF, 0xFFFFFFFF }, @@ -1076,6 +1120,10 @@ static int igb_reg_test(struct igb_adapter *adapter, u64 *data)  	u32 i, toggle;  	switch (adapter->hw.mac.type) { +	case e1000_i350: +		test = reg_test_i350; +		toggle = 0x7FEFF3FF; +		break;  	case e1000_82580:  		test = reg_test_82580;  		toggle = 0x7FEFF3FF; @@ -1237,6 +1285,9 @@ static int igb_intr_test(struct igb_adapter *adapter, u64 *data)  	case e1000_82580:  		ics_mask = 0x77DCFED5;  		break; +	case e1000_i350: +		ics_mask = 0x77DCFED5; +		break;  	default:  		ics_mask = 0x7FFFFFFF;  		break; @@ -1813,6 +1864,7 @@ static int igb_wol_exclusion(struct igb_adapter *adapter,  		retval = 0;  		break;  	case E1000_DEV_ID_82576_QUAD_COPPER: +	case E1000_DEV_ID_82576_QUAD_COPPER_ET2:  		/* quad port adapters only support WoL on port A */  		if (!(adapter->flags & IGB_FLAG_QUAD_PORT_A)) {  			wol->supported = 0;  |