Commit 76b2c34a authored by James Smart's avatar James Smart Committed by James Bottomley

lpfc: Fix FDMI Fabric support in driver for Brocade

Signed-off-by: default avatarDick Kennedy <dick.kennedy@emulex.com>
Signed-off-by: default avatarJames Smart <james.smart@emulex.com>
Reviewed-by: default avatarHannes Reinecke <hare@suse.de>
Signed-off-by: default avatarJames Bottomley <JBottomley@Odin.com>
parent f0bf5f91
...@@ -413,6 +413,9 @@ struct lpfc_vport { ...@@ -413,6 +413,9 @@ struct lpfc_vport {
uint32_t cfg_fcp_class; uint32_t cfg_fcp_class;
uint32_t cfg_use_adisc; uint32_t cfg_use_adisc;
uint32_t cfg_fdmi_on; uint32_t cfg_fdmi_on;
#define LPFC_FDMI_SUPPORT 1 /* bit 0 - FDMI supported? */
#define LPFC_FDMI_REG_DELAY 2 /* bit 1 - 60 sec registration delay */
#define LPFC_FDMI_ALL_ATTRIB 4 /* bit 2 - register ALL attributes? */
uint32_t cfg_discovery_threads; uint32_t cfg_discovery_threads;
uint32_t cfg_log_verbose; uint32_t cfg_log_verbose;
uint32_t cfg_max_luns; uint32_t cfg_max_luns;
......
...@@ -4573,12 +4573,18 @@ LPFC_ATTR_R(multi_ring_type, FC_TYPE_IP, 1, ...@@ -4573,12 +4573,18 @@ LPFC_ATTR_R(multi_ring_type, FC_TYPE_IP, 1,
/* /*
# lpfc_fdmi_on: controls FDMI support. # lpfc_fdmi_on: controls FDMI support.
# 0 = no FDMI support # Set NOT Set
# 1 = support FDMI without attribute of hostname # bit 0 = FDMI support no FDMI support
# 2 = support FDMI with attribute of hostname # LPFC_FDMI_SUPPORT just turns basic support on/off
# Value range [0,2]. Default value is 0. # bit 1 = Register delay no register delay (60 seconds)
# LPFC_FDMI_REG_DELAY 60 sec registration delay after FDMI login
# bit 2 = All attributes Use a attribute subset
# LPFC_FDMI_ALL_ATTRIB applies to both port and HBA attributes
# Port attrutes subset: 1 thru 6 OR all: 1 thru 0xd 0x101 0x102 0x103
# HBA attributes subset: 1 thru 0xb OR all: 1 thru 0xc
# Value range [0,7]. Default value is 0.
*/ */
LPFC_VPORT_ATTR_RW(fdmi_on, 0, 0, 2, "Enable FDMI support"); LPFC_VPORT_ATTR_RW(fdmi_on, 0, 0, 7, "Enable FDMI support");
/* /*
# Specifies the maximum number of ELS cmds we can have outstanding (for # Specifies the maximum number of ELS cmds we can have outstanding (for
......
This diff is collapsed.
...@@ -7172,7 +7172,7 @@ lpfc_do_scr_ns_plogi(struct lpfc_hba *phba, struct lpfc_vport *vport) ...@@ -7172,7 +7172,7 @@ lpfc_do_scr_ns_plogi(struct lpfc_hba *phba, struct lpfc_vport *vport)
return; return;
} }
if (vport->cfg_fdmi_on) { if (vport->cfg_fdmi_on & LPFC_FDMI_SUPPORT) {
/* If this is the first time, allocate an ndlp and initialize /* If this is the first time, allocate an ndlp and initialize
* it. Otherwise, make sure the node is enabled and then do the * it. Otherwise, make sure the node is enabled and then do the
* login. * login.
......
...@@ -5489,11 +5489,11 @@ lpfc_mbx_cmpl_fdmi_reg_login(struct lpfc_hba *phba, LPFC_MBOXQ_t *pmb) ...@@ -5489,11 +5489,11 @@ lpfc_mbx_cmpl_fdmi_reg_login(struct lpfc_hba *phba, LPFC_MBOXQ_t *pmb)
* fdmi-on=2 (supporting RPA/hostnmae) * fdmi-on=2 (supporting RPA/hostnmae)
*/ */
if (vport->cfg_fdmi_on == 1) if (vport->cfg_fdmi_on & LPFC_FDMI_REG_DELAY)
lpfc_fdmi_cmd(vport, ndlp, SLI_MGMT_DHBA);
else
mod_timer(&vport->fc_fdmitmo, mod_timer(&vport->fc_fdmitmo,
jiffies + msecs_to_jiffies(1000 * 60)); jiffies + msecs_to_jiffies(1000 * 60));
else
lpfc_fdmi_cmd(vport, ndlp, SLI_MGMT_DHBA);
/* decrement the node reference count held for this callback /* decrement the node reference count held for this callback
* function. * function.
......
...@@ -107,6 +107,7 @@ struct lpfc_sli_ct_request { ...@@ -107,6 +107,7 @@ struct lpfc_sli_ct_request {
uint8_t ReasonCode; uint8_t ReasonCode;
uint8_t Explanation; uint8_t Explanation;
uint8_t VendorUnique; uint8_t VendorUnique;
#define LPFC_CT_PREAMBLE 20 /* Size of CTReq + 4 up to here */
union { union {
uint32_t PortID; uint32_t PortID;
...@@ -170,6 +171,8 @@ struct lpfc_sli_ct_request { ...@@ -170,6 +171,8 @@ struct lpfc_sli_ct_request {
} un; } un;
}; };
#define LPFC_MAX_CT_SIZE (60 * 4096)
#define SLI_CT_REVISION 1 #define SLI_CT_REVISION 1
#define GID_REQUEST_SZ (offsetof(struct lpfc_sli_ct_request, un) + \ #define GID_REQUEST_SZ (offsetof(struct lpfc_sli_ct_request, un) + \
sizeof(struct gid)) sizeof(struct gid))
...@@ -1007,78 +1010,45 @@ typedef struct _ELS_PKT { /* Structure is in Big Endian format */ ...@@ -1007,78 +1010,45 @@ typedef struct _ELS_PKT { /* Structure is in Big Endian format */
} un; } un;
} ELS_PKT; } ELS_PKT;
/* /******** FDMI ********/
* FDMI
* HBA MAnagement Operations Command Codes
*/
#define SLI_MGMT_GRHL 0x100 /* Get registered HBA list */
#define SLI_MGMT_GHAT 0x101 /* Get HBA attributes */
#define SLI_MGMT_GRPL 0x102 /* Get registered Port list */
#define SLI_MGMT_GPAT 0x110 /* Get Port attributes */
#define SLI_MGMT_RHBA 0x200 /* Register HBA */
#define SLI_MGMT_RHAT 0x201 /* Register HBA attributes */
#define SLI_MGMT_RPRT 0x210 /* Register Port */
#define SLI_MGMT_RPA 0x211 /* Register Port attributes */
#define SLI_MGMT_DHBA 0x300 /* De-register HBA */
#define SLI_MGMT_DPRT 0x310 /* De-register Port */
/* /* lpfc_sli_ct_request defines the CT_IU preamble for FDMI commands */
* Management Service Subtypes #define SLI_CT_FDMI_Subtypes 0x10 /* Management Service Subtype */
*/
#define SLI_CT_FDMI_Subtypes 0x10
/* /*
* HBA Management Service Reject Code * Registered Port List Format
*/ */
#define REJECT_CODE 0x9 /* Unable to perform command request */ struct lpfc_fdmi_reg_port_list {
uint32_t EntryCnt;
uint32_t pe; /* Variable-length array */
};
/*
* HBA Management Service Reject Reason Code
* Please refer to the Reason Codes above
*/
/* /* Definitions for HBA / Port attribute entries */
* HBA Attribute Types
*/
#define NODE_NAME 0x1
#define MANUFACTURER 0x2
#define SERIAL_NUMBER 0x3
#define MODEL 0x4
#define MODEL_DESCRIPTION 0x5
#define HARDWARE_VERSION 0x6
#define DRIVER_VERSION 0x7
#define OPTION_ROM_VERSION 0x8
#define FIRMWARE_VERSION 0x9
#define OS_NAME_VERSION 0xa
#define MAX_CT_PAYLOAD_LEN 0xb
/* struct lpfc_fdmi_attr_def { /* Defined in TLV format */
* Port Attrubute Types
*/
#define SUPPORTED_FC4_TYPES 0x1
#define SUPPORTED_SPEED 0x2
#define PORT_SPEED 0x3
#define MAX_FRAME_SIZE 0x4
#define OS_DEVICE_NAME 0x5
#define HOST_NAME 0x6
union AttributesDef {
/* Structure is in Big Endian format */ /* Structure is in Big Endian format */
struct {
uint32_t AttrType:16; uint32_t AttrType:16;
uint32_t AttrLen:16; uint32_t AttrLen:16;
} bits; uint32_t AttrValue; /* Marks start of Value (ATTRIBUTE_ENTRY) */
uint32_t word;
}; };
/* /* Attribute Entry */
* HBA Attribute Entry (8 - 260 bytes) struct lpfc_fdmi_attr_entry {
*/
typedef struct {
union AttributesDef ad;
union { union {
uint32_t VendorSpecific; uint32_t VendorSpecific;
uint32_t SupportClass;
uint32_t SupportSpeed;
uint32_t PortSpeed;
uint32_t MaxFrameSize;
uint32_t MaxCTPayloadLen;
uint32_t PortState;
uint32_t PortId;
struct lpfc_name NodeName;
struct lpfc_name PortName;
struct lpfc_name FabricName;
uint8_t FC4Types[32];
uint8_t Manufacturer[64]; uint8_t Manufacturer[64];
uint8_t SerialNumber[64]; uint8_t SerialNumber[64];
uint8_t Model[256]; uint8_t Model[256];
...@@ -1087,97 +1057,115 @@ typedef struct { ...@@ -1087,97 +1057,115 @@ typedef struct {
uint8_t DriverVersion[256]; uint8_t DriverVersion[256];
uint8_t OptionROMVersion[256]; uint8_t OptionROMVersion[256];
uint8_t FirmwareVersion[256]; uint8_t FirmwareVersion[256];
struct lpfc_name NodeName; uint8_t OsHostName[256];
uint8_t SupportFC4Types[32]; uint8_t NodeSymName[256];
uint32_t SupportSpeed;
uint32_t PortSpeed;
uint32_t MaxFrameSize;
uint8_t OsDeviceName[256]; uint8_t OsDeviceName[256];
uint8_t OsNameVersion[256]; uint8_t OsNameVersion[256];
uint32_t MaxCTPayloadLen;
uint8_t HostName[256]; uint8_t HostName[256];
} un; } un;
} ATTRIBUTE_ENTRY; };
#define LPFC_FDMI_MAX_AE_SIZE sizeof(struct lpfc_fdmi_attr_entry)
/* /*
* HBA Attribute Block * HBA Attribute Block
*/ */
typedef struct { struct lpfc_fdmi_attr_block {
uint32_t EntryCnt; /* Number of HBA attribute entries */ uint32_t EntryCnt; /* Number of HBA attribute entries */
ATTRIBUTE_ENTRY Entry; /* Variable-length array */ struct lpfc_fdmi_attr_entry Entry; /* Variable-length array */
} ATTRIBUTE_BLOCK; };
/* /*
* Port Entry * Port Entry
*/ */
typedef struct { struct lpfc_fdmi_port_entry {
struct lpfc_name PortName; struct lpfc_name PortName;
} PORT_ENTRY; };
/* /*
* HBA Identifier * HBA Identifier
*/ */
typedef struct { struct lpfc_fdmi_hba_ident {
struct lpfc_name PortName; struct lpfc_name PortName;
} HBA_IDENTIFIER; };
/*
* Registered Port List Format
*/
typedef struct {
uint32_t EntryCnt;
PORT_ENTRY pe; /* Variable-length array */
} REG_PORT_LIST;
/* /*
* Register HBA(RHBA) * Register HBA(RHBA)
*/ */
typedef struct { struct lpfc_fdmi_reg_hba {
HBA_IDENTIFIER hi; struct lpfc_fdmi_hba_ident hi;
REG_PORT_LIST rpl; /* variable-length array */ struct lpfc_fdmi_reg_port_list rpl; /* variable-length array */
/* ATTRIBUTE_BLOCK ab; */ /* struct lpfc_fdmi_attr_block ab; */
} REG_HBA; };
/* /*
* Register HBA Attributes (RHAT) * Register HBA Attributes (RHAT)
*/ */
typedef struct { struct lpfc_fdmi_reg_hbaattr {
struct lpfc_name HBA_PortName; struct lpfc_name HBA_PortName;
ATTRIBUTE_BLOCK ab; struct lpfc_fdmi_attr_block ab;
} REG_HBA_ATTRIBUTE; };
/* /*
* Register Port Attributes (RPA) * Register Port Attributes (RPA)
*/ */
typedef struct { struct lpfc_fdmi_reg_portattr {
struct lpfc_name PortName; struct lpfc_name PortName;
ATTRIBUTE_BLOCK ab; struct lpfc_fdmi_attr_block ab;
} REG_PORT_ATTRIBUTE; };
/* /*
* Get Registered HBA List (GRHL) Accept Payload Format * HBA MAnagement Operations Command Codes
*/ */
typedef struct { #define SLI_MGMT_GRHL 0x100 /* Get registered HBA list */
uint32_t HBA__Entry_Cnt; /* Number of Registered HBA Identifiers */ #define SLI_MGMT_GHAT 0x101 /* Get HBA attributes */
struct lpfc_name HBA_PortName; /* Variable-length array */ #define SLI_MGMT_GRPL 0x102 /* Get registered Port list */
} GRHL_ACC_PAYLOAD; #define SLI_MGMT_GPAT 0x110 /* Get Port attributes */
#define SLI_MGMT_GPAS 0x120 /* Get Port Statistics */
#define SLI_MGMT_RHBA 0x200 /* Register HBA */
#define SLI_MGMT_RHAT 0x201 /* Register HBA attributes */
#define SLI_MGMT_RPRT 0x210 /* Register Port */
#define SLI_MGMT_RPA 0x211 /* Register Port attributes */
#define SLI_MGMT_DHBA 0x300 /* De-register HBA */
#define SLI_MGMT_DHAT 0x301 /* De-register HBA attributes */
#define SLI_MGMT_DPRT 0x310 /* De-register Port */
#define SLI_MGMT_DPA 0x311 /* De-register Port attributes */
/* /*
* Get Registered Port List (GRPL) Accept Payload Format * HBA Attribute Types
*/ */
typedef struct { #define RHBA_NODENAME 0x1 /* 8 byte WWNN */
uint32_t RPL_Entry_Cnt; /* Number of Registered Port Entries */ #define RHBA_MANUFACTURER 0x2 /* 4 to 64 byte ASCII string */
PORT_ENTRY Reg_Port_Entry[1]; /* Variable-length array */ #define RHBA_SERIAL_NUMBER 0x3 /* 4 to 64 byte ASCII string */
} GRPL_ACC_PAYLOAD; #define RHBA_MODEL 0x4 /* 4 to 256 byte ASCII string */
#define RHBA_MODEL_DESCRIPTION 0x5 /* 4 to 256 byte ASCII string */
#define RHBA_HARDWARE_VERSION 0x6 /* 4 to 256 byte ASCII string */
#define RHBA_DRIVER_VERSION 0x7 /* 4 to 256 byte ASCII string */
#define RHBA_OPTION_ROM_VERSION 0x8 /* 4 to 256 byte ASCII string */
#define RHBA_FIRMWARE_VERSION 0x9 /* 4 to 256 byte ASCII string */
#define RHBA_OS_NAME_VERSION 0xa /* 4 to 256 byte ASCII string */
#define RHBA_MAX_CT_PAYLOAD_LEN 0xb /* 32-bit unsigned int */
#define RHBA_SYM_NODENAME 0xc /* 4 to 256 byte ASCII string */
/* /*
* Get Port Attributes (GPAT) Accept Payload Format * Port Attrubute Types
*/ */
#define RPRT_SUPPORTED_FC4_TYPES 0x1 /* 32 byte binary array */
typedef struct { #define RPRT_SUPPORTED_SPEED 0x2 /* 32-bit unsigned int */
ATTRIBUTE_BLOCK pab; #define RPRT_PORT_SPEED 0x3 /* 32-bit unsigned int */
} GPAT_ACC_PAYLOAD; #define RPRT_MAX_FRAME_SIZE 0x4 /* 32-bit unsigned int */
#define RPRT_OS_DEVICE_NAME 0x5 /* 4 to 256 byte ASCII string */
#define RPRT_HOST_NAME 0x6 /* 4 to 256 byte ASCII string */
#define RPRT_NODENAME 0x7 /* 8 byte WWNN */
#define RPRT_PORTNAME 0x8 /* 8 byte WWNN */
#define RPRT_SYM_PORTNAME 0x9 /* 4 to 256 byte ASCII string */
#define RPRT_PORT_TYPE 0xa /* 32-bit unsigned int */
#define RPRT_SUPPORTED_CLASS 0xb /* 32-bit unsigned int */
#define RPRT_FABRICNAME 0xc /* 8 byte Fabric WWNN */
#define RPRT_ACTIVE_FC4_TYPES 0xd /* 32 byte binary array */
#define RPRT_PORT_STATE 0x101 /* 32-bit unsigned int */
#define RPRT_DISC_PORT 0x102 /* 32-bit unsigned int */
#define RPRT_PORT_ID 0x103 /* 32-bit unsigned int */
/* /*
* Begin HBA configuration parameters. * Begin HBA configuration parameters.
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment