[SCSI] bfa: Brocade BFA FC SCSI driver
Add new driver for Brocade Hardware Signed-off-by: Jing Huang <huangj@brocade.com> Signed-off-by: James Bottomley <James.Bottomley@suse.de>
This commit is contained in:

committed by
James Bottomley

parent
5415907af1
commit
7725ccfda5
292
drivers/scsi/bfa/vfapi.c
Normal file
292
drivers/scsi/bfa/vfapi.c
Normal file
@@ -0,0 +1,292 @@
|
||||
/*
|
||||
* Copyright (c) 2005-2009 Brocade Communications Systems, Inc.
|
||||
* 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.
|
||||
*/
|
||||
|
||||
/**
|
||||
* vfapi.c Fabric module implementation.
|
||||
*/
|
||||
|
||||
#include "fcs_fabric.h"
|
||||
#include "fcs_trcmod.h"
|
||||
|
||||
BFA_TRC_FILE(FCS, VFAPI);
|
||||
|
||||
/**
|
||||
* fcs_vf_api virtual fabrics API
|
||||
*/
|
||||
|
||||
/**
|
||||
* Enable VF mode.
|
||||
*
|
||||
* @param[in] fcs fcs module instance
|
||||
* @param[in] vf_id default vf_id of port, FC_VF_ID_NULL
|
||||
* to use standard default vf_id of 1.
|
||||
*
|
||||
* @retval BFA_STATUS_OK vf mode is enabled
|
||||
* @retval BFA_STATUS_BUSY Port is active. Port must be disabled
|
||||
* before VF mode can be enabled.
|
||||
*/
|
||||
bfa_status_t
|
||||
bfa_fcs_vf_mode_enable(struct bfa_fcs_s *fcs, u16 vf_id)
|
||||
{
|
||||
return BFA_STATUS_OK;
|
||||
}
|
||||
|
||||
/**
|
||||
* Disable VF mode.
|
||||
*
|
||||
* @param[in] fcs fcs module instance
|
||||
*
|
||||
* @retval BFA_STATUS_OK vf mode is disabled
|
||||
* @retval BFA_STATUS_BUSY VFs are present and being used. All
|
||||
* VFs must be deleted before disabling
|
||||
* VF mode.
|
||||
*/
|
||||
bfa_status_t
|
||||
bfa_fcs_vf_mode_disable(struct bfa_fcs_s *fcs)
|
||||
{
|
||||
return BFA_STATUS_OK;
|
||||
}
|
||||
|
||||
/**
|
||||
* Create a new VF instance.
|
||||
*
|
||||
* A new VF is created using the given VF configuration. A VF is identified
|
||||
* by VF id. No duplicate VF creation is allowed with the same VF id. Once
|
||||
* a VF is created, VF is automatically started after link initialization
|
||||
* and EVFP exchange is completed.
|
||||
*
|
||||
* param[in] vf - FCS vf data structure. Memory is
|
||||
* allocated by caller (driver)
|
||||
* param[in] fcs - FCS module
|
||||
* param[in] vf_cfg - VF configuration
|
||||
* param[in] vf_drv - Opaque handle back to the driver's
|
||||
* virtual vf structure
|
||||
*
|
||||
* retval BFA_STATUS_OK VF creation is successful
|
||||
* retval BFA_STATUS_FAILED VF creation failed
|
||||
* retval BFA_STATUS_EEXIST A VF exists with the given vf_id
|
||||
*/
|
||||
bfa_status_t
|
||||
bfa_fcs_vf_create(bfa_fcs_vf_t *vf, struct bfa_fcs_s *fcs, u16 vf_id,
|
||||
struct bfa_port_cfg_s *port_cfg, struct bfad_vf_s *vf_drv)
|
||||
{
|
||||
bfa_trc(fcs, vf_id);
|
||||
return BFA_STATUS_OK;
|
||||
}
|
||||
|
||||
/**
|
||||
* Use this function to delete a BFA VF object. VF object should
|
||||
* be stopped before this function call.
|
||||
*
|
||||
* param[in] vf - pointer to bfa_vf_t.
|
||||
*
|
||||
* retval BFA_STATUS_OK On vf deletion success
|
||||
* retval BFA_STATUS_BUSY VF is not in a stopped state
|
||||
* retval BFA_STATUS_INPROGRESS VF deletion in in progress
|
||||
*/
|
||||
bfa_status_t
|
||||
bfa_fcs_vf_delete(bfa_fcs_vf_t *vf)
|
||||
{
|
||||
bfa_trc(vf->fcs, vf->vf_id);
|
||||
return BFA_STATUS_OK;
|
||||
}
|
||||
|
||||
/**
|
||||
* Start participation in VF. This triggers login to the virtual fabric.
|
||||
*
|
||||
* param[in] vf - pointer to bfa_vf_t.
|
||||
*
|
||||
* return None
|
||||
*/
|
||||
void
|
||||
bfa_fcs_vf_start(bfa_fcs_vf_t *vf)
|
||||
{
|
||||
bfa_trc(vf->fcs, vf->vf_id);
|
||||
}
|
||||
|
||||
/**
|
||||
* Logout with the virtual fabric.
|
||||
*
|
||||
* param[in] vf - pointer to bfa_vf_t.
|
||||
*
|
||||
* retval BFA_STATUS_OK On success.
|
||||
* retval BFA_STATUS_INPROGRESS VF is being stopped.
|
||||
*/
|
||||
bfa_status_t
|
||||
bfa_fcs_vf_stop(bfa_fcs_vf_t *vf)
|
||||
{
|
||||
bfa_trc(vf->fcs, vf->vf_id);
|
||||
return BFA_STATUS_OK;
|
||||
}
|
||||
|
||||
/**
|
||||
* Returns attributes of the given VF.
|
||||
*
|
||||
* param[in] vf pointer to bfa_vf_t.
|
||||
* param[out] vf_attr vf attributes returned
|
||||
*
|
||||
* return None
|
||||
*/
|
||||
void
|
||||
bfa_fcs_vf_get_attr(bfa_fcs_vf_t *vf, struct bfa_vf_attr_s *vf_attr)
|
||||
{
|
||||
bfa_trc(vf->fcs, vf->vf_id);
|
||||
}
|
||||
|
||||
/**
|
||||
* Return statistics associated with the given vf.
|
||||
*
|
||||
* param[in] vf pointer to bfa_vf_t.
|
||||
* param[out] vf_stats vf statistics returned
|
||||
*
|
||||
* @return None
|
||||
*/
|
||||
void
|
||||
bfa_fcs_vf_get_stats(bfa_fcs_vf_t *vf, struct bfa_vf_stats_s *vf_stats)
|
||||
{
|
||||
bfa_os_memcpy(vf_stats, &vf->stats, sizeof(struct bfa_vf_stats_s));
|
||||
return;
|
||||
}
|
||||
|
||||
void
|
||||
/**
|
||||
* clear statistics associated with the given vf.
|
||||
*
|
||||
* param[in] vf pointer to bfa_vf_t.
|
||||
*
|
||||
* @return None
|
||||
*/
|
||||
bfa_fcs_vf_clear_stats(bfa_fcs_vf_t *vf)
|
||||
{
|
||||
bfa_os_memset(&vf->stats, 0, sizeof(struct bfa_vf_stats_s));
|
||||
return;
|
||||
}
|
||||
|
||||
/**
|
||||
* Returns FCS vf structure for a given vf_id.
|
||||
*
|
||||
* param[in] vf_id - VF_ID
|
||||
*
|
||||
* return
|
||||
* If lookup succeeds, retuns fcs vf object, otherwise returns NULL
|
||||
*/
|
||||
bfa_fcs_vf_t *
|
||||
bfa_fcs_vf_lookup(struct bfa_fcs_s *fcs, u16 vf_id)
|
||||
{
|
||||
bfa_trc(fcs, vf_id);
|
||||
if (vf_id == FC_VF_ID_NULL)
|
||||
return (&fcs->fabric);
|
||||
|
||||
/**
|
||||
* @todo vf support
|
||||
*/
|
||||
|
||||
return NULL;
|
||||
}
|
||||
|
||||
/**
|
||||
* Returns driver VF structure for a given FCS vf.
|
||||
*
|
||||
* param[in] vf - pointer to bfa_vf_t
|
||||
*
|
||||
* return Driver VF structure
|
||||
*/
|
||||
struct bfad_vf_s *
|
||||
bfa_fcs_vf_get_drv_vf(bfa_fcs_vf_t *vf)
|
||||
{
|
||||
bfa_assert(vf);
|
||||
bfa_trc(vf->fcs, vf->vf_id);
|
||||
return vf->vf_drv;
|
||||
}
|
||||
|
||||
/**
|
||||
* Return the list of VFs configured.
|
||||
*
|
||||
* param[in] fcs fcs module instance
|
||||
* param[out] vf_ids returned list of vf_ids
|
||||
* param[in,out] nvfs in:size of vf_ids array,
|
||||
* out:total elements present,
|
||||
* actual elements returned is limited by the size
|
||||
*
|
||||
* return Driver VF structure
|
||||
*/
|
||||
void
|
||||
bfa_fcs_vf_list(struct bfa_fcs_s *fcs, u16 *vf_ids, int *nvfs)
|
||||
{
|
||||
bfa_trc(fcs, *nvfs);
|
||||
}
|
||||
|
||||
/**
|
||||
* Return the list of all VFs visible from fabric.
|
||||
*
|
||||
* param[in] fcs fcs module instance
|
||||
* param[out] vf_ids returned list of vf_ids
|
||||
* param[in,out] nvfs in:size of vf_ids array,
|
||||
* out:total elements present,
|
||||
* actual elements returned is limited by the size
|
||||
*
|
||||
* return Driver VF structure
|
||||
*/
|
||||
void
|
||||
bfa_fcs_vf_list_all(struct bfa_fcs_s *fcs, u16 *vf_ids, int *nvfs)
|
||||
{
|
||||
bfa_trc(fcs, *nvfs);
|
||||
}
|
||||
|
||||
/**
|
||||
* Return the list of local logical ports present in the given VF.
|
||||
*
|
||||
* param[in] vf vf for which logical ports are returned
|
||||
* param[out] lpwwn returned logical port wwn list
|
||||
* param[in,out] nlports in:size of lpwwn list;
|
||||
* out:total elements present,
|
||||
* actual elements returned is limited by the size
|
||||
*
|
||||
*/
|
||||
void
|
||||
bfa_fcs_vf_get_ports(bfa_fcs_vf_t *vf, wwn_t lpwwn[], int *nlports)
|
||||
{
|
||||
struct list_head *qe;
|
||||
struct bfa_fcs_vport_s *vport;
|
||||
int i;
|
||||
struct bfa_fcs_s *fcs;
|
||||
|
||||
if (vf == NULL || lpwwn == NULL || *nlports == 0)
|
||||
return;
|
||||
|
||||
fcs = vf->fcs;
|
||||
|
||||
bfa_trc(fcs, vf->vf_id);
|
||||
bfa_trc(fcs, (u32) *nlports);
|
||||
|
||||
i = 0;
|
||||
lpwwn[i++] = vf->bport.port_cfg.pwwn;
|
||||
|
||||
list_for_each(qe, &vf->vport_q) {
|
||||
if (i >= *nlports)
|
||||
break;
|
||||
|
||||
vport = (struct bfa_fcs_vport_s *) qe;
|
||||
lpwwn[i++] = vport->lport.port_cfg.pwwn;
|
||||
}
|
||||
|
||||
bfa_trc(fcs, i);
|
||||
*nlports = i;
|
||||
return;
|
||||
}
|
||||
|
||||
|
Reference in New Issue
Block a user