Roll revision levels. Move DEFAULT_LOOPID definition to platform files.

Change some fcp parameter structures such that we can get the portid
(24 bit value), get both node and port WWN, know whether we're on a fabric
or not, note whether we've ever seen the loop up, and note the current
state of the loop.

Replace the isp_pdb_t structure in fcparams with a reduced cost structure
that maintains a static relationship to 'Target', but can have the actual
loop ID used change (in case, post LIP, we discover things have moved
around). This also retains portid and node/port WWNs.  This array gets
larger if we have fabric support compiled in.

Note special loop IDs that are invariate for this device- FL_PORT_ID
(0x7e) which tells us if there's a fabric controller present, FC_PORT_ID
and FC_SNS_ID (fabric controller port and fabric SNS server port). We don't
use the latter two for anything. IDs above FC_SNS_ID up through 255 are
available for mapping fabric devices to 'target' ids.

Add in a config define to set FC full duplex mode. Add in a define to
recognize the Qlogic 2200 boards. Add comments about ISPCTL commands.
Add and change some ISPASYNC enumes.
This commit is contained in:
Matt Jacob 1999-07-02 22:46:31 +00:00
parent 7050843886
commit 77d4e8361d

View File

@ -1,10 +1,10 @@
/* $Id: ispvar.h,v 1.14 1999/05/11 05:02:23 mjacob Exp $ */
/* release_5_11_99+ */
/* $Id: ispvar.h,v 1.15 1999/06/24 16:34:00 mjacob Exp $ */
/* release_6_2_99 */
/*
* Soft Definitions for for Qlogic ISP SCSI adapters.
*
*---------------------------------------
* Copyright (c) 1997, 1998 by Matthew Jacob
* Copyright (c) 1997, 1998, 1999 by Matthew Jacob
* NASA/Ames Research Center
* All rights reserved.
*---------------------------------------
@ -48,7 +48,7 @@
#endif
#define ISP_CORE_VERSION_MAJOR 1
#define ISP_CORE_VERSION_MINOR 8
#define ISP_CORE_VERSION_MINOR 9
/*
* Vector for bus specific code to provide specific services.
@ -82,7 +82,6 @@ struct ispmdvec {
#else
#define MAX_FC_TARG 126
#endif
#define DEFAULT_LOOPID 113
/* queue length must be a power of two */
#define QENTRY_LEN 64
@ -161,22 +160,43 @@ typedef struct {
* Fibre Channel Specifics
*/
typedef struct {
u_int8_t isp_gotdparms;
u_int8_t isp_reserved;
u_int isp_fwoptions : 16,
: 7,
loop_seen_once : 1,
isp_loopstate : 3, /* Current Loop State */
isp_fwstate : 3, /* ISP F/W state */
isp_gotdparms : 1,
isp_onfabric : 1;
u_int8_t isp_loopid; /* hard loop id */
u_int8_t isp_alpa; /* ALPA */
u_int32_t isp_portid;
u_int8_t isp_execthrottle;
u_int8_t isp_retry_delay;
u_int8_t isp_retry_count;
u_int8_t isp_fwstate; /* ISP F/W state */
u_int64_t isp_wwn; /* WWN of adapter */
u_int16_t isp_maxalloc;
u_int16_t isp_maxfrmlen;
u_int16_t isp_fwoptions;
u_int64_t isp_nodewwn;
u_int64_t isp_portwwn;
/*
* Port Data Base
* Port Data Base. This is indexed by 'target', which is invariate.
* However, elements within can move around due to loop changes,
* so the actual loop ID passed to the F/W is in this structure.
* The first time the loop is seen up, loopid will match the index
* (except for fabric nodes which are above mapped above FC_SNS_ID
* and are completely virtual), but subsequent LIPs can cause things
* to move around.
*/
isp_pdb_t isp_pdb[MAX_FC_TARG];
struct lportdb {
u_int
loopid : 8,
: 4,
fabdev : 1,
roles : 2,
valid : 1;
u_int32_t portid;
u_int64_t node_wwn;
u_int64_t port_wwn;
} portdb[MAX_FC_TARG];
/*
* Scratch DMA mapped in area to fetch Port Database stuff, etc.
@ -185,16 +205,23 @@ typedef struct {
u_int32_t isp_scdma;
} fcparam;
#define ISP2100_SCRLEN 0x100
#define FW_CONFIG_WAIT 0
#define FW_WAIT_AL_PA 1
#define FW_WAIT_LOGIN 2
#define FW_READY 3
#define FW_LOSS_OF_SYNC 4
#define FW_ERROR 5
#define FW_REINIT 6
#define FW_NON_PART 7
#define FW_CONFIG_WAIT 0x0000
#define FW_WAIT_AL_PA 0x0001
#define FW_WAIT_LOGIN 0x0002
#define FW_READY 0x0003
#define FW_LOSS_OF_SYNC 0x0004
#define FW_ERROR 0x0005
#define FW_REINIT 0x0006
#define FW_NON_PART 0x0007
#define LOOP_NIL 0
#define LOOP_LIP_RCVD 1
#define LOOP_PDB_RCVD 2
#define LOOP_READY 7
#define FL_PORT_ID 0x7e /* FL_Port Special ID */
#define FC_PORT_ID 0x7f /* Fabric Controller Special ID */
#define FC_SNS_ID 0x80 /* SNS Server Special ID */
#ifdef ISP_TARGET_MODE
/*
@ -339,6 +366,7 @@ struct ispsoftc {
*/
#define ISP_CFG_NORELOAD 0x80 /* don't download f/w */
#define ISP_CFG_NONVRAM 0x40 /* ignore NVRAM */
#define ISP_CFG_FULL_DUPLEX 0x01 /* Fibre Channel Only */
#define ISP_FW_REV(maj, min, mic) ((maj << 24) | (min << 16) | mic)
#define ISP_FW_REVX(xp) ((xp[0]<<24) | (xp[1] << 16) | xp[2])
@ -365,6 +393,7 @@ struct ispsoftc {
#define ISP_HA_SCSI_12X0 0xe
#define ISP_HA_FC 0xf0
#define ISP_HA_FC_2100 0x10
#define ISP_HA_FC_2200 0x20
#define IS_SCSI(isp) (isp->isp_type & ISP_HA_SCSI)
#define IS_1080(isp) (isp->isp_type == ISP_HA_SCSI_1080)
@ -437,21 +466,15 @@ int32_t ispscsicmd __P((ISP_SCSI_XFER_T *));
/*
* Platform Dependent to External to Internal Control Function
*
* For: Aborting a running command - arg is an ISP_SCSI_XFER_T *
* Resetting a Device - arg is target to reset
* Resetting a BUS - arg is ignored
* Updating parameters - arg is ignored
* Assumes all locks are held and that no reentrancy issues need be dealt with.
*
* First argument is this instance's softc pointer.
* Second argument is an index into xflist array.
* Assumes all locks must be held already.
*/
typedef enum {
ISPCTL_RESET_BUS,
ISPCTL_RESET_DEV,
ISPCTL_ABORT_CMD,
ISPCTL_UPDATE_PARAMS,
ISPCTL_FCLINK_TEST
ISPCTL_RESET_BUS, /* Reset Bus */
ISPCTL_RESET_DEV, /* Reset Device */
ISPCTL_ABORT_CMD, /* Abort Command */
ISPCTL_UPDATE_PARAMS, /* Update Operating Parameters */
ISPCTL_FCLINK_TEST /* Test FC Link Status */
} ispctl_t;
int isp_control __P((struct ispsoftc *, ispctl_t, void *));
@ -460,18 +483,18 @@ int isp_control __P((struct ispsoftc *, ispctl_t, void *));
* Platform Dependent to Internal to External Control Function
* (each platform must provide such a function)
*
* For: Announcing Target Paramter Changes (arg is target)
* Assumes all locks are held and that no reentrancy issues need be dealt with.
*
* Assumes all locks are held.
*/
typedef enum {
ISPASYNC_NEW_TGT_PARAMS,
ISPASYNC_BUS_RESET, /* Bus Reset */
ISPASYNC_LOOP_DOWN, /* Obvious FC only */
ISPASYNC_LOOP_UP, /* "" */
ISPASYNC_PDB_CHANGE_COMPLETE, /* "" */
ISPASYNC_CHANGE_NOTIFY /* "" */
ISPASYNC_BUS_RESET, /* Bus Was Reset */
ISPASYNC_LOOP_DOWN, /* FC Loop Down */
ISPASYNC_LOOP_UP, /* FC Loop Up */
ISPASYNC_PDB_CHANGED, /* FC Port Data Base Changed */
ISPASYNC_CHANGE_NOTIFY, /* FC SNS Change Notification */
ISPASYNC_FABRIC_DEV, /* FC New Fabric Device */
} ispasync_t;
int isp_async __P((struct ispsoftc *, ispasync_t, void *));