@ -150,7 +150,12 @@ void t4_write_indirect(struct adapter *adap, unsigned int addr_reg,
*/
void t4_hw_pci_read_cfg4 ( struct adapter * adap , int reg , u32 * val )
{
u32 req = ENABLE_F | FUNCTION_V ( adap - > pf ) | REGISTER_V ( reg ) ;
u32 req = FUNCTION_V ( adap - > pf ) | REGISTER_V ( reg ) ;
if ( CHELSIO_CHIP_VERSION ( adap - > params . chip ) < = CHELSIO_T5 )
req | = ENABLE_F ;
else
req | = T6_ENABLE_F ;
if ( is_t4 ( adap - > params . chip ) )
req | = LOCALCFG_F ;
@ -381,9 +386,8 @@ int t4_memory_rw(struct adapter *adap, int win, int mtype, u32 addr,
/* Offset into the region of memory which is being accessed
* MEM_EDC0 = 0
* MEM_EDC1 = 1
* MEM_MC = 2 - - T4
* MEM_MC0 = 2 - - For T5
* MEM_MC1 = 3 - - For T5
* MEM_MC = 2 - - MEM_MC for chips with only 1 memory controller
* MEM_MC1 = 3 - - for chips with 2 memory controllers ( e . g . T5 )
*/
edc_size = EDRAM0_SIZE_G ( t4_read_reg ( adap , MA_EDRAM0_BAR_A ) ) ;
if ( mtype ! = MEM_MC1 )
@ -634,6 +638,7 @@ unsigned int t4_get_regs_len(struct adapter *adapter)
return T4_REGMAP_SIZE ;
case CHELSIO_T5 :
case CHELSIO_T6 :
return T5_REGMAP_SIZE ;
}
@ -1316,6 +1321,344 @@ void t4_get_regs(struct adapter *adap, void *buf, size_t buf_size)
0x51300 , 0x51308 ,
} ;
static const unsigned int t6_reg_ranges [ ] = {
0x1008 , 0x114c ,
0x1180 , 0x11b4 ,
0x11fc , 0x1250 ,
0x1280 , 0x133c ,
0x1800 , 0x18fc ,
0x3000 , 0x302c ,
0x3060 , 0x30d8 ,
0x30e0 , 0x30fc ,
0x3140 , 0x357c ,
0x35a8 , 0x35cc ,
0x35ec , 0x35ec ,
0x3600 , 0x5624 ,
0x56cc , 0x575c ,
0x580c , 0x5814 ,
0x5890 , 0x58bc ,
0x5940 , 0x595c ,
0x5980 , 0x598c ,
0x59b0 , 0x59dc ,
0x59fc , 0x5a18 ,
0x5a60 , 0x5a6c ,
0x5a80 , 0x5a9c ,
0x5b94 , 0x5bfc ,
0x5c10 , 0x5ec0 ,
0x5ec8 , 0x5ec8 ,
0x6000 , 0x6040 ,
0x6058 , 0x6154 ,
0x7700 , 0x7798 ,
0x77c0 , 0x7880 ,
0x78cc , 0x78fc ,
0x7b00 , 0x7c54 ,
0x7d00 , 0x7efc ,
0x8dc0 , 0x8de0 ,
0x8df8 , 0x8e84 ,
0x8ea0 , 0x8f88 ,
0x8fb8 , 0x911c ,
0x9400 , 0x9470 ,
0x9600 , 0x971c ,
0x9800 , 0x9808 ,
0x9820 , 0x983c ,
0x9850 , 0x9864 ,
0x9c00 , 0x9c6c ,
0x9c80 , 0x9cec ,
0x9d00 , 0x9d6c ,
0x9d80 , 0x9dec ,
0x9e00 , 0x9e6c ,
0x9e80 , 0x9eec ,
0x9f00 , 0x9f6c ,
0x9f80 , 0xa020 ,
0xd004 , 0xd03c ,
0xdfc0 , 0xdfe0 ,
0xe000 , 0xf008 ,
0x11000 , 0x11014 ,
0x11048 , 0x11110 ,
0x11118 , 0x1117c ,
0x11190 , 0x11260 ,
0x11300 , 0x1130c ,
0x12000 , 0x1205c ,
0x19040 , 0x1906c ,
0x19078 , 0x19080 ,
0x1908c , 0x19124 ,
0x19150 , 0x191b0 ,
0x191d0 , 0x191e8 ,
0x19238 , 0x192b8 ,
0x193f8 , 0x19474 ,
0x19490 , 0x194cc ,
0x194f0 , 0x194f8 ,
0x19c00 , 0x19c80 ,
0x19c94 , 0x19cbc ,
0x19ce4 , 0x19d28 ,
0x19d50 , 0x19d78 ,
0x19d94 , 0x19dc8 ,
0x19df0 , 0x19e10 ,
0x19e50 , 0x19e6c ,
0x19ea0 , 0x19f34 ,
0x19f40 , 0x19f50 ,
0x19f90 , 0x19fac ,
0x19fc4 , 0x19fe4 ,
0x1a000 , 0x1a06c ,
0x1a0b0 , 0x1a120 ,
0x1a128 , 0x1a138 ,
0x1a190 , 0x1a1c4 ,
0x1a1fc , 0x1a1fc ,
0x1e008 , 0x1e00c ,
0x1e040 , 0x1e04c ,
0x1e284 , 0x1e290 ,
0x1e2c0 , 0x1e2c0 ,
0x1e2e0 , 0x1e2e0 ,
0x1e300 , 0x1e384 ,
0x1e3c0 , 0x1e3c8 ,
0x1e408 , 0x1e40c ,
0x1e440 , 0x1e44c ,
0x1e684 , 0x1e690 ,
0x1e6c0 , 0x1e6c0 ,
0x1e6e0 , 0x1e6e0 ,
0x1e700 , 0x1e784 ,
0x1e7c0 , 0x1e7c8 ,
0x1e808 , 0x1e80c ,
0x1e840 , 0x1e84c ,
0x1ea84 , 0x1ea90 ,
0x1eac0 , 0x1eac0 ,
0x1eae0 , 0x1eae0 ,
0x1eb00 , 0x1eb84 ,
0x1ebc0 , 0x1ebc8 ,
0x1ec08 , 0x1ec0c ,
0x1ec40 , 0x1ec4c ,
0x1ee84 , 0x1ee90 ,
0x1eec0 , 0x1eec0 ,
0x1eee0 , 0x1eee0 ,
0x1ef00 , 0x1ef84 ,
0x1efc0 , 0x1efc8 ,
0x1f008 , 0x1f00c ,
0x1f040 , 0x1f04c ,
0x1f284 , 0x1f290 ,
0x1f2c0 , 0x1f2c0 ,
0x1f2e0 , 0x1f2e0 ,
0x1f300 , 0x1f384 ,
0x1f3c0 , 0x1f3c8 ,
0x1f408 , 0x1f40c ,
0x1f440 , 0x1f44c ,
0x1f684 , 0x1f690 ,
0x1f6c0 , 0x1f6c0 ,
0x1f6e0 , 0x1f6e0 ,
0x1f700 , 0x1f784 ,
0x1f7c0 , 0x1f7c8 ,
0x1f808 , 0x1f80c ,
0x1f840 , 0x1f84c ,
0x1fa84 , 0x1fa90 ,
0x1fac0 , 0x1fac0 ,
0x1fae0 , 0x1fae0 ,
0x1fb00 , 0x1fb84 ,
0x1fbc0 , 0x1fbc8 ,
0x1fc08 , 0x1fc0c ,
0x1fc40 , 0x1fc4c ,
0x1fe84 , 0x1fe90 ,
0x1fec0 , 0x1fec0 ,
0x1fee0 , 0x1fee0 ,
0x1ff00 , 0x1ff84 ,
0x1ffc0 , 0x1ffc8 ,
0x30000 , 0x30070 ,
0x30100 , 0x3015c ,
0x30190 , 0x301d0 ,
0x30200 , 0x30318 ,
0x30400 , 0x3052c ,
0x30540 , 0x3061c ,
0x30800 , 0x3088c ,
0x308c0 , 0x30908 ,
0x30910 , 0x309b8 ,
0x30a00 , 0x30a04 ,
0x30a0c , 0x30a2c ,
0x30a44 , 0x30a50 ,
0x30a74 , 0x30c24 ,
0x30d00 , 0x30d3c ,
0x30d44 , 0x30d7c ,
0x30de0 , 0x30de0 ,
0x30e00 , 0x30ed4 ,
0x30f00 , 0x30fa4 ,
0x30fc0 , 0x30fc4 ,
0x31000 , 0x31004 ,
0x31080 , 0x310fc ,
0x31208 , 0x31220 ,
0x3123c , 0x31254 ,
0x31300 , 0x31300 ,
0x31308 , 0x3131c ,
0x31338 , 0x3133c ,
0x31380 , 0x31380 ,
0x31388 , 0x313a8 ,
0x313b4 , 0x313b4 ,
0x31400 , 0x31420 ,
0x31438 , 0x3143c ,
0x31480 , 0x31480 ,
0x314a8 , 0x314a8 ,
0x314b0 , 0x314b4 ,
0x314c8 , 0x314d4 ,
0x31a40 , 0x31a4c ,
0x31af0 , 0x31b20 ,
0x31b38 , 0x31b3c ,
0x31b80 , 0x31b80 ,
0x31ba8 , 0x31ba8 ,
0x31bb0 , 0x31bb4 ,
0x31bc8 , 0x31bd4 ,
0x32140 , 0x3218c ,
0x321f0 , 0x32200 ,
0x32218 , 0x32218 ,
0x32400 , 0x32400 ,
0x32408 , 0x3241c ,
0x32618 , 0x32620 ,
0x32664 , 0x32664 ,
0x326a8 , 0x326a8 ,
0x326ec , 0x326ec ,
0x32a00 , 0x32abc ,
0x32b00 , 0x32b78 ,
0x32c00 , 0x32c00 ,
0x32c08 , 0x32c3c ,
0x32e00 , 0x32e2c ,
0x32f00 , 0x32f2c ,
0x33000 , 0x330ac ,
0x330c0 , 0x331ac ,
0x331c0 , 0x332c4 ,
0x332e4 , 0x333c4 ,
0x333e4 , 0x334ac ,
0x334c0 , 0x335ac ,
0x335c0 , 0x336c4 ,
0x336e4 , 0x337c4 ,
0x337e4 , 0x337fc ,
0x33814 , 0x33814 ,
0x33854 , 0x33868 ,
0x33880 , 0x3388c ,
0x338c0 , 0x338d0 ,
0x338e8 , 0x338ec ,
0x33900 , 0x339ac ,
0x339c0 , 0x33ac4 ,
0x33ae4 , 0x33b10 ,
0x33b24 , 0x33b50 ,
0x33bf0 , 0x33c10 ,
0x33c24 , 0x33c50 ,
0x33cf0 , 0x33cfc ,
0x34000 , 0x34070 ,
0x34100 , 0x3415c ,
0x34190 , 0x341d0 ,
0x34200 , 0x34318 ,
0x34400 , 0x3452c ,
0x34540 , 0x3461c ,
0x34800 , 0x3488c ,
0x348c0 , 0x34908 ,
0x34910 , 0x349b8 ,
0x34a00 , 0x34a04 ,
0x34a0c , 0x34a2c ,
0x34a44 , 0x34a50 ,
0x34a74 , 0x34c24 ,
0x34d00 , 0x34d3c ,
0x34d44 , 0x34d7c ,
0x34de0 , 0x34de0 ,
0x34e00 , 0x34ed4 ,
0x34f00 , 0x34fa4 ,
0x34fc0 , 0x34fc4 ,
0x35000 , 0x35004 ,
0x35080 , 0x350fc ,
0x35208 , 0x35220 ,
0x3523c , 0x35254 ,
0x35300 , 0x35300 ,
0x35308 , 0x3531c ,
0x35338 , 0x3533c ,
0x35380 , 0x35380 ,
0x35388 , 0x353a8 ,
0x353b4 , 0x353b4 ,
0x35400 , 0x35420 ,
0x35438 , 0x3543c ,
0x35480 , 0x35480 ,
0x354a8 , 0x354a8 ,
0x354b0 , 0x354b4 ,
0x354c8 , 0x354d4 ,
0x35a40 , 0x35a4c ,
0x35af0 , 0x35b20 ,
0x35b38 , 0x35b3c ,
0x35b80 , 0x35b80 ,
0x35ba8 , 0x35ba8 ,
0x35bb0 , 0x35bb4 ,
0x35bc8 , 0x35bd4 ,
0x36140 , 0x3618c ,
0x361f0 , 0x36200 ,
0x36218 , 0x36218 ,
0x36400 , 0x36400 ,
0x36408 , 0x3641c ,
0x36618 , 0x36620 ,
0x36664 , 0x36664 ,
0x366a8 , 0x366a8 ,
0x366ec , 0x366ec ,
0x36a00 , 0x36abc ,
0x36b00 , 0x36b78 ,
0x36c00 , 0x36c00 ,
0x36c08 , 0x36c3c ,
0x36e00 , 0x36e2c ,
0x36f00 , 0x36f2c ,
0x37000 , 0x370ac ,
0x370c0 , 0x371ac ,
0x371c0 , 0x372c4 ,
0x372e4 , 0x373c4 ,
0x373e4 , 0x374ac ,
0x374c0 , 0x375ac ,
0x375c0 , 0x376c4 ,
0x376e4 , 0x377c4 ,
0x377e4 , 0x377fc ,
0x37814 , 0x37814 ,
0x37854 , 0x37868 ,
0x37880 , 0x3788c ,
0x378c0 , 0x378d0 ,
0x378e8 , 0x378ec ,
0x37900 , 0x379ac ,
0x379c0 , 0x37ac4 ,
0x37ae4 , 0x37b10 ,
0x37b24 , 0x37b50 ,
0x37bf0 , 0x37c10 ,
0x37c24 , 0x37c50 ,
0x37cf0 , 0x37cfc ,
0x40040 , 0x40040 ,
0x40080 , 0x40084 ,
0x40100 , 0x40100 ,
0x40140 , 0x401bc ,
0x40200 , 0x40214 ,
0x40228 , 0x40228 ,
0x40240 , 0x40258 ,
0x40280 , 0x40280 ,
0x40304 , 0x40304 ,
0x40330 , 0x4033c ,
0x41304 , 0x413dc ,
0x41400 , 0x4141c ,
0x41480 , 0x414d0 ,
0x44000 , 0x4407c ,
0x440c0 , 0x4427c ,
0x442c0 , 0x4447c ,
0x444c0 , 0x4467c ,
0x446c0 , 0x4487c ,
0x448c0 , 0x44a7c ,
0x44ac0 , 0x44c7c ,
0x44cc0 , 0x44e7c ,
0x44ec0 , 0x4507c ,
0x450c0 , 0x451fc ,
0x45800 , 0x45868 ,
0x45880 , 0x45884 ,
0x458a0 , 0x458b0 ,
0x45a00 , 0x45a68 ,
0x45a80 , 0x45a84 ,
0x45aa0 , 0x45ab0 ,
0x460c0 , 0x460e4 ,
0x47000 , 0x4708c ,
0x47200 , 0x47250 ,
0x47400 , 0x47420 ,
0x47600 , 0x47618 ,
0x47800 , 0x4782c ,
0x50000 , 0x500cc ,
0x50400 , 0x50400 ,
0x50800 , 0x508cc ,
0x50c00 , 0x50c00 ,
0x51000 , 0x510b0 ,
0x51300 , 0x51324 ,
} ;
u32 * buf_end = ( u32 * ) ( ( char * ) buf + buf_size ) ;
const unsigned int * reg_ranges ;
int reg_ranges_size , range ;
@ -1335,6 +1678,11 @@ void t4_get_regs(struct adapter *adap, void *buf, size_t buf_size)
reg_ranges_size = ARRAY_SIZE ( t5_reg_ranges ) ;
break ;
case CHELSIO_T6 :
reg_ranges = t6_reg_ranges ;
reg_ranges_size = ARRAY_SIZE ( t6_reg_ranges ) ;
break ;
default :
dev_err ( adap - > pdev_dev ,
" Unsupported chip version %d \n " , chip_version ) ;
@ -1948,7 +2296,8 @@ static bool t4_fw_matches_chip(const struct adapter *adap,
* which will keep us " honest " in the future . . .
*/
if ( ( is_t4 ( adap - > params . chip ) & & hdr - > chip = = FW_HDR_CHIP_T4 ) | |
( is_t5 ( adap - > params . chip ) & & hdr - > chip = = FW_HDR_CHIP_T5 ) )
( is_t5 ( adap - > params . chip ) & & hdr - > chip = = FW_HDR_CHIP_T5 ) | |
( is_t6 ( adap - > params . chip ) & & hdr - > chip = = FW_HDR_CHIP_T6 ) )
return true ;
dev_err ( adap - > pdev_dev ,
@ -2488,6 +2837,7 @@ static void tp_intr_handler(struct adapter *adapter)
static void sge_intr_handler ( struct adapter * adapter )
{
u64 v ;
u32 err ;
static const struct intr_info sge_intr_info [ ] = {
{ ERR_CPL_EXCEED_IQE_SIZE_F ,
@ -2496,8 +2846,6 @@ static void sge_intr_handler(struct adapter *adapter)
" SGE GTS CIDX increment too large " , - 1 , 0 } ,
{ ERR_CPL_OPCODE_0_F , " SGE received 0-length CPL " , - 1 , 0 } ,
{ DBFIFO_LP_INT_F , NULL , - 1 , 0 , t4_db_full } ,
{ DBFIFO_HP_INT_F , NULL , - 1 , 0 , t4_db_full } ,
{ ERR_DROPPED_DB_F , NULL , - 1 , 0 , t4_db_dropped } ,
{ ERR_DATA_CPL_ON_HIGH_QID1_F | ERR_DATA_CPL_ON_HIGH_QID0_F ,
" SGE IQID > 1023 received CPL for FL " , - 1 , 0 } ,
{ ERR_BAD_DB_PIDX3_F , " SGE DBP 3 pidx increment too large " , - 1 ,
@ -2510,13 +2858,19 @@ static void sge_intr_handler(struct adapter *adapter)
0 } ,
{ ERR_ING_CTXT_PRIO_F ,
" SGE too many priority ingress contexts " , - 1 , 0 } ,
{ ERR_EGR_CTXT_PRIO_F ,
" SGE too many priority egress contexts " , - 1 , 0 } ,
{ INGRESS_SIZE_ERR_F , " SGE illegal ingress QID " , - 1 , 0 } ,
{ EGRESS_SIZE_ERR_F , " SGE illegal egress QID " , - 1 , 0 } ,
{ 0 }
} ;
static struct intr_info t4t5_sge_intr_info [ ] = {
{ ERR_DROPPED_DB_F , NULL , - 1 , 0 , t4_db_dropped } ,
{ DBFIFO_HP_INT_F , NULL , - 1 , 0 , t4_db_full } ,
{ ERR_EGR_CTXT_PRIO_F ,
" SGE too many priority egress contexts " , - 1 , 0 } ,
{ 0 }
} ;
v = ( u64 ) t4_read_reg ( adapter , SGE_INT_CAUSE1_A ) |
( ( u64 ) t4_read_reg ( adapter , SGE_INT_CAUSE2_A ) < < 32 ) ;
if ( v ) {
@ -2526,8 +2880,23 @@ static void sge_intr_handler(struct adapter *adapter)
t4_write_reg ( adapter , SGE_INT_CAUSE2_A , v > > 32 ) ;
}
if ( t4_handle_intr_status ( adapter , SGE_INT_CAUSE3_A , sge_intr_info ) | |
v ! = 0 )
v | = t4_handle_intr_status ( adapter , SGE_INT_CAUSE3_A , sge_intr_info ) ;
if ( CHELSIO_CHIP_VERSION ( adapter - > params . chip ) < = CHELSIO_T5 )
v | = t4_handle_intr_status ( adapter , SGE_INT_CAUSE3_A ,
t4t5_sge_intr_info ) ;
err = t4_read_reg ( adapter , SGE_ERROR_STATS_A ) ;
if ( err & ERROR_QID_VALID_F ) {
dev_err ( adapter - > pdev_dev , " SGE error for queue %u \n " ,
ERROR_QID_G ( err ) ) ;
if ( err & UNCAPTURED_ERROR_F )
dev_err ( adapter - > pdev_dev ,
" SGE UNCAPTURED_ERROR set (clearing) \n " ) ;
t4_write_reg ( adapter , SGE_ERROR_STATS_A , ERROR_QID_VALID_F |
UNCAPTURED_ERROR_F ) ;
}
if ( v ! = 0 )
t4_fatal_err ( adapter ) ;
}
@ -2700,6 +3069,7 @@ static void cplsw_intr_handler(struct adapter *adapter)
*/
static void le_intr_handler ( struct adapter * adap )
{
enum chip_type chip = CHELSIO_CHIP_VERSION ( adap - > params . chip ) ;
static const struct intr_info le_intr_info [ ] = {
{ LIPMISS_F , " LE LIP miss " , - 1 , 0 } ,
{ LIP0_F , " LE 0 LIP error " , - 1 , 0 } ,
@ -2709,7 +3079,18 @@ static void le_intr_handler(struct adapter *adap)
{ 0 }
} ;
if ( t4_handle_intr_status ( adap , LE_DB_INT_CAUSE_A , le_intr_info ) )
static struct intr_info t6_le_intr_info [ ] = {
{ T6_LIPMISS_F , " LE LIP miss " , - 1 , 0 } ,
{ T6_LIP0_F , " LE 0 LIP error " , - 1 , 0 } ,
{ TCAMINTPERR_F , " LE parity error " , - 1 , 1 } ,
{ T6_UNKNOWNCMD_F , " LE unknown command " , - 1 , 1 } ,
{ SSRAMINTPERR_F , " LE request queue parity error " , - 1 , 1 } ,
{ 0 }
} ;
if ( t4_handle_intr_status ( adap , LE_DB_INT_CAUSE_A ,
( chip < = CHELSIO_T5 ) ?
le_intr_info : t6_le_intr_info ) )
t4_fatal_err ( adap ) ;
}
@ -2978,7 +3359,7 @@ int t4_slow_intr_handler(struct adapter *adapter)
pcie_intr_handler ( adapter ) ;
if ( cause & MC_F )
mem_intr_handler ( adapter , MEM_MC ) ;
if ( ! is_t4 ( adapter - > params . chip ) & & ( cause & MC1_S ) )
if ( is_t5 ( adapter - > params . chip ) & & ( cause & MC1_F ) )
mem_intr_handler ( adapter , MEM_MC1 ) ;
if ( cause & EDC0_F )
mem_intr_handler ( adapter , MEM_EDC0 ) ;
@ -3024,17 +3405,18 @@ int t4_slow_intr_handler(struct adapter *adapter)
*/
void t4_intr_enable ( struct adapter * adapter )
{
u32 val = 0 ;
u32 pf = SOURCEPF_G ( t4_read_reg ( adapter , PL_WHOAMI_A ) ) ;
if ( CHELSIO_CHIP_VERSION ( adapter - > params . chip ) < = CHELSIO_T5 )
val = ERR_DROPPED_DB_F | ERR_EGR_CTXT_PRIO_F | DBFIFO_HP_INT_F ;
t4_write_reg ( adapter , SGE_INT_ENABLE3_A , ERR_CPL_EXCEED_IQE_SIZE_F |
ERR_INVALID_CIDX_INC_F | ERR_CPL_OPCODE_0_F |
ERR_DROPPED_DB_F | ERR_DATA_CPL_ON_HIGH_QID1 _F |
ERR_DATA_CPL_ON_HIGH_QID1_F | INGRESS_SIZE_ERR _F |
ERR_DATA_CPL_ON_HIGH_QID0_F | ERR_BAD_DB_PIDX3_F |
ERR_BAD_DB_PIDX2_F | ERR_BAD_DB_PIDX1_F |
ERR_BAD_DB_PIDX0_F | ERR_ING_CTXT_PRIO_F |
ERR_EGR_CTXT_PRIO_F | INGRESS_SIZE_ERR_F |
DBFIFO_HP_INT_F | DBFIFO_LP_INT_F |
EGRESS_SIZE_ERR_F ) ;
DBFIFO_LP_INT_F | EGRESS_SIZE_ERR_F | val ) ;
t4_write_reg ( adapter , MYPF_REG ( PL_PF_INT_ENABLE_A ) , PF_INTR_MASK ) ;
t4_set_reg_field ( adapter , PL_INT_MAP0_A , 0 , 1 < < pf ) ;
}
@ -3248,11 +3630,29 @@ void t4_read_rss_key(struct adapter *adap, u32 *key)
*/
void t4_write_rss_key ( struct adapter * adap , const u32 * key , int idx )
{
u8 rss_key_addr_cnt = 16 ;
u32 vrt = t4_read_reg ( adap , TP_RSS_CONFIG_VRT_A ) ;
/* T6 and later: for KeyMode 3 (per-vf and per-vf scramble),
* allows access to key addresses 16 - 63 by using KeyWrAddrX
* as index [ 5 : 4 ] ( upper 2 ) into key table
*/
if ( ( CHELSIO_CHIP_VERSION ( adap - > params . chip ) > CHELSIO_T5 ) & &
( vrt & KEYEXTEND_F ) & & ( KEYMODE_G ( vrt ) = = 3 ) )
rss_key_addr_cnt = 32 ;
t4_write_indirect ( adap , TP_PIO_ADDR_A , TP_PIO_DATA_A , key , 10 ,
TP_RSS_SECRET_KEY0_A ) ;
if ( idx > = 0 & & idx < 16 )
t4_write_reg ( adap , TP_RSS_CONFIG_VRT_A ,
KEYWRADDR_V ( idx ) | KEYWREN_F ) ;
if ( idx > = 0 & & idx < rss_key_addr_cnt ) {
if ( rss_key_addr_cnt > 16 )
t4_write_reg ( adap , TP_RSS_CONFIG_VRT_A ,
KEYWRADDRX_V ( idx > > 4 ) |
T6_VFWRADDR_V ( idx ) | KEYWREN_F ) ;
else
t4_write_reg ( adap , TP_RSS_CONFIG_VRT_A ,
KEYWRADDR_V ( idx ) | KEYWREN_F ) ;
}
}
/**
@ -3286,8 +3686,13 @@ void t4_read_rss_vf_config(struct adapter *adapter, unsigned int index,
{
u32 vrt , mask , data ;
mask = VFWRADDR_V ( VFWRADDR_M ) ;
data = VFWRADDR_V ( index ) ;
if ( CHELSIO_CHIP_VERSION ( adapter - > params . chip ) < = CHELSIO_T5 ) {
mask = VFWRADDR_V ( VFWRADDR_M ) ;
data = VFWRADDR_V ( index ) ;
} else {
mask = T6_VFWRADDR_V ( T6_VFWRADDR_M ) ;
data = T6_VFWRADDR_V ( index ) ;
}
/* Request that the index'th VF Table values be read into VFL/VFH.
*/
@ -4798,45 +5203,71 @@ int t4_alloc_mac_filt(struct adapter *adap, unsigned int mbox,
unsigned int viid , bool free , unsigned int naddr ,
const u8 * * addr , u16 * idx , u64 * hash , bool sleep_ok )
{
int i , ret ;
int offset , ret = 0 ;
struct fw_vi_mac_cmd c ;
struct fw_vi_mac_exact * p ;
unsigned int max_naddr = is_t4 ( adap - > params . chip ) ?
NUM_MPS_CLS_SRAM_L_INSTANCES :
NUM_MPS_T5_CLS_SRAM_L_INSTANCES ;
unsigned int nfilters = 0 ;
unsigned int max_naddr = adap - > params . arch . mps_tcam_size ;
unsigned int rem = naddr ;
if ( naddr > 7 )
if ( naddr > max_naddr )
return - EINVAL ;
memset ( & c , 0 , sizeof ( c ) ) ;
c . op_to_viid = cpu_to_be32 ( FW_CMD_OP_V ( FW_VI_MAC_CMD ) |
FW_CMD_REQUEST_F | FW_CMD_WRITE_F |
( free ? FW_CMD_EXEC_F : 0 ) |
FW_VI_MAC_CMD_VIID_V ( viid ) ) ;
c . freemacs_to_len16 = cpu_to_be32 ( FW_VI_MAC_CMD_FREEMACS_V ( free ) |
FW_CMD_LEN16_V ( ( naddr + 2 ) / 2 ) ) ;
for ( i = 0 , p = c . u . exact ; i < naddr ; i + + , p + + ) {
p - > valid_to_idx =
cpu_to_be16 ( FW_VI_MAC_CMD_VALID_F |
FW_VI_MAC_CMD_IDX_V ( FW_VI_MAC_ADD_MAC ) ) ;
memcpy ( p - > macaddr , addr [ i ] , sizeof ( p - > macaddr ) ) ;
}
for ( offset = 0 ; offset < naddr ; /**/ ) {
unsigned int fw_naddr = ( rem < ARRAY_SIZE ( c . u . exact ) ?
rem : ARRAY_SIZE ( c . u . exact ) ) ;
size_t len16 = DIV_ROUND_UP ( offsetof ( struct fw_vi_mac_cmd ,
u . exact [ fw_naddr ] ) , 16 ) ;
struct fw_vi_mac_exact * p ;
int i ;
ret = t4_wr_mbox_meat ( adap , mbox , & c , sizeof ( c ) , & c , sleep_ok ) ;
if ( ret )
return ret ;
memset ( & c , 0 , sizeof ( c ) ) ;
c . op_to_viid = cpu_to_be32 ( FW_CMD_OP_V ( FW_VI_MAC_CMD ) |
FW_CMD_REQUEST_F |
FW_CMD_WRITE_F |
FW_CMD_EXEC_V ( free ) |
FW_VI_MAC_CMD_VIID_V ( viid ) ) ;
c . freemacs_to_len16 =
cpu_to_be32 ( FW_VI_MAC_CMD_FREEMACS_V ( free ) |
FW_CMD_LEN16_V ( len16 ) ) ;
for ( i = 0 , p = c . u . exact ; i < fw_naddr ; i + + , p + + ) {
p - > valid_to_idx =
cpu_to_be16 ( FW_VI_MAC_CMD_VALID_F |
FW_VI_MAC_CMD_IDX_V (
FW_VI_MAC_ADD_MAC ) ) ;
memcpy ( p - > macaddr , addr [ offset + i ] ,
sizeof ( p - > macaddr ) ) ;
}
for ( i = 0 , p = c . u . exact ; i < naddr ; i + + , p + + ) {
u16 index = FW_VI_MAC_CMD_IDX_G ( be16_to_cpu ( p - > valid_to_idx ) ) ;
/* It's okay if we run out of space in our MAC address arena.
* Some of the addresses we submit may get stored so we need
* to run through the reply to see what the results were . . .
*/
ret = t4_wr_mbox_meat ( adap , mbox , & c , sizeof ( c ) , & c , sleep_ok ) ;
if ( ret & & ret ! = - FW_ENOMEM )
break ;
for ( i = 0 , p = c . u . exact ; i < fw_naddr ; i + + , p + + ) {
u16 index = FW_VI_MAC_CMD_IDX_G (
be16_to_cpu ( p - > valid_to_idx ) ) ;
if ( idx )
idx [ offset + i ] = ( index > = max_naddr ?
0xffff : index ) ;
if ( index < max_naddr )
nfilters + + ;
else if ( hash )
* hash | = ( 1ULL < <
hash_mac_addr ( addr [ offset + i ] ) ) ;
}
if ( idx )
idx [ i ] = index > = max_naddr ? 0xffff : index ;
if ( index < max_naddr )
ret + + ;
else if ( hash )
* hash | = ( 1ULL < < hash_mac_addr ( addr [ i ] ) ) ;
free = false ;
offset + = fw_naddr ;
rem - = fw_naddr ;
}
if ( ret = = 0 | | ret = = - FW_ENOMEM )
ret = nfilters ;
return ret ;
}
@ -4865,9 +5296,7 @@ int t4_change_mac(struct adapter *adap, unsigned int mbox, unsigned int viid,
int ret , mode ;
struct fw_vi_mac_cmd c ;
struct fw_vi_mac_exact * p = c . u . exact ;
unsigned int max_mac_addr = is_t4 ( adap - > params . chip ) ?
NUM_MPS_CLS_SRAM_L_INSTANCES :
NUM_MPS_T5_CLS_SRAM_L_INSTANCES ;
unsigned int max_mac_addr = adap - > params . arch . mps_tcam_size ;
if ( idx < 0 ) /* new allocation */
idx = persist ? FW_VI_MAC_ADD_PERSIST_MAC : FW_VI_MAC_ADD_MAC ;
@ -5276,9 +5705,30 @@ int t4_prep_adapter(struct adapter *adapter)
switch ( ver ) {
case CHELSIO_T4 :
adapter - > params . chip | = CHELSIO_CHIP_CODE ( CHELSIO_T4 , pl_rev ) ;
adapter - > params . arch . sge_fl_db = DBPRIO_F ;
adapter - > params . arch . mps_tcam_size =
NUM_MPS_CLS_SRAM_L_INSTANCES ;
adapter - > params . arch . mps_rplc_size = 128 ;
adapter - > params . arch . nchan = NCHAN ;
adapter - > params . arch . vfcount = 128 ;
break ;
case CHELSIO_T5 :
adapter - > params . chip | = CHELSIO_CHIP_CODE ( CHELSIO_T5 , pl_rev ) ;
adapter - > params . arch . sge_fl_db = DBPRIO_F | DBTYPE_F ;
adapter - > params . arch . mps_tcam_size =
NUM_MPS_T5_CLS_SRAM_L_INSTANCES ;
adapter - > params . arch . mps_rplc_size = 128 ;
adapter - > params . arch . nchan = NCHAN ;
adapter - > params . arch . vfcount = 128 ;
break ;
case CHELSIO_T6 :
adapter - > params . chip | = CHELSIO_CHIP_CODE ( CHELSIO_T6 , pl_rev ) ;
adapter - > params . arch . sge_fl_db = 0 ;
adapter - > params . arch . mps_tcam_size =
NUM_MPS_T5_CLS_SRAM_L_INSTANCES ;
adapter - > params . arch . mps_rplc_size = 256 ;
adapter - > params . arch . nchan = 2 ;
adapter - > params . arch . vfcount = 256 ;
break ;
default :
dev_err ( adapter - > pdev_dev , " Device %d is not supported \n " ,