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-10-19 04:17:23 +04:00
/*
2009-09-24 04:46:15 +04:00
* bfa_attr . c Linux driver configuration interface module .
*/
# include "bfad_drv.h"
# include "bfad_im.h"
2010-10-19 04:17:23 +04:00
/*
2009-09-24 04:46:15 +04:00
* FC transport template entry , get SCSI target port ID .
*/
2010-11-30 05:21:32 +03:00
static void
2009-09-24 04:46:15 +04:00
bfad_im_get_starget_port_id ( struct scsi_target * starget )
{
struct Scsi_Host * shost ;
struct bfad_im_port_s * im_port ;
struct bfad_s * bfad ;
struct bfad_itnim_s * itnim = NULL ;
u32 fc_id = - 1 ;
unsigned long flags ;
2010-09-15 22:50:55 +04:00
shost = dev_to_shost ( starget - > dev . parent ) ;
2009-09-24 04:46:15 +04:00
im_port = ( struct bfad_im_port_s * ) shost - > hostdata [ 0 ] ;
bfad = im_port - > bfad ;
spin_lock_irqsave ( & bfad - > bfad_lock , flags ) ;
2010-12-10 06:12:32 +03:00
itnim = bfad_get_itnim ( im_port , starget - > id ) ;
2009-09-24 04:46:15 +04:00
if ( itnim )
fc_id = bfa_fcs_itnim_get_fcid ( & itnim - > fcs_itnim ) ;
fc_starget_port_id ( starget ) = fc_id ;
spin_unlock_irqrestore ( & bfad - > bfad_lock , flags ) ;
}
2010-10-19 04:17:23 +04:00
/*
2009-09-24 04:46:15 +04:00
* FC transport template entry , get SCSI target nwwn .
*/
2010-11-30 05:21:32 +03:00
static void
2009-09-24 04:46:15 +04:00
bfad_im_get_starget_node_name ( struct scsi_target * starget )
{
struct Scsi_Host * shost ;
struct bfad_im_port_s * im_port ;
struct bfad_s * bfad ;
struct bfad_itnim_s * itnim = NULL ;
u64 node_name = 0 ;
unsigned long flags ;
2010-09-15 22:50:55 +04:00
shost = dev_to_shost ( starget - > dev . parent ) ;
2009-09-24 04:46:15 +04:00
im_port = ( struct bfad_im_port_s * ) shost - > hostdata [ 0 ] ;
bfad = im_port - > bfad ;
spin_lock_irqsave ( & bfad - > bfad_lock , flags ) ;
2010-12-10 06:12:32 +03:00
itnim = bfad_get_itnim ( im_port , starget - > id ) ;
2009-09-24 04:46:15 +04:00
if ( itnim )
node_name = bfa_fcs_itnim_get_nwwn ( & itnim - > fcs_itnim ) ;
2010-10-19 04:10:50 +04:00
fc_starget_node_name ( starget ) = cpu_to_be64 ( node_name ) ;
2009-09-24 04:46:15 +04:00
spin_unlock_irqrestore ( & bfad - > bfad_lock , flags ) ;
}
2010-10-19 04:17:23 +04:00
/*
2009-09-24 04:46:15 +04:00
* FC transport template entry , get SCSI target pwwn .
*/
2010-11-30 05:21:32 +03:00
static void
2009-09-24 04:46:15 +04:00
bfad_im_get_starget_port_name ( struct scsi_target * starget )
{
struct Scsi_Host * shost ;
struct bfad_im_port_s * im_port ;
struct bfad_s * bfad ;
struct bfad_itnim_s * itnim = NULL ;
u64 port_name = 0 ;
unsigned long flags ;
2010-09-15 22:50:55 +04:00
shost = dev_to_shost ( starget - > dev . parent ) ;
2009-09-24 04:46:15 +04:00
im_port = ( struct bfad_im_port_s * ) shost - > hostdata [ 0 ] ;
bfad = im_port - > bfad ;
spin_lock_irqsave ( & bfad - > bfad_lock , flags ) ;
2010-12-10 06:12:32 +03:00
itnim = bfad_get_itnim ( im_port , starget - > id ) ;
2009-09-24 04:46:15 +04:00
if ( itnim )
port_name = bfa_fcs_itnim_get_pwwn ( & itnim - > fcs_itnim ) ;
2010-10-19 04:10:50 +04:00
fc_starget_port_name ( starget ) = cpu_to_be64 ( port_name ) ;
2009-09-24 04:46:15 +04:00
spin_unlock_irqrestore ( & bfad - > bfad_lock , flags ) ;
}
2010-10-19 04:17:23 +04:00
/*
2009-09-24 04:46:15 +04:00
* FC transport template entry , get SCSI host port ID .
*/
2010-11-30 05:21:32 +03:00
static void
2009-09-24 04:46:15 +04:00
bfad_im_get_host_port_id ( struct Scsi_Host * shost )
{
struct bfad_im_port_s * im_port =
( struct bfad_im_port_s * ) shost - > hostdata [ 0 ] ;
struct bfad_port_s * port = im_port - > port ;
fc_host_port_id ( shost ) =
2010-12-10 06:12:32 +03:00
bfa_hton3b ( bfa_fcs_lport_get_fcid ( port - > fcs_port ) ) ;
2009-09-24 04:46:15 +04:00
}
2010-10-19 04:17:23 +04:00
/*
2009-09-24 04:46:15 +04:00
* FC transport template entry , get SCSI host port type .
*/
static void
bfad_im_get_host_port_type ( struct Scsi_Host * shost )
{
struct bfad_im_port_s * im_port =
( struct bfad_im_port_s * ) shost - > hostdata [ 0 ] ;
struct bfad_s * bfad = im_port - > bfad ;
2010-09-15 22:50:55 +04:00
struct bfa_lport_attr_s port_attr ;
2009-09-24 04:46:15 +04:00
2010-09-15 22:50:55 +04:00
bfa_fcs_lport_get_attr ( & bfad - > bfa_fcs . fabric . bport , & port_attr ) ;
2009-09-24 04:46:15 +04:00
2010-09-15 22:50:55 +04:00
switch ( port_attr . port_type ) {
case BFA_PORT_TYPE_NPORT :
2009-09-24 04:46:15 +04:00
fc_host_port_type ( shost ) = FC_PORTTYPE_NPORT ;
break ;
2010-09-15 22:50:55 +04:00
case BFA_PORT_TYPE_NLPORT :
2009-09-24 04:46:15 +04:00
fc_host_port_type ( shost ) = FC_PORTTYPE_NLPORT ;
break ;
2010-09-15 22:50:55 +04:00
case BFA_PORT_TYPE_P2P :
2009-09-24 04:46:15 +04:00
fc_host_port_type ( shost ) = FC_PORTTYPE_PTP ;
break ;
2010-09-15 22:50:55 +04:00
case BFA_PORT_TYPE_LPORT :
2009-09-24 04:46:15 +04:00
fc_host_port_type ( shost ) = FC_PORTTYPE_LPORT ;
break ;
default :
fc_host_port_type ( shost ) = FC_PORTTYPE_UNKNOWN ;
break ;
}
}
2010-10-19 04:17:23 +04:00
/*
2009-09-24 04:46:15 +04:00
* FC transport template entry , get SCSI host port state .
*/
static void
bfad_im_get_host_port_state ( struct Scsi_Host * shost )
{
struct bfad_im_port_s * im_port =
( struct bfad_im_port_s * ) shost - > hostdata [ 0 ] ;
struct bfad_s * bfad = im_port - > bfad ;
2010-09-15 22:50:55 +04:00
struct bfa_port_attr_s attr ;
2009-09-24 04:46:15 +04:00
2010-03-06 06:37:37 +03:00
bfa_fcport_get_attr ( & bfad - > bfa , & attr ) ;
2009-09-24 04:46:15 +04:00
switch ( attr . port_state ) {
2010-09-15 22:50:55 +04:00
case BFA_PORT_ST_LINKDOWN :
2009-09-24 04:46:15 +04:00
fc_host_port_state ( shost ) = FC_PORTSTATE_LINKDOWN ;
break ;
2010-09-15 22:50:55 +04:00
case BFA_PORT_ST_LINKUP :
2009-09-24 04:46:15 +04:00
fc_host_port_state ( shost ) = FC_PORTSTATE_ONLINE ;
break ;
2010-09-15 22:50:55 +04:00
case BFA_PORT_ST_DISABLED :
case BFA_PORT_ST_STOPPED :
case BFA_PORT_ST_IOCDOWN :
case BFA_PORT_ST_IOCDIS :
fc_host_port_state ( shost ) = FC_PORTSTATE_OFFLINE ;
break ;
case BFA_PORT_ST_UNINIT :
case BFA_PORT_ST_ENABLING_QWAIT :
case BFA_PORT_ST_ENABLING :
case BFA_PORT_ST_DISABLING_QWAIT :
case BFA_PORT_ST_DISABLING :
2009-09-24 04:46:15 +04:00
default :
fc_host_port_state ( shost ) = FC_PORTSTATE_UNKNOWN ;
break ;
}
}
2010-10-19 04:17:23 +04:00
/*
2009-09-24 04:46:15 +04:00
* FC transport template entry , get SCSI host active fc4s .
*/
static void
bfad_im_get_host_active_fc4s ( struct Scsi_Host * shost )
{
struct bfad_im_port_s * im_port =
( struct bfad_im_port_s * ) shost - > hostdata [ 0 ] ;
struct bfad_port_s * port = im_port - > port ;
memset ( fc_host_active_fc4s ( shost ) , 0 ,
sizeof ( fc_host_active_fc4s ( shost ) ) ) ;
2010-09-15 22:50:55 +04:00
if ( port - > supported_fc4s & BFA_LPORT_ROLE_FCP_IM )
2009-09-24 04:46:15 +04:00
fc_host_active_fc4s ( shost ) [ 2 ] = 1 ;
fc_host_active_fc4s ( shost ) [ 7 ] = 1 ;
}
2010-10-19 04:17:23 +04:00
/*
2009-09-24 04:46:15 +04:00
* FC transport template entry , get SCSI host link speed .
*/
static void
bfad_im_get_host_speed ( struct Scsi_Host * shost )
{
struct bfad_im_port_s * im_port =
( struct bfad_im_port_s * ) shost - > hostdata [ 0 ] ;
struct bfad_s * bfad = im_port - > bfad ;
2010-09-15 22:50:55 +04:00
struct bfa_port_attr_s attr ;
2009-09-24 04:46:15 +04:00
2010-03-06 06:37:37 +03:00
bfa_fcport_get_attr ( & bfad - > bfa , & attr ) ;
2009-09-24 04:46:15 +04:00
switch ( attr . speed ) {
2010-09-15 22:50:55 +04:00
case BFA_PORT_SPEED_10GBPS :
fc_host_speed ( shost ) = FC_PORTSPEED_10GBIT ;
break ;
2011-06-14 02:52:40 +04:00
case BFA_PORT_SPEED_16GBPS :
fc_host_speed ( shost ) = FC_PORTSPEED_16GBIT ;
break ;
2010-09-15 22:50:55 +04:00
case BFA_PORT_SPEED_8GBPS :
2009-09-24 04:46:15 +04:00
fc_host_speed ( shost ) = FC_PORTSPEED_8GBIT ;
break ;
2010-09-15 22:50:55 +04:00
case BFA_PORT_SPEED_4GBPS :
2009-09-24 04:46:15 +04:00
fc_host_speed ( shost ) = FC_PORTSPEED_4GBIT ;
break ;
2010-09-15 22:50:55 +04:00
case BFA_PORT_SPEED_2GBPS :
2009-09-24 04:46:15 +04:00
fc_host_speed ( shost ) = FC_PORTSPEED_2GBIT ;
break ;
2010-09-15 22:50:55 +04:00
case BFA_PORT_SPEED_1GBPS :
2009-09-24 04:46:15 +04:00
fc_host_speed ( shost ) = FC_PORTSPEED_1GBIT ;
break ;
default :
fc_host_speed ( shost ) = FC_PORTSPEED_UNKNOWN ;
break ;
}
}
2010-10-19 04:17:23 +04:00
/*
2009-09-24 04:46:15 +04:00
* FC transport template entry , get SCSI host port type .
*/
static void
bfad_im_get_host_fabric_name ( struct Scsi_Host * shost )
{
struct bfad_im_port_s * im_port =
( struct bfad_im_port_s * ) shost - > hostdata [ 0 ] ;
struct bfad_port_s * port = im_port - > port ;
wwn_t fabric_nwwn = 0 ;
2010-09-15 22:50:55 +04:00
fabric_nwwn = bfa_fcs_lport_get_fabric_name ( port - > fcs_port ) ;
2009-09-24 04:46:15 +04:00
2010-10-19 04:10:50 +04:00
fc_host_fabric_name ( shost ) = cpu_to_be64 ( fabric_nwwn ) ;
2009-09-24 04:46:15 +04:00
}
2010-10-19 04:17:23 +04:00
/*
2009-09-24 04:46:15 +04:00
* FC transport template entry , get BFAD statistics .
*/
static struct fc_host_statistics *
bfad_im_get_stats ( struct Scsi_Host * shost )
{
struct bfad_im_port_s * im_port =
( struct bfad_im_port_s * ) shost - > hostdata [ 0 ] ;
struct bfad_s * bfad = im_port - > bfad ;
struct bfad_hal_comp fcomp ;
2010-09-15 22:50:55 +04:00
union bfa_port_stats_u * fcstats ;
2009-09-24 04:46:15 +04:00
struct fc_host_statistics * hstats ;
bfa_status_t rc ;
unsigned long flags ;
2010-09-15 22:50:55 +04:00
fcstats = kzalloc ( sizeof ( union bfa_port_stats_u ) , GFP_KERNEL ) ;
if ( fcstats = = NULL )
return NULL ;
2009-09-24 04:46:15 +04:00
hstats = & bfad - > link_stats ;
init_completion ( & fcomp . comp ) ;
spin_lock_irqsave ( & bfad - > bfad_lock , flags ) ;
memset ( hstats , 0 , sizeof ( struct fc_host_statistics ) ) ;
2010-09-15 22:50:55 +04:00
rc = bfa_port_get_stats ( BFA_FCPORT ( & bfad - > bfa ) ,
fcstats , bfad_hcb_comp , & fcomp ) ;
2009-09-24 04:46:15 +04:00
spin_unlock_irqrestore ( & bfad - > bfad_lock , flags ) ;
if ( rc ! = BFA_STATUS_OK )
return NULL ;
wait_for_completion ( & fcomp . comp ) ;
2010-09-15 22:50:55 +04:00
/* Fill the fc_host_statistics structure */
hstats - > seconds_since_last_reset = fcstats - > fc . secs_reset ;
hstats - > tx_frames = fcstats - > fc . tx_frames ;
hstats - > tx_words = fcstats - > fc . tx_words ;
hstats - > rx_frames = fcstats - > fc . rx_frames ;
hstats - > rx_words = fcstats - > fc . rx_words ;
hstats - > lip_count = fcstats - > fc . lip_count ;
hstats - > nos_count = fcstats - > fc . nos_count ;
hstats - > error_frames = fcstats - > fc . error_frames ;
hstats - > dumped_frames = fcstats - > fc . dropped_frames ;
hstats - > link_failure_count = fcstats - > fc . link_failures ;
hstats - > loss_of_sync_count = fcstats - > fc . loss_of_syncs ;
hstats - > loss_of_signal_count = fcstats - > fc . loss_of_signals ;
hstats - > prim_seq_protocol_err_count = fcstats - > fc . primseq_errs ;
hstats - > invalid_crc_count = fcstats - > fc . invalid_crcs ;
kfree ( fcstats ) ;
2009-09-24 04:46:15 +04:00
return hstats ;
}
2010-10-19 04:17:23 +04:00
/*
2009-09-24 04:46:15 +04:00
* FC transport template entry , reset BFAD statistics .
*/
static void
bfad_im_reset_stats ( struct Scsi_Host * shost )
{
struct bfad_im_port_s * im_port =
( struct bfad_im_port_s * ) shost - > hostdata [ 0 ] ;
struct bfad_s * bfad = im_port - > bfad ;
struct bfad_hal_comp fcomp ;
unsigned long flags ;
bfa_status_t rc ;
init_completion ( & fcomp . comp ) ;
spin_lock_irqsave ( & bfad - > bfad_lock , flags ) ;
2010-03-06 06:38:07 +03:00
rc = bfa_port_clear_stats ( BFA_FCPORT ( & bfad - > bfa ) , bfad_hcb_comp ,
2010-09-15 22:50:55 +04:00
& fcomp ) ;
2009-09-24 04:46:15 +04:00
spin_unlock_irqrestore ( & bfad - > bfad_lock , flags ) ;
if ( rc ! = BFA_STATUS_OK )
return ;
wait_for_completion ( & fcomp . comp ) ;
return ;
}
2010-10-19 04:17:23 +04:00
/*
2009-09-24 04:46:15 +04:00
* FC transport template entry , set rport loss timeout .
2013-05-13 13:33:34 +04:00
* Update dev_loss_tmo based on the value pushed down by the stack
* In case it is lesser than path_tov of driver , set it to path_tov + 1
* to ensure that the driver times out before the application
2009-09-24 04:46:15 +04:00
*/
static void
bfad_im_set_rport_loss_tmo ( struct fc_rport * rport , u32 timeout )
{
struct bfad_itnim_data_s * itnim_data = rport - > dd_data ;
struct bfad_itnim_s * itnim = itnim_data - > itnim ;
struct bfad_s * bfad = itnim - > im - > bfad ;
2013-05-13 13:33:34 +04:00
uint16_t path_tov = bfa_fcpim_path_tov_get ( & bfad - > bfa ) ;
2009-09-24 04:46:15 +04:00
2013-05-13 13:33:34 +04:00
rport - > dev_loss_tmo = timeout ;
if ( timeout < path_tov )
rport - > dev_loss_tmo = path_tov + 1 ;
2009-09-24 04:46:15 +04:00
}
2010-03-19 21:05:39 +03:00
static int
bfad_im_vport_create ( struct fc_vport * fc_vport , bool disable )
{
char * vname = fc_vport - > symbolic_name ;
struct Scsi_Host * shost = fc_vport - > shost ;
struct bfad_im_port_s * im_port =
( struct bfad_im_port_s * ) shost - > hostdata [ 0 ] ;
struct bfad_s * bfad = im_port - > bfad ;
2010-09-15 22:50:55 +04:00
struct bfa_lport_cfg_s port_cfg ;
struct bfad_vport_s * vp ;
2010-03-19 21:05:39 +03:00
int status = 0 , rc ;
unsigned long flags ;
memset ( & port_cfg , 0 , sizeof ( port_cfg ) ) ;
2010-07-09 06:46:26 +04:00
u64_to_wwn ( fc_vport - > node_name , ( u8 * ) & port_cfg . nwwn ) ;
u64_to_wwn ( fc_vport - > port_name , ( u8 * ) & port_cfg . pwwn ) ;
2010-03-19 21:05:39 +03:00
if ( strlen ( vname ) > 0 )
strcpy ( ( char * ) & port_cfg . sym_name , vname ) ;
2010-09-15 22:50:55 +04:00
port_cfg . roles = BFA_LPORT_ROLE_FCP_IM ;
2010-03-19 21:05:39 +03:00
2010-07-09 06:46:26 +04:00
spin_lock_irqsave ( & bfad - > bfad_lock , flags ) ;
2010-09-15 22:50:55 +04:00
list_for_each_entry ( vp , & bfad - > pbc_vport_list , list_entry ) {
if ( port_cfg . pwwn = =
vp - > fcs_vport . lport . port_cfg . pwwn ) {
port_cfg . preboot_vp =
vp - > fcs_vport . lport . port_cfg . preboot_vp ;
2010-07-09 06:46:26 +04:00
break ;
}
}
spin_unlock_irqrestore ( & bfad - > bfad_lock , flags ) ;
rc = bfad_vport_create ( bfad , 0 , & port_cfg , & fc_vport - > dev ) ;
2010-03-19 21:05:39 +03:00
if ( rc = = BFA_STATUS_OK ) {
2010-07-09 06:46:26 +04:00
struct bfad_vport_s * vport ;
2010-03-19 21:05:39 +03:00
struct bfa_fcs_vport_s * fcs_vport ;
struct Scsi_Host * vshost ;
spin_lock_irqsave ( & bfad - > bfad_lock , flags ) ;
fcs_vport = bfa_fcs_vport_lookup ( & bfad - > bfa_fcs , 0 ,
port_cfg . pwwn ) ;
2010-07-09 06:46:26 +04:00
spin_unlock_irqrestore ( & bfad - > bfad_lock , flags ) ;
if ( fcs_vport = = NULL )
2010-03-19 21:05:39 +03:00
return VPCERR_BAD_WWN ;
fc_vport_set_state ( fc_vport , FC_VPORT_ACTIVE ) ;
if ( disable ) {
2010-07-09 06:46:26 +04:00
spin_lock_irqsave ( & bfad - > bfad_lock , flags ) ;
2010-03-19 21:05:39 +03:00
bfa_fcs_vport_stop ( fcs_vport ) ;
2010-07-09 06:46:26 +04:00
spin_unlock_irqrestore ( & bfad - > bfad_lock , flags ) ;
2010-03-19 21:05:39 +03:00
fc_vport_set_state ( fc_vport , FC_VPORT_DISABLED ) ;
}
vport = fcs_vport - > vport_drv ;
vshost = vport - > drv_port . im_port - > shost ;
2010-07-09 06:46:26 +04:00
fc_host_node_name ( vshost ) = wwn_to_u64 ( ( u8 * ) & port_cfg . nwwn ) ;
fc_host_port_name ( vshost ) = wwn_to_u64 ( ( u8 * ) & port_cfg . pwwn ) ;
2012-05-12 04:49:59 +04:00
fc_host_supported_classes ( vshost ) = FC_COS_CLASS3 ;
memset ( fc_host_supported_fc4s ( vshost ) , 0 ,
sizeof ( fc_host_supported_fc4s ( vshost ) ) ) ;
/* For FCP type 0x08 */
if ( supported_fc4s & BFA_LPORT_ROLE_FCP_IM )
fc_host_supported_fc4s ( vshost ) [ 2 ] = 1 ;
/* For fibre channel services type 0x20 */
fc_host_supported_fc4s ( vshost ) [ 7 ] = 1 ;
fc_host_supported_speeds ( vshost ) =
bfad_im_supported_speeds ( & bfad - > bfa ) ;
fc_host_maxframe_size ( vshost ) =
bfa_fcport_get_maxfrsize ( & bfad - > bfa ) ;
2010-03-19 21:05:39 +03:00
fc_vport - > dd_data = vport ;
vport - > drv_port . im_port - > fc_vport = fc_vport ;
} else if ( rc = = BFA_STATUS_INVALID_WWN )
return VPCERR_BAD_WWN ;
else if ( rc = = BFA_STATUS_VPORT_EXISTS )
return VPCERR_BAD_WWN ;
else if ( rc = = BFA_STATUS_VPORT_MAX )
return VPCERR_NO_FABRIC_SUPP ;
else if ( rc = = BFA_STATUS_VPORT_WWN_BP )
return VPCERR_BAD_WWN ;
2010-07-09 06:46:26 +04:00
else
2010-03-19 21:05:39 +03:00
return FC_VPORT_FAILED ;
return status ;
}
2012-03-14 04:37:26 +04:00
int
bfad_im_issue_fc_host_lip ( struct Scsi_Host * shost )
{
struct bfad_im_port_s * im_port =
( struct bfad_im_port_s * ) shost - > hostdata [ 0 ] ;
struct bfad_s * bfad = im_port - > bfad ;
struct bfad_hal_comp fcomp ;
unsigned long flags ;
uint32_t status ;
init_completion ( & fcomp . comp ) ;
spin_lock_irqsave ( & bfad - > bfad_lock , flags ) ;
status = bfa_port_disable ( & bfad - > bfa . modules . port ,
bfad_hcb_comp , & fcomp ) ;
spin_unlock_irqrestore ( & bfad - > bfad_lock , flags ) ;
if ( status ! = BFA_STATUS_OK )
return - EIO ;
wait_for_completion ( & fcomp . comp ) ;
if ( fcomp . status ! = BFA_STATUS_OK )
return - EIO ;
spin_lock_irqsave ( & bfad - > bfad_lock , flags ) ;
status = bfa_port_enable ( & bfad - > bfa . modules . port ,
bfad_hcb_comp , & fcomp ) ;
spin_unlock_irqrestore ( & bfad - > bfad_lock , flags ) ;
if ( status ! = BFA_STATUS_OK )
return - EIO ;
wait_for_completion ( & fcomp . comp ) ;
if ( fcomp . status ! = BFA_STATUS_OK )
return - EIO ;
return 0 ;
}
2010-03-19 21:05:39 +03:00
static int
bfad_im_vport_delete ( struct fc_vport * fc_vport )
{
struct bfad_vport_s * vport = ( struct bfad_vport_s * ) fc_vport - > dd_data ;
struct bfad_im_port_s * im_port =
( struct bfad_im_port_s * ) vport - > drv_port . im_port ;
struct bfad_s * bfad = im_port - > bfad ;
struct bfa_fcs_vport_s * fcs_vport ;
struct Scsi_Host * vshost ;
wwn_t pwwn ;
int rc ;
unsigned long flags ;
struct completion fcomp ;
2012-03-14 04:40:31 +04:00
if ( im_port - > flags & BFAD_PORT_DELETE ) {
bfad_scsi_host_free ( bfad , im_port ) ;
list_del ( & vport - > list_entry ) ;
2012-04-10 05:40:01 +04:00
kfree ( vport ) ;
2012-03-14 04:40:31 +04:00
return 0 ;
}
2010-03-19 21:05:39 +03:00
vshost = vport - > drv_port . im_port - > shost ;
2010-07-09 06:46:26 +04:00
u64_to_wwn ( fc_host_port_name ( vshost ) , ( u8 * ) & pwwn ) ;
2010-03-19 21:05:39 +03:00
spin_lock_irqsave ( & bfad - > bfad_lock , flags ) ;
fcs_vport = bfa_fcs_vport_lookup ( & bfad - > bfa_fcs , 0 , pwwn ) ;
spin_unlock_irqrestore ( & bfad - > bfad_lock , flags ) ;
if ( fcs_vport = = NULL )
return VPCERR_BAD_WWN ;
vport - > drv_port . flags | = BFAD_PORT_DELETE ;
vport - > comp_del = & fcomp ;
init_completion ( vport - > comp_del ) ;
spin_lock_irqsave ( & bfad - > bfad_lock , flags ) ;
rc = bfa_fcs_vport_delete ( & vport - > fcs_vport ) ;
spin_unlock_irqrestore ( & bfad - > bfad_lock , flags ) ;
2010-07-09 07:01:49 +04:00
if ( rc = = BFA_STATUS_PBC ) {
vport - > drv_port . flags & = ~ BFAD_PORT_DELETE ;
vport - > comp_del = NULL ;
2010-07-09 06:46:26 +04:00
return - 1 ;
2010-07-09 07:01:49 +04:00
}
2010-07-09 06:46:26 +04:00
2010-03-19 21:05:39 +03:00
wait_for_completion ( vport - > comp_del ) ;
2010-12-10 06:12:32 +03:00
bfad_scsi_host_free ( bfad , im_port ) ;
2011-12-21 06:58:32 +04:00
list_del ( & vport - > list_entry ) ;
2010-03-19 21:05:39 +03:00
kfree ( vport ) ;
return 0 ;
}
static int
bfad_im_vport_disable ( struct fc_vport * fc_vport , bool disable )
{
struct bfad_vport_s * vport ;
struct bfad_s * bfad ;
struct bfa_fcs_vport_s * fcs_vport ;
struct Scsi_Host * vshost ;
wwn_t pwwn ;
unsigned long flags ;
vport = ( struct bfad_vport_s * ) fc_vport - > dd_data ;
bfad = vport - > drv_port . bfad ;
vshost = vport - > drv_port . im_port - > shost ;
2010-07-09 06:46:26 +04:00
u64_to_wwn ( fc_host_port_name ( vshost ) , ( u8 * ) & pwwn ) ;
2010-03-19 21:05:39 +03:00
spin_lock_irqsave ( & bfad - > bfad_lock , flags ) ;
fcs_vport = bfa_fcs_vport_lookup ( & bfad - > bfa_fcs , 0 , pwwn ) ;
spin_unlock_irqrestore ( & bfad - > bfad_lock , flags ) ;
if ( fcs_vport = = NULL )
return VPCERR_BAD_WWN ;
if ( disable ) {
bfa_fcs_vport_stop ( fcs_vport ) ;
fc_vport_set_state ( fc_vport , FC_VPORT_DISABLED ) ;
} else {
bfa_fcs_vport_start ( fcs_vport ) ;
fc_vport_set_state ( fc_vport , FC_VPORT_ACTIVE ) ;
}
return 0 ;
}
2012-08-23 06:50:20 +04:00
void
bfad_im_vport_set_symbolic_name ( struct fc_vport * fc_vport )
{
struct bfad_vport_s * vport = ( struct bfad_vport_s * ) fc_vport - > dd_data ;
struct bfad_im_port_s * im_port =
( struct bfad_im_port_s * ) vport - > drv_port . im_port ;
struct bfad_s * bfad = im_port - > bfad ;
struct Scsi_Host * vshost = vport - > drv_port . im_port - > shost ;
char * sym_name = fc_vport - > symbolic_name ;
struct bfa_fcs_vport_s * fcs_vport ;
wwn_t pwwn ;
unsigned long flags ;
u64_to_wwn ( fc_host_port_name ( vshost ) , ( u8 * ) & pwwn ) ;
spin_lock_irqsave ( & bfad - > bfad_lock , flags ) ;
fcs_vport = bfa_fcs_vport_lookup ( & bfad - > bfa_fcs , 0 , pwwn ) ;
spin_unlock_irqrestore ( & bfad - > bfad_lock , flags ) ;
if ( fcs_vport = = NULL )
return ;
spin_lock_irqsave ( & bfad - > bfad_lock , flags ) ;
2013-11-21 13:37:49 +04:00
if ( strlen ( sym_name ) > 0 )
bfa_fcs_lport_set_symname ( & fcs_vport - > lport , sym_name ) ;
2012-08-23 06:50:20 +04:00
spin_unlock_irqrestore ( & bfad - > bfad_lock , flags ) ;
}
2009-09-24 04:46:15 +04:00
struct fc_function_template bfad_im_fc_function_template = {
/* Target dynamic attributes */
. get_starget_port_id = bfad_im_get_starget_port_id ,
. show_starget_port_id = 1 ,
. get_starget_node_name = bfad_im_get_starget_node_name ,
. show_starget_node_name = 1 ,
. get_starget_port_name = bfad_im_get_starget_port_name ,
. show_starget_port_name = 1 ,
2010-03-19 21:05:39 +03:00
/* Host dynamic attribute */
. get_host_port_id = bfad_im_get_host_port_id ,
. show_host_port_id = 1 ,
/* Host fixed attributes */
. show_host_node_name = 1 ,
. show_host_port_name = 1 ,
. show_host_supported_classes = 1 ,
. show_host_supported_fc4s = 1 ,
. show_host_supported_speeds = 1 ,
. show_host_maxframe_size = 1 ,
/* More host dynamic attributes */
. show_host_port_type = 1 ,
. get_host_port_type = bfad_im_get_host_port_type ,
. show_host_port_state = 1 ,
. get_host_port_state = bfad_im_get_host_port_state ,
. show_host_active_fc4s = 1 ,
. get_host_active_fc4s = bfad_im_get_host_active_fc4s ,
. show_host_speed = 1 ,
. get_host_speed = bfad_im_get_host_speed ,
. show_host_fabric_name = 1 ,
. get_host_fabric_name = bfad_im_get_host_fabric_name ,
. show_host_symbolic_name = 1 ,
/* Statistics */
. get_fc_host_stats = bfad_im_get_stats ,
. reset_fc_host_stats = bfad_im_reset_stats ,
/* Allocation length for host specific data */
. dd_fcrport_size = sizeof ( struct bfad_itnim_data_s * ) ,
/* Remote port fixed attributes */
. show_rport_maxframe_size = 1 ,
. show_rport_supported_classes = 1 ,
. show_rport_dev_loss_tmo = 1 ,
. set_rport_dev_loss_tmo = bfad_im_set_rport_loss_tmo ,
2012-03-14 04:37:26 +04:00
. issue_fc_host_lip = bfad_im_issue_fc_host_lip ,
2010-03-19 21:05:39 +03:00
. vport_create = bfad_im_vport_create ,
. vport_delete = bfad_im_vport_delete ,
. vport_disable = bfad_im_vport_disable ,
2012-08-23 06:50:20 +04:00
. set_vport_symbolic_name = bfad_im_vport_set_symbolic_name ,
2011-06-14 02:55:11 +04:00
. bsg_request = bfad_im_bsg_request ,
. bsg_timeout = bfad_im_bsg_timeout ,
2010-03-19 21:05:39 +03:00
} ;
struct fc_function_template bfad_im_vport_fc_function_template = {
/* Target dynamic attributes */
. get_starget_port_id = bfad_im_get_starget_port_id ,
. show_starget_port_id = 1 ,
. get_starget_node_name = bfad_im_get_starget_node_name ,
. show_starget_node_name = 1 ,
. get_starget_port_name = bfad_im_get_starget_port_name ,
. show_starget_port_name = 1 ,
2009-09-24 04:46:15 +04:00
/* Host dynamic attribute */
. get_host_port_id = bfad_im_get_host_port_id ,
. show_host_port_id = 1 ,
/* Host fixed attributes */
. show_host_node_name = 1 ,
. show_host_port_name = 1 ,
. show_host_supported_classes = 1 ,
. show_host_supported_fc4s = 1 ,
. show_host_supported_speeds = 1 ,
. show_host_maxframe_size = 1 ,
/* More host dynamic attributes */
. show_host_port_type = 1 ,
. get_host_port_type = bfad_im_get_host_port_type ,
. show_host_port_state = 1 ,
. get_host_port_state = bfad_im_get_host_port_state ,
. show_host_active_fc4s = 1 ,
. get_host_active_fc4s = bfad_im_get_host_active_fc4s ,
. show_host_speed = 1 ,
. get_host_speed = bfad_im_get_host_speed ,
. show_host_fabric_name = 1 ,
. get_host_fabric_name = bfad_im_get_host_fabric_name ,
. show_host_symbolic_name = 1 ,
/* Statistics */
. get_fc_host_stats = bfad_im_get_stats ,
. reset_fc_host_stats = bfad_im_reset_stats ,
/* Allocation length for host specific data */
. dd_fcrport_size = sizeof ( struct bfad_itnim_data_s * ) ,
/* Remote port fixed attributes */
. show_rport_maxframe_size = 1 ,
. show_rport_supported_classes = 1 ,
. show_rport_dev_loss_tmo = 1 ,
. set_rport_dev_loss_tmo = bfad_im_set_rport_loss_tmo ,
} ;
2010-10-19 04:17:23 +04:00
/*
2009-09-24 04:46:15 +04:00
* Scsi_Host_attrs SCSI host attributes
*/
static ssize_t
bfad_im_serial_num_show ( struct device * dev , struct device_attribute * attr ,
char * buf )
{
struct Scsi_Host * shost = class_to_shost ( dev ) ;
struct bfad_im_port_s * im_port =
( struct bfad_im_port_s * ) shost - > hostdata [ 0 ] ;
2010-09-15 22:50:55 +04:00
struct bfad_s * bfad = im_port - > bfad ;
2010-03-06 06:37:57 +03:00
char serial_num [ BFA_ADAPTER_SERIAL_NUM_LEN ] ;
2009-09-24 04:46:15 +04:00
2010-03-06 06:37:57 +03:00
bfa_get_adapter_serial_num ( & bfad - > bfa , serial_num ) ;
return snprintf ( buf , PAGE_SIZE , " %s \n " , serial_num ) ;
2009-09-24 04:46:15 +04:00
}
static ssize_t
bfad_im_model_show ( struct device * dev , struct device_attribute * attr ,
char * buf )
{
struct Scsi_Host * shost = class_to_shost ( dev ) ;
struct bfad_im_port_s * im_port =
( struct bfad_im_port_s * ) shost - > hostdata [ 0 ] ;
2010-09-15 22:50:55 +04:00
struct bfad_s * bfad = im_port - > bfad ;
2010-03-06 06:37:57 +03:00
char model [ BFA_ADAPTER_MODEL_NAME_LEN ] ;
2009-09-24 04:46:15 +04:00
2010-03-06 06:37:57 +03:00
bfa_get_adapter_model ( & bfad - > bfa , model ) ;
return snprintf ( buf , PAGE_SIZE , " %s \n " , model ) ;
2009-09-24 04:46:15 +04:00
}
static ssize_t
bfad_im_model_desc_show ( struct device * dev , struct device_attribute * attr ,
char * buf )
{
struct Scsi_Host * shost = class_to_shost ( dev ) ;
struct bfad_im_port_s * im_port =
( struct bfad_im_port_s * ) shost - > hostdata [ 0 ] ;
2010-09-15 22:50:55 +04:00
struct bfad_s * bfad = im_port - > bfad ;
char model [ BFA_ADAPTER_MODEL_NAME_LEN ] ;
2010-03-06 06:37:57 +03:00
char model_descr [ BFA_ADAPTER_MODEL_DESCR_LEN ] ;
2011-06-14 02:54:31 +04:00
int nports = 0 ;
2009-09-24 04:46:15 +04:00
2010-09-15 22:50:55 +04:00
bfa_get_adapter_model ( & bfad - > bfa , model ) ;
2011-06-14 02:54:31 +04:00
nports = bfa_get_nports ( & bfad - > bfa ) ;
2015-11-26 11:54:46 +03:00
if ( ! strcmp ( model , " QLogic-425 " ) )
2010-09-15 22:50:55 +04:00
snprintf ( model_descr , BFA_ADAPTER_MODEL_DESCR_LEN ,
2015-11-26 11:54:46 +03:00
" QLogic BR-series 4Gbps PCIe dual port FC HBA " ) ;
else if ( ! strcmp ( model , " QLogic-825 " ) )
2010-09-15 22:50:55 +04:00
snprintf ( model_descr , BFA_ADAPTER_MODEL_DESCR_LEN ,
2015-11-26 11:54:46 +03:00
" QLogic BR-series 8Gbps PCIe dual port FC HBA " ) ;
else if ( ! strcmp ( model , " QLogic-42B " ) )
2010-09-15 22:50:55 +04:00
snprintf ( model_descr , BFA_ADAPTER_MODEL_DESCR_LEN ,
2015-11-26 11:54:46 +03:00
" QLogic BR-series 4Gbps PCIe dual port FC HBA for HP " ) ;
else if ( ! strcmp ( model , " QLogic-82B " ) )
2010-09-15 22:50:55 +04:00
snprintf ( model_descr , BFA_ADAPTER_MODEL_DESCR_LEN ,
2015-11-26 11:54:46 +03:00
" QLogic BR-series 8Gbps PCIe dual port FC HBA for HP " ) ;
else if ( ! strcmp ( model , " QLogic-1010 " ) )
2010-09-15 22:50:55 +04:00
snprintf ( model_descr , BFA_ADAPTER_MODEL_DESCR_LEN ,
2015-11-26 11:54:46 +03:00
" QLogic BR-series 10Gbps single port CNA " ) ;
else if ( ! strcmp ( model , " QLogic-1020 " ) )
2010-09-15 22:50:55 +04:00
snprintf ( model_descr , BFA_ADAPTER_MODEL_DESCR_LEN ,
2015-11-26 11:54:46 +03:00
" QLogic BR-series 10Gbps dual port CNA " ) ;
else if ( ! strcmp ( model , " QLogic-1007 " ) )
2010-09-15 22:50:55 +04:00
snprintf ( model_descr , BFA_ADAPTER_MODEL_DESCR_LEN ,
2015-11-26 11:54:46 +03:00
" QLogic BR-series 10Gbps CNA for IBM Blade Center " ) ;
else if ( ! strcmp ( model , " QLogic-415 " ) )
2010-09-15 22:50:55 +04:00
snprintf ( model_descr , BFA_ADAPTER_MODEL_DESCR_LEN ,
2015-11-26 11:54:46 +03:00
" QLogic BR-series 4Gbps PCIe single port FC HBA " ) ;
else if ( ! strcmp ( model , " QLogic-815 " ) )
2010-09-15 22:50:55 +04:00
snprintf ( model_descr , BFA_ADAPTER_MODEL_DESCR_LEN ,
2015-11-26 11:54:46 +03:00
" QLogic BR-series 8Gbps PCIe single port FC HBA " ) ;
else if ( ! strcmp ( model , " QLogic-41B " ) )
2010-09-15 22:50:55 +04:00
snprintf ( model_descr , BFA_ADAPTER_MODEL_DESCR_LEN ,
2015-11-26 11:54:46 +03:00
" QLogic BR-series 4Gbps PCIe single port FC HBA for HP " ) ;
else if ( ! strcmp ( model , " QLogic-81B " ) )
2010-09-15 22:50:55 +04:00
snprintf ( model_descr , BFA_ADAPTER_MODEL_DESCR_LEN ,
2015-11-26 11:54:46 +03:00
" QLogic BR-series 8Gbps PCIe single port FC HBA for HP " ) ;
else if ( ! strcmp ( model , " QLogic-804 " ) )
2010-09-15 22:50:55 +04:00
snprintf ( model_descr , BFA_ADAPTER_MODEL_DESCR_LEN ,
2015-11-26 11:54:46 +03:00
" QLogic BR-series 8Gbps FC HBA for HP Bladesystem C-class " ) ;
else if ( ! strcmp ( model , " QLogic-1741 " ) )
2010-09-15 22:50:55 +04:00
snprintf ( model_descr , BFA_ADAPTER_MODEL_DESCR_LEN ,
2015-11-26 11:54:46 +03:00
" QLogic BR-series 10Gbps CNA for Dell M-Series Blade Servers " ) ;
else if ( strstr ( model , " QLogic-1860 " ) ) {
2011-06-14 02:54:31 +04:00
if ( nports = = 1 & & bfa_ioc_is_cna ( & bfad - > bfa . ioc ) )
snprintf ( model_descr , BFA_ADAPTER_MODEL_DESCR_LEN ,
2015-11-26 11:54:46 +03:00
" QLogic BR-series 10Gbps single port CNA " ) ;
2011-06-14 02:54:31 +04:00
else if ( nports = = 1 & & ! bfa_ioc_is_cna ( & bfad - > bfa . ioc ) )
snprintf ( model_descr , BFA_ADAPTER_MODEL_DESCR_LEN ,
2015-11-26 11:54:46 +03:00
" QLogic BR-series 16Gbps PCIe single port FC HBA " ) ;
2011-06-14 02:54:31 +04:00
else if ( nports = = 2 & & bfa_ioc_is_cna ( & bfad - > bfa . ioc ) )
snprintf ( model_descr , BFA_ADAPTER_MODEL_DESCR_LEN ,
2015-11-26 11:54:46 +03:00
" QLogic BR-series 10Gbps dual port CNA " ) ;
2011-06-14 02:54:31 +04:00
else if ( nports = = 2 & & ! bfa_ioc_is_cna ( & bfad - > bfa . ioc ) )
snprintf ( model_descr , BFA_ADAPTER_MODEL_DESCR_LEN ,
2015-11-26 11:54:46 +03:00
" QLogic BR-series 16Gbps PCIe dual port FC HBA " ) ;
} else if ( ! strcmp ( model , " QLogic-1867 " ) ) {
2012-08-23 06:51:35 +04:00
if ( nports = = 1 & & ! bfa_ioc_is_cna ( & bfad - > bfa . ioc ) )
snprintf ( model_descr , BFA_ADAPTER_MODEL_DESCR_LEN ,
2015-11-26 11:54:46 +03:00
" QLogic BR-series 16Gbps PCIe single port FC HBA for IBM " ) ;
2012-08-23 06:51:35 +04:00
else if ( nports = = 2 & & ! bfa_ioc_is_cna ( & bfad - > bfa . ioc ) )
snprintf ( model_descr , BFA_ADAPTER_MODEL_DESCR_LEN ,
2015-11-26 11:54:46 +03:00
" QLogic BR-series 16Gbps PCIe dual port FC HBA for IBM " ) ;
2011-06-14 02:54:31 +04:00
} else
2010-09-15 22:50:55 +04:00
snprintf ( model_descr , BFA_ADAPTER_MODEL_DESCR_LEN ,
" Invalid Model " ) ;
2010-03-06 06:37:57 +03:00
return snprintf ( buf , PAGE_SIZE , " %s \n " , model_descr ) ;
2009-09-24 04:46:15 +04:00
}
static ssize_t
bfad_im_node_name_show ( struct device * dev , struct device_attribute * attr ,
char * buf )
{
struct Scsi_Host * shost = class_to_shost ( dev ) ;
struct bfad_im_port_s * im_port =
( struct bfad_im_port_s * ) shost - > hostdata [ 0 ] ;
struct bfad_port_s * port = im_port - > port ;
u64 nwwn ;
2010-09-15 22:50:55 +04:00
nwwn = bfa_fcs_lport_get_nwwn ( port - > fcs_port ) ;
2010-10-19 04:10:50 +04:00
return snprintf ( buf , PAGE_SIZE , " 0x%llx \n " , cpu_to_be64 ( nwwn ) ) ;
2009-09-24 04:46:15 +04:00
}
static ssize_t
bfad_im_symbolic_name_show ( struct device * dev , struct device_attribute * attr ,
char * buf )
{
struct Scsi_Host * shost = class_to_shost ( dev ) ;
struct bfad_im_port_s * im_port =
( struct bfad_im_port_s * ) shost - > hostdata [ 0 ] ;
2010-09-15 22:50:55 +04:00
struct bfad_s * bfad = im_port - > bfad ;
struct bfa_lport_attr_s port_attr ;
char symname [ BFA_SYMNAME_MAXLEN ] ;
2009-09-24 04:46:15 +04:00
2010-09-15 22:50:55 +04:00
bfa_fcs_lport_get_attr ( & bfad - > bfa_fcs . fabric . bport , & port_attr ) ;
2017-12-04 17:47:00 +03:00
strlcpy ( symname , port_attr . port_cfg . sym_name . symname ,
2010-09-15 22:50:55 +04:00
BFA_SYMNAME_MAXLEN ) ;
return snprintf ( buf , PAGE_SIZE , " %s \n " , symname ) ;
2009-09-24 04:46:15 +04:00
}
static ssize_t
bfad_im_hw_version_show ( struct device * dev , struct device_attribute * attr ,
char * buf )
{
struct Scsi_Host * shost = class_to_shost ( dev ) ;
struct bfad_im_port_s * im_port =
( struct bfad_im_port_s * ) shost - > hostdata [ 0 ] ;
2010-09-15 22:50:55 +04:00
struct bfad_s * bfad = im_port - > bfad ;
2010-03-06 06:37:57 +03:00
char hw_ver [ BFA_VERSION_LEN ] ;
2009-09-24 04:46:15 +04:00
2010-03-06 06:37:57 +03:00
bfa_get_pci_chip_rev ( & bfad - > bfa , hw_ver ) ;
return snprintf ( buf , PAGE_SIZE , " %s \n " , hw_ver ) ;
2009-09-24 04:46:15 +04:00
}
static ssize_t
bfad_im_drv_version_show ( struct device * dev , struct device_attribute * attr ,
char * buf )
{
return snprintf ( buf , PAGE_SIZE , " %s \n " , BFAD_DRIVER_VERSION ) ;
}
static ssize_t
bfad_im_optionrom_version_show ( struct device * dev ,
struct device_attribute * attr , char * buf )
{
struct Scsi_Host * shost = class_to_shost ( dev ) ;
struct bfad_im_port_s * im_port =
( struct bfad_im_port_s * ) shost - > hostdata [ 0 ] ;
2010-09-15 22:50:55 +04:00
struct bfad_s * bfad = im_port - > bfad ;
2010-03-06 06:37:57 +03:00
char optrom_ver [ BFA_VERSION_LEN ] ;
2009-09-24 04:46:15 +04:00
2010-03-06 06:37:57 +03:00
bfa_get_adapter_optrom_ver ( & bfad - > bfa , optrom_ver ) ;
return snprintf ( buf , PAGE_SIZE , " %s \n " , optrom_ver ) ;
2009-09-24 04:46:15 +04:00
}
static ssize_t
bfad_im_fw_version_show ( struct device * dev , struct device_attribute * attr ,
char * buf )
{
struct Scsi_Host * shost = class_to_shost ( dev ) ;
struct bfad_im_port_s * im_port =
( struct bfad_im_port_s * ) shost - > hostdata [ 0 ] ;
2010-09-15 22:50:55 +04:00
struct bfad_s * bfad = im_port - > bfad ;
2010-03-06 06:37:57 +03:00
char fw_ver [ BFA_VERSION_LEN ] ;
2009-09-24 04:46:15 +04:00
2010-03-06 06:37:57 +03:00
bfa_get_adapter_fw_ver ( & bfad - > bfa , fw_ver ) ;
return snprintf ( buf , PAGE_SIZE , " %s \n " , fw_ver ) ;
2009-09-24 04:46:15 +04:00
}
static ssize_t
bfad_im_num_of_ports_show ( struct device * dev , struct device_attribute * attr ,
char * buf )
{
struct Scsi_Host * shost = class_to_shost ( dev ) ;
struct bfad_im_port_s * im_port =
( struct bfad_im_port_s * ) shost - > hostdata [ 0 ] ;
2010-09-15 22:50:55 +04:00
struct bfad_s * bfad = im_port - > bfad ;
2009-09-24 04:46:15 +04:00
2010-03-06 06:37:57 +03:00
return snprintf ( buf , PAGE_SIZE , " %d \n " ,
2010-09-15 22:50:55 +04:00
bfa_get_nports ( & bfad - > bfa ) ) ;
2009-09-24 04:46:15 +04:00
}
static ssize_t
bfad_im_drv_name_show ( struct device * dev , struct device_attribute * attr ,
char * buf )
{
return snprintf ( buf , PAGE_SIZE , " %s \n " , BFAD_DRIVER_NAME ) ;
}
static ssize_t
bfad_im_num_of_discovered_ports_show ( struct device * dev ,
struct device_attribute * attr , char * buf )
{
struct Scsi_Host * shost = class_to_shost ( dev ) ;
struct bfad_im_port_s * im_port =
( struct bfad_im_port_s * ) shost - > hostdata [ 0 ] ;
struct bfad_port_s * port = im_port - > port ;
struct bfad_s * bfad = im_port - > bfad ;
int nrports = 2048 ;
2012-08-23 06:50:43 +04:00
struct bfa_rport_qualifier_s * rports = NULL ;
2009-09-24 04:46:15 +04:00
unsigned long flags ;
treewide: kzalloc() -> kcalloc()
The kzalloc() function has a 2-factor argument form, kcalloc(). This
patch replaces cases of:
kzalloc(a * b, gfp)
with:
kcalloc(a * b, gfp)
as well as handling cases of:
kzalloc(a * b * c, gfp)
with:
kzalloc(array3_size(a, b, c), gfp)
as it's slightly less ugly than:
kzalloc_array(array_size(a, b), c, gfp)
This does, however, attempt to ignore constant size factors like:
kzalloc(4 * 1024, gfp)
though any constants defined via macros get caught up in the conversion.
Any factors with a sizeof() of "unsigned char", "char", and "u8" were
dropped, since they're redundant.
The Coccinelle script used for this was:
// Fix redundant parens around sizeof().
@@
type TYPE;
expression THING, E;
@@
(
kzalloc(
- (sizeof(TYPE)) * E
+ sizeof(TYPE) * E
, ...)
|
kzalloc(
- (sizeof(THING)) * E
+ sizeof(THING) * E
, ...)
)
// Drop single-byte sizes and redundant parens.
@@
expression COUNT;
typedef u8;
typedef __u8;
@@
(
kzalloc(
- sizeof(u8) * (COUNT)
+ COUNT
, ...)
|
kzalloc(
- sizeof(__u8) * (COUNT)
+ COUNT
, ...)
|
kzalloc(
- sizeof(char) * (COUNT)
+ COUNT
, ...)
|
kzalloc(
- sizeof(unsigned char) * (COUNT)
+ COUNT
, ...)
|
kzalloc(
- sizeof(u8) * COUNT
+ COUNT
, ...)
|
kzalloc(
- sizeof(__u8) * COUNT
+ COUNT
, ...)
|
kzalloc(
- sizeof(char) * COUNT
+ COUNT
, ...)
|
kzalloc(
- sizeof(unsigned char) * COUNT
+ COUNT
, ...)
)
// 2-factor product with sizeof(type/expression) and identifier or constant.
@@
type TYPE;
expression THING;
identifier COUNT_ID;
constant COUNT_CONST;
@@
(
- kzalloc
+ kcalloc
(
- sizeof(TYPE) * (COUNT_ID)
+ COUNT_ID, sizeof(TYPE)
, ...)
|
- kzalloc
+ kcalloc
(
- sizeof(TYPE) * COUNT_ID
+ COUNT_ID, sizeof(TYPE)
, ...)
|
- kzalloc
+ kcalloc
(
- sizeof(TYPE) * (COUNT_CONST)
+ COUNT_CONST, sizeof(TYPE)
, ...)
|
- kzalloc
+ kcalloc
(
- sizeof(TYPE) * COUNT_CONST
+ COUNT_CONST, sizeof(TYPE)
, ...)
|
- kzalloc
+ kcalloc
(
- sizeof(THING) * (COUNT_ID)
+ COUNT_ID, sizeof(THING)
, ...)
|
- kzalloc
+ kcalloc
(
- sizeof(THING) * COUNT_ID
+ COUNT_ID, sizeof(THING)
, ...)
|
- kzalloc
+ kcalloc
(
- sizeof(THING) * (COUNT_CONST)
+ COUNT_CONST, sizeof(THING)
, ...)
|
- kzalloc
+ kcalloc
(
- sizeof(THING) * COUNT_CONST
+ COUNT_CONST, sizeof(THING)
, ...)
)
// 2-factor product, only identifiers.
@@
identifier SIZE, COUNT;
@@
- kzalloc
+ kcalloc
(
- SIZE * COUNT
+ COUNT, SIZE
, ...)
// 3-factor product with 1 sizeof(type) or sizeof(expression), with
// redundant parens removed.
@@
expression THING;
identifier STRIDE, COUNT;
type TYPE;
@@
(
kzalloc(
- sizeof(TYPE) * (COUNT) * (STRIDE)
+ array3_size(COUNT, STRIDE, sizeof(TYPE))
, ...)
|
kzalloc(
- sizeof(TYPE) * (COUNT) * STRIDE
+ array3_size(COUNT, STRIDE, sizeof(TYPE))
, ...)
|
kzalloc(
- sizeof(TYPE) * COUNT * (STRIDE)
+ array3_size(COUNT, STRIDE, sizeof(TYPE))
, ...)
|
kzalloc(
- sizeof(TYPE) * COUNT * STRIDE
+ array3_size(COUNT, STRIDE, sizeof(TYPE))
, ...)
|
kzalloc(
- sizeof(THING) * (COUNT) * (STRIDE)
+ array3_size(COUNT, STRIDE, sizeof(THING))
, ...)
|
kzalloc(
- sizeof(THING) * (COUNT) * STRIDE
+ array3_size(COUNT, STRIDE, sizeof(THING))
, ...)
|
kzalloc(
- sizeof(THING) * COUNT * (STRIDE)
+ array3_size(COUNT, STRIDE, sizeof(THING))
, ...)
|
kzalloc(
- sizeof(THING) * COUNT * STRIDE
+ array3_size(COUNT, STRIDE, sizeof(THING))
, ...)
)
// 3-factor product with 2 sizeof(variable), with redundant parens removed.
@@
expression THING1, THING2;
identifier COUNT;
type TYPE1, TYPE2;
@@
(
kzalloc(
- sizeof(TYPE1) * sizeof(TYPE2) * COUNT
+ array3_size(COUNT, sizeof(TYPE1), sizeof(TYPE2))
, ...)
|
kzalloc(
- sizeof(TYPE1) * sizeof(THING2) * (COUNT)
+ array3_size(COUNT, sizeof(TYPE1), sizeof(TYPE2))
, ...)
|
kzalloc(
- sizeof(THING1) * sizeof(THING2) * COUNT
+ array3_size(COUNT, sizeof(THING1), sizeof(THING2))
, ...)
|
kzalloc(
- sizeof(THING1) * sizeof(THING2) * (COUNT)
+ array3_size(COUNT, sizeof(THING1), sizeof(THING2))
, ...)
|
kzalloc(
- sizeof(TYPE1) * sizeof(THING2) * COUNT
+ array3_size(COUNT, sizeof(TYPE1), sizeof(THING2))
, ...)
|
kzalloc(
- sizeof(TYPE1) * sizeof(THING2) * (COUNT)
+ array3_size(COUNT, sizeof(TYPE1), sizeof(THING2))
, ...)
)
// 3-factor product, only identifiers, with redundant parens removed.
@@
identifier STRIDE, SIZE, COUNT;
@@
(
kzalloc(
- (COUNT) * STRIDE * SIZE
+ array3_size(COUNT, STRIDE, SIZE)
, ...)
|
kzalloc(
- COUNT * (STRIDE) * SIZE
+ array3_size(COUNT, STRIDE, SIZE)
, ...)
|
kzalloc(
- COUNT * STRIDE * (SIZE)
+ array3_size(COUNT, STRIDE, SIZE)
, ...)
|
kzalloc(
- (COUNT) * (STRIDE) * SIZE
+ array3_size(COUNT, STRIDE, SIZE)
, ...)
|
kzalloc(
- COUNT * (STRIDE) * (SIZE)
+ array3_size(COUNT, STRIDE, SIZE)
, ...)
|
kzalloc(
- (COUNT) * STRIDE * (SIZE)
+ array3_size(COUNT, STRIDE, SIZE)
, ...)
|
kzalloc(
- (COUNT) * (STRIDE) * (SIZE)
+ array3_size(COUNT, STRIDE, SIZE)
, ...)
|
kzalloc(
- COUNT * STRIDE * SIZE
+ array3_size(COUNT, STRIDE, SIZE)
, ...)
)
// Any remaining multi-factor products, first at least 3-factor products,
// when they're not all constants...
@@
expression E1, E2, E3;
constant C1, C2, C3;
@@
(
kzalloc(C1 * C2 * C3, ...)
|
kzalloc(
- (E1) * E2 * E3
+ array3_size(E1, E2, E3)
, ...)
|
kzalloc(
- (E1) * (E2) * E3
+ array3_size(E1, E2, E3)
, ...)
|
kzalloc(
- (E1) * (E2) * (E3)
+ array3_size(E1, E2, E3)
, ...)
|
kzalloc(
- E1 * E2 * E3
+ array3_size(E1, E2, E3)
, ...)
)
// And then all remaining 2 factors products when they're not all constants,
// keeping sizeof() as the second factor argument.
@@
expression THING, E1, E2;
type TYPE;
constant C1, C2, C3;
@@
(
kzalloc(sizeof(THING) * C2, ...)
|
kzalloc(sizeof(TYPE) * C2, ...)
|
kzalloc(C1 * C2 * C3, ...)
|
kzalloc(C1 * C2, ...)
|
- kzalloc
+ kcalloc
(
- sizeof(TYPE) * (E2)
+ E2, sizeof(TYPE)
, ...)
|
- kzalloc
+ kcalloc
(
- sizeof(TYPE) * E2
+ E2, sizeof(TYPE)
, ...)
|
- kzalloc
+ kcalloc
(
- sizeof(THING) * (E2)
+ E2, sizeof(THING)
, ...)
|
- kzalloc
+ kcalloc
(
- sizeof(THING) * E2
+ E2, sizeof(THING)
, ...)
|
- kzalloc
+ kcalloc
(
- (E1) * E2
+ E1, E2
, ...)
|
- kzalloc
+ kcalloc
(
- (E1) * (E2)
+ E1, E2
, ...)
|
- kzalloc
+ kcalloc
(
- E1 * E2
+ E1, E2
, ...)
)
Signed-off-by: Kees Cook <keescook@chromium.org>
2018-06-13 00:03:40 +03:00
rports = kcalloc ( nrports , sizeof ( struct bfa_rport_qualifier_s ) ,
2012-08-23 06:50:43 +04:00
GFP_ATOMIC ) ;
2009-09-24 04:46:15 +04:00
if ( rports = = NULL )
2010-09-15 22:50:55 +04:00
return snprintf ( buf , PAGE_SIZE , " Failed \n " ) ;
2009-09-24 04:46:15 +04:00
spin_lock_irqsave ( & bfad - > bfad_lock , flags ) ;
2012-08-23 06:50:43 +04:00
bfa_fcs_lport_get_rport_quals ( port - > fcs_port , rports , & nrports ) ;
2009-09-24 04:46:15 +04:00
spin_unlock_irqrestore ( & bfad - > bfad_lock , flags ) ;
kfree ( rports ) ;
return snprintf ( buf , PAGE_SIZE , " %d \n " , nrports ) ;
}
static DEVICE_ATTR ( serial_number , S_IRUGO ,
bfad_im_serial_num_show , NULL ) ;
static DEVICE_ATTR ( model , S_IRUGO , bfad_im_model_show , NULL ) ;
static DEVICE_ATTR ( model_description , S_IRUGO ,
bfad_im_model_desc_show , NULL ) ;
static DEVICE_ATTR ( node_name , S_IRUGO , bfad_im_node_name_show , NULL ) ;
static DEVICE_ATTR ( symbolic_name , S_IRUGO ,
bfad_im_symbolic_name_show , NULL ) ;
static DEVICE_ATTR ( hardware_version , S_IRUGO ,
bfad_im_hw_version_show , NULL ) ;
static DEVICE_ATTR ( driver_version , S_IRUGO ,
bfad_im_drv_version_show , NULL ) ;
static DEVICE_ATTR ( option_rom_version , S_IRUGO ,
bfad_im_optionrom_version_show , NULL ) ;
static DEVICE_ATTR ( firmware_version , S_IRUGO ,
bfad_im_fw_version_show , NULL ) ;
static DEVICE_ATTR ( number_of_ports , S_IRUGO ,
bfad_im_num_of_ports_show , NULL ) ;
static DEVICE_ATTR ( driver_name , S_IRUGO , bfad_im_drv_name_show , NULL ) ;
static DEVICE_ATTR ( number_of_discovered_ports , S_IRUGO ,
bfad_im_num_of_discovered_ports_show , NULL ) ;
struct device_attribute * bfad_im_host_attrs [ ] = {
& dev_attr_serial_number ,
& dev_attr_model ,
& dev_attr_model_description ,
& dev_attr_node_name ,
& dev_attr_symbolic_name ,
& dev_attr_hardware_version ,
& dev_attr_driver_version ,
& dev_attr_option_rom_version ,
& dev_attr_firmware_version ,
& dev_attr_number_of_ports ,
& dev_attr_driver_name ,
& dev_attr_number_of_discovered_ports ,
NULL ,
} ;
struct device_attribute * bfad_im_vport_attrs [ ] = {
2010-09-15 22:50:55 +04:00
& dev_attr_serial_number ,
& dev_attr_model ,
& dev_attr_model_description ,
& dev_attr_node_name ,
& dev_attr_symbolic_name ,
& dev_attr_hardware_version ,
& dev_attr_driver_version ,
& dev_attr_option_rom_version ,
& dev_attr_firmware_version ,
& dev_attr_number_of_ports ,
& dev_attr_driver_name ,
& dev_attr_number_of_discovered_ports ,
NULL ,
2009-09-24 04:46:15 +04:00
} ;