static DEVICE_ATTR(fw_attr, 0444, qla2x00_fw_attr_show, NULL);
 static DEVICE_ATTR_RO(edif_doorbell);
 
-
-struct device_attribute *qla2x00_host_attrs[] = {
-       &dev_attr_driver_version,
-       &dev_attr_fw_version,
-       &dev_attr_serial_num,
-       &dev_attr_isp_name,
-       &dev_attr_isp_id,
-       &dev_attr_model_name,
-       &dev_attr_model_desc,
-       &dev_attr_pci_info,
-       &dev_attr_link_state,
-       &dev_attr_zio,
-       &dev_attr_zio_timer,
-       &dev_attr_beacon,
-       &dev_attr_beacon_config,
-       &dev_attr_optrom_bios_version,
-       &dev_attr_optrom_efi_version,
-       &dev_attr_optrom_fcode_version,
-       &dev_attr_optrom_fw_version,
-       &dev_attr_84xx_fw_version,
-       &dev_attr_total_isp_aborts,
-       &dev_attr_serdes_version,
-       &dev_attr_mpi_version,
-       &dev_attr_phy_version,
-       &dev_attr_flash_block_size,
-       &dev_attr_vlan_id,
-       &dev_attr_vn_port_mac_address,
-       &dev_attr_fabric_param,
-       &dev_attr_fw_state,
-       &dev_attr_optrom_gold_fw_version,
-       &dev_attr_thermal_temp,
-       &dev_attr_diag_requests,
-       &dev_attr_diag_megabytes,
-       &dev_attr_fw_dump_size,
-       &dev_attr_allow_cna_fw_dump,
-       &dev_attr_pep_version,
-       &dev_attr_min_supported_speed,
-       &dev_attr_max_supported_speed,
-       &dev_attr_zio_threshold,
-       &dev_attr_dif_bundle_statistics,
-       &dev_attr_port_speed,
-       &dev_attr_port_no,
-       &dev_attr_fw_attr,
-       &dev_attr_dport_diagnostics,
-       &dev_attr_edif_doorbell,
-       &dev_attr_mpi_pause,
-       NULL, /* reserve for qlini_mode */
-       NULL, /* reserve for ql2xiniexchg */
-       NULL, /* reserve for ql2xexchoffld */
+static struct attribute *qla2x00_host_attrs[] = {
+       &dev_attr_driver_version.attr,
+       &dev_attr_fw_version.attr,
+       &dev_attr_serial_num.attr,
+       &dev_attr_isp_name.attr,
+       &dev_attr_isp_id.attr,
+       &dev_attr_model_name.attr,
+       &dev_attr_model_desc.attr,
+       &dev_attr_pci_info.attr,
+       &dev_attr_link_state.attr,
+       &dev_attr_zio.attr,
+       &dev_attr_zio_timer.attr,
+       &dev_attr_beacon.attr,
+       &dev_attr_beacon_config.attr,
+       &dev_attr_optrom_bios_version.attr,
+       &dev_attr_optrom_efi_version.attr,
+       &dev_attr_optrom_fcode_version.attr,
+       &dev_attr_optrom_fw_version.attr,
+       &dev_attr_84xx_fw_version.attr,
+       &dev_attr_total_isp_aborts.attr,
+       &dev_attr_serdes_version.attr,
+       &dev_attr_mpi_version.attr,
+       &dev_attr_phy_version.attr,
+       &dev_attr_flash_block_size.attr,
+       &dev_attr_vlan_id.attr,
+       &dev_attr_vn_port_mac_address.attr,
+       &dev_attr_fabric_param.attr,
+       &dev_attr_fw_state.attr,
+       &dev_attr_optrom_gold_fw_version.attr,
+       &dev_attr_thermal_temp.attr,
+       &dev_attr_diag_requests.attr,
+       &dev_attr_diag_megabytes.attr,
+       &dev_attr_fw_dump_size.attr,
+       &dev_attr_allow_cna_fw_dump.attr,
+       &dev_attr_pep_version.attr,
+       &dev_attr_min_supported_speed.attr,
+       &dev_attr_max_supported_speed.attr,
+       &dev_attr_zio_threshold.attr,
+       &dev_attr_dif_bundle_statistics.attr,
+       &dev_attr_port_speed.attr,
+       &dev_attr_port_no.attr,
+       &dev_attr_fw_attr.attr,
+       &dev_attr_dport_diagnostics.attr,
+       &dev_attr_edif_doorbell.attr,
+       &dev_attr_mpi_pause.attr,
+       &dev_attr_qlini_mode.attr,
+       &dev_attr_ql2xiniexchg.attr,
+       &dev_attr_ql2xexchoffld.attr,
        NULL,
 };
 
-void qla_insert_tgt_attrs(void)
+static umode_t qla_host_attr_is_visible(struct kobject *kobj,
+                                       struct attribute *attr, int i)
 {
-       struct device_attribute **attr;
+       if (ql2x_ini_mode != QLA2XXX_INI_MODE_DUAL &&
+           (attr == &dev_attr_qlini_mode.attr ||
+            attr == &dev_attr_ql2xiniexchg.attr ||
+            attr == &dev_attr_ql2xexchoffld.attr))
+               return 0;
+       return attr->mode;
+}
 
-       /* advance to empty slot */
-       for (attr = &qla2x00_host_attrs[0]; *attr; ++attr)
-               continue;
+static const struct attribute_group qla2x00_host_attr_group = {
+       .is_visible = qla_host_attr_is_visible,
+       .attrs = qla2x00_host_attrs
+};
 
-       *attr = &dev_attr_qlini_mode;
-       attr++;
-       *attr = &dev_attr_ql2xiniexchg;
-       attr++;
-       *attr = &dev_attr_ql2xexchoffld;
-}
+const struct attribute_group *qla2x00_host_groups[] = {
+       &qla2x00_host_attr_group,
+       NULL
+};
 
 /* Host attributes. */