[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
60
drivers/scsi/bfa/include/cs/bfa_checksum.h
Normal file
60
drivers/scsi/bfa/include/cs/bfa_checksum.h
Normal file
@@ -0,0 +1,60 @@
|
||||
/*
|
||||
* 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.
|
||||
*/
|
||||
|
||||
/**
|
||||
* bfa_checksum.h BFA checksum utilities
|
||||
*/
|
||||
|
||||
#ifndef __BFA_CHECKSUM_H__
|
||||
#define __BFA_CHECKSUM_H__
|
||||
|
||||
static inline u32
|
||||
bfa_checksum_u32(u32 *buf, int sz)
|
||||
{
|
||||
int i, m = sz >> 2;
|
||||
u32 sum = 0;
|
||||
|
||||
for (i = 0; i < m; i++)
|
||||
sum ^= buf[i];
|
||||
|
||||
return (sum);
|
||||
}
|
||||
|
||||
static inline u16
|
||||
bfa_checksum_u16(u16 *buf, int sz)
|
||||
{
|
||||
int i, m = sz >> 1;
|
||||
u16 sum = 0;
|
||||
|
||||
for (i = 0; i < m; i++)
|
||||
sum ^= buf[i];
|
||||
|
||||
return (sum);
|
||||
}
|
||||
|
||||
static inline u8
|
||||
bfa_checksum_u8(u8 *buf, int sz)
|
||||
{
|
||||
int i;
|
||||
u8 sum = 0;
|
||||
|
||||
for (i = 0; i < sz; i++)
|
||||
sum ^= buf[i];
|
||||
|
||||
return (sum);
|
||||
}
|
||||
#endif
|
44
drivers/scsi/bfa/include/cs/bfa_debug.h
Normal file
44
drivers/scsi/bfa/include/cs/bfa_debug.h
Normal file
@@ -0,0 +1,44 @@
|
||||
/*
|
||||
* 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.
|
||||
*/
|
||||
|
||||
/**
|
||||
* bfa_debug.h BFA debug interfaces
|
||||
*/
|
||||
|
||||
#ifndef __BFA_DEBUG_H__
|
||||
#define __BFA_DEBUG_H__
|
||||
|
||||
#define bfa_assert(__cond) do { \
|
||||
if (!(__cond)) \
|
||||
bfa_panic(__LINE__, __FILE__, #__cond); \
|
||||
} while (0)
|
||||
|
||||
#define bfa_sm_fault(__mod, __event) do { \
|
||||
bfa_sm_panic((__mod)->logm, __LINE__, __FILE__, __event); \
|
||||
} while (0)
|
||||
|
||||
#ifndef BFA_PERF_BUILD
|
||||
#define bfa_assert_fp(__cond) bfa_assert(__cond)
|
||||
#else
|
||||
#define bfa_assert_fp(__cond)
|
||||
#endif
|
||||
|
||||
struct bfa_log_mod_s;
|
||||
void bfa_panic(int line, char *file, char *panicstr);
|
||||
void bfa_sm_panic(struct bfa_log_mod_s *logm, int line, char *file, int event);
|
||||
|
||||
#endif /* __BFA_DEBUG_H__ */
|
184
drivers/scsi/bfa/include/cs/bfa_log.h
Normal file
184
drivers/scsi/bfa/include/cs/bfa_log.h
Normal file
@@ -0,0 +1,184 @@
|
||||
/*
|
||||
* 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.
|
||||
*/
|
||||
|
||||
/**
|
||||
* bfa_log.h BFA log library data structure and function definition
|
||||
*/
|
||||
|
||||
#ifndef __BFA_LOG_H__
|
||||
#define __BFA_LOG_H__
|
||||
|
||||
#include <bfa_os_inc.h>
|
||||
#include <defs/bfa_defs_status.h>
|
||||
#include <defs/bfa_defs_aen.h>
|
||||
|
||||
/*
|
||||
* BFA log module definition
|
||||
*
|
||||
* To create a new module id:
|
||||
* Add a #define at the end of the list below. Select a value for your
|
||||
* definition so that it is one (1) greater than the previous
|
||||
* definition. Modify the definition of BFA_LOG_MODULE_ID_MAX to become
|
||||
* your new definition.
|
||||
* Should have no gaps in between the values because this is used in arrays.
|
||||
* IMPORTANT: AEN_IDs must be at the begining, otherwise update bfa_defs_aen.h
|
||||
*/
|
||||
|
||||
enum bfa_log_module_id {
|
||||
BFA_LOG_UNUSED_ID = 0,
|
||||
|
||||
/* AEN defs begin */
|
||||
BFA_LOG_AEN_MIN = BFA_LOG_UNUSED_ID,
|
||||
|
||||
BFA_LOG_AEN_ID_ADAPTER = BFA_LOG_AEN_MIN + BFA_AEN_CAT_ADAPTER,/* 1 */
|
||||
BFA_LOG_AEN_ID_PORT = BFA_LOG_AEN_MIN + BFA_AEN_CAT_PORT, /* 2 */
|
||||
BFA_LOG_AEN_ID_LPORT = BFA_LOG_AEN_MIN + BFA_AEN_CAT_LPORT, /* 3 */
|
||||
BFA_LOG_AEN_ID_RPORT = BFA_LOG_AEN_MIN + BFA_AEN_CAT_RPORT, /* 4 */
|
||||
BFA_LOG_AEN_ID_ITNIM = BFA_LOG_AEN_MIN + BFA_AEN_CAT_ITNIM, /* 5 */
|
||||
BFA_LOG_AEN_ID_TIN = BFA_LOG_AEN_MIN + BFA_AEN_CAT_TIN, /* 6 */
|
||||
BFA_LOG_AEN_ID_IPFC = BFA_LOG_AEN_MIN + BFA_AEN_CAT_IPFC, /* 7 */
|
||||
BFA_LOG_AEN_ID_AUDIT = BFA_LOG_AEN_MIN + BFA_AEN_CAT_AUDIT, /* 8 */
|
||||
BFA_LOG_AEN_ID_IOC = BFA_LOG_AEN_MIN + BFA_AEN_CAT_IOC, /* 9 */
|
||||
BFA_LOG_AEN_ID_ETHPORT = BFA_LOG_AEN_MIN + BFA_AEN_CAT_ETHPORT,/* 10 */
|
||||
|
||||
BFA_LOG_AEN_MAX = BFA_LOG_AEN_ID_ETHPORT,
|
||||
/* AEN defs end */
|
||||
|
||||
BFA_LOG_MODULE_ID_MIN = BFA_LOG_AEN_MAX,
|
||||
|
||||
BFA_LOG_FW_ID = BFA_LOG_MODULE_ID_MIN + 1,
|
||||
BFA_LOG_HAL_ID = BFA_LOG_MODULE_ID_MIN + 2,
|
||||
BFA_LOG_FCS_ID = BFA_LOG_MODULE_ID_MIN + 3,
|
||||
BFA_LOG_WDRV_ID = BFA_LOG_MODULE_ID_MIN + 4,
|
||||
BFA_LOG_LINUX_ID = BFA_LOG_MODULE_ID_MIN + 5,
|
||||
BFA_LOG_SOLARIS_ID = BFA_LOG_MODULE_ID_MIN + 6,
|
||||
|
||||
BFA_LOG_MODULE_ID_MAX = BFA_LOG_SOLARIS_ID,
|
||||
|
||||
/* Not part of any arrays */
|
||||
BFA_LOG_MODULE_ID_ALL = BFA_LOG_MODULE_ID_MAX + 1,
|
||||
BFA_LOG_AEN_ALL = BFA_LOG_MODULE_ID_MAX + 2,
|
||||
BFA_LOG_DRV_ALL = BFA_LOG_MODULE_ID_MAX + 3,
|
||||
};
|
||||
|
||||
/*
|
||||
* BFA log catalog name
|
||||
*/
|
||||
#define BFA_LOG_CAT_NAME "BFA"
|
||||
|
||||
/*
|
||||
* bfa log severity values
|
||||
*/
|
||||
enum bfa_log_severity {
|
||||
BFA_LOG_INVALID = 0,
|
||||
BFA_LOG_CRITICAL = 1,
|
||||
BFA_LOG_ERROR = 2,
|
||||
BFA_LOG_WARNING = 3,
|
||||
BFA_LOG_INFO = 4,
|
||||
BFA_LOG_NONE = 5,
|
||||
BFA_LOG_LEVEL_MAX = BFA_LOG_NONE
|
||||
};
|
||||
|
||||
#define BFA_LOG_MODID_OFFSET 16
|
||||
|
||||
|
||||
struct bfa_log_msgdef_s {
|
||||
u32 msg_id; /* message id */
|
||||
int attributes; /* attributes */
|
||||
int severity; /* severity level */
|
||||
char *msg_value;
|
||||
/* msg string */
|
||||
char *message;
|
||||
/* msg format string */
|
||||
int arg_type; /* argument type */
|
||||
int arg_num; /* number of argument */
|
||||
};
|
||||
|
||||
/*
|
||||
* supported argument type
|
||||
*/
|
||||
enum bfa_log_arg_type {
|
||||
BFA_LOG_S = 0, /* string */
|
||||
BFA_LOG_D, /* decimal */
|
||||
BFA_LOG_I, /* integer */
|
||||
BFA_LOG_O, /* oct number */
|
||||
BFA_LOG_U, /* unsigned integer */
|
||||
BFA_LOG_X, /* hex number */
|
||||
BFA_LOG_F, /* floating */
|
||||
BFA_LOG_C, /* character */
|
||||
BFA_LOG_L, /* double */
|
||||
BFA_LOG_P /* pointer */
|
||||
};
|
||||
|
||||
#define BFA_LOG_ARG_TYPE 2
|
||||
#define BFA_LOG_ARG0 (0 * BFA_LOG_ARG_TYPE)
|
||||
#define BFA_LOG_ARG1 (1 * BFA_LOG_ARG_TYPE)
|
||||
#define BFA_LOG_ARG2 (2 * BFA_LOG_ARG_TYPE)
|
||||
#define BFA_LOG_ARG3 (3 * BFA_LOG_ARG_TYPE)
|
||||
|
||||
#define BFA_LOG_GET_MOD_ID(msgid) ((msgid >> BFA_LOG_MODID_OFFSET) & 0xff)
|
||||
#define BFA_LOG_GET_MSG_IDX(msgid) (msgid & 0xffff)
|
||||
#define BFA_LOG_GET_MSG_ID(msgdef) ((msgdef)->msg_id)
|
||||
#define BFA_LOG_GET_MSG_FMT_STRING(msgdef) ((msgdef)->message)
|
||||
#define BFA_LOG_GET_SEVERITY(msgdef) ((msgdef)->severity)
|
||||
|
||||
/*
|
||||
* Event attributes
|
||||
*/
|
||||
#define BFA_LOG_ATTR_NONE 0
|
||||
#define BFA_LOG_ATTR_AUDIT 1
|
||||
#define BFA_LOG_ATTR_LOG 2
|
||||
#define BFA_LOG_ATTR_FFDC 4
|
||||
|
||||
#define BFA_LOG_CREATE_ID(msw, lsw) \
|
||||
(((u32)msw << BFA_LOG_MODID_OFFSET) | lsw)
|
||||
|
||||
struct bfa_log_mod_s;
|
||||
|
||||
/**
|
||||
* callback function
|
||||
*/
|
||||
typedef void (*bfa_log_cb_t)(struct bfa_log_mod_s *log_mod, u32 msg_id,
|
||||
const char *format, ...);
|
||||
|
||||
|
||||
struct bfa_log_mod_s {
|
||||
char instance_info[16]; /* instance info */
|
||||
int log_level[BFA_LOG_MODULE_ID_MAX + 1];
|
||||
/* log level for modules */
|
||||
bfa_log_cb_t cbfn; /* callback function */
|
||||
};
|
||||
|
||||
extern int bfa_log_init(struct bfa_log_mod_s *log_mod,
|
||||
char *instance_name, bfa_log_cb_t cbfn);
|
||||
extern int bfa_log(struct bfa_log_mod_s *log_mod, u32 msg_id, ...);
|
||||
extern bfa_status_t bfa_log_set_level(struct bfa_log_mod_s *log_mod,
|
||||
int mod_id, enum bfa_log_severity log_level);
|
||||
extern bfa_status_t bfa_log_set_level_all(struct bfa_log_mod_s *log_mod,
|
||||
enum bfa_log_severity log_level);
|
||||
extern bfa_status_t bfa_log_set_level_aen(struct bfa_log_mod_s *log_mod,
|
||||
enum bfa_log_severity log_level);
|
||||
extern enum bfa_log_severity bfa_log_get_level(struct bfa_log_mod_s *log_mod,
|
||||
int mod_id);
|
||||
extern enum bfa_log_severity bfa_log_get_msg_level(
|
||||
struct bfa_log_mod_s *log_mod, u32 msg_id);
|
||||
/*
|
||||
* array of messages generated from xml files
|
||||
*/
|
||||
extern struct bfa_log_msgdef_s bfa_log_msg_array[];
|
||||
|
||||
#endif
|
34
drivers/scsi/bfa/include/cs/bfa_perf.h
Normal file
34
drivers/scsi/bfa/include/cs/bfa_perf.h
Normal file
@@ -0,0 +1,34 @@
|
||||
/*
|
||||
* 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.
|
||||
*/
|
||||
#ifndef __BFAD_PERF_H__
|
||||
#define __BFAD_PERF_H__
|
||||
|
||||
#ifdef BFAD_PERF_BUILD
|
||||
|
||||
#undef bfa_trc
|
||||
#undef bfa_trc32
|
||||
#undef bfa_assert
|
||||
#undef BFA_TRC_FILE
|
||||
|
||||
#define bfa_trc(_trcp, _data)
|
||||
#define bfa_trc32(_trcp, _data)
|
||||
#define bfa_assert(__cond)
|
||||
#define BFA_TRC_FILE(__mod, __submod)
|
||||
|
||||
#endif
|
||||
|
||||
#endif /* __BFAD_PERF_H__ */
|
162
drivers/scsi/bfa/include/cs/bfa_plog.h
Normal file
162
drivers/scsi/bfa/include/cs/bfa_plog.h
Normal file
@@ -0,0 +1,162 @@
|
||||
/*
|
||||
* 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.
|
||||
*/
|
||||
#ifndef __BFA_PORTLOG_H__
|
||||
#define __BFA_PORTLOG_H__
|
||||
|
||||
#include "protocol/fc.h"
|
||||
#include <defs/bfa_defs_types.h>
|
||||
|
||||
#define BFA_PL_NLOG_ENTS 256
|
||||
#define BFA_PL_LOG_REC_INCR(_x) ((_x)++, (_x) %= BFA_PL_NLOG_ENTS)
|
||||
|
||||
#define BFA_PL_STRING_LOG_SZ 32 /* number of chars in string log */
|
||||
#define BFA_PL_INT_LOG_SZ 8 /* number of integers in the integer log */
|
||||
|
||||
enum bfa_plog_log_type {
|
||||
BFA_PL_LOG_TYPE_INVALID = 0,
|
||||
BFA_PL_LOG_TYPE_INT = 1,
|
||||
BFA_PL_LOG_TYPE_STRING = 2,
|
||||
};
|
||||
|
||||
/*
|
||||
* the (fixed size) record format for each entry in the portlog
|
||||
*/
|
||||
struct bfa_plog_rec_s {
|
||||
u32 tv; /* Filled by the portlog driver when the *
|
||||
* entry is added to the circular log. */
|
||||
u8 port; /* Source port that logged this entry. CM
|
||||
* entities will use 0xFF */
|
||||
u8 mid; /* Integer value to be used by all entities *
|
||||
* while logging. The module id to string *
|
||||
* conversion will be done by BFAL. See
|
||||
* enum bfa_plog_mid */
|
||||
u8 eid; /* indicates Rx, Tx, IOCTL, etc. See
|
||||
* enum bfa_plog_eid */
|
||||
u8 log_type; /* indicates string log or integer log.
|
||||
* see bfa_plog_log_type_t */
|
||||
u8 log_num_ints;
|
||||
/*
|
||||
* interpreted only if log_type is INT_LOG. indicates number of
|
||||
* integers in the int_log[] (0-PL_INT_LOG_SZ).
|
||||
*/
|
||||
u8 rsvd;
|
||||
u16 misc; /* can be used to indicate fc frame length,
|
||||
*etc.. */
|
||||
union {
|
||||
char string_log[BFA_PL_STRING_LOG_SZ];
|
||||
u32 int_log[BFA_PL_INT_LOG_SZ];
|
||||
} log_entry;
|
||||
|
||||
};
|
||||
|
||||
/*
|
||||
* the following #defines will be used by the logging entities to indicate
|
||||
* their module id. BFAL will convert the integer value to string format
|
||||
*
|
||||
* process to be used while changing the following #defines:
|
||||
* - Always add new entries at the end
|
||||
* - define corresponding string in BFAL
|
||||
* - Do not remove any entry or rearrange the order.
|
||||
*/
|
||||
enum bfa_plog_mid {
|
||||
BFA_PL_MID_INVALID = 0,
|
||||
BFA_PL_MID_DEBUG = 1,
|
||||
BFA_PL_MID_DRVR = 2,
|
||||
BFA_PL_MID_HAL = 3,
|
||||
BFA_PL_MID_HAL_FCXP = 4,
|
||||
BFA_PL_MID_HAL_UF = 5,
|
||||
BFA_PL_MID_FCS = 6,
|
||||
BFA_PL_MID_MAX = 7
|
||||
};
|
||||
|
||||
#define BFA_PL_MID_STRLEN 8
|
||||
struct bfa_plog_mid_strings_s {
|
||||
char m_str[BFA_PL_MID_STRLEN];
|
||||
};
|
||||
|
||||
/*
|
||||
* the following #defines will be used by the logging entities to indicate
|
||||
* their event type. BFAL will convert the integer value to string format
|
||||
*
|
||||
* process to be used while changing the following #defines:
|
||||
* - Always add new entries at the end
|
||||
* - define corresponding string in BFAL
|
||||
* - Do not remove any entry or rearrange the order.
|
||||
*/
|
||||
enum bfa_plog_eid {
|
||||
BFA_PL_EID_INVALID = 0,
|
||||
BFA_PL_EID_IOC_DISABLE = 1,
|
||||
BFA_PL_EID_IOC_ENABLE = 2,
|
||||
BFA_PL_EID_PORT_DISABLE = 3,
|
||||
BFA_PL_EID_PORT_ENABLE = 4,
|
||||
BFA_PL_EID_PORT_ST_CHANGE = 5,
|
||||
BFA_PL_EID_TX = 6,
|
||||
BFA_PL_EID_TX_ACK1 = 7,
|
||||
BFA_PL_EID_TX_RJT = 8,
|
||||
BFA_PL_EID_TX_BSY = 9,
|
||||
BFA_PL_EID_RX = 10,
|
||||
BFA_PL_EID_RX_ACK1 = 11,
|
||||
BFA_PL_EID_RX_RJT = 12,
|
||||
BFA_PL_EID_RX_BSY = 13,
|
||||
BFA_PL_EID_CT_IN = 14,
|
||||
BFA_PL_EID_CT_OUT = 15,
|
||||
BFA_PL_EID_DRIVER_START = 16,
|
||||
BFA_PL_EID_RSCN = 17,
|
||||
BFA_PL_EID_DEBUG = 18,
|
||||
BFA_PL_EID_MISC = 19,
|
||||
BFA_PL_EID_MAX = 20
|
||||
};
|
||||
|
||||
#define BFA_PL_ENAME_STRLEN 8
|
||||
struct bfa_plog_eid_strings_s {
|
||||
char e_str[BFA_PL_ENAME_STRLEN];
|
||||
};
|
||||
|
||||
#define BFA_PL_SIG_LEN 8
|
||||
#define BFA_PL_SIG_STR "12pl123"
|
||||
|
||||
/*
|
||||
* per port circular log buffer
|
||||
*/
|
||||
struct bfa_plog_s {
|
||||
char plog_sig[BFA_PL_SIG_LEN]; /* Start signature */
|
||||
u8 plog_enabled;
|
||||
u8 rsvd[7];
|
||||
u32 ticks;
|
||||
u16 head;
|
||||
u16 tail;
|
||||
struct bfa_plog_rec_s plog_recs[BFA_PL_NLOG_ENTS];
|
||||
};
|
||||
|
||||
void bfa_plog_init(struct bfa_plog_s *plog);
|
||||
void bfa_plog_str(struct bfa_plog_s *plog, enum bfa_plog_mid mid,
|
||||
enum bfa_plog_eid event, u16 misc, char *log_str);
|
||||
void bfa_plog_intarr(struct bfa_plog_s *plog, enum bfa_plog_mid mid,
|
||||
enum bfa_plog_eid event, u16 misc,
|
||||
u32 *intarr, u32 num_ints);
|
||||
void bfa_plog_fchdr(struct bfa_plog_s *plog, enum bfa_plog_mid mid,
|
||||
enum bfa_plog_eid event, u16 misc,
|
||||
struct fchs_s *fchdr);
|
||||
void bfa_plog_fchdr_and_pl(struct bfa_plog_s *plog, enum bfa_plog_mid mid,
|
||||
enum bfa_plog_eid event, u16 misc,
|
||||
struct fchs_s *fchdr, u32 pld_w0);
|
||||
void bfa_plog_clear(struct bfa_plog_s *plog);
|
||||
void bfa_plog_enable(struct bfa_plog_s *plog);
|
||||
void bfa_plog_disable(struct bfa_plog_s *plog);
|
||||
bfa_boolean_t bfa_plog_get_setting(struct bfa_plog_s *plog);
|
||||
|
||||
#endif /* __BFA_PORTLOG_H__ */
|
81
drivers/scsi/bfa/include/cs/bfa_q.h
Normal file
81
drivers/scsi/bfa/include/cs/bfa_q.h
Normal file
@@ -0,0 +1,81 @@
|
||||
/*
|
||||
* 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.
|
||||
*/
|
||||
|
||||
/**
|
||||
* bfa_q.h Circular queue definitions.
|
||||
*/
|
||||
|
||||
#ifndef __BFA_Q_H__
|
||||
#define __BFA_Q_H__
|
||||
|
||||
#define bfa_q_first(_q) ((void *)(((struct list_head *) (_q))->next))
|
||||
#define bfa_q_next(_qe) (((struct list_head *) (_qe))->next)
|
||||
#define bfa_q_prev(_qe) (((struct list_head *) (_qe))->prev)
|
||||
|
||||
/*
|
||||
* bfa_q_qe_init - to initialize a queue element
|
||||
*/
|
||||
#define bfa_q_qe_init(_qe) { \
|
||||
bfa_q_next(_qe) = (struct list_head *) NULL; \
|
||||
bfa_q_prev(_qe) = (struct list_head *) NULL; \
|
||||
}
|
||||
|
||||
/*
|
||||
* bfa_q_deq - dequeue an element from head of the queue
|
||||
*/
|
||||
#define bfa_q_deq(_q, _qe) { \
|
||||
if (!list_empty(_q)) { \
|
||||
(*((struct list_head **) (_qe))) = bfa_q_next(_q); \
|
||||
bfa_q_prev(bfa_q_next(*((struct list_head **) _qe))) = \
|
||||
(struct list_head *) (_q); \
|
||||
bfa_q_next(_q) = bfa_q_next(*((struct list_head **) _qe)); \
|
||||
BFA_Q_DBG_INIT(*((struct list_head **) _qe)); \
|
||||
} else { \
|
||||
*((struct list_head **) (_qe)) = (struct list_head *) NULL; \
|
||||
} \
|
||||
}
|
||||
|
||||
/*
|
||||
* bfa_q_deq_tail - dequeue an element from tail of the queue
|
||||
*/
|
||||
#define bfa_q_deq_tail(_q, _qe) { \
|
||||
if (!list_empty(_q)) { \
|
||||
*((struct list_head **) (_qe)) = bfa_q_prev(_q); \
|
||||
bfa_q_next(bfa_q_prev(*((struct list_head **) _qe))) = \
|
||||
(struct list_head *) (_q); \
|
||||
bfa_q_prev(_q) = bfa_q_prev(*(struct list_head **) _qe); \
|
||||
BFA_Q_DBG_INIT(*((struct list_head **) _qe)); \
|
||||
} else { \
|
||||
*((struct list_head **) (_qe)) = (struct list_head *) NULL; \
|
||||
} \
|
||||
}
|
||||
|
||||
/*
|
||||
* #ifdef BFA_DEBUG (Using bfa_assert to check for debug_build is not
|
||||
* consistent across modules)
|
||||
*/
|
||||
#ifndef BFA_PERF_BUILD
|
||||
#define BFA_Q_DBG_INIT(_qe) bfa_q_qe_init(_qe)
|
||||
#else
|
||||
#define BFA_Q_DBG_INIT(_qe)
|
||||
#endif
|
||||
|
||||
#define bfa_q_is_on_q(_q, _qe) \
|
||||
bfa_q_is_on_q_func(_q, (struct list_head *)(_qe))
|
||||
extern int bfa_q_is_on_q_func(struct list_head *q, struct list_head *qe);
|
||||
|
||||
#endif
|
69
drivers/scsi/bfa/include/cs/bfa_sm.h
Normal file
69
drivers/scsi/bfa/include/cs/bfa_sm.h
Normal file
@@ -0,0 +1,69 @@
|
||||
/*
|
||||
* 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.
|
||||
*/
|
||||
|
||||
/**
|
||||
* bfasm.h State machine defines
|
||||
*/
|
||||
|
||||
#ifndef __BFA_SM_H__
|
||||
#define __BFA_SM_H__
|
||||
|
||||
typedef void (*bfa_sm_t)(void *sm, int event);
|
||||
|
||||
#define bfa_sm_set_state(_sm, _state) (_sm)->sm = (bfa_sm_t)(_state)
|
||||
#define bfa_sm_send_event(_sm, _event) (_sm)->sm((_sm), (_event))
|
||||
#define bfa_sm_get_state(_sm) ((_sm)->sm)
|
||||
#define bfa_sm_cmp_state(_sm, _state) ((_sm)->sm == (bfa_sm_t)(_state))
|
||||
|
||||
/**
|
||||
* For converting from state machine function to state encoding.
|
||||
*/
|
||||
struct bfa_sm_table_s {
|
||||
bfa_sm_t sm; /* state machine function */
|
||||
int state; /* state machine encoding */
|
||||
char *name; /* state name for display */
|
||||
};
|
||||
#define BFA_SM(_sm) ((bfa_sm_t)(_sm))
|
||||
|
||||
int bfa_sm_to_state(struct bfa_sm_table_s *smt, bfa_sm_t sm);
|
||||
|
||||
/**
|
||||
* State machine with entry actions.
|
||||
*/
|
||||
typedef void (*bfa_fsm_t)(void *fsm, int event);
|
||||
|
||||
/**
|
||||
* oc - object class eg. bfa_ioc
|
||||
* st - state, eg. reset
|
||||
* otype - object type, eg. struct bfa_ioc_s
|
||||
* etype - object type, eg. enum ioc_event
|
||||
*/
|
||||
#define bfa_fsm_state_decl(oc, st, otype, etype) \
|
||||
static void oc ## _sm_ ## st(otype * fsm, etype event); \
|
||||
static void oc ## _sm_ ## st ## _entry(otype * fsm)
|
||||
|
||||
#define bfa_fsm_set_state(_fsm, _state) do { \
|
||||
(_fsm)->fsm = (bfa_fsm_t)(_state); \
|
||||
_state ## _entry(_fsm); \
|
||||
} while (0)
|
||||
|
||||
#define bfa_fsm_send_event(_fsm, _event) \
|
||||
(_fsm)->fsm((_fsm), (_event))
|
||||
#define bfa_fsm_cmp_state(_fsm, _state) \
|
||||
((_fsm)->fsm == (bfa_fsm_t)(_state))
|
||||
|
||||
#endif
|
176
drivers/scsi/bfa/include/cs/bfa_trc.h
Normal file
176
drivers/scsi/bfa/include/cs/bfa_trc.h
Normal file
@@ -0,0 +1,176 @@
|
||||
/*
|
||||
* 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.
|
||||
*/
|
||||
#ifndef __BFA_TRC_H__
|
||||
#define __BFA_TRC_H__
|
||||
|
||||
#include <bfa_os_inc.h>
|
||||
|
||||
#ifndef BFA_TRC_MAX
|
||||
#define BFA_TRC_MAX (4 * 1024)
|
||||
#endif
|
||||
|
||||
#ifndef BFA_TRC_TS
|
||||
#define BFA_TRC_TS(_trcm) ((_trcm)->ticks ++)
|
||||
#endif
|
||||
|
||||
struct bfa_trc_s {
|
||||
#ifdef __BIGENDIAN
|
||||
u16 fileno;
|
||||
u16 line;
|
||||
#else
|
||||
u16 line;
|
||||
u16 fileno;
|
||||
#endif
|
||||
u32 timestamp;
|
||||
union {
|
||||
struct {
|
||||
u32 rsvd;
|
||||
u32 u32;
|
||||
} u32;
|
||||
u64 u64;
|
||||
} data;
|
||||
};
|
||||
|
||||
|
||||
struct bfa_trc_mod_s {
|
||||
u32 head;
|
||||
u32 tail;
|
||||
u32 ntrc;
|
||||
u32 stopped;
|
||||
u32 ticks;
|
||||
u32 rsvd[3];
|
||||
struct bfa_trc_s trc[BFA_TRC_MAX];
|
||||
};
|
||||
|
||||
|
||||
enum {
|
||||
BFA_TRC_FW = 1, /* firmware modules */
|
||||
BFA_TRC_HAL = 2, /* BFA modules */
|
||||
BFA_TRC_FCS = 3, /* BFA FCS modules */
|
||||
BFA_TRC_LDRV = 4, /* Linux driver modules */
|
||||
BFA_TRC_SDRV = 5, /* Solaris driver modules */
|
||||
BFA_TRC_VDRV = 6, /* vmware driver modules */
|
||||
BFA_TRC_WDRV = 7, /* windows driver modules */
|
||||
BFA_TRC_AEN = 8, /* AEN module */
|
||||
BFA_TRC_BIOS = 9, /* bios driver modules */
|
||||
BFA_TRC_EFI = 10, /* EFI driver modules */
|
||||
BNA_TRC_WDRV = 11, /* BNA windows driver modules */
|
||||
BNA_TRC_VDRV = 12, /* BNA vmware driver modules */
|
||||
BNA_TRC_SDRV = 13, /* BNA Solaris driver modules */
|
||||
BNA_TRC_LDRV = 14, /* BNA Linux driver modules */
|
||||
BNA_TRC_HAL = 15, /* BNA modules */
|
||||
BFA_TRC_CNA = 16, /* Common modules */
|
||||
BNA_TRC_IMDRV = 17 /* BNA windows intermediate driver modules */
|
||||
};
|
||||
#define BFA_TRC_MOD_SH 10
|
||||
#define BFA_TRC_MOD(__mod) ((BFA_TRC_ ## __mod) << BFA_TRC_MOD_SH)
|
||||
|
||||
/**
|
||||
* Define a new tracing file (module). Module should match one defined above.
|
||||
*/
|
||||
#define BFA_TRC_FILE(__mod, __submod) \
|
||||
static int __trc_fileno = ((BFA_TRC_ ## __mod ## _ ## __submod) | \
|
||||
BFA_TRC_MOD(__mod))
|
||||
|
||||
|
||||
#define bfa_trc32(_trcp, _data) \
|
||||
__bfa_trc((_trcp)->trcmod, __trc_fileno, __LINE__, (u32)_data)
|
||||
|
||||
|
||||
#ifndef BFA_BOOT_BUILD
|
||||
#define bfa_trc(_trcp, _data) \
|
||||
__bfa_trc((_trcp)->trcmod, __trc_fileno, __LINE__, (u64)_data)
|
||||
#else
|
||||
void bfa_boot_trc(struct bfa_trc_mod_s *trcmod, u16 fileno,
|
||||
u16 line, u32 data);
|
||||
#define bfa_trc(_trcp, _data) \
|
||||
bfa_boot_trc((_trcp)->trcmod, __trc_fileno, __LINE__, (u32)_data)
|
||||
#endif
|
||||
|
||||
|
||||
static inline void
|
||||
bfa_trc_init(struct bfa_trc_mod_s *trcm)
|
||||
{
|
||||
trcm->head = trcm->tail = trcm->stopped = 0;
|
||||
trcm->ntrc = BFA_TRC_MAX;
|
||||
}
|
||||
|
||||
|
||||
static inline void
|
||||
bfa_trc_stop(struct bfa_trc_mod_s *trcm)
|
||||
{
|
||||
trcm->stopped = 1;
|
||||
}
|
||||
|
||||
#ifdef FWTRC
|
||||
extern void dc_flush(void *data);
|
||||
#else
|
||||
#define dc_flush(data)
|
||||
#endif
|
||||
|
||||
|
||||
static inline void
|
||||
__bfa_trc(struct bfa_trc_mod_s *trcm, int fileno, int line, u64 data)
|
||||
{
|
||||
int tail = trcm->tail;
|
||||
struct bfa_trc_s *trc = &trcm->trc[tail];
|
||||
|
||||
if (trcm->stopped)
|
||||
return;
|
||||
|
||||
trc->fileno = (u16) fileno;
|
||||
trc->line = (u16) line;
|
||||
trc->data.u64 = data;
|
||||
trc->timestamp = BFA_TRC_TS(trcm);
|
||||
dc_flush(trc);
|
||||
|
||||
trcm->tail = (trcm->tail + 1) & (BFA_TRC_MAX - 1);
|
||||
if (trcm->tail == trcm->head)
|
||||
trcm->head = (trcm->head + 1) & (BFA_TRC_MAX - 1);
|
||||
dc_flush(trcm);
|
||||
}
|
||||
|
||||
|
||||
static inline void
|
||||
__bfa_trc32(struct bfa_trc_mod_s *trcm, int fileno, int line, u32 data)
|
||||
{
|
||||
int tail = trcm->tail;
|
||||
struct bfa_trc_s *trc = &trcm->trc[tail];
|
||||
|
||||
if (trcm->stopped)
|
||||
return;
|
||||
|
||||
trc->fileno = (u16) fileno;
|
||||
trc->line = (u16) line;
|
||||
trc->data.u32.u32 = data;
|
||||
trc->timestamp = BFA_TRC_TS(trcm);
|
||||
dc_flush(trc);
|
||||
|
||||
trcm->tail = (trcm->tail + 1) & (BFA_TRC_MAX - 1);
|
||||
if (trcm->tail == trcm->head)
|
||||
trcm->head = (trcm->head + 1) & (BFA_TRC_MAX - 1);
|
||||
dc_flush(trcm);
|
||||
}
|
||||
|
||||
#ifndef BFA_PERF_BUILD
|
||||
#define bfa_trc_fp(_trcp, _data) bfa_trc(_trcp, _data)
|
||||
#else
|
||||
#define bfa_trc_fp(_trcp, _data)
|
||||
#endif
|
||||
|
||||
#endif /* __BFA_TRC_H__ */
|
||||
|
68
drivers/scsi/bfa/include/cs/bfa_wc.h
Normal file
68
drivers/scsi/bfa/include/cs/bfa_wc.h
Normal file
@@ -0,0 +1,68 @@
|
||||
/*
|
||||
* 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.
|
||||
*/
|
||||
|
||||
/**
|
||||
* bfa_wc.h Generic wait counter.
|
||||
*/
|
||||
|
||||
#ifndef __BFA_WC_H__
|
||||
#define __BFA_WC_H__
|
||||
|
||||
typedef void (*bfa_wc_resume_t) (void *cbarg);
|
||||
|
||||
struct bfa_wc_s {
|
||||
bfa_wc_resume_t wc_resume;
|
||||
void *wc_cbarg;
|
||||
int wc_count;
|
||||
};
|
||||
|
||||
static inline void
|
||||
bfa_wc_up(struct bfa_wc_s *wc)
|
||||
{
|
||||
wc->wc_count++;
|
||||
}
|
||||
|
||||
static inline void
|
||||
bfa_wc_down(struct bfa_wc_s *wc)
|
||||
{
|
||||
wc->wc_count--;
|
||||
if (wc->wc_count == 0)
|
||||
wc->wc_resume(wc->wc_cbarg);
|
||||
}
|
||||
|
||||
/**
|
||||
* Initialize a waiting counter.
|
||||
*/
|
||||
static inline void
|
||||
bfa_wc_init(struct bfa_wc_s *wc, bfa_wc_resume_t wc_resume, void *wc_cbarg)
|
||||
{
|
||||
wc->wc_resume = wc_resume;
|
||||
wc->wc_cbarg = wc_cbarg;
|
||||
wc->wc_count = 0;
|
||||
bfa_wc_up(wc);
|
||||
}
|
||||
|
||||
/**
|
||||
* Wait for counter to reach zero
|
||||
*/
|
||||
static inline void
|
||||
bfa_wc_wait(struct bfa_wc_s *wc)
|
||||
{
|
||||
bfa_wc_down(wc);
|
||||
}
|
||||
|
||||
#endif
|
Reference in New Issue
Block a user