2019-05-29 17:18:06 +03:00
// SPDX-License-Identifier: GPL-2.0-only
2009-09-24 04:46:15 +04:00
/*
2015-11-26 11:54:45 +03:00
* Copyright ( c ) 2005 - 2014 Brocade Communications Systems , Inc .
* Copyright ( c ) 2014 - QLogic Corporation .
2009-09-24 04:46:15 +04:00
* All rights reserved
2015-11-26 11:54:45 +03:00
* www . qlogic . com
2009-09-24 04:46:15 +04:00
*
2015-11-26 11:54:46 +03:00
* Linux driver for QLogic BR - series Fibre Channel Host Bus Adapter .
2009-09-24 04:46:15 +04:00
*/
2010-12-10 06:12:32 +03:00
# include "bfad_drv.h"
2010-09-15 22:50:55 +04:00
# include "bfa_modules.h"
2011-06-14 02:50:35 +04:00
# include "bfi_reg.h"
2009-09-24 04:46:15 +04:00
BFA_TRC_FILE ( HAL , IOCFC_CT ) ;
2010-10-19 04:17:23 +04:00
/*
2009-09-24 04:46:15 +04:00
* Dummy interrupt handler for handling spurious interrupt during chip - reinit .
*/
static void
bfa_hwct_msix_dummy ( struct bfa_s * bfa , int vec )
{
}
void
bfa_hwct_reginit ( struct bfa_s * bfa )
{
struct bfa_iocfc_regs_s * bfa_regs = & bfa - > iocfc . bfa_regs ;
2010-10-19 04:12:29 +04:00
void __iomem * kva = bfa_ioc_bar0 ( & bfa - > ioc ) ;
2011-06-14 02:50:35 +04:00
int fn = bfa_ioc_pcifn ( & bfa - > ioc ) ;
2009-09-24 04:46:15 +04:00
if ( fn = = 0 ) {
bfa_regs - > intr_status = ( kva + HOSTFN0_INT_STATUS ) ;
bfa_regs - > intr_mask = ( kva + HOSTFN0_INT_MSK ) ;
} else {
bfa_regs - > intr_status = ( kva + HOSTFN1_INT_STATUS ) ;
bfa_regs - > intr_mask = ( kva + HOSTFN1_INT_MSK ) ;
}
2011-06-14 02:50:35 +04:00
}
2009-09-24 04:46:15 +04:00
2011-06-14 02:50:35 +04:00
void
bfa_hwct2_reginit ( struct bfa_s * bfa )
{
struct bfa_iocfc_regs_s * bfa_regs = & bfa - > iocfc . bfa_regs ;
void __iomem * kva = bfa_ioc_bar0 ( & bfa - > ioc ) ;
bfa_regs - > intr_status = ( kva + CT2_HOSTFN_INT_STATUS ) ;
bfa_regs - > intr_mask = ( kva + CT2_HOSTFN_INTR_MASK ) ;
2009-09-24 04:46:15 +04:00
}
2010-03-06 06:37:09 +03:00
void
bfa_hwct_reqq_ack ( struct bfa_s * bfa , int reqq )
{
2010-09-15 22:50:55 +04:00
u32 r32 ;
2010-03-06 06:37:09 +03:00
2010-10-19 04:12:29 +04:00
r32 = readl ( bfa - > iocfc . bfa_regs . cpe_q_ctrl [ reqq ] ) ;
writel ( r32 , bfa - > iocfc . bfa_regs . cpe_q_ctrl [ reqq ] ) ;
2010-03-06 06:37:09 +03:00
}
2011-07-21 04:00:45 +04:00
/*
* Actions to respond RME Interrupt for Catapult ASIC :
* - Write 1 to Interrupt Status register ( INTx only - done in bfa_intx ( ) )
* - Acknowledge by writing to RME Queue Control register
* - Update CI
*/
2009-09-24 04:46:15 +04:00
void
2011-07-21 04:00:45 +04:00
bfa_hwct_rspq_ack ( struct bfa_s * bfa , int rspq , u32 ci )
2009-09-24 04:46:15 +04:00
{
u32 r32 ;
2010-10-19 04:12:29 +04:00
r32 = readl ( bfa - > iocfc . bfa_regs . rme_q_ctrl [ rspq ] ) ;
writel ( r32 , bfa - > iocfc . bfa_regs . rme_q_ctrl [ rspq ] ) ;
2011-07-21 04:00:45 +04:00
bfa_rspq_ci ( bfa , rspq ) = ci ;
writel ( ci , bfa - > iocfc . bfa_regs . rme_q_ci [ rspq ] ) ;
}
/*
* Actions to respond RME Interrupt for Catapult2 ASIC :
* - Write 1 to Interrupt Status register ( INTx only - done in bfa_intx ( ) )
* - Update CI
*/
void
bfa_hwct2_rspq_ack ( struct bfa_s * bfa , int rspq , u32 ci )
{
bfa_rspq_ci ( bfa , rspq ) = ci ;
writel ( ci , bfa - > iocfc . bfa_regs . rme_q_ci [ rspq ] ) ;
2009-09-24 04:46:15 +04:00
}
void
bfa_hwct_msix_getvecs ( struct bfa_s * bfa , u32 * msix_vecs_bmap ,
u32 * num_vecs , u32 * max_vec_bit )
{
2011-06-14 02:50:35 +04:00
* msix_vecs_bmap = ( 1 < < BFI_MSIX_CT_MAX ) - 1 ;
* max_vec_bit = ( 1 < < ( BFI_MSIX_CT_MAX - 1 ) ) ;
* num_vecs = BFI_MSIX_CT_MAX ;
2009-09-24 04:46:15 +04:00
}
2010-10-19 04:17:23 +04:00
/*
2009-09-24 04:46:15 +04:00
* Setup MSI - X vector for catapult
*/
void
bfa_hwct_msix_init ( struct bfa_s * bfa , int nvecs )
{
2011-06-14 02:50:35 +04:00
WARN_ON ( ( nvecs ! = 1 ) & & ( nvecs ! = BFI_MSIX_CT_MAX ) ) ;
2009-09-24 04:46:15 +04:00
bfa_trc ( bfa , nvecs ) ;
bfa - > msix . nvecs = nvecs ;
bfa_hwct_msix_uninstall ( bfa ) ;
}
void
2011-06-14 02:52:12 +04:00
bfa_hwct_msix_ctrl_install ( struct bfa_s * bfa )
{
if ( bfa - > msix . nvecs = = 0 )
return ;
if ( bfa - > msix . nvecs = = 1 )
bfa - > msix . handler [ BFI_MSIX_LPU_ERR_CT ] = bfa_msix_all ;
else
bfa - > msix . handler [ BFI_MSIX_LPU_ERR_CT ] = bfa_msix_lpu_err ;
}
void
bfa_hwct_msix_queue_install ( struct bfa_s * bfa )
2009-09-24 04:46:15 +04:00
{
int i ;
if ( bfa - > msix . nvecs = = 0 )
return ;
if ( bfa - > msix . nvecs = = 1 ) {
2011-06-14 02:52:12 +04:00
for ( i = BFI_MSIX_CPE_QMIN_CT ; i < BFI_MSIX_CT_MAX ; i + + )
2009-09-24 04:46:15 +04:00
bfa - > msix . handler [ i ] = bfa_msix_all ;
return ;
}
2011-06-14 02:50:35 +04:00
for ( i = BFI_MSIX_CPE_QMIN_CT ; i < = BFI_MSIX_CPE_QMAX_CT ; i + + )
2009-09-24 04:46:15 +04:00
bfa - > msix . handler [ i ] = bfa_msix_reqq ;
2011-06-14 02:50:35 +04:00
for ( i = BFI_MSIX_RME_QMIN_CT ; i < = BFI_MSIX_RME_QMAX_CT ; i + + )
2009-09-24 04:46:15 +04:00
bfa - > msix . handler [ i ] = bfa_msix_rspq ;
}
void
bfa_hwct_msix_uninstall ( struct bfa_s * bfa )
{
int i ;
2011-06-14 02:50:35 +04:00
for ( i = 0 ; i < BFI_MSIX_CT_MAX ; i + + )
2009-09-24 04:46:15 +04:00
bfa - > msix . handler [ i ] = bfa_hwct_msix_dummy ;
}
2010-10-19 04:17:23 +04:00
/*
2009-09-24 04:46:15 +04:00
* Enable MSI - X vectors
*/
void
bfa_hwct_isr_mode_set ( struct bfa_s * bfa , bfa_boolean_t msix )
{
bfa_trc ( bfa , 0 ) ;
bfa_ioc_isr_mode_set ( & bfa - > ioc , msix ) ;
}
2010-07-09 06:57:33 +04:00
void
bfa_hwct_msix_get_rme_range ( struct bfa_s * bfa , u32 * start , u32 * end )
{
2011-06-14 02:50:35 +04:00
* start = BFI_MSIX_RME_QMIN_CT ;
* end = BFI_MSIX_RME_QMAX_CT ;
2010-07-09 06:57:33 +04:00
}