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
*
* 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-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 bfad_port_s * port ;
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
port = im_port - > port ;
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 ) ;
2010-09-15 22:50:55 +04:00
if ( ! strcmp ( model , " Brocade-425 " ) )
snprintf ( model_descr , BFA_ADAPTER_MODEL_DESCR_LEN ,
" Brocade 4Gbps PCIe dual port FC HBA " ) ;
else if ( ! strcmp ( model , " Brocade-825 " ) )
snprintf ( model_descr , BFA_ADAPTER_MODEL_DESCR_LEN ,
" Brocade 8Gbps PCIe dual port FC HBA " ) ;
else if ( ! strcmp ( model , " Brocade-42B " ) )
snprintf ( model_descr , BFA_ADAPTER_MODEL_DESCR_LEN ,
2011-06-14 02:54:31 +04:00
" Brocade 4Gbps PCIe dual port FC HBA for HP " ) ;
2010-09-15 22:50:55 +04:00
else if ( ! strcmp ( model , " Brocade-82B " ) )
snprintf ( model_descr , BFA_ADAPTER_MODEL_DESCR_LEN ,
2011-06-14 02:54:31 +04:00
" Brocade 8Gbps PCIe dual port FC HBA for HP " ) ;
2010-09-15 22:50:55 +04:00
else if ( ! strcmp ( model , " Brocade-1010 " ) )
snprintf ( model_descr , BFA_ADAPTER_MODEL_DESCR_LEN ,
" Brocade 10Gbps single port CNA " ) ;
else if ( ! strcmp ( model , " Brocade-1020 " ) )
snprintf ( model_descr , BFA_ADAPTER_MODEL_DESCR_LEN ,
" Brocade 10Gbps dual port CNA " ) ;
else if ( ! strcmp ( model , " Brocade-1007 " ) )
snprintf ( model_descr , BFA_ADAPTER_MODEL_DESCR_LEN ,
2011-06-14 02:54:31 +04:00
" Brocade 10Gbps CNA for IBM Blade Center " ) ;
2010-09-15 22:50:55 +04:00
else if ( ! strcmp ( model , " Brocade-415 " ) )
snprintf ( model_descr , BFA_ADAPTER_MODEL_DESCR_LEN ,
" Brocade 4Gbps PCIe single port FC HBA " ) ;
else if ( ! strcmp ( model , " Brocade-815 " ) )
snprintf ( model_descr , BFA_ADAPTER_MODEL_DESCR_LEN ,
" Brocade 8Gbps PCIe single port FC HBA " ) ;
else if ( ! strcmp ( model , " Brocade-41B " ) )
snprintf ( model_descr , BFA_ADAPTER_MODEL_DESCR_LEN ,
2011-06-14 02:54:31 +04:00
" Brocade 4Gbps PCIe single port FC HBA for HP " ) ;
2010-09-15 22:50:55 +04:00
else if ( ! strcmp ( model , " Brocade-81B " ) )
snprintf ( model_descr , BFA_ADAPTER_MODEL_DESCR_LEN ,
2011-06-14 02:54:31 +04:00
" Brocade 8Gbps PCIe single port FC HBA for HP " ) ;
2010-09-15 22:50:55 +04:00
else if ( ! strcmp ( model , " Brocade-804 " ) )
snprintf ( model_descr , BFA_ADAPTER_MODEL_DESCR_LEN ,
2011-06-14 02:54:31 +04:00
" Brocade 8Gbps FC HBA for HP Bladesystem C-class " ) ;
2012-04-10 05:40:43 +04:00
else if ( ! strcmp ( model , " Brocade-1741 " ) )
2010-09-15 22:50:55 +04:00
snprintf ( model_descr , BFA_ADAPTER_MODEL_DESCR_LEN ,
2011-06-14 02:54:31 +04:00
" Brocade 10Gbps CNA for Dell M-Series Blade Servers " ) ;
2012-04-10 05:40:43 +04:00
else if ( strstr ( model , " Brocade-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 ,
" Brocade 10Gbps single port CNA " ) ;
else if ( nports = = 1 & & ! bfa_ioc_is_cna ( & bfad - > bfa . ioc ) )
snprintf ( model_descr , BFA_ADAPTER_MODEL_DESCR_LEN ,
" Brocade 16Gbps PCIe single port FC HBA " ) ;
else if ( nports = = 2 & & bfa_ioc_is_cna ( & bfad - > bfa . ioc ) )
snprintf ( model_descr , BFA_ADAPTER_MODEL_DESCR_LEN ,
" Brocade 10Gbps dual port CNA " ) ;
else if ( nports = = 2 & & ! bfa_ioc_is_cna ( & bfad - > bfa . ioc ) )
snprintf ( model_descr , BFA_ADAPTER_MODEL_DESCR_LEN ,
" Brocade 16Gbps PCIe dual port FC HBA " ) ;
2012-08-23 06:51:35 +04:00
} else if ( ! strcmp ( model , " Brocade-1867 " ) ) {
if ( nports = = 1 & & ! bfa_ioc_is_cna ( & bfad - > bfa . ioc ) )
snprintf ( model_descr , BFA_ADAPTER_MODEL_DESCR_LEN ,
" Brocade 16Gbps PCIe single port FC HBA for IBM " ) ;
else if ( nports = = 2 & & ! bfa_ioc_is_cna ( & bfad - > bfa . ioc ) )
snprintf ( model_descr , BFA_ADAPTER_MODEL_DESCR_LEN ,
" Brocade 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 ) ;
strncpy ( symname , port_attr . port_cfg . sym_name . symname ,
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 ;
2012-08-23 06:50:43 +04:00
rports = kzalloc ( sizeof ( struct bfa_rport_qualifier_s ) * nrports ,
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
} ;