[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:
Jing Huang
2009-09-23 17:46:15 -07:00
committed by James Bottomley
parent 5415907af1
commit 7725ccfda5
198 changed files with 49189 additions and 0 deletions

View 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

View 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__ */

View 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

View 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__ */

View 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__ */

View 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

View 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

View 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__ */

View 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