2009-09-24 04:46:15 +04:00
/*
2010-09-15 22:50:55 +04:00
* Copyright ( c ) 2005 - 2010 Brocade Communications Systems , Inc .
2009-09-24 04:46:15 +04:00
* All rights reserved
* www . brocade . com
*
* Linux driver for Brocade Fibre Channel Host Bus Adapter .
*
* This program is free software ; you can redistribute it and / or modify it
* under the terms of the GNU General Public License ( GPL ) Version 2 as
* published by the Free Software Foundation
*
* This program is distributed in the hope that it will be useful , but
* WITHOUT ANY WARRANTY ; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE . See the GNU
* General Public License for more details .
*/
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
}
2009-09-24 04:46:15 +04:00
void
bfa_hwct_rspq_ack ( struct bfa_s * bfa , int rspq )
{
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 ] ) ;
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
}