|
@@ -2048,10 +2048,71 @@ bfa_fcs_lport_fdmi_build_rhba_pyld(struct bfa_fcs_lport_fdmi_s *fdmi, u8 *pyld)
|
|
|
attr->type = cpu_to_be16(FDMI_HBA_ATTRIB_MAX_CT);
|
|
|
templen = sizeof(fcs_hba_attr->max_ct_pyld);
|
|
|
memcpy(attr->value, &fcs_hba_attr->max_ct_pyld, templen);
|
|
|
+ templen = fc_roundup(templen, sizeof(u32));
|
|
|
+ curr_ptr += sizeof(attr->type) + sizeof(templen) + templen;
|
|
|
len += templen;
|
|
|
count++;
|
|
|
attr->len = cpu_to_be16(templen + sizeof(attr->type) +
|
|
|
sizeof(templen));
|
|
|
+ /*
|
|
|
+ * Send extended attributes ( FOS 7.1 support )
|
|
|
+ */
|
|
|
+ if (fdmi->retry_cnt == 0) {
|
|
|
+ attr = (struct fdmi_attr_s *) curr_ptr;
|
|
|
+ attr->type = cpu_to_be16(FDMI_HBA_ATTRIB_NODE_SYM_NAME);
|
|
|
+ templen = sizeof(fcs_hba_attr->node_sym_name);
|
|
|
+ memcpy(attr->value, &fcs_hba_attr->node_sym_name, templen);
|
|
|
+ templen = fc_roundup(templen, sizeof(u32));
|
|
|
+ curr_ptr += sizeof(attr->type) + sizeof(templen) + templen;
|
|
|
+ len += templen;
|
|
|
+ count++;
|
|
|
+ attr->len = cpu_to_be16(templen + sizeof(attr->type) +
|
|
|
+ sizeof(templen));
|
|
|
+
|
|
|
+ attr = (struct fdmi_attr_s *) curr_ptr;
|
|
|
+ attr->type = cpu_to_be16(FDMI_HBA_ATTRIB_VENDOR_ID);
|
|
|
+ templen = sizeof(fcs_hba_attr->vendor_info);
|
|
|
+ memcpy(attr->value, &fcs_hba_attr->vendor_info, templen);
|
|
|
+ templen = fc_roundup(templen, sizeof(u32));
|
|
|
+ curr_ptr += sizeof(attr->type) + sizeof(templen) + templen;
|
|
|
+ len += templen;
|
|
|
+ count++;
|
|
|
+ attr->len = cpu_to_be16(templen + sizeof(attr->type) +
|
|
|
+ sizeof(templen));
|
|
|
+
|
|
|
+ attr = (struct fdmi_attr_s *) curr_ptr;
|
|
|
+ attr->type = cpu_to_be16(FDMI_HBA_ATTRIB_NUM_PORTS);
|
|
|
+ templen = sizeof(fcs_hba_attr->num_ports);
|
|
|
+ memcpy(attr->value, &fcs_hba_attr->num_ports, templen);
|
|
|
+ templen = fc_roundup(templen, sizeof(u32));
|
|
|
+ curr_ptr += sizeof(attr->type) + sizeof(templen) + templen;
|
|
|
+ len += templen;
|
|
|
+ count++;
|
|
|
+ attr->len = cpu_to_be16(templen + sizeof(attr->type) +
|
|
|
+ sizeof(templen));
|
|
|
+
|
|
|
+ attr = (struct fdmi_attr_s *) curr_ptr;
|
|
|
+ attr->type = cpu_to_be16(FDMI_HBA_ATTRIB_FABRIC_NAME);
|
|
|
+ templen = sizeof(fcs_hba_attr->fabric_name);
|
|
|
+ memcpy(attr->value, &fcs_hba_attr->fabric_name, templen);
|
|
|
+ templen = fc_roundup(templen, sizeof(u32));
|
|
|
+ curr_ptr += sizeof(attr->type) + sizeof(templen) + templen;
|
|
|
+ len += templen;
|
|
|
+ count++;
|
|
|
+ attr->len = cpu_to_be16(templen + sizeof(attr->type) +
|
|
|
+ sizeof(templen));
|
|
|
+
|
|
|
+ attr = (struct fdmi_attr_s *) curr_ptr;
|
|
|
+ attr->type = cpu_to_be16(FDMI_HBA_ATTRIB_BIOS_VER);
|
|
|
+ templen = sizeof(fcs_hba_attr->bios_ver);
|
|
|
+ memcpy(attr->value, &fcs_hba_attr->bios_ver, templen);
|
|
|
+ templen = fc_roundup(attr->len, sizeof(u32));
|
|
|
+ curr_ptr += sizeof(attr->type) + sizeof(templen) + templen;
|
|
|
+ len += templen;
|
|
|
+ count++;
|
|
|
+ attr->len = cpu_to_be16(templen + sizeof(attr->type) +
|
|
|
+ sizeof(templen));
|
|
|
+ }
|
|
|
|
|
|
/*
|
|
|
* Update size of payload
|
|
@@ -2252,6 +2313,113 @@ bfa_fcs_lport_fdmi_build_portattr_block(struct bfa_fcs_lport_fdmi_s *fdmi,
|
|
|
sizeof(templen));
|
|
|
}
|
|
|
|
|
|
+ if (fdmi->retry_cnt == 0) {
|
|
|
+ attr = (struct fdmi_attr_s *) curr_ptr;
|
|
|
+ attr->type = cpu_to_be16(FDMI_PORT_ATTRIB_NODE_NAME);
|
|
|
+ templen = sizeof(fcs_port_attr.node_name);
|
|
|
+ memcpy(attr->value, &fcs_port_attr.node_name, templen);
|
|
|
+ templen = fc_roundup(templen, sizeof(u32));
|
|
|
+ curr_ptr += sizeof(attr->type) + sizeof(templen) + templen;
|
|
|
+ len += templen;
|
|
|
+ ++count;
|
|
|
+ attr->len = cpu_to_be16(templen + sizeof(attr->type) +
|
|
|
+ sizeof(templen));
|
|
|
+
|
|
|
+ attr = (struct fdmi_attr_s *) curr_ptr;
|
|
|
+ attr->type = cpu_to_be16(FDMI_PORT_ATTRIB_PORT_NAME);
|
|
|
+ templen = sizeof(fcs_port_attr.port_name);
|
|
|
+ memcpy(attr->value, &fcs_port_attr.port_name, templen);
|
|
|
+ templen = fc_roundup(templen, sizeof(u32));
|
|
|
+ curr_ptr += sizeof(attr->type) + sizeof(attr->len) + templen;
|
|
|
+ len += templen;
|
|
|
+ ++count;
|
|
|
+ attr->len = cpu_to_be16(templen + sizeof(attr->type) +
|
|
|
+ sizeof(templen));
|
|
|
+
|
|
|
+ if (fcs_port_attr.port_sym_name.symname[0] != '\0') {
|
|
|
+ attr = (struct fdmi_attr_s *) curr_ptr;
|
|
|
+ attr->type =
|
|
|
+ cpu_to_be16(FDMI_PORT_ATTRIB_PORT_SYM_NAME);
|
|
|
+ templen = sizeof(fcs_port_attr.port_sym_name);
|
|
|
+ memcpy(attr->value,
|
|
|
+ &fcs_port_attr.port_sym_name, templen);
|
|
|
+ templen = fc_roundup(templen, sizeof(u32));
|
|
|
+ curr_ptr += sizeof(attr->type) +
|
|
|
+ sizeof(templen) + templen;
|
|
|
+ len += templen;
|
|
|
+ ++count;
|
|
|
+ attr->len = cpu_to_be16(templen +
|
|
|
+ sizeof(attr->type) + sizeof(templen));
|
|
|
+ }
|
|
|
+
|
|
|
+ attr = (struct fdmi_attr_s *) curr_ptr;
|
|
|
+ attr->type = cpu_to_be16(FDMI_PORT_ATTRIB_PORT_TYPE);
|
|
|
+ templen = sizeof(fcs_port_attr.port_type);
|
|
|
+ memcpy(attr->value, &fcs_port_attr.port_type, templen);
|
|
|
+ templen = fc_roundup(templen, sizeof(u32));
|
|
|
+ curr_ptr += sizeof(attr->type) + sizeof(templen) + templen;
|
|
|
+ len += templen;
|
|
|
+ ++count;
|
|
|
+ attr->len = cpu_to_be16(templen + sizeof(attr->type) +
|
|
|
+ sizeof(templen));
|
|
|
+
|
|
|
+ attr = (struct fdmi_attr_s *) curr_ptr;
|
|
|
+ attr->type = cpu_to_be16(FDMI_PORT_ATTRIB_SUPP_COS);
|
|
|
+ templen = sizeof(fcs_port_attr.scos);
|
|
|
+ memcpy(attr->value, &fcs_port_attr.scos, templen);
|
|
|
+ templen = fc_roundup(templen, sizeof(u32));
|
|
|
+ curr_ptr += sizeof(attr->type) + sizeof(templen) + templen;
|
|
|
+ len += templen;
|
|
|
+ ++count;
|
|
|
+ attr->len = cpu_to_be16(templen + sizeof(attr->type) +
|
|
|
+ sizeof(templen));
|
|
|
+
|
|
|
+ attr = (struct fdmi_attr_s *) curr_ptr;
|
|
|
+ attr->type = cpu_to_be16(FDMI_PORT_ATTRIB_PORT_FAB_NAME);
|
|
|
+ templen = sizeof(fcs_port_attr.port_fabric_name);
|
|
|
+ memcpy(attr->value, &fcs_port_attr.port_fabric_name, templen);
|
|
|
+ templen = fc_roundup(templen, sizeof(u32));
|
|
|
+ curr_ptr += sizeof(attr->type) + sizeof(templen) + templen;
|
|
|
+ len += templen;
|
|
|
+ ++count;
|
|
|
+ attr->len = cpu_to_be16(templen + sizeof(attr->type) +
|
|
|
+ sizeof(templen));
|
|
|
+
|
|
|
+ attr = (struct fdmi_attr_s *) curr_ptr;
|
|
|
+ attr->type = cpu_to_be16(FDMI_PORT_ATTRIB_PORT_FC4_TYPE);
|
|
|
+ templen = sizeof(fcs_port_attr.port_act_fc4_type);
|
|
|
+ memcpy(attr->value, fcs_port_attr.port_act_fc4_type,
|
|
|
+ templen);
|
|
|
+ templen = fc_roundup(templen, sizeof(u32));
|
|
|
+ curr_ptr += sizeof(attr->type) + sizeof(templen) + templen;
|
|
|
+ len += templen;
|
|
|
+ ++count;
|
|
|
+ attr->len = cpu_to_be16(templen + sizeof(attr->type) +
|
|
|
+ sizeof(templen));
|
|
|
+
|
|
|
+ attr = (struct fdmi_attr_s *) curr_ptr;
|
|
|
+ attr->type = cpu_to_be16(FDMI_PORT_ATTRIB_PORT_STATE);
|
|
|
+ templen = sizeof(fcs_port_attr.port_state);
|
|
|
+ memcpy(attr->value, &fcs_port_attr.port_state, templen);
|
|
|
+ templen = fc_roundup(templen, sizeof(u32));
|
|
|
+ curr_ptr += sizeof(attr->type) + sizeof(templen) + templen;
|
|
|
+ len += templen;
|
|
|
+ ++count;
|
|
|
+ attr->len = cpu_to_be16(templen + sizeof(attr->type) +
|
|
|
+ sizeof(templen));
|
|
|
+
|
|
|
+ attr = (struct fdmi_attr_s *) curr_ptr;
|
|
|
+ attr->type = cpu_to_be16(FDMI_PORT_ATTRIB_PORT_NUM_RPRT);
|
|
|
+ templen = sizeof(fcs_port_attr.num_ports);
|
|
|
+ memcpy(attr->value, &fcs_port_attr.num_ports, templen);
|
|
|
+ templen = fc_roundup(templen, sizeof(u32));
|
|
|
+ curr_ptr += sizeof(attr->type) + sizeof(templen) + templen;
|
|
|
+ len += templen;
|
|
|
+ ++count;
|
|
|
+ attr->len = cpu_to_be16(templen + sizeof(attr->type) +
|
|
|
+ sizeof(templen));
|
|
|
+ }
|
|
|
+
|
|
|
/*
|
|
|
* Update size of payload
|
|
|
*/
|
|
@@ -2458,6 +2626,15 @@ bfa_fcs_fdmi_get_hbaattr(struct bfa_fcs_lport_fdmi_s *fdmi,
|
|
|
/* Retrieve the max frame size from the port attr */
|
|
|
bfa_fcs_fdmi_get_portattr(fdmi, &fcs_port_attr);
|
|
|
hba_attr->max_ct_pyld = fcs_port_attr.max_frm_size;
|
|
|
+
|
|
|
+ strncpy(hba_attr->node_sym_name.symname,
|
|
|
+ port->port_cfg.node_sym_name.symname, BFA_SYMNAME_MAXLEN);
|
|
|
+ strcpy(hba_attr->vendor_info, "BROCADE");
|
|
|
+ hba_attr->num_ports =
|
|
|
+ cpu_to_be32(bfa_ioc_get_nports(&port->fcs->bfa->ioc));
|
|
|
+ hba_attr->fabric_name = port->fabric->lps->pr_nwwn;
|
|
|
+ strncpy(hba_attr->bios_ver, hba_attr->option_rom_ver, BFA_VERSION_LEN);
|
|
|
+
|
|
|
}
|
|
|
|
|
|
static void
|
|
@@ -2467,6 +2644,7 @@ bfa_fcs_fdmi_get_portattr(struct bfa_fcs_lport_fdmi_s *fdmi,
|
|
|
struct bfa_fcs_lport_s *port = fdmi->ms->port;
|
|
|
struct bfa_fcs_driver_info_s *driver_info = &port->fcs->driver_info;
|
|
|
struct bfa_port_attr_s pport_attr;
|
|
|
+ struct bfa_lport_attr_s lport_attr;
|
|
|
|
|
|
memset(port_attr, 0, sizeof(struct bfa_fcs_fdmi_port_attr_s));
|
|
|
|
|
@@ -2531,6 +2709,18 @@ bfa_fcs_fdmi_get_portattr(struct bfa_fcs_lport_fdmi_s *fdmi,
|
|
|
strncpy(port_attr->host_name, (char *)driver_info->host_machine_name,
|
|
|
sizeof(port_attr->host_name));
|
|
|
|
|
|
+ port_attr->node_name = bfa_fcs_lport_get_nwwn(port);
|
|
|
+ port_attr->port_name = bfa_fcs_lport_get_pwwn(port);
|
|
|
+
|
|
|
+ strncpy(port_attr->port_sym_name.symname,
|
|
|
+ (char *)&bfa_fcs_lport_get_psym_name(port), BFA_SYMNAME_MAXLEN);
|
|
|
+ bfa_fcs_lport_get_attr(port, &lport_attr);
|
|
|
+ port_attr->port_type = cpu_to_be32(lport_attr.port_type);
|
|
|
+ port_attr->scos = pport_attr.cos_supported;
|
|
|
+ port_attr->port_fabric_name = port->fabric->lps->pr_nwwn;
|
|
|
+ fc_get_fc4type_bitmask(FC_TYPE_FCP, port_attr->port_act_fc4_type);
|
|
|
+ port_attr->port_state = cpu_to_be32(pport_attr.port_state);
|
|
|
+ port_attr->num_ports = cpu_to_be32(port->num_rports);
|
|
|
}
|
|
|
|
|
|
/*
|