cachepc-linux

Fork of AMDESE/linux with modifications for CachePC side-channel attack
git clone https://git.sinitax.com/sinitax/cachepc-linux
Log | Files | Refs | README | LICENSE | sfeed.txt

qla_attr.c (87708B)


      1// SPDX-License-Identifier: GPL-2.0-only
      2/*
      3 * QLogic Fibre Channel HBA Driver
      4 * Copyright (c)  2003-2014 QLogic Corporation
      5 */
      6#include "qla_def.h"
      7#include "qla_target.h"
      8
      9#include <linux/kthread.h>
     10#include <linux/vmalloc.h>
     11#include <linux/slab.h>
     12#include <linux/delay.h>
     13
     14static int qla24xx_vport_disable(struct fc_vport *, bool);
     15
     16/* SYSFS attributes --------------------------------------------------------- */
     17
     18static ssize_t
     19qla2x00_sysfs_read_fw_dump(struct file *filp, struct kobject *kobj,
     20			   struct bin_attribute *bin_attr,
     21			   char *buf, loff_t off, size_t count)
     22{
     23	struct scsi_qla_host *vha = shost_priv(dev_to_shost(container_of(kobj,
     24	    struct device, kobj)));
     25	struct qla_hw_data *ha = vha->hw;
     26	int rval = 0;
     27
     28	if (!(ha->fw_dump_reading || ha->mctp_dump_reading ||
     29	      ha->mpi_fw_dump_reading))
     30		return 0;
     31
     32	mutex_lock(&ha->optrom_mutex);
     33	if (IS_P3P_TYPE(ha)) {
     34		if (off < ha->md_template_size) {
     35			rval = memory_read_from_buffer(buf, count,
     36			    &off, ha->md_tmplt_hdr, ha->md_template_size);
     37		} else {
     38			off -= ha->md_template_size;
     39			rval = memory_read_from_buffer(buf, count,
     40			    &off, ha->md_dump, ha->md_dump_size);
     41		}
     42	} else if (ha->mctp_dumped && ha->mctp_dump_reading) {
     43		rval = memory_read_from_buffer(buf, count, &off, ha->mctp_dump,
     44		    MCTP_DUMP_SIZE);
     45	} else if (ha->mpi_fw_dumped && ha->mpi_fw_dump_reading) {
     46		rval = memory_read_from_buffer(buf, count, &off,
     47					       ha->mpi_fw_dump,
     48					       ha->mpi_fw_dump_len);
     49	} else if (ha->fw_dump_reading) {
     50		rval = memory_read_from_buffer(buf, count, &off, ha->fw_dump,
     51					ha->fw_dump_len);
     52	} else {
     53		rval = 0;
     54	}
     55	mutex_unlock(&ha->optrom_mutex);
     56	return rval;
     57}
     58
     59static ssize_t
     60qla2x00_sysfs_write_fw_dump(struct file *filp, struct kobject *kobj,
     61			    struct bin_attribute *bin_attr,
     62			    char *buf, loff_t off, size_t count)
     63{
     64	struct scsi_qla_host *vha = shost_priv(dev_to_shost(container_of(kobj,
     65	    struct device, kobj)));
     66	struct qla_hw_data *ha = vha->hw;
     67	int reading;
     68
     69	if (off != 0)
     70		return (0);
     71
     72	reading = simple_strtol(buf, NULL, 10);
     73	switch (reading) {
     74	case 0:
     75		if (!ha->fw_dump_reading)
     76			break;
     77
     78		ql_log(ql_log_info, vha, 0x705d,
     79		    "Firmware dump cleared on (%ld).\n", vha->host_no);
     80
     81		if (IS_P3P_TYPE(ha)) {
     82			qla82xx_md_free(vha);
     83			qla82xx_md_prep(vha);
     84		}
     85		ha->fw_dump_reading = 0;
     86		ha->fw_dumped = false;
     87		break;
     88	case 1:
     89		if (ha->fw_dumped && !ha->fw_dump_reading) {
     90			ha->fw_dump_reading = 1;
     91
     92			ql_log(ql_log_info, vha, 0x705e,
     93			    "Raw firmware dump ready for read on (%ld).\n",
     94			    vha->host_no);
     95		}
     96		break;
     97	case 2:
     98		qla2x00_alloc_fw_dump(vha);
     99		break;
    100	case 3:
    101		if (IS_QLA82XX(ha)) {
    102			qla82xx_idc_lock(ha);
    103			qla82xx_set_reset_owner(vha);
    104			qla82xx_idc_unlock(ha);
    105		} else if (IS_QLA8044(ha)) {
    106			qla8044_idc_lock(ha);
    107			qla82xx_set_reset_owner(vha);
    108			qla8044_idc_unlock(ha);
    109		} else {
    110			qla2x00_system_error(vha);
    111		}
    112		break;
    113	case 4:
    114		if (IS_P3P_TYPE(ha)) {
    115			if (ha->md_tmplt_hdr)
    116				ql_dbg(ql_dbg_user, vha, 0x705b,
    117				    "MiniDump supported with this firmware.\n");
    118			else
    119				ql_dbg(ql_dbg_user, vha, 0x709d,
    120				    "MiniDump not supported with this firmware.\n");
    121		}
    122		break;
    123	case 5:
    124		if (IS_P3P_TYPE(ha))
    125			set_bit(ISP_ABORT_NEEDED, &vha->dpc_flags);
    126		break;
    127	case 6:
    128		if (!ha->mctp_dump_reading)
    129			break;
    130		ql_log(ql_log_info, vha, 0x70c1,
    131		    "MCTP dump cleared on (%ld).\n", vha->host_no);
    132		ha->mctp_dump_reading = 0;
    133		ha->mctp_dumped = 0;
    134		break;
    135	case 7:
    136		if (ha->mctp_dumped && !ha->mctp_dump_reading) {
    137			ha->mctp_dump_reading = 1;
    138			ql_log(ql_log_info, vha, 0x70c2,
    139			    "Raw mctp dump ready for read on (%ld).\n",
    140			    vha->host_no);
    141		}
    142		break;
    143	case 8:
    144		if (!ha->mpi_fw_dump_reading)
    145			break;
    146		ql_log(ql_log_info, vha, 0x70e7,
    147		       "MPI firmware dump cleared on (%ld).\n", vha->host_no);
    148		ha->mpi_fw_dump_reading = 0;
    149		ha->mpi_fw_dumped = 0;
    150		break;
    151	case 9:
    152		if (ha->mpi_fw_dumped && !ha->mpi_fw_dump_reading) {
    153			ha->mpi_fw_dump_reading = 1;
    154			ql_log(ql_log_info, vha, 0x70e8,
    155			       "Raw MPI firmware dump ready for read on (%ld).\n",
    156			       vha->host_no);
    157		}
    158		break;
    159	case 10:
    160		if (IS_QLA27XX(ha) || IS_QLA28XX(ha)) {
    161			ql_log(ql_log_info, vha, 0x70e9,
    162			       "Issuing MPI firmware dump on host#%ld.\n",
    163			       vha->host_no);
    164			ha->isp_ops->mpi_fw_dump(vha, 0);
    165		}
    166		break;
    167	}
    168	return count;
    169}
    170
    171static struct bin_attribute sysfs_fw_dump_attr = {
    172	.attr = {
    173		.name = "fw_dump",
    174		.mode = S_IRUSR | S_IWUSR,
    175	},
    176	.size = 0,
    177	.read = qla2x00_sysfs_read_fw_dump,
    178	.write = qla2x00_sysfs_write_fw_dump,
    179};
    180
    181static ssize_t
    182qla2x00_sysfs_read_nvram(struct file *filp, struct kobject *kobj,
    183			 struct bin_attribute *bin_attr,
    184			 char *buf, loff_t off, size_t count)
    185{
    186	struct scsi_qla_host *vha = shost_priv(dev_to_shost(container_of(kobj,
    187	    struct device, kobj)));
    188	struct qla_hw_data *ha = vha->hw;
    189	uint32_t faddr;
    190	struct active_regions active_regions = { };
    191
    192	if (!capable(CAP_SYS_ADMIN))
    193		return 0;
    194
    195	mutex_lock(&ha->optrom_mutex);
    196	if (qla2x00_chip_is_down(vha)) {
    197		mutex_unlock(&ha->optrom_mutex);
    198		return -EAGAIN;
    199	}
    200
    201	if (!IS_NOCACHE_VPD_TYPE(ha)) {
    202		mutex_unlock(&ha->optrom_mutex);
    203		goto skip;
    204	}
    205
    206	faddr = ha->flt_region_nvram;
    207	if (IS_QLA28XX(ha)) {
    208		qla28xx_get_aux_images(vha, &active_regions);
    209		if (active_regions.aux.vpd_nvram == QLA27XX_SECONDARY_IMAGE)
    210			faddr = ha->flt_region_nvram_sec;
    211	}
    212	ha->isp_ops->read_optrom(vha, ha->nvram, faddr << 2, ha->nvram_size);
    213
    214	mutex_unlock(&ha->optrom_mutex);
    215
    216skip:
    217	return memory_read_from_buffer(buf, count, &off, ha->nvram,
    218					ha->nvram_size);
    219}
    220
    221static ssize_t
    222qla2x00_sysfs_write_nvram(struct file *filp, struct kobject *kobj,
    223			  struct bin_attribute *bin_attr,
    224			  char *buf, loff_t off, size_t count)
    225{
    226	struct scsi_qla_host *vha = shost_priv(dev_to_shost(container_of(kobj,
    227	    struct device, kobj)));
    228	struct qla_hw_data *ha = vha->hw;
    229	uint16_t	cnt;
    230
    231	if (!capable(CAP_SYS_ADMIN) || off != 0 || count != ha->nvram_size ||
    232	    !ha->isp_ops->write_nvram)
    233		return -EINVAL;
    234
    235	/* Checksum NVRAM. */
    236	if (IS_FWI2_CAPABLE(ha)) {
    237		__le32 *iter = (__force __le32 *)buf;
    238		uint32_t chksum;
    239
    240		chksum = 0;
    241		for (cnt = 0; cnt < ((count >> 2) - 1); cnt++, iter++)
    242			chksum += le32_to_cpu(*iter);
    243		chksum = ~chksum + 1;
    244		*iter = cpu_to_le32(chksum);
    245	} else {
    246		uint8_t *iter;
    247		uint8_t chksum;
    248
    249		iter = (uint8_t *)buf;
    250		chksum = 0;
    251		for (cnt = 0; cnt < count - 1; cnt++)
    252			chksum += *iter++;
    253		chksum = ~chksum + 1;
    254		*iter = chksum;
    255	}
    256
    257	if (qla2x00_wait_for_hba_online(vha) != QLA_SUCCESS) {
    258		ql_log(ql_log_warn, vha, 0x705f,
    259		    "HBA not online, failing NVRAM update.\n");
    260		return -EAGAIN;
    261	}
    262
    263	mutex_lock(&ha->optrom_mutex);
    264	if (qla2x00_chip_is_down(vha)) {
    265		mutex_unlock(&ha->optrom_mutex);
    266		return -EAGAIN;
    267	}
    268
    269	/* Write NVRAM. */
    270	ha->isp_ops->write_nvram(vha, buf, ha->nvram_base, count);
    271	ha->isp_ops->read_nvram(vha, ha->nvram, ha->nvram_base,
    272	    count);
    273	mutex_unlock(&ha->optrom_mutex);
    274
    275	ql_dbg(ql_dbg_user, vha, 0x7060,
    276	    "Setting ISP_ABORT_NEEDED\n");
    277	/* NVRAM settings take effect immediately. */
    278	set_bit(ISP_ABORT_NEEDED, &vha->dpc_flags);
    279	qla2xxx_wake_dpc(vha);
    280	qla2x00_wait_for_chip_reset(vha);
    281
    282	return count;
    283}
    284
    285static struct bin_attribute sysfs_nvram_attr = {
    286	.attr = {
    287		.name = "nvram",
    288		.mode = S_IRUSR | S_IWUSR,
    289	},
    290	.size = 512,
    291	.read = qla2x00_sysfs_read_nvram,
    292	.write = qla2x00_sysfs_write_nvram,
    293};
    294
    295static ssize_t
    296qla2x00_sysfs_read_optrom(struct file *filp, struct kobject *kobj,
    297			  struct bin_attribute *bin_attr,
    298			  char *buf, loff_t off, size_t count)
    299{
    300	struct scsi_qla_host *vha = shost_priv(dev_to_shost(container_of(kobj,
    301	    struct device, kobj)));
    302	struct qla_hw_data *ha = vha->hw;
    303	ssize_t rval = 0;
    304
    305	mutex_lock(&ha->optrom_mutex);
    306
    307	if (ha->optrom_state != QLA_SREADING)
    308		goto out;
    309
    310	rval = memory_read_from_buffer(buf, count, &off, ha->optrom_buffer,
    311	    ha->optrom_region_size);
    312
    313out:
    314	mutex_unlock(&ha->optrom_mutex);
    315
    316	return rval;
    317}
    318
    319static ssize_t
    320qla2x00_sysfs_write_optrom(struct file *filp, struct kobject *kobj,
    321			   struct bin_attribute *bin_attr,
    322			   char *buf, loff_t off, size_t count)
    323{
    324	struct scsi_qla_host *vha = shost_priv(dev_to_shost(container_of(kobj,
    325	    struct device, kobj)));
    326	struct qla_hw_data *ha = vha->hw;
    327
    328	mutex_lock(&ha->optrom_mutex);
    329
    330	if (ha->optrom_state != QLA_SWRITING) {
    331		mutex_unlock(&ha->optrom_mutex);
    332		return -EINVAL;
    333	}
    334	if (off > ha->optrom_region_size) {
    335		mutex_unlock(&ha->optrom_mutex);
    336		return -ERANGE;
    337	}
    338	if (off + count > ha->optrom_region_size)
    339		count = ha->optrom_region_size - off;
    340
    341	memcpy(&ha->optrom_buffer[off], buf, count);
    342	mutex_unlock(&ha->optrom_mutex);
    343
    344	return count;
    345}
    346
    347static struct bin_attribute sysfs_optrom_attr = {
    348	.attr = {
    349		.name = "optrom",
    350		.mode = S_IRUSR | S_IWUSR,
    351	},
    352	.size = 0,
    353	.read = qla2x00_sysfs_read_optrom,
    354	.write = qla2x00_sysfs_write_optrom,
    355};
    356
    357static ssize_t
    358qla2x00_sysfs_write_optrom_ctl(struct file *filp, struct kobject *kobj,
    359			       struct bin_attribute *bin_attr,
    360			       char *buf, loff_t off, size_t count)
    361{
    362	struct scsi_qla_host *vha = shost_priv(dev_to_shost(container_of(kobj,
    363	    struct device, kobj)));
    364	struct qla_hw_data *ha = vha->hw;
    365	uint32_t start = 0;
    366	uint32_t size = ha->optrom_size;
    367	int val, valid;
    368	ssize_t rval = count;
    369
    370	if (off)
    371		return -EINVAL;
    372
    373	if (unlikely(pci_channel_offline(ha->pdev)))
    374		return -EAGAIN;
    375
    376	if (sscanf(buf, "%d:%x:%x", &val, &start, &size) < 1)
    377		return -EINVAL;
    378	if (start > ha->optrom_size)
    379		return -EINVAL;
    380	if (size > ha->optrom_size - start)
    381		size = ha->optrom_size - start;
    382
    383	mutex_lock(&ha->optrom_mutex);
    384	if (qla2x00_chip_is_down(vha)) {
    385		mutex_unlock(&ha->optrom_mutex);
    386		return -EAGAIN;
    387	}
    388	switch (val) {
    389	case 0:
    390		if (ha->optrom_state != QLA_SREADING &&
    391		    ha->optrom_state != QLA_SWRITING) {
    392			rval =  -EINVAL;
    393			goto out;
    394		}
    395		ha->optrom_state = QLA_SWAITING;
    396
    397		ql_dbg(ql_dbg_user, vha, 0x7061,
    398		    "Freeing flash region allocation -- 0x%x bytes.\n",
    399		    ha->optrom_region_size);
    400
    401		vfree(ha->optrom_buffer);
    402		ha->optrom_buffer = NULL;
    403		break;
    404	case 1:
    405		if (ha->optrom_state != QLA_SWAITING) {
    406			rval = -EINVAL;
    407			goto out;
    408		}
    409
    410		ha->optrom_region_start = start;
    411		ha->optrom_region_size = size;
    412
    413		ha->optrom_state = QLA_SREADING;
    414		ha->optrom_buffer = vzalloc(ha->optrom_region_size);
    415		if (ha->optrom_buffer == NULL) {
    416			ql_log(ql_log_warn, vha, 0x7062,
    417			    "Unable to allocate memory for optrom retrieval "
    418			    "(%x).\n", ha->optrom_region_size);
    419
    420			ha->optrom_state = QLA_SWAITING;
    421			rval = -ENOMEM;
    422			goto out;
    423		}
    424
    425		if (qla2x00_wait_for_hba_online(vha) != QLA_SUCCESS) {
    426			ql_log(ql_log_warn, vha, 0x7063,
    427			    "HBA not online, failing NVRAM update.\n");
    428			rval = -EAGAIN;
    429			goto out;
    430		}
    431
    432		ql_dbg(ql_dbg_user, vha, 0x7064,
    433		    "Reading flash region -- 0x%x/0x%x.\n",
    434		    ha->optrom_region_start, ha->optrom_region_size);
    435
    436		ha->isp_ops->read_optrom(vha, ha->optrom_buffer,
    437		    ha->optrom_region_start, ha->optrom_region_size);
    438		break;
    439	case 2:
    440		if (ha->optrom_state != QLA_SWAITING) {
    441			rval = -EINVAL;
    442			goto out;
    443		}
    444
    445		/*
    446		 * We need to be more restrictive on which FLASH regions are
    447		 * allowed to be updated via user-space.  Regions accessible
    448		 * via this method include:
    449		 *
    450		 * ISP21xx/ISP22xx/ISP23xx type boards:
    451		 *
    452		 * 	0x000000 -> 0x020000 -- Boot code.
    453		 *
    454		 * ISP2322/ISP24xx type boards:
    455		 *
    456		 * 	0x000000 -> 0x07ffff -- Boot code.
    457		 * 	0x080000 -> 0x0fffff -- Firmware.
    458		 *
    459		 * ISP25xx type boards:
    460		 *
    461		 * 	0x000000 -> 0x07ffff -- Boot code.
    462		 * 	0x080000 -> 0x0fffff -- Firmware.
    463		 * 	0x120000 -> 0x12ffff -- VPD and HBA parameters.
    464		 *
    465		 * > ISP25xx type boards:
    466		 *
    467		 *      None -- should go through BSG.
    468		 */
    469		valid = 0;
    470		if (ha->optrom_size == OPTROM_SIZE_2300 && start == 0)
    471			valid = 1;
    472		else if (IS_QLA24XX_TYPE(ha) || IS_QLA25XX(ha))
    473			valid = 1;
    474		if (!valid) {
    475			ql_log(ql_log_warn, vha, 0x7065,
    476			    "Invalid start region 0x%x/0x%x.\n", start, size);
    477			rval = -EINVAL;
    478			goto out;
    479		}
    480
    481		ha->optrom_region_start = start;
    482		ha->optrom_region_size = size;
    483
    484		ha->optrom_state = QLA_SWRITING;
    485		ha->optrom_buffer = vzalloc(ha->optrom_region_size);
    486		if (ha->optrom_buffer == NULL) {
    487			ql_log(ql_log_warn, vha, 0x7066,
    488			    "Unable to allocate memory for optrom update "
    489			    "(%x)\n", ha->optrom_region_size);
    490
    491			ha->optrom_state = QLA_SWAITING;
    492			rval = -ENOMEM;
    493			goto out;
    494		}
    495
    496		ql_dbg(ql_dbg_user, vha, 0x7067,
    497		    "Staging flash region write -- 0x%x/0x%x.\n",
    498		    ha->optrom_region_start, ha->optrom_region_size);
    499
    500		break;
    501	case 3:
    502		if (ha->optrom_state != QLA_SWRITING) {
    503			rval = -EINVAL;
    504			goto out;
    505		}
    506
    507		if (qla2x00_wait_for_hba_online(vha) != QLA_SUCCESS) {
    508			ql_log(ql_log_warn, vha, 0x7068,
    509			    "HBA not online, failing flash update.\n");
    510			rval = -EAGAIN;
    511			goto out;
    512		}
    513
    514		ql_dbg(ql_dbg_user, vha, 0x7069,
    515		    "Writing flash region -- 0x%x/0x%x.\n",
    516		    ha->optrom_region_start, ha->optrom_region_size);
    517
    518		rval = ha->isp_ops->write_optrom(vha, ha->optrom_buffer,
    519		    ha->optrom_region_start, ha->optrom_region_size);
    520		if (rval)
    521			rval = -EIO;
    522		break;
    523	default:
    524		rval = -EINVAL;
    525	}
    526
    527out:
    528	mutex_unlock(&ha->optrom_mutex);
    529	return rval;
    530}
    531
    532static struct bin_attribute sysfs_optrom_ctl_attr = {
    533	.attr = {
    534		.name = "optrom_ctl",
    535		.mode = S_IWUSR,
    536	},
    537	.size = 0,
    538	.write = qla2x00_sysfs_write_optrom_ctl,
    539};
    540
    541static ssize_t
    542qla2x00_sysfs_read_vpd(struct file *filp, struct kobject *kobj,
    543		       struct bin_attribute *bin_attr,
    544		       char *buf, loff_t off, size_t count)
    545{
    546	struct scsi_qla_host *vha = shost_priv(dev_to_shost(container_of(kobj,
    547	    struct device, kobj)));
    548	struct qla_hw_data *ha = vha->hw;
    549	uint32_t faddr;
    550	struct active_regions active_regions = { };
    551
    552	if (unlikely(pci_channel_offline(ha->pdev)))
    553		return -EAGAIN;
    554
    555	if (!capable(CAP_SYS_ADMIN))
    556		return -EINVAL;
    557
    558	if (!IS_NOCACHE_VPD_TYPE(ha))
    559		goto skip;
    560
    561	faddr = ha->flt_region_vpd << 2;
    562
    563	if (IS_QLA28XX(ha)) {
    564		qla28xx_get_aux_images(vha, &active_regions);
    565		if (active_regions.aux.vpd_nvram == QLA27XX_SECONDARY_IMAGE)
    566			faddr = ha->flt_region_vpd_sec << 2;
    567
    568		ql_dbg(ql_dbg_init, vha, 0x7070,
    569		    "Loading %s nvram image.\n",
    570		    active_regions.aux.vpd_nvram == QLA27XX_PRIMARY_IMAGE ?
    571		    "primary" : "secondary");
    572	}
    573
    574	mutex_lock(&ha->optrom_mutex);
    575	if (qla2x00_chip_is_down(vha)) {
    576		mutex_unlock(&ha->optrom_mutex);
    577		return -EAGAIN;
    578	}
    579
    580	ha->isp_ops->read_optrom(vha, ha->vpd, faddr, ha->vpd_size);
    581	mutex_unlock(&ha->optrom_mutex);
    582
    583	ha->isp_ops->read_optrom(vha, ha->vpd, faddr, ha->vpd_size);
    584skip:
    585	return memory_read_from_buffer(buf, count, &off, ha->vpd, ha->vpd_size);
    586}
    587
    588static ssize_t
    589qla2x00_sysfs_write_vpd(struct file *filp, struct kobject *kobj,
    590			struct bin_attribute *bin_attr,
    591			char *buf, loff_t off, size_t count)
    592{
    593	struct scsi_qla_host *vha = shost_priv(dev_to_shost(container_of(kobj,
    594	    struct device, kobj)));
    595	struct qla_hw_data *ha = vha->hw;
    596	uint8_t *tmp_data;
    597
    598	if (unlikely(pci_channel_offline(ha->pdev)))
    599		return 0;
    600
    601	if (qla2x00_chip_is_down(vha))
    602		return 0;
    603
    604	if (!capable(CAP_SYS_ADMIN) || off != 0 || count != ha->vpd_size ||
    605	    !ha->isp_ops->write_nvram)
    606		return 0;
    607
    608	if (qla2x00_wait_for_hba_online(vha) != QLA_SUCCESS) {
    609		ql_log(ql_log_warn, vha, 0x706a,
    610		    "HBA not online, failing VPD update.\n");
    611		return -EAGAIN;
    612	}
    613
    614	mutex_lock(&ha->optrom_mutex);
    615	if (qla2x00_chip_is_down(vha)) {
    616		mutex_unlock(&ha->optrom_mutex);
    617		return -EAGAIN;
    618	}
    619
    620	/* Write NVRAM. */
    621	ha->isp_ops->write_nvram(vha, buf, ha->vpd_base, count);
    622	ha->isp_ops->read_nvram(vha, ha->vpd, ha->vpd_base, count);
    623
    624	/* Update flash version information for 4Gb & above. */
    625	if (!IS_FWI2_CAPABLE(ha)) {
    626		mutex_unlock(&ha->optrom_mutex);
    627		return -EINVAL;
    628	}
    629
    630	tmp_data = vmalloc(256);
    631	if (!tmp_data) {
    632		mutex_unlock(&ha->optrom_mutex);
    633		ql_log(ql_log_warn, vha, 0x706b,
    634		    "Unable to allocate memory for VPD information update.\n");
    635		return -ENOMEM;
    636	}
    637	ha->isp_ops->get_flash_version(vha, tmp_data);
    638	vfree(tmp_data);
    639
    640	mutex_unlock(&ha->optrom_mutex);
    641
    642	return count;
    643}
    644
    645static struct bin_attribute sysfs_vpd_attr = {
    646	.attr = {
    647		.name = "vpd",
    648		.mode = S_IRUSR | S_IWUSR,
    649	},
    650	.size = 0,
    651	.read = qla2x00_sysfs_read_vpd,
    652	.write = qla2x00_sysfs_write_vpd,
    653};
    654
    655static ssize_t
    656qla2x00_sysfs_read_sfp(struct file *filp, struct kobject *kobj,
    657		       struct bin_attribute *bin_attr,
    658		       char *buf, loff_t off, size_t count)
    659{
    660	struct scsi_qla_host *vha = shost_priv(dev_to_shost(container_of(kobj,
    661	    struct device, kobj)));
    662	int rval;
    663
    664	if (!capable(CAP_SYS_ADMIN) || off != 0 || count < SFP_DEV_SIZE)
    665		return 0;
    666
    667	mutex_lock(&vha->hw->optrom_mutex);
    668	if (qla2x00_chip_is_down(vha)) {
    669		mutex_unlock(&vha->hw->optrom_mutex);
    670		return 0;
    671	}
    672
    673	rval = qla2x00_read_sfp_dev(vha, buf, count);
    674	mutex_unlock(&vha->hw->optrom_mutex);
    675
    676	if (rval)
    677		return -EIO;
    678
    679	return count;
    680}
    681
    682static struct bin_attribute sysfs_sfp_attr = {
    683	.attr = {
    684		.name = "sfp",
    685		.mode = S_IRUSR | S_IWUSR,
    686	},
    687	.size = SFP_DEV_SIZE,
    688	.read = qla2x00_sysfs_read_sfp,
    689};
    690
    691static ssize_t
    692qla2x00_sysfs_write_reset(struct file *filp, struct kobject *kobj,
    693			struct bin_attribute *bin_attr,
    694			char *buf, loff_t off, size_t count)
    695{
    696	struct scsi_qla_host *vha = shost_priv(dev_to_shost(container_of(kobj,
    697	    struct device, kobj)));
    698	struct qla_hw_data *ha = vha->hw;
    699	struct scsi_qla_host *base_vha = pci_get_drvdata(ha->pdev);
    700	int type;
    701	uint32_t idc_control;
    702	uint8_t *tmp_data = NULL;
    703
    704	if (off != 0)
    705		return -EINVAL;
    706
    707	type = simple_strtol(buf, NULL, 10);
    708	switch (type) {
    709	case 0x2025c:
    710		ql_log(ql_log_info, vha, 0x706e,
    711		    "Issuing ISP reset.\n");
    712
    713		if (vha->hw->flags.port_isolated) {
    714			ql_log(ql_log_info, vha, 0x706e,
    715			       "Port is isolated, returning.\n");
    716			return -EINVAL;
    717		}
    718
    719		scsi_block_requests(vha->host);
    720		if (IS_QLA82XX(ha)) {
    721			ha->flags.isp82xx_no_md_cap = 1;
    722			qla82xx_idc_lock(ha);
    723			qla82xx_set_reset_owner(vha);
    724			qla82xx_idc_unlock(ha);
    725		} else if (IS_QLA8044(ha)) {
    726			qla8044_idc_lock(ha);
    727			idc_control = qla8044_rd_reg(ha,
    728			    QLA8044_IDC_DRV_CTRL);
    729			qla8044_wr_reg(ha, QLA8044_IDC_DRV_CTRL,
    730			    (idc_control | GRACEFUL_RESET_BIT1));
    731			qla82xx_set_reset_owner(vha);
    732			qla8044_idc_unlock(ha);
    733		} else {
    734			set_bit(ISP_ABORT_NEEDED, &vha->dpc_flags);
    735			qla2xxx_wake_dpc(vha);
    736		}
    737		qla2x00_wait_for_chip_reset(vha);
    738		scsi_unblock_requests(vha->host);
    739		break;
    740	case 0x2025d:
    741		if (!IS_QLA81XX(ha) && !IS_QLA83XX(ha) &&
    742		    !IS_QLA27XX(ha) && !IS_QLA28XX(ha))
    743			return -EPERM;
    744
    745		ql_log(ql_log_info, vha, 0x706f,
    746		    "Issuing MPI reset.\n");
    747
    748		if (IS_QLA83XX(ha)) {
    749			uint32_t idc_control;
    750
    751			qla83xx_idc_lock(vha, 0);
    752			__qla83xx_get_idc_control(vha, &idc_control);
    753			idc_control |= QLA83XX_IDC_GRACEFUL_RESET;
    754			__qla83xx_set_idc_control(vha, idc_control);
    755			qla83xx_wr_reg(vha, QLA83XX_IDC_DEV_STATE,
    756			    QLA8XXX_DEV_NEED_RESET);
    757			qla83xx_idc_audit(vha, IDC_AUDIT_TIMESTAMP);
    758			qla83xx_idc_unlock(vha, 0);
    759			break;
    760		} else {
    761			/* Make sure FC side is not in reset */
    762			WARN_ON_ONCE(qla2x00_wait_for_hba_online(vha) !=
    763				     QLA_SUCCESS);
    764
    765			/* Issue MPI reset */
    766			scsi_block_requests(vha->host);
    767			if (qla81xx_restart_mpi_firmware(vha) != QLA_SUCCESS)
    768				ql_log(ql_log_warn, vha, 0x7070,
    769				    "MPI reset failed.\n");
    770			scsi_unblock_requests(vha->host);
    771			break;
    772		}
    773		break;
    774	case 0x2025e:
    775		if (!IS_P3P_TYPE(ha) || vha != base_vha) {
    776			ql_log(ql_log_info, vha, 0x7071,
    777			    "FCoE ctx reset not supported.\n");
    778			return -EPERM;
    779		}
    780
    781		ql_log(ql_log_info, vha, 0x7072,
    782		    "Issuing FCoE ctx reset.\n");
    783		set_bit(FCOE_CTX_RESET_NEEDED, &vha->dpc_flags);
    784		qla2xxx_wake_dpc(vha);
    785		qla2x00_wait_for_fcoe_ctx_reset(vha);
    786		break;
    787	case 0x2025f:
    788		if (!IS_QLA8031(ha))
    789			return -EPERM;
    790		ql_log(ql_log_info, vha, 0x70bc,
    791		    "Disabling Reset by IDC control\n");
    792		qla83xx_idc_lock(vha, 0);
    793		__qla83xx_get_idc_control(vha, &idc_control);
    794		idc_control |= QLA83XX_IDC_RESET_DISABLED;
    795		__qla83xx_set_idc_control(vha, idc_control);
    796		qla83xx_idc_unlock(vha, 0);
    797		break;
    798	case 0x20260:
    799		if (!IS_QLA8031(ha))
    800			return -EPERM;
    801		ql_log(ql_log_info, vha, 0x70bd,
    802		    "Enabling Reset by IDC control\n");
    803		qla83xx_idc_lock(vha, 0);
    804		__qla83xx_get_idc_control(vha, &idc_control);
    805		idc_control &= ~QLA83XX_IDC_RESET_DISABLED;
    806		__qla83xx_set_idc_control(vha, idc_control);
    807		qla83xx_idc_unlock(vha, 0);
    808		break;
    809	case 0x20261:
    810		ql_dbg(ql_dbg_user, vha, 0x70e0,
    811		    "Updating cache versions without reset ");
    812
    813		tmp_data = vmalloc(256);
    814		if (!tmp_data) {
    815			ql_log(ql_log_warn, vha, 0x70e1,
    816			    "Unable to allocate memory for VPD information update.\n");
    817			return -ENOMEM;
    818		}
    819		ha->isp_ops->get_flash_version(vha, tmp_data);
    820		vfree(tmp_data);
    821		break;
    822	}
    823	return count;
    824}
    825
    826static struct bin_attribute sysfs_reset_attr = {
    827	.attr = {
    828		.name = "reset",
    829		.mode = S_IWUSR,
    830	},
    831	.size = 0,
    832	.write = qla2x00_sysfs_write_reset,
    833};
    834
    835static ssize_t
    836qla2x00_issue_logo(struct file *filp, struct kobject *kobj,
    837			struct bin_attribute *bin_attr,
    838			char *buf, loff_t off, size_t count)
    839{
    840	struct scsi_qla_host *vha = shost_priv(dev_to_shost(container_of(kobj,
    841	    struct device, kobj)));
    842	int type;
    843	port_id_t did;
    844
    845	if (!capable(CAP_SYS_ADMIN))
    846		return 0;
    847
    848	if (unlikely(pci_channel_offline(vha->hw->pdev)))
    849		return 0;
    850
    851	if (qla2x00_chip_is_down(vha))
    852		return 0;
    853
    854	type = simple_strtol(buf, NULL, 10);
    855
    856	did.b.domain = (type & 0x00ff0000) >> 16;
    857	did.b.area = (type & 0x0000ff00) >> 8;
    858	did.b.al_pa = (type & 0x000000ff);
    859
    860	ql_log(ql_log_info, vha, 0xd04d, "portid=%02x%02x%02x done\n",
    861	    did.b.domain, did.b.area, did.b.al_pa);
    862
    863	ql_log(ql_log_info, vha, 0x70e4, "%s: %d\n", __func__, type);
    864
    865	qla24xx_els_dcmd_iocb(vha, ELS_DCMD_LOGO, did);
    866	return count;
    867}
    868
    869static struct bin_attribute sysfs_issue_logo_attr = {
    870	.attr = {
    871		.name = "issue_logo",
    872		.mode = S_IWUSR,
    873	},
    874	.size = 0,
    875	.write = qla2x00_issue_logo,
    876};
    877
    878static ssize_t
    879qla2x00_sysfs_read_xgmac_stats(struct file *filp, struct kobject *kobj,
    880		       struct bin_attribute *bin_attr,
    881		       char *buf, loff_t off, size_t count)
    882{
    883	struct scsi_qla_host *vha = shost_priv(dev_to_shost(container_of(kobj,
    884	    struct device, kobj)));
    885	struct qla_hw_data *ha = vha->hw;
    886	int rval;
    887	uint16_t actual_size;
    888
    889	if (!capable(CAP_SYS_ADMIN) || off != 0 || count > XGMAC_DATA_SIZE)
    890		return 0;
    891
    892	if (unlikely(pci_channel_offline(ha->pdev)))
    893		return 0;
    894	mutex_lock(&vha->hw->optrom_mutex);
    895	if (qla2x00_chip_is_down(vha)) {
    896		mutex_unlock(&vha->hw->optrom_mutex);
    897		return 0;
    898	}
    899
    900	if (ha->xgmac_data)
    901		goto do_read;
    902
    903	ha->xgmac_data = dma_alloc_coherent(&ha->pdev->dev, XGMAC_DATA_SIZE,
    904	    &ha->xgmac_data_dma, GFP_KERNEL);
    905	if (!ha->xgmac_data) {
    906		mutex_unlock(&vha->hw->optrom_mutex);
    907		ql_log(ql_log_warn, vha, 0x7076,
    908		    "Unable to allocate memory for XGMAC read-data.\n");
    909		return 0;
    910	}
    911
    912do_read:
    913	actual_size = 0;
    914	memset(ha->xgmac_data, 0, XGMAC_DATA_SIZE);
    915
    916	rval = qla2x00_get_xgmac_stats(vha, ha->xgmac_data_dma,
    917	    XGMAC_DATA_SIZE, &actual_size);
    918
    919	mutex_unlock(&vha->hw->optrom_mutex);
    920	if (rval != QLA_SUCCESS) {
    921		ql_log(ql_log_warn, vha, 0x7077,
    922		    "Unable to read XGMAC data (%x).\n", rval);
    923		count = 0;
    924	}
    925
    926	count = actual_size > count ? count : actual_size;
    927	memcpy(buf, ha->xgmac_data, count);
    928
    929	return count;
    930}
    931
    932static struct bin_attribute sysfs_xgmac_stats_attr = {
    933	.attr = {
    934		.name = "xgmac_stats",
    935		.mode = S_IRUSR,
    936	},
    937	.size = 0,
    938	.read = qla2x00_sysfs_read_xgmac_stats,
    939};
    940
    941static ssize_t
    942qla2x00_sysfs_read_dcbx_tlv(struct file *filp, struct kobject *kobj,
    943		       struct bin_attribute *bin_attr,
    944		       char *buf, loff_t off, size_t count)
    945{
    946	struct scsi_qla_host *vha = shost_priv(dev_to_shost(container_of(kobj,
    947	    struct device, kobj)));
    948	struct qla_hw_data *ha = vha->hw;
    949	int rval;
    950
    951	if (!capable(CAP_SYS_ADMIN) || off != 0 || count > DCBX_TLV_DATA_SIZE)
    952		return 0;
    953
    954	if (ha->dcbx_tlv)
    955		goto do_read;
    956	mutex_lock(&vha->hw->optrom_mutex);
    957	if (qla2x00_chip_is_down(vha)) {
    958		mutex_unlock(&vha->hw->optrom_mutex);
    959		return 0;
    960	}
    961
    962	ha->dcbx_tlv = dma_alloc_coherent(&ha->pdev->dev, DCBX_TLV_DATA_SIZE,
    963	    &ha->dcbx_tlv_dma, GFP_KERNEL);
    964	if (!ha->dcbx_tlv) {
    965		mutex_unlock(&vha->hw->optrom_mutex);
    966		ql_log(ql_log_warn, vha, 0x7078,
    967		    "Unable to allocate memory for DCBX TLV read-data.\n");
    968		return -ENOMEM;
    969	}
    970
    971do_read:
    972	memset(ha->dcbx_tlv, 0, DCBX_TLV_DATA_SIZE);
    973
    974	rval = qla2x00_get_dcbx_params(vha, ha->dcbx_tlv_dma,
    975	    DCBX_TLV_DATA_SIZE);
    976
    977	mutex_unlock(&vha->hw->optrom_mutex);
    978
    979	if (rval != QLA_SUCCESS) {
    980		ql_log(ql_log_warn, vha, 0x7079,
    981		    "Unable to read DCBX TLV (%x).\n", rval);
    982		return -EIO;
    983	}
    984
    985	memcpy(buf, ha->dcbx_tlv, count);
    986
    987	return count;
    988}
    989
    990static struct bin_attribute sysfs_dcbx_tlv_attr = {
    991	.attr = {
    992		.name = "dcbx_tlv",
    993		.mode = S_IRUSR,
    994	},
    995	.size = 0,
    996	.read = qla2x00_sysfs_read_dcbx_tlv,
    997};
    998
    999static struct sysfs_entry {
   1000	char *name;
   1001	struct bin_attribute *attr;
   1002	int type;
   1003} bin_file_entries[] = {
   1004	{ "fw_dump", &sysfs_fw_dump_attr, },
   1005	{ "nvram", &sysfs_nvram_attr, },
   1006	{ "optrom", &sysfs_optrom_attr, },
   1007	{ "optrom_ctl", &sysfs_optrom_ctl_attr, },
   1008	{ "vpd", &sysfs_vpd_attr, 1 },
   1009	{ "sfp", &sysfs_sfp_attr, 1 },
   1010	{ "reset", &sysfs_reset_attr, },
   1011	{ "issue_logo", &sysfs_issue_logo_attr, },
   1012	{ "xgmac_stats", &sysfs_xgmac_stats_attr, 3 },
   1013	{ "dcbx_tlv", &sysfs_dcbx_tlv_attr, 3 },
   1014	{ NULL },
   1015};
   1016
   1017void
   1018qla2x00_alloc_sysfs_attr(scsi_qla_host_t *vha)
   1019{
   1020	struct Scsi_Host *host = vha->host;
   1021	struct sysfs_entry *iter;
   1022	int ret;
   1023
   1024	for (iter = bin_file_entries; iter->name; iter++) {
   1025		if (iter->type && !IS_FWI2_CAPABLE(vha->hw))
   1026			continue;
   1027		if (iter->type == 2 && !IS_QLA25XX(vha->hw))
   1028			continue;
   1029		if (iter->type == 3 && !(IS_CNA_CAPABLE(vha->hw)))
   1030			continue;
   1031
   1032		ret = sysfs_create_bin_file(&host->shost_gendev.kobj,
   1033		    iter->attr);
   1034		if (ret)
   1035			ql_log(ql_log_warn, vha, 0x00f3,
   1036			    "Unable to create sysfs %s binary attribute (%d).\n",
   1037			    iter->name, ret);
   1038		else
   1039			ql_dbg(ql_dbg_init, vha, 0x00f4,
   1040			    "Successfully created sysfs %s binary attribute.\n",
   1041			    iter->name);
   1042	}
   1043}
   1044
   1045void
   1046qla2x00_free_sysfs_attr(scsi_qla_host_t *vha, bool stop_beacon)
   1047{
   1048	struct Scsi_Host *host = vha->host;
   1049	struct sysfs_entry *iter;
   1050	struct qla_hw_data *ha = vha->hw;
   1051
   1052	for (iter = bin_file_entries; iter->name; iter++) {
   1053		if (iter->type && !IS_FWI2_CAPABLE(ha))
   1054			continue;
   1055		if (iter->type == 2 && !IS_QLA25XX(ha))
   1056			continue;
   1057		if (iter->type == 3 && !(IS_CNA_CAPABLE(ha)))
   1058			continue;
   1059
   1060		sysfs_remove_bin_file(&host->shost_gendev.kobj,
   1061		    iter->attr);
   1062	}
   1063
   1064	if (stop_beacon && ha->beacon_blink_led == 1)
   1065		ha->isp_ops->beacon_off(vha);
   1066}
   1067
   1068/* Scsi_Host attributes. */
   1069
   1070static ssize_t
   1071qla2x00_driver_version_show(struct device *dev,
   1072			  struct device_attribute *attr, char *buf)
   1073{
   1074	return scnprintf(buf, PAGE_SIZE, "%s\n", qla2x00_version_str);
   1075}
   1076
   1077static ssize_t
   1078qla2x00_fw_version_show(struct device *dev,
   1079			struct device_attribute *attr, char *buf)
   1080{
   1081	scsi_qla_host_t *vha = shost_priv(class_to_shost(dev));
   1082	struct qla_hw_data *ha = vha->hw;
   1083	char fw_str[128];
   1084
   1085	return scnprintf(buf, PAGE_SIZE, "%s\n",
   1086	    ha->isp_ops->fw_version_str(vha, fw_str, sizeof(fw_str)));
   1087}
   1088
   1089static ssize_t
   1090qla2x00_serial_num_show(struct device *dev, struct device_attribute *attr,
   1091			char *buf)
   1092{
   1093	scsi_qla_host_t *vha = shost_priv(class_to_shost(dev));
   1094	struct qla_hw_data *ha = vha->hw;
   1095	uint32_t sn;
   1096
   1097	if (IS_QLAFX00(vha->hw)) {
   1098		return scnprintf(buf, PAGE_SIZE, "%s\n",
   1099		    vha->hw->mr.serial_num);
   1100	} else if (IS_FWI2_CAPABLE(ha)) {
   1101		qla2xxx_get_vpd_field(vha, "SN", buf, PAGE_SIZE - 1);
   1102		return strlen(strcat(buf, "\n"));
   1103	}
   1104
   1105	sn = ((ha->serial0 & 0x1f) << 16) | (ha->serial2 << 8) | ha->serial1;
   1106	return scnprintf(buf, PAGE_SIZE, "%c%05d\n", 'A' + sn / 100000,
   1107	    sn % 100000);
   1108}
   1109
   1110static ssize_t
   1111qla2x00_isp_name_show(struct device *dev, struct device_attribute *attr,
   1112		      char *buf)
   1113{
   1114	scsi_qla_host_t *vha = shost_priv(class_to_shost(dev));
   1115
   1116	return scnprintf(buf, PAGE_SIZE, "ISP%04X\n", vha->hw->pdev->device);
   1117}
   1118
   1119static ssize_t
   1120qla2x00_isp_id_show(struct device *dev, struct device_attribute *attr,
   1121		    char *buf)
   1122{
   1123	scsi_qla_host_t *vha = shost_priv(class_to_shost(dev));
   1124	struct qla_hw_data *ha = vha->hw;
   1125
   1126	if (IS_QLAFX00(vha->hw))
   1127		return scnprintf(buf, PAGE_SIZE, "%s\n",
   1128		    vha->hw->mr.hw_version);
   1129
   1130	return scnprintf(buf, PAGE_SIZE, "%04x %04x %04x %04x\n",
   1131	    ha->product_id[0], ha->product_id[1], ha->product_id[2],
   1132	    ha->product_id[3]);
   1133}
   1134
   1135static ssize_t
   1136qla2x00_model_name_show(struct device *dev, struct device_attribute *attr,
   1137			char *buf)
   1138{
   1139	scsi_qla_host_t *vha = shost_priv(class_to_shost(dev));
   1140
   1141	return scnprintf(buf, PAGE_SIZE, "%s\n", vha->hw->model_number);
   1142}
   1143
   1144static ssize_t
   1145qla2x00_model_desc_show(struct device *dev, struct device_attribute *attr,
   1146			char *buf)
   1147{
   1148	scsi_qla_host_t *vha = shost_priv(class_to_shost(dev));
   1149
   1150	return scnprintf(buf, PAGE_SIZE, "%s\n", vha->hw->model_desc);
   1151}
   1152
   1153static ssize_t
   1154qla2x00_pci_info_show(struct device *dev, struct device_attribute *attr,
   1155		      char *buf)
   1156{
   1157	scsi_qla_host_t *vha = shost_priv(class_to_shost(dev));
   1158	char pci_info[30];
   1159
   1160	return scnprintf(buf, PAGE_SIZE, "%s\n",
   1161			 vha->hw->isp_ops->pci_info_str(vha, pci_info,
   1162							sizeof(pci_info)));
   1163}
   1164
   1165static ssize_t
   1166qla2x00_link_state_show(struct device *dev, struct device_attribute *attr,
   1167			char *buf)
   1168{
   1169	scsi_qla_host_t *vha = shost_priv(class_to_shost(dev));
   1170	struct qla_hw_data *ha = vha->hw;
   1171	int len = 0;
   1172
   1173	if (atomic_read(&vha->loop_state) == LOOP_DOWN ||
   1174	    atomic_read(&vha->loop_state) == LOOP_DEAD ||
   1175	    vha->device_flags & DFLG_NO_CABLE)
   1176		len = scnprintf(buf, PAGE_SIZE, "Link Down\n");
   1177	else if (atomic_read(&vha->loop_state) != LOOP_READY ||
   1178	    qla2x00_chip_is_down(vha))
   1179		len = scnprintf(buf, PAGE_SIZE, "Unknown Link State\n");
   1180	else {
   1181		len = scnprintf(buf, PAGE_SIZE, "Link Up - ");
   1182
   1183		switch (ha->current_topology) {
   1184		case ISP_CFG_NL:
   1185			len += scnprintf(buf + len, PAGE_SIZE-len, "Loop\n");
   1186			break;
   1187		case ISP_CFG_FL:
   1188			len += scnprintf(buf + len, PAGE_SIZE-len, "FL_Port\n");
   1189			break;
   1190		case ISP_CFG_N:
   1191			len += scnprintf(buf + len, PAGE_SIZE-len,
   1192			    "N_Port to N_Port\n");
   1193			break;
   1194		case ISP_CFG_F:
   1195			len += scnprintf(buf + len, PAGE_SIZE-len, "F_Port\n");
   1196			break;
   1197		default:
   1198			len += scnprintf(buf + len, PAGE_SIZE-len, "Loop\n");
   1199			break;
   1200		}
   1201	}
   1202	return len;
   1203}
   1204
   1205static ssize_t
   1206qla2x00_zio_show(struct device *dev, struct device_attribute *attr,
   1207		 char *buf)
   1208{
   1209	scsi_qla_host_t *vha = shost_priv(class_to_shost(dev));
   1210	int len = 0;
   1211
   1212	switch (vha->hw->zio_mode) {
   1213	case QLA_ZIO_MODE_6:
   1214		len += scnprintf(buf + len, PAGE_SIZE-len, "Mode 6\n");
   1215		break;
   1216	case QLA_ZIO_DISABLED:
   1217		len += scnprintf(buf + len, PAGE_SIZE-len, "Disabled\n");
   1218		break;
   1219	}
   1220	return len;
   1221}
   1222
   1223static ssize_t
   1224qla2x00_zio_store(struct device *dev, struct device_attribute *attr,
   1225		  const char *buf, size_t count)
   1226{
   1227	scsi_qla_host_t *vha = shost_priv(class_to_shost(dev));
   1228	struct qla_hw_data *ha = vha->hw;
   1229	int val = 0;
   1230	uint16_t zio_mode;
   1231
   1232	if (!IS_ZIO_SUPPORTED(ha))
   1233		return -ENOTSUPP;
   1234
   1235	if (sscanf(buf, "%d", &val) != 1)
   1236		return -EINVAL;
   1237
   1238	if (val)
   1239		zio_mode = QLA_ZIO_MODE_6;
   1240	else
   1241		zio_mode = QLA_ZIO_DISABLED;
   1242
   1243	/* Update per-hba values and queue a reset. */
   1244	if (zio_mode != QLA_ZIO_DISABLED || ha->zio_mode != QLA_ZIO_DISABLED) {
   1245		ha->zio_mode = zio_mode;
   1246		set_bit(ISP_ABORT_NEEDED, &vha->dpc_flags);
   1247	}
   1248	return strlen(buf);
   1249}
   1250
   1251static ssize_t
   1252qla2x00_zio_timer_show(struct device *dev, struct device_attribute *attr,
   1253		       char *buf)
   1254{
   1255	scsi_qla_host_t *vha = shost_priv(class_to_shost(dev));
   1256
   1257	return scnprintf(buf, PAGE_SIZE, "%d us\n", vha->hw->zio_timer * 100);
   1258}
   1259
   1260static ssize_t
   1261qla2x00_zio_timer_store(struct device *dev, struct device_attribute *attr,
   1262			const char *buf, size_t count)
   1263{
   1264	scsi_qla_host_t *vha = shost_priv(class_to_shost(dev));
   1265	int val = 0;
   1266	uint16_t zio_timer;
   1267
   1268	if (sscanf(buf, "%d", &val) != 1)
   1269		return -EINVAL;
   1270	if (val > 25500 || val < 100)
   1271		return -ERANGE;
   1272
   1273	zio_timer = (uint16_t)(val / 100);
   1274	vha->hw->zio_timer = zio_timer;
   1275
   1276	return strlen(buf);
   1277}
   1278
   1279static ssize_t
   1280qla_zio_threshold_show(struct device *dev, struct device_attribute *attr,
   1281		       char *buf)
   1282{
   1283	scsi_qla_host_t *vha = shost_priv(class_to_shost(dev));
   1284
   1285	return scnprintf(buf, PAGE_SIZE, "%d exchanges\n",
   1286	    vha->hw->last_zio_threshold);
   1287}
   1288
   1289static ssize_t
   1290qla_zio_threshold_store(struct device *dev, struct device_attribute *attr,
   1291    const char *buf, size_t count)
   1292{
   1293	scsi_qla_host_t *vha = shost_priv(class_to_shost(dev));
   1294	int val = 0;
   1295
   1296	if (vha->hw->zio_mode != QLA_ZIO_MODE_6)
   1297		return -EINVAL;
   1298	if (sscanf(buf, "%d", &val) != 1)
   1299		return -EINVAL;
   1300	if (val < 0 || val > 256)
   1301		return -ERANGE;
   1302
   1303	atomic_set(&vha->hw->zio_threshold, val);
   1304	return strlen(buf);
   1305}
   1306
   1307static ssize_t
   1308qla2x00_beacon_show(struct device *dev, struct device_attribute *attr,
   1309		    char *buf)
   1310{
   1311	scsi_qla_host_t *vha = shost_priv(class_to_shost(dev));
   1312	int len = 0;
   1313
   1314	if (vha->hw->beacon_blink_led)
   1315		len += scnprintf(buf + len, PAGE_SIZE-len, "Enabled\n");
   1316	else
   1317		len += scnprintf(buf + len, PAGE_SIZE-len, "Disabled\n");
   1318	return len;
   1319}
   1320
   1321static ssize_t
   1322qla2x00_beacon_store(struct device *dev, struct device_attribute *attr,
   1323		     const char *buf, size_t count)
   1324{
   1325	scsi_qla_host_t *vha = shost_priv(class_to_shost(dev));
   1326	struct qla_hw_data *ha = vha->hw;
   1327	int val = 0;
   1328	int rval;
   1329
   1330	if (IS_QLA2100(ha) || IS_QLA2200(ha))
   1331		return -EPERM;
   1332
   1333	if (sscanf(buf, "%d", &val) != 1)
   1334		return -EINVAL;
   1335
   1336	mutex_lock(&vha->hw->optrom_mutex);
   1337	if (qla2x00_chip_is_down(vha)) {
   1338		mutex_unlock(&vha->hw->optrom_mutex);
   1339		ql_log(ql_log_warn, vha, 0x707a,
   1340		    "Abort ISP active -- ignoring beacon request.\n");
   1341		return -EBUSY;
   1342	}
   1343
   1344	if (val)
   1345		rval = ha->isp_ops->beacon_on(vha);
   1346	else
   1347		rval = ha->isp_ops->beacon_off(vha);
   1348
   1349	if (rval != QLA_SUCCESS)
   1350		count = 0;
   1351
   1352	mutex_unlock(&vha->hw->optrom_mutex);
   1353
   1354	return count;
   1355}
   1356
   1357static ssize_t
   1358qla2x00_beacon_config_show(struct device *dev, struct device_attribute *attr,
   1359	char *buf)
   1360{
   1361	scsi_qla_host_t *vha = shost_priv(class_to_shost(dev));
   1362	struct qla_hw_data *ha = vha->hw;
   1363	uint16_t led[3] = { 0 };
   1364
   1365	if (!IS_QLA2031(ha) && !IS_QLA27XX(ha) && !IS_QLA28XX(ha))
   1366		return -EPERM;
   1367
   1368	if (ql26xx_led_config(vha, 0, led))
   1369		return scnprintf(buf, PAGE_SIZE, "\n");
   1370
   1371	return scnprintf(buf, PAGE_SIZE, "%#04hx %#04hx %#04hx\n",
   1372	    led[0], led[1], led[2]);
   1373}
   1374
   1375static ssize_t
   1376qla2x00_beacon_config_store(struct device *dev, struct device_attribute *attr,
   1377	const char *buf, size_t count)
   1378{
   1379	scsi_qla_host_t *vha = shost_priv(class_to_shost(dev));
   1380	struct qla_hw_data *ha = vha->hw;
   1381	uint16_t options = BIT_0;
   1382	uint16_t led[3] = { 0 };
   1383	uint16_t word[4];
   1384	int n;
   1385
   1386	if (!IS_QLA2031(ha) && !IS_QLA27XX(ha) && !IS_QLA28XX(ha))
   1387		return -EPERM;
   1388
   1389	n = sscanf(buf, "%hx %hx %hx %hx", word+0, word+1, word+2, word+3);
   1390	if (n == 4) {
   1391		if (word[0] == 3) {
   1392			options |= BIT_3|BIT_2|BIT_1;
   1393			led[0] = word[1];
   1394			led[1] = word[2];
   1395			led[2] = word[3];
   1396			goto write;
   1397		}
   1398		return -EINVAL;
   1399	}
   1400
   1401	if (n == 2) {
   1402		/* check led index */
   1403		if (word[0] == 0) {
   1404			options |= BIT_2;
   1405			led[0] = word[1];
   1406			goto write;
   1407		}
   1408		if (word[0] == 1) {
   1409			options |= BIT_3;
   1410			led[1] = word[1];
   1411			goto write;
   1412		}
   1413		if (word[0] == 2) {
   1414			options |= BIT_1;
   1415			led[2] = word[1];
   1416			goto write;
   1417		}
   1418		return -EINVAL;
   1419	}
   1420
   1421	return -EINVAL;
   1422
   1423write:
   1424	if (ql26xx_led_config(vha, options, led))
   1425		return -EFAULT;
   1426
   1427	return count;
   1428}
   1429
   1430static ssize_t
   1431qla2x00_optrom_bios_version_show(struct device *dev,
   1432				 struct device_attribute *attr, char *buf)
   1433{
   1434	scsi_qla_host_t *vha = shost_priv(class_to_shost(dev));
   1435	struct qla_hw_data *ha = vha->hw;
   1436
   1437	return scnprintf(buf, PAGE_SIZE, "%d.%02d\n", ha->bios_revision[1],
   1438	    ha->bios_revision[0]);
   1439}
   1440
   1441static ssize_t
   1442qla2x00_optrom_efi_version_show(struct device *dev,
   1443				struct device_attribute *attr, char *buf)
   1444{
   1445	scsi_qla_host_t *vha = shost_priv(class_to_shost(dev));
   1446	struct qla_hw_data *ha = vha->hw;
   1447
   1448	return scnprintf(buf, PAGE_SIZE, "%d.%02d\n", ha->efi_revision[1],
   1449	    ha->efi_revision[0]);
   1450}
   1451
   1452static ssize_t
   1453qla2x00_optrom_fcode_version_show(struct device *dev,
   1454				  struct device_attribute *attr, char *buf)
   1455{
   1456	scsi_qla_host_t *vha = shost_priv(class_to_shost(dev));
   1457	struct qla_hw_data *ha = vha->hw;
   1458
   1459	return scnprintf(buf, PAGE_SIZE, "%d.%02d\n", ha->fcode_revision[1],
   1460	    ha->fcode_revision[0]);
   1461}
   1462
   1463static ssize_t
   1464qla2x00_optrom_fw_version_show(struct device *dev,
   1465			       struct device_attribute *attr, char *buf)
   1466{
   1467	scsi_qla_host_t *vha = shost_priv(class_to_shost(dev));
   1468	struct qla_hw_data *ha = vha->hw;
   1469
   1470	return scnprintf(buf, PAGE_SIZE, "%d.%02d.%02d %d\n",
   1471	    ha->fw_revision[0], ha->fw_revision[1], ha->fw_revision[2],
   1472	    ha->fw_revision[3]);
   1473}
   1474
   1475static ssize_t
   1476qla2x00_optrom_gold_fw_version_show(struct device *dev,
   1477    struct device_attribute *attr, char *buf)
   1478{
   1479	scsi_qla_host_t *vha = shost_priv(class_to_shost(dev));
   1480	struct qla_hw_data *ha = vha->hw;
   1481
   1482	if (!IS_QLA81XX(ha) && !IS_QLA83XX(ha) &&
   1483	    !IS_QLA27XX(ha) && !IS_QLA28XX(ha))
   1484		return scnprintf(buf, PAGE_SIZE, "\n");
   1485
   1486	return scnprintf(buf, PAGE_SIZE, "%d.%02d.%02d (%d)\n",
   1487	    ha->gold_fw_version[0], ha->gold_fw_version[1],
   1488	    ha->gold_fw_version[2], ha->gold_fw_version[3]);
   1489}
   1490
   1491static ssize_t
   1492qla2x00_total_isp_aborts_show(struct device *dev,
   1493			      struct device_attribute *attr, char *buf)
   1494{
   1495	scsi_qla_host_t *vha = shost_priv(class_to_shost(dev));
   1496
   1497	return scnprintf(buf, PAGE_SIZE, "%d\n",
   1498	    vha->qla_stats.total_isp_aborts);
   1499}
   1500
   1501static ssize_t
   1502qla24xx_84xx_fw_version_show(struct device *dev,
   1503	struct device_attribute *attr, char *buf)
   1504{
   1505	int rval = QLA_SUCCESS;
   1506	uint16_t status[2] = { 0 };
   1507	scsi_qla_host_t *vha = shost_priv(class_to_shost(dev));
   1508	struct qla_hw_data *ha = vha->hw;
   1509
   1510	if (!IS_QLA84XX(ha))
   1511		return scnprintf(buf, PAGE_SIZE, "\n");
   1512
   1513	if (!ha->cs84xx->op_fw_version) {
   1514		rval = qla84xx_verify_chip(vha, status);
   1515
   1516		if (!rval && !status[0])
   1517			return scnprintf(buf, PAGE_SIZE, "%u\n",
   1518			    (uint32_t)ha->cs84xx->op_fw_version);
   1519	}
   1520
   1521	return scnprintf(buf, PAGE_SIZE, "\n");
   1522}
   1523
   1524static ssize_t
   1525qla2x00_serdes_version_show(struct device *dev, struct device_attribute *attr,
   1526    char *buf)
   1527{
   1528	scsi_qla_host_t *vha = shost_priv(class_to_shost(dev));
   1529	struct qla_hw_data *ha = vha->hw;
   1530
   1531	if (!IS_QLA27XX(ha) && !IS_QLA28XX(ha))
   1532		return scnprintf(buf, PAGE_SIZE, "\n");
   1533
   1534	return scnprintf(buf, PAGE_SIZE, "%d.%02d.%02d\n",
   1535	    ha->serdes_version[0], ha->serdes_version[1],
   1536	    ha->serdes_version[2]);
   1537}
   1538
   1539static ssize_t
   1540qla2x00_mpi_version_show(struct device *dev, struct device_attribute *attr,
   1541    char *buf)
   1542{
   1543	scsi_qla_host_t *vha = shost_priv(class_to_shost(dev));
   1544	struct qla_hw_data *ha = vha->hw;
   1545
   1546	if (!IS_QLA81XX(ha) && !IS_QLA8031(ha) && !IS_QLA8044(ha) &&
   1547	    !IS_QLA27XX(ha) && !IS_QLA28XX(ha))
   1548		return scnprintf(buf, PAGE_SIZE, "\n");
   1549
   1550	return scnprintf(buf, PAGE_SIZE, "%d.%02d.%02d (%x)\n",
   1551	    ha->mpi_version[0], ha->mpi_version[1], ha->mpi_version[2],
   1552	    ha->mpi_capabilities);
   1553}
   1554
   1555static ssize_t
   1556qla2x00_phy_version_show(struct device *dev, struct device_attribute *attr,
   1557    char *buf)
   1558{
   1559	scsi_qla_host_t *vha = shost_priv(class_to_shost(dev));
   1560	struct qla_hw_data *ha = vha->hw;
   1561
   1562	if (!IS_QLA81XX(ha) && !IS_QLA8031(ha))
   1563		return scnprintf(buf, PAGE_SIZE, "\n");
   1564
   1565	return scnprintf(buf, PAGE_SIZE, "%d.%02d.%02d\n",
   1566	    ha->phy_version[0], ha->phy_version[1], ha->phy_version[2]);
   1567}
   1568
   1569static ssize_t
   1570qla2x00_flash_block_size_show(struct device *dev,
   1571			      struct device_attribute *attr, char *buf)
   1572{
   1573	scsi_qla_host_t *vha = shost_priv(class_to_shost(dev));
   1574	struct qla_hw_data *ha = vha->hw;
   1575
   1576	return scnprintf(buf, PAGE_SIZE, "0x%x\n", ha->fdt_block_size);
   1577}
   1578
   1579static ssize_t
   1580qla2x00_vlan_id_show(struct device *dev, struct device_attribute *attr,
   1581    char *buf)
   1582{
   1583	scsi_qla_host_t *vha = shost_priv(class_to_shost(dev));
   1584
   1585	if (!IS_CNA_CAPABLE(vha->hw))
   1586		return scnprintf(buf, PAGE_SIZE, "\n");
   1587
   1588	return scnprintf(buf, PAGE_SIZE, "%d\n", vha->fcoe_vlan_id);
   1589}
   1590
   1591static ssize_t
   1592qla2x00_vn_port_mac_address_show(struct device *dev,
   1593    struct device_attribute *attr, char *buf)
   1594{
   1595	scsi_qla_host_t *vha = shost_priv(class_to_shost(dev));
   1596
   1597	if (!IS_CNA_CAPABLE(vha->hw))
   1598		return scnprintf(buf, PAGE_SIZE, "\n");
   1599
   1600	return scnprintf(buf, PAGE_SIZE, "%pMR\n", vha->fcoe_vn_port_mac);
   1601}
   1602
   1603static ssize_t
   1604qla2x00_fabric_param_show(struct device *dev, struct device_attribute *attr,
   1605    char *buf)
   1606{
   1607	scsi_qla_host_t *vha = shost_priv(class_to_shost(dev));
   1608
   1609	return scnprintf(buf, PAGE_SIZE, "%d\n", vha->hw->switch_cap);
   1610}
   1611
   1612static ssize_t
   1613qla2x00_thermal_temp_show(struct device *dev,
   1614	struct device_attribute *attr, char *buf)
   1615{
   1616	scsi_qla_host_t *vha = shost_priv(class_to_shost(dev));
   1617	uint16_t temp = 0;
   1618	int rc;
   1619
   1620	mutex_lock(&vha->hw->optrom_mutex);
   1621	if (qla2x00_chip_is_down(vha)) {
   1622		mutex_unlock(&vha->hw->optrom_mutex);
   1623		ql_log(ql_log_warn, vha, 0x70dc, "ISP reset active.\n");
   1624		goto done;
   1625	}
   1626
   1627	if (vha->hw->flags.eeh_busy) {
   1628		mutex_unlock(&vha->hw->optrom_mutex);
   1629		ql_log(ql_log_warn, vha, 0x70dd, "PCI EEH busy.\n");
   1630		goto done;
   1631	}
   1632
   1633	rc = qla2x00_get_thermal_temp(vha, &temp);
   1634	mutex_unlock(&vha->hw->optrom_mutex);
   1635	if (rc == QLA_SUCCESS)
   1636		return scnprintf(buf, PAGE_SIZE, "%d\n", temp);
   1637
   1638done:
   1639	return scnprintf(buf, PAGE_SIZE, "\n");
   1640}
   1641
   1642static ssize_t
   1643qla2x00_fw_state_show(struct device *dev, struct device_attribute *attr,
   1644    char *buf)
   1645{
   1646	scsi_qla_host_t *vha = shost_priv(class_to_shost(dev));
   1647	int rval = QLA_FUNCTION_FAILED;
   1648	uint16_t state[6];
   1649	uint32_t pstate;
   1650
   1651	if (IS_QLAFX00(vha->hw)) {
   1652		pstate = qlafx00_fw_state_show(dev, attr, buf);
   1653		return scnprintf(buf, PAGE_SIZE, "0x%x\n", pstate);
   1654	}
   1655
   1656	mutex_lock(&vha->hw->optrom_mutex);
   1657	if (qla2x00_chip_is_down(vha)) {
   1658		mutex_unlock(&vha->hw->optrom_mutex);
   1659		ql_log(ql_log_warn, vha, 0x707c,
   1660		    "ISP reset active.\n");
   1661		goto out;
   1662	} else if (vha->hw->flags.eeh_busy) {
   1663		mutex_unlock(&vha->hw->optrom_mutex);
   1664		goto out;
   1665	}
   1666
   1667	rval = qla2x00_get_firmware_state(vha, state);
   1668	mutex_unlock(&vha->hw->optrom_mutex);
   1669out:
   1670	if (rval != QLA_SUCCESS) {
   1671		memset(state, -1, sizeof(state));
   1672		rval = qla2x00_get_firmware_state(vha, state);
   1673	}
   1674
   1675	return scnprintf(buf, PAGE_SIZE, "0x%x 0x%x 0x%x 0x%x 0x%x 0x%x\n",
   1676	    state[0], state[1], state[2], state[3], state[4], state[5]);
   1677}
   1678
   1679static ssize_t
   1680qla2x00_diag_requests_show(struct device *dev,
   1681	struct device_attribute *attr, char *buf)
   1682{
   1683	scsi_qla_host_t *vha = shost_priv(class_to_shost(dev));
   1684
   1685	if (!IS_BIDI_CAPABLE(vha->hw))
   1686		return scnprintf(buf, PAGE_SIZE, "\n");
   1687
   1688	return scnprintf(buf, PAGE_SIZE, "%llu\n", vha->bidi_stats.io_count);
   1689}
   1690
   1691static ssize_t
   1692qla2x00_diag_megabytes_show(struct device *dev,
   1693	struct device_attribute *attr, char *buf)
   1694{
   1695	scsi_qla_host_t *vha = shost_priv(class_to_shost(dev));
   1696
   1697	if (!IS_BIDI_CAPABLE(vha->hw))
   1698		return scnprintf(buf, PAGE_SIZE, "\n");
   1699
   1700	return scnprintf(buf, PAGE_SIZE, "%llu\n",
   1701	    vha->bidi_stats.transfer_bytes >> 20);
   1702}
   1703
   1704static ssize_t
   1705qla2x00_fw_dump_size_show(struct device *dev, struct device_attribute *attr,
   1706	char *buf)
   1707{
   1708	scsi_qla_host_t *vha = shost_priv(class_to_shost(dev));
   1709	struct qla_hw_data *ha = vha->hw;
   1710	uint32_t size;
   1711
   1712	if (!ha->fw_dumped)
   1713		size = 0;
   1714	else if (IS_P3P_TYPE(ha))
   1715		size = ha->md_template_size + ha->md_dump_size;
   1716	else
   1717		size = ha->fw_dump_len;
   1718
   1719	return scnprintf(buf, PAGE_SIZE, "%d\n", size);
   1720}
   1721
   1722static ssize_t
   1723qla2x00_allow_cna_fw_dump_show(struct device *dev,
   1724	struct device_attribute *attr, char *buf)
   1725{
   1726	scsi_qla_host_t *vha = shost_priv(class_to_shost(dev));
   1727
   1728	if (!IS_P3P_TYPE(vha->hw))
   1729		return scnprintf(buf, PAGE_SIZE, "\n");
   1730	else
   1731		return scnprintf(buf, PAGE_SIZE, "%s\n",
   1732		    vha->hw->allow_cna_fw_dump ? "true" : "false");
   1733}
   1734
   1735static ssize_t
   1736qla2x00_allow_cna_fw_dump_store(struct device *dev,
   1737	struct device_attribute *attr, const char *buf, size_t count)
   1738{
   1739	scsi_qla_host_t *vha = shost_priv(class_to_shost(dev));
   1740	int val = 0;
   1741
   1742	if (!IS_P3P_TYPE(vha->hw))
   1743		return -EINVAL;
   1744
   1745	if (sscanf(buf, "%d", &val) != 1)
   1746		return -EINVAL;
   1747
   1748	vha->hw->allow_cna_fw_dump = val != 0;
   1749
   1750	return strlen(buf);
   1751}
   1752
   1753static ssize_t
   1754qla2x00_pep_version_show(struct device *dev, struct device_attribute *attr,
   1755	char *buf)
   1756{
   1757	scsi_qla_host_t *vha = shost_priv(class_to_shost(dev));
   1758	struct qla_hw_data *ha = vha->hw;
   1759
   1760	if (!IS_QLA27XX(ha) && !IS_QLA28XX(ha))
   1761		return scnprintf(buf, PAGE_SIZE, "\n");
   1762
   1763	return scnprintf(buf, PAGE_SIZE, "%d.%02d.%02d\n",
   1764	    ha->pep_version[0], ha->pep_version[1], ha->pep_version[2]);
   1765}
   1766
   1767static ssize_t
   1768qla2x00_min_supported_speed_show(struct device *dev,
   1769    struct device_attribute *attr, char *buf)
   1770{
   1771	scsi_qla_host_t *vha = shost_priv(class_to_shost(dev));
   1772	struct qla_hw_data *ha = vha->hw;
   1773
   1774	if (!IS_QLA27XX(ha) && !IS_QLA28XX(ha))
   1775		return scnprintf(buf, PAGE_SIZE, "\n");
   1776
   1777	return scnprintf(buf, PAGE_SIZE, "%s\n",
   1778	    ha->min_supported_speed == 6 ? "64Gps" :
   1779	    ha->min_supported_speed == 5 ? "32Gps" :
   1780	    ha->min_supported_speed == 4 ? "16Gps" :
   1781	    ha->min_supported_speed == 3 ? "8Gps" :
   1782	    ha->min_supported_speed == 2 ? "4Gps" :
   1783	    ha->min_supported_speed != 0 ? "unknown" : "");
   1784}
   1785
   1786static ssize_t
   1787qla2x00_max_supported_speed_show(struct device *dev,
   1788    struct device_attribute *attr, char *buf)
   1789{
   1790	scsi_qla_host_t *vha = shost_priv(class_to_shost(dev));
   1791	struct qla_hw_data *ha = vha->hw;
   1792
   1793	if (!IS_QLA27XX(ha) && !IS_QLA28XX(ha))
   1794		return scnprintf(buf, PAGE_SIZE, "\n");
   1795
   1796	return scnprintf(buf, PAGE_SIZE, "%s\n",
   1797	    ha->max_supported_speed  == 2 ? "64Gps" :
   1798	    ha->max_supported_speed  == 1 ? "32Gps" :
   1799	    ha->max_supported_speed  == 0 ? "16Gps" : "unknown");
   1800}
   1801
   1802static ssize_t
   1803qla2x00_port_speed_store(struct device *dev, struct device_attribute *attr,
   1804    const char *buf, size_t count)
   1805{
   1806	struct scsi_qla_host *vha = shost_priv(dev_to_shost(dev));
   1807	ulong type, speed;
   1808	int oldspeed, rval;
   1809	int mode = QLA_SET_DATA_RATE_LR;
   1810	struct qla_hw_data *ha = vha->hw;
   1811
   1812	if (!IS_QLA27XX(ha) && !IS_QLA28XX(ha)) {
   1813		ql_log(ql_log_warn, vha, 0x70d8,
   1814		    "Speed setting not supported \n");
   1815		return -EINVAL;
   1816	}
   1817
   1818	rval = kstrtol(buf, 10, &type);
   1819	if (rval)
   1820		return rval;
   1821	speed = type;
   1822	if (type == 40 || type == 80 || type == 160 ||
   1823	    type == 320) {
   1824		ql_dbg(ql_dbg_user, vha, 0x70d9,
   1825		    "Setting will be affected after a loss of sync\n");
   1826		type = type/10;
   1827		mode = QLA_SET_DATA_RATE_NOLR;
   1828	}
   1829
   1830	oldspeed = ha->set_data_rate;
   1831
   1832	switch (type) {
   1833	case 0:
   1834		ha->set_data_rate = PORT_SPEED_AUTO;
   1835		break;
   1836	case 4:
   1837		ha->set_data_rate = PORT_SPEED_4GB;
   1838		break;
   1839	case 8:
   1840		ha->set_data_rate = PORT_SPEED_8GB;
   1841		break;
   1842	case 16:
   1843		ha->set_data_rate = PORT_SPEED_16GB;
   1844		break;
   1845	case 32:
   1846		ha->set_data_rate = PORT_SPEED_32GB;
   1847		break;
   1848	default:
   1849		ql_log(ql_log_warn, vha, 0x1199,
   1850		    "Unrecognized speed setting:%lx. Setting Autoneg\n",
   1851		    speed);
   1852		ha->set_data_rate = PORT_SPEED_AUTO;
   1853	}
   1854
   1855	if (qla2x00_chip_is_down(vha) || (oldspeed == ha->set_data_rate))
   1856		return -EINVAL;
   1857
   1858	ql_log(ql_log_info, vha, 0x70da,
   1859	    "Setting speed to %lx Gbps \n", type);
   1860
   1861	rval = qla2x00_set_data_rate(vha, mode);
   1862	if (rval != QLA_SUCCESS)
   1863		return -EIO;
   1864
   1865	return strlen(buf);
   1866}
   1867
   1868static const struct {
   1869	u16 rate;
   1870	char *str;
   1871} port_speed_str[] = {
   1872	{ PORT_SPEED_4GB, "4" },
   1873	{ PORT_SPEED_8GB, "8" },
   1874	{ PORT_SPEED_16GB, "16" },
   1875	{ PORT_SPEED_32GB, "32" },
   1876	{ PORT_SPEED_64GB, "64" },
   1877	{ PORT_SPEED_10GB, "10" },
   1878};
   1879
   1880static ssize_t
   1881qla2x00_port_speed_show(struct device *dev, struct device_attribute *attr,
   1882    char *buf)
   1883{
   1884	struct scsi_qla_host *vha = shost_priv(dev_to_shost(dev));
   1885	struct qla_hw_data *ha = vha->hw;
   1886	ssize_t rval;
   1887	u16 i;
   1888	char *speed = "Unknown";
   1889
   1890	rval = qla2x00_get_data_rate(vha);
   1891	if (rval != QLA_SUCCESS) {
   1892		ql_log(ql_log_warn, vha, 0x70db,
   1893		    "Unable to get port speed rval:%zd\n", rval);
   1894		return -EINVAL;
   1895	}
   1896
   1897	for (i = 0; i < ARRAY_SIZE(port_speed_str); i++) {
   1898		if (port_speed_str[i].rate != ha->link_data_rate)
   1899			continue;
   1900		speed = port_speed_str[i].str;
   1901		break;
   1902	}
   1903
   1904	return scnprintf(buf, PAGE_SIZE, "%s\n", speed);
   1905}
   1906
   1907static ssize_t
   1908qla2x00_mpi_pause_store(struct device *dev,
   1909	struct device_attribute *attr, const char *buf, size_t count)
   1910{
   1911	scsi_qla_host_t *vha = shost_priv(class_to_shost(dev));
   1912	int rval = 0;
   1913
   1914	if (sscanf(buf, "%d", &rval) != 1)
   1915		return -EINVAL;
   1916
   1917	ql_log(ql_log_warn, vha, 0x7089, "Pausing MPI...\n");
   1918
   1919	rval = qla83xx_wr_reg(vha, 0x002012d4, 0x30000001);
   1920
   1921	if (rval != QLA_SUCCESS) {
   1922		ql_log(ql_log_warn, vha, 0x708a, "Unable to pause MPI.\n");
   1923		count = 0;
   1924	}
   1925
   1926	return count;
   1927}
   1928
   1929static DEVICE_ATTR(mpi_pause, S_IWUSR, NULL, qla2x00_mpi_pause_store);
   1930
   1931/* ----- */
   1932
   1933static ssize_t
   1934qlini_mode_show(struct device *dev, struct device_attribute *attr, char *buf)
   1935{
   1936	scsi_qla_host_t *vha = shost_priv(class_to_shost(dev));
   1937	int len = 0;
   1938
   1939	len += scnprintf(buf + len, PAGE_SIZE-len,
   1940	    "Supported options: enabled | disabled | dual | exclusive\n");
   1941
   1942	/* --- */
   1943	len += scnprintf(buf + len, PAGE_SIZE-len, "Current selection: ");
   1944
   1945	switch (vha->qlini_mode) {
   1946	case QLA2XXX_INI_MODE_EXCLUSIVE:
   1947		len += scnprintf(buf + len, PAGE_SIZE-len,
   1948		    QLA2XXX_INI_MODE_STR_EXCLUSIVE);
   1949		break;
   1950	case QLA2XXX_INI_MODE_DISABLED:
   1951		len += scnprintf(buf + len, PAGE_SIZE-len,
   1952		    QLA2XXX_INI_MODE_STR_DISABLED);
   1953		break;
   1954	case QLA2XXX_INI_MODE_ENABLED:
   1955		len += scnprintf(buf + len, PAGE_SIZE-len,
   1956		    QLA2XXX_INI_MODE_STR_ENABLED);
   1957		break;
   1958	case QLA2XXX_INI_MODE_DUAL:
   1959		len += scnprintf(buf + len, PAGE_SIZE-len,
   1960		    QLA2XXX_INI_MODE_STR_DUAL);
   1961		break;
   1962	}
   1963	len += scnprintf(buf + len, PAGE_SIZE-len, "\n");
   1964
   1965	return len;
   1966}
   1967
   1968static char *mode_to_str[] = {
   1969	"exclusive",
   1970	"disabled",
   1971	"enabled",
   1972	"dual",
   1973};
   1974
   1975#define NEED_EXCH_OFFLOAD(_exchg) ((_exchg) > FW_DEF_EXCHANGES_CNT)
   1976static void qla_set_ini_mode(scsi_qla_host_t *vha, int op)
   1977{
   1978	enum {
   1979		NO_ACTION,
   1980		MODE_CHANGE_ACCEPT,
   1981		MODE_CHANGE_NO_ACTION,
   1982		TARGET_STILL_ACTIVE,
   1983	};
   1984	int action = NO_ACTION;
   1985	int set_mode = 0;
   1986	u8  eo_toggle = 0;	/* exchange offload flipped */
   1987
   1988	switch (vha->qlini_mode) {
   1989	case QLA2XXX_INI_MODE_DISABLED:
   1990		switch (op) {
   1991		case QLA2XXX_INI_MODE_DISABLED:
   1992			if (qla_tgt_mode_enabled(vha)) {
   1993				if (NEED_EXCH_OFFLOAD(vha->u_ql2xexchoffld) !=
   1994				    vha->hw->flags.exchoffld_enabled)
   1995					eo_toggle = 1;
   1996				if (((vha->ql2xexchoffld !=
   1997				    vha->u_ql2xexchoffld) &&
   1998				    NEED_EXCH_OFFLOAD(vha->u_ql2xexchoffld)) ||
   1999				    eo_toggle) {
   2000					/*
   2001					 * The number of exchange to be offload
   2002					 * was tweaked or offload option was
   2003					 * flipped
   2004					 */
   2005					action = MODE_CHANGE_ACCEPT;
   2006				} else {
   2007					action = MODE_CHANGE_NO_ACTION;
   2008				}
   2009			} else {
   2010				action = MODE_CHANGE_NO_ACTION;
   2011			}
   2012			break;
   2013		case QLA2XXX_INI_MODE_EXCLUSIVE:
   2014			if (qla_tgt_mode_enabled(vha)) {
   2015				if (NEED_EXCH_OFFLOAD(vha->u_ql2xexchoffld) !=
   2016				    vha->hw->flags.exchoffld_enabled)
   2017					eo_toggle = 1;
   2018				if (((vha->ql2xexchoffld !=
   2019				    vha->u_ql2xexchoffld) &&
   2020				    NEED_EXCH_OFFLOAD(vha->u_ql2xexchoffld)) ||
   2021				    eo_toggle) {
   2022					/*
   2023					 * The number of exchange to be offload
   2024					 * was tweaked or offload option was
   2025					 * flipped
   2026					 */
   2027					action = MODE_CHANGE_ACCEPT;
   2028				} else {
   2029					action = MODE_CHANGE_NO_ACTION;
   2030				}
   2031			} else {
   2032				action = MODE_CHANGE_ACCEPT;
   2033			}
   2034			break;
   2035		case QLA2XXX_INI_MODE_DUAL:
   2036			action = MODE_CHANGE_ACCEPT;
   2037			/* active_mode is target only, reset it to dual */
   2038			if (qla_tgt_mode_enabled(vha)) {
   2039				set_mode = 1;
   2040				action = MODE_CHANGE_ACCEPT;
   2041			} else {
   2042				action = MODE_CHANGE_NO_ACTION;
   2043			}
   2044			break;
   2045
   2046		case QLA2XXX_INI_MODE_ENABLED:
   2047			if (qla_tgt_mode_enabled(vha))
   2048				action = TARGET_STILL_ACTIVE;
   2049			else {
   2050				action = MODE_CHANGE_ACCEPT;
   2051				set_mode = 1;
   2052			}
   2053			break;
   2054		}
   2055		break;
   2056
   2057	case QLA2XXX_INI_MODE_EXCLUSIVE:
   2058		switch (op) {
   2059		case QLA2XXX_INI_MODE_EXCLUSIVE:
   2060			if (qla_tgt_mode_enabled(vha)) {
   2061				if (NEED_EXCH_OFFLOAD(vha->u_ql2xexchoffld) !=
   2062				    vha->hw->flags.exchoffld_enabled)
   2063					eo_toggle = 1;
   2064				if (((vha->ql2xexchoffld !=
   2065				    vha->u_ql2xexchoffld) &&
   2066				    NEED_EXCH_OFFLOAD(vha->u_ql2xexchoffld)) ||
   2067				    eo_toggle)
   2068					/*
   2069					 * The number of exchange to be offload
   2070					 * was tweaked or offload option was
   2071					 * flipped
   2072					 */
   2073					action = MODE_CHANGE_ACCEPT;
   2074				else
   2075					action = NO_ACTION;
   2076			} else
   2077				action = NO_ACTION;
   2078
   2079			break;
   2080
   2081		case QLA2XXX_INI_MODE_DISABLED:
   2082			if (qla_tgt_mode_enabled(vha)) {
   2083				if (NEED_EXCH_OFFLOAD(vha->u_ql2xexchoffld) !=
   2084				    vha->hw->flags.exchoffld_enabled)
   2085					eo_toggle = 1;
   2086				if (((vha->ql2xexchoffld !=
   2087				      vha->u_ql2xexchoffld) &&
   2088				    NEED_EXCH_OFFLOAD(vha->u_ql2xexchoffld)) ||
   2089				    eo_toggle)
   2090					action = MODE_CHANGE_ACCEPT;
   2091				else
   2092					action = MODE_CHANGE_NO_ACTION;
   2093			} else
   2094				action = MODE_CHANGE_NO_ACTION;
   2095			break;
   2096
   2097		case QLA2XXX_INI_MODE_DUAL: /* exclusive -> dual */
   2098			if (qla_tgt_mode_enabled(vha)) {
   2099				action = MODE_CHANGE_ACCEPT;
   2100				set_mode = 1;
   2101			} else
   2102				action = MODE_CHANGE_ACCEPT;
   2103			break;
   2104
   2105		case QLA2XXX_INI_MODE_ENABLED:
   2106			if (qla_tgt_mode_enabled(vha))
   2107				action = TARGET_STILL_ACTIVE;
   2108			else {
   2109				if (vha->hw->flags.fw_started)
   2110					action = MODE_CHANGE_NO_ACTION;
   2111				else
   2112					action = MODE_CHANGE_ACCEPT;
   2113			}
   2114			break;
   2115		}
   2116		break;
   2117
   2118	case QLA2XXX_INI_MODE_ENABLED:
   2119		switch (op) {
   2120		case QLA2XXX_INI_MODE_ENABLED:
   2121			if (NEED_EXCH_OFFLOAD(vha->u_ql2xiniexchg) !=
   2122			    vha->hw->flags.exchoffld_enabled)
   2123				eo_toggle = 1;
   2124			if (((vha->ql2xiniexchg != vha->u_ql2xiniexchg) &&
   2125				NEED_EXCH_OFFLOAD(vha->u_ql2xiniexchg)) ||
   2126			    eo_toggle)
   2127				action = MODE_CHANGE_ACCEPT;
   2128			else
   2129				action = NO_ACTION;
   2130			break;
   2131		case QLA2XXX_INI_MODE_DUAL:
   2132		case QLA2XXX_INI_MODE_DISABLED:
   2133			action = MODE_CHANGE_ACCEPT;
   2134			break;
   2135		default:
   2136			action = MODE_CHANGE_NO_ACTION;
   2137			break;
   2138		}
   2139		break;
   2140
   2141	case QLA2XXX_INI_MODE_DUAL:
   2142		switch (op) {
   2143		case QLA2XXX_INI_MODE_DUAL:
   2144			if (qla_tgt_mode_enabled(vha) ||
   2145			    qla_dual_mode_enabled(vha)) {
   2146				if (NEED_EXCH_OFFLOAD(vha->u_ql2xexchoffld +
   2147					vha->u_ql2xiniexchg) !=
   2148				    vha->hw->flags.exchoffld_enabled)
   2149					eo_toggle = 1;
   2150
   2151				if ((((vha->ql2xexchoffld +
   2152				       vha->ql2xiniexchg) !=
   2153				    (vha->u_ql2xiniexchg +
   2154				     vha->u_ql2xexchoffld)) &&
   2155				    NEED_EXCH_OFFLOAD(vha->u_ql2xiniexchg +
   2156					vha->u_ql2xexchoffld)) || eo_toggle)
   2157					action = MODE_CHANGE_ACCEPT;
   2158				else
   2159					action = NO_ACTION;
   2160			} else {
   2161				if (NEED_EXCH_OFFLOAD(vha->u_ql2xexchoffld +
   2162					vha->u_ql2xiniexchg) !=
   2163				    vha->hw->flags.exchoffld_enabled)
   2164					eo_toggle = 1;
   2165
   2166				if ((((vha->ql2xexchoffld + vha->ql2xiniexchg)
   2167				    != (vha->u_ql2xiniexchg +
   2168					vha->u_ql2xexchoffld)) &&
   2169				    NEED_EXCH_OFFLOAD(vha->u_ql2xiniexchg +
   2170					vha->u_ql2xexchoffld)) || eo_toggle)
   2171					action = MODE_CHANGE_NO_ACTION;
   2172				else
   2173					action = NO_ACTION;
   2174			}
   2175			break;
   2176
   2177		case QLA2XXX_INI_MODE_DISABLED:
   2178			if (qla_tgt_mode_enabled(vha) ||
   2179			    qla_dual_mode_enabled(vha)) {
   2180				/* turning off initiator mode */
   2181				set_mode = 1;
   2182				action = MODE_CHANGE_ACCEPT;
   2183			} else {
   2184				action = MODE_CHANGE_NO_ACTION;
   2185			}
   2186			break;
   2187
   2188		case QLA2XXX_INI_MODE_EXCLUSIVE:
   2189			if (qla_tgt_mode_enabled(vha) ||
   2190			    qla_dual_mode_enabled(vha)) {
   2191				set_mode = 1;
   2192				action = MODE_CHANGE_ACCEPT;
   2193			} else {
   2194				action = MODE_CHANGE_ACCEPT;
   2195			}
   2196			break;
   2197
   2198		case QLA2XXX_INI_MODE_ENABLED:
   2199			if (qla_tgt_mode_enabled(vha) ||
   2200			    qla_dual_mode_enabled(vha)) {
   2201				action = TARGET_STILL_ACTIVE;
   2202			} else {
   2203				action = MODE_CHANGE_ACCEPT;
   2204			}
   2205		}
   2206		break;
   2207	}
   2208
   2209	switch (action) {
   2210	case MODE_CHANGE_ACCEPT:
   2211		ql_log(ql_log_warn, vha, 0xffff,
   2212		    "Mode change accepted. From %s to %s, Tgt exchg %d|%d. ini exchg %d|%d\n",
   2213		    mode_to_str[vha->qlini_mode], mode_to_str[op],
   2214		    vha->ql2xexchoffld, vha->u_ql2xexchoffld,
   2215		    vha->ql2xiniexchg, vha->u_ql2xiniexchg);
   2216
   2217		vha->qlini_mode = op;
   2218		vha->ql2xexchoffld = vha->u_ql2xexchoffld;
   2219		vha->ql2xiniexchg = vha->u_ql2xiniexchg;
   2220		if (set_mode)
   2221			qlt_set_mode(vha);
   2222		vha->flags.online = 1;
   2223		set_bit(ISP_ABORT_NEEDED, &vha->dpc_flags);
   2224		break;
   2225
   2226	case MODE_CHANGE_NO_ACTION:
   2227		ql_log(ql_log_warn, vha, 0xffff,
   2228		    "Mode is set. No action taken. From %s to %s, Tgt exchg %d|%d. ini exchg %d|%d\n",
   2229		    mode_to_str[vha->qlini_mode], mode_to_str[op],
   2230		    vha->ql2xexchoffld, vha->u_ql2xexchoffld,
   2231		    vha->ql2xiniexchg, vha->u_ql2xiniexchg);
   2232		vha->qlini_mode = op;
   2233		vha->ql2xexchoffld = vha->u_ql2xexchoffld;
   2234		vha->ql2xiniexchg = vha->u_ql2xiniexchg;
   2235		break;
   2236
   2237	case TARGET_STILL_ACTIVE:
   2238		ql_log(ql_log_warn, vha, 0xffff,
   2239		    "Target Mode is active. Unable to change Mode.\n");
   2240		break;
   2241
   2242	case NO_ACTION:
   2243	default:
   2244		ql_log(ql_log_warn, vha, 0xffff,
   2245		    "Mode unchange. No action taken. %d|%d pct %d|%d.\n",
   2246		    vha->qlini_mode, op,
   2247		    vha->ql2xexchoffld, vha->u_ql2xexchoffld);
   2248		break;
   2249	}
   2250}
   2251
   2252static ssize_t
   2253qlini_mode_store(struct device *dev, struct device_attribute *attr,
   2254    const char *buf, size_t count)
   2255{
   2256	scsi_qla_host_t *vha = shost_priv(class_to_shost(dev));
   2257	int ini;
   2258
   2259	if (!buf)
   2260		return -EINVAL;
   2261
   2262	if (strncasecmp(QLA2XXX_INI_MODE_STR_EXCLUSIVE, buf,
   2263		strlen(QLA2XXX_INI_MODE_STR_EXCLUSIVE)) == 0)
   2264		ini = QLA2XXX_INI_MODE_EXCLUSIVE;
   2265	else if (strncasecmp(QLA2XXX_INI_MODE_STR_DISABLED, buf,
   2266		strlen(QLA2XXX_INI_MODE_STR_DISABLED)) == 0)
   2267		ini = QLA2XXX_INI_MODE_DISABLED;
   2268	else if (strncasecmp(QLA2XXX_INI_MODE_STR_ENABLED, buf,
   2269		  strlen(QLA2XXX_INI_MODE_STR_ENABLED)) == 0)
   2270		ini = QLA2XXX_INI_MODE_ENABLED;
   2271	else if (strncasecmp(QLA2XXX_INI_MODE_STR_DUAL, buf,
   2272		strlen(QLA2XXX_INI_MODE_STR_DUAL)) == 0)
   2273		ini = QLA2XXX_INI_MODE_DUAL;
   2274	else
   2275		return -EINVAL;
   2276
   2277	qla_set_ini_mode(vha, ini);
   2278	return strlen(buf);
   2279}
   2280
   2281static ssize_t
   2282ql2xexchoffld_show(struct device *dev, struct device_attribute *attr,
   2283    char *buf)
   2284{
   2285	scsi_qla_host_t *vha = shost_priv(class_to_shost(dev));
   2286	int len = 0;
   2287
   2288	len += scnprintf(buf + len, PAGE_SIZE-len,
   2289		"target exchange: new %d : current: %d\n\n",
   2290		vha->u_ql2xexchoffld, vha->ql2xexchoffld);
   2291
   2292	len += scnprintf(buf + len, PAGE_SIZE-len,
   2293	    "Please (re)set operating mode via \"/sys/class/scsi_host/host%ld/qlini_mode\" to load new setting.\n",
   2294	    vha->host_no);
   2295
   2296	return len;
   2297}
   2298
   2299static ssize_t
   2300ql2xexchoffld_store(struct device *dev, struct device_attribute *attr,
   2301    const char *buf, size_t count)
   2302{
   2303	scsi_qla_host_t *vha = shost_priv(class_to_shost(dev));
   2304	int val = 0;
   2305
   2306	if (sscanf(buf, "%d", &val) != 1)
   2307		return -EINVAL;
   2308
   2309	if (val > FW_MAX_EXCHANGES_CNT)
   2310		val = FW_MAX_EXCHANGES_CNT;
   2311	else if (val < 0)
   2312		val = 0;
   2313
   2314	vha->u_ql2xexchoffld = val;
   2315	return strlen(buf);
   2316}
   2317
   2318static ssize_t
   2319ql2xiniexchg_show(struct device *dev, struct device_attribute *attr,
   2320    char *buf)
   2321{
   2322	scsi_qla_host_t *vha = shost_priv(class_to_shost(dev));
   2323	int len = 0;
   2324
   2325	len += scnprintf(buf + len, PAGE_SIZE-len,
   2326		"target exchange: new %d : current: %d\n\n",
   2327		vha->u_ql2xiniexchg, vha->ql2xiniexchg);
   2328
   2329	len += scnprintf(buf + len, PAGE_SIZE-len,
   2330	    "Please (re)set operating mode via \"/sys/class/scsi_host/host%ld/qlini_mode\" to load new setting.\n",
   2331	    vha->host_no);
   2332
   2333	return len;
   2334}
   2335
   2336static ssize_t
   2337ql2xiniexchg_store(struct device *dev, struct device_attribute *attr,
   2338    const char *buf, size_t count)
   2339{
   2340	scsi_qla_host_t *vha = shost_priv(class_to_shost(dev));
   2341	int val = 0;
   2342
   2343	if (sscanf(buf, "%d", &val) != 1)
   2344		return -EINVAL;
   2345
   2346	if (val > FW_MAX_EXCHANGES_CNT)
   2347		val = FW_MAX_EXCHANGES_CNT;
   2348	else if (val < 0)
   2349		val = 0;
   2350
   2351	vha->u_ql2xiniexchg = val;
   2352	return strlen(buf);
   2353}
   2354
   2355static ssize_t
   2356qla2x00_dif_bundle_statistics_show(struct device *dev,
   2357    struct device_attribute *attr, char *buf)
   2358{
   2359	scsi_qla_host_t *vha = shost_priv(class_to_shost(dev));
   2360	struct qla_hw_data *ha = vha->hw;
   2361
   2362	return scnprintf(buf, PAGE_SIZE,
   2363	    "cross=%llu read=%llu write=%llu kalloc=%llu dma_alloc=%llu unusable=%u\n",
   2364	    ha->dif_bundle_crossed_pages, ha->dif_bundle_reads,
   2365	    ha->dif_bundle_writes, ha->dif_bundle_kallocs,
   2366	    ha->dif_bundle_dma_allocs, ha->pool.unusable.count);
   2367}
   2368
   2369static ssize_t
   2370qla2x00_fw_attr_show(struct device *dev,
   2371    struct device_attribute *attr, char *buf)
   2372{
   2373	scsi_qla_host_t *vha = shost_priv(class_to_shost(dev));
   2374	struct qla_hw_data *ha = vha->hw;
   2375
   2376	if (!IS_QLA27XX(ha) && !IS_QLA28XX(ha))
   2377		return scnprintf(buf, PAGE_SIZE, "\n");
   2378
   2379	return scnprintf(buf, PAGE_SIZE, "%llx\n",
   2380	    (uint64_t)ha->fw_attributes_ext[1] << 48 |
   2381	    (uint64_t)ha->fw_attributes_ext[0] << 32 |
   2382	    (uint64_t)ha->fw_attributes_h << 16 |
   2383	    (uint64_t)ha->fw_attributes);
   2384}
   2385
   2386static ssize_t
   2387qla2x00_port_no_show(struct device *dev, struct device_attribute *attr,
   2388    char *buf)
   2389{
   2390	scsi_qla_host_t *vha = shost_priv(class_to_shost(dev));
   2391
   2392	return scnprintf(buf, PAGE_SIZE, "%u\n", vha->hw->port_no);
   2393}
   2394
   2395static ssize_t
   2396qla2x00_dport_diagnostics_show(struct device *dev,
   2397	struct device_attribute *attr, char *buf)
   2398{
   2399	scsi_qla_host_t *vha = shost_priv(class_to_shost(dev));
   2400
   2401	if (!IS_QLA83XX(vha->hw) && !IS_QLA27XX(vha->hw) &&
   2402	    !IS_QLA28XX(vha->hw))
   2403		return scnprintf(buf, PAGE_SIZE, "\n");
   2404
   2405	if (!*vha->dport_data)
   2406		return scnprintf(buf, PAGE_SIZE, "\n");
   2407
   2408	return scnprintf(buf, PAGE_SIZE, "%04x %04x %04x %04x\n",
   2409	    vha->dport_data[0], vha->dport_data[1],
   2410	    vha->dport_data[2], vha->dport_data[3]);
   2411}
   2412static DEVICE_ATTR(dport_diagnostics, 0444,
   2413	   qla2x00_dport_diagnostics_show, NULL);
   2414
   2415static DEVICE_ATTR(driver_version, S_IRUGO, qla2x00_driver_version_show, NULL);
   2416static DEVICE_ATTR(fw_version, S_IRUGO, qla2x00_fw_version_show, NULL);
   2417static DEVICE_ATTR(serial_num, S_IRUGO, qla2x00_serial_num_show, NULL);
   2418static DEVICE_ATTR(isp_name, S_IRUGO, qla2x00_isp_name_show, NULL);
   2419static DEVICE_ATTR(isp_id, S_IRUGO, qla2x00_isp_id_show, NULL);
   2420static DEVICE_ATTR(model_name, S_IRUGO, qla2x00_model_name_show, NULL);
   2421static DEVICE_ATTR(model_desc, S_IRUGO, qla2x00_model_desc_show, NULL);
   2422static DEVICE_ATTR(pci_info, S_IRUGO, qla2x00_pci_info_show, NULL);
   2423static DEVICE_ATTR(link_state, S_IRUGO, qla2x00_link_state_show, NULL);
   2424static DEVICE_ATTR(zio, S_IRUGO | S_IWUSR, qla2x00_zio_show, qla2x00_zio_store);
   2425static DEVICE_ATTR(zio_timer, S_IRUGO | S_IWUSR, qla2x00_zio_timer_show,
   2426		   qla2x00_zio_timer_store);
   2427static DEVICE_ATTR(beacon, S_IRUGO | S_IWUSR, qla2x00_beacon_show,
   2428		   qla2x00_beacon_store);
   2429static DEVICE_ATTR(beacon_config, 0644, qla2x00_beacon_config_show,
   2430		   qla2x00_beacon_config_store);
   2431static DEVICE_ATTR(optrom_bios_version, S_IRUGO,
   2432		   qla2x00_optrom_bios_version_show, NULL);
   2433static DEVICE_ATTR(optrom_efi_version, S_IRUGO,
   2434		   qla2x00_optrom_efi_version_show, NULL);
   2435static DEVICE_ATTR(optrom_fcode_version, S_IRUGO,
   2436		   qla2x00_optrom_fcode_version_show, NULL);
   2437static DEVICE_ATTR(optrom_fw_version, S_IRUGO, qla2x00_optrom_fw_version_show,
   2438		   NULL);
   2439static DEVICE_ATTR(optrom_gold_fw_version, S_IRUGO,
   2440    qla2x00_optrom_gold_fw_version_show, NULL);
   2441static DEVICE_ATTR(84xx_fw_version, S_IRUGO, qla24xx_84xx_fw_version_show,
   2442		   NULL);
   2443static DEVICE_ATTR(total_isp_aborts, S_IRUGO, qla2x00_total_isp_aborts_show,
   2444		   NULL);
   2445static DEVICE_ATTR(serdes_version, 0444, qla2x00_serdes_version_show, NULL);
   2446static DEVICE_ATTR(mpi_version, S_IRUGO, qla2x00_mpi_version_show, NULL);
   2447static DEVICE_ATTR(phy_version, S_IRUGO, qla2x00_phy_version_show, NULL);
   2448static DEVICE_ATTR(flash_block_size, S_IRUGO, qla2x00_flash_block_size_show,
   2449		   NULL);
   2450static DEVICE_ATTR(vlan_id, S_IRUGO, qla2x00_vlan_id_show, NULL);
   2451static DEVICE_ATTR(vn_port_mac_address, S_IRUGO,
   2452		   qla2x00_vn_port_mac_address_show, NULL);
   2453static DEVICE_ATTR(fabric_param, S_IRUGO, qla2x00_fabric_param_show, NULL);
   2454static DEVICE_ATTR(fw_state, S_IRUGO, qla2x00_fw_state_show, NULL);
   2455static DEVICE_ATTR(thermal_temp, S_IRUGO, qla2x00_thermal_temp_show, NULL);
   2456static DEVICE_ATTR(diag_requests, S_IRUGO, qla2x00_diag_requests_show, NULL);
   2457static DEVICE_ATTR(diag_megabytes, S_IRUGO, qla2x00_diag_megabytes_show, NULL);
   2458static DEVICE_ATTR(fw_dump_size, S_IRUGO, qla2x00_fw_dump_size_show, NULL);
   2459static DEVICE_ATTR(allow_cna_fw_dump, S_IRUGO | S_IWUSR,
   2460		   qla2x00_allow_cna_fw_dump_show,
   2461		   qla2x00_allow_cna_fw_dump_store);
   2462static DEVICE_ATTR(pep_version, S_IRUGO, qla2x00_pep_version_show, NULL);
   2463static DEVICE_ATTR(min_supported_speed, 0444,
   2464		   qla2x00_min_supported_speed_show, NULL);
   2465static DEVICE_ATTR(max_supported_speed, 0444,
   2466		   qla2x00_max_supported_speed_show, NULL);
   2467static DEVICE_ATTR(zio_threshold, 0644,
   2468    qla_zio_threshold_show,
   2469    qla_zio_threshold_store);
   2470static DEVICE_ATTR_RW(qlini_mode);
   2471static DEVICE_ATTR_RW(ql2xexchoffld);
   2472static DEVICE_ATTR_RW(ql2xiniexchg);
   2473static DEVICE_ATTR(dif_bundle_statistics, 0444,
   2474    qla2x00_dif_bundle_statistics_show, NULL);
   2475static DEVICE_ATTR(port_speed, 0644, qla2x00_port_speed_show,
   2476    qla2x00_port_speed_store);
   2477static DEVICE_ATTR(port_no, 0444, qla2x00_port_no_show, NULL);
   2478static DEVICE_ATTR(fw_attr, 0444, qla2x00_fw_attr_show, NULL);
   2479static DEVICE_ATTR_RO(edif_doorbell);
   2480
   2481static struct attribute *qla2x00_host_attrs[] = {
   2482	&dev_attr_driver_version.attr,
   2483	&dev_attr_fw_version.attr,
   2484	&dev_attr_serial_num.attr,
   2485	&dev_attr_isp_name.attr,
   2486	&dev_attr_isp_id.attr,
   2487	&dev_attr_model_name.attr,
   2488	&dev_attr_model_desc.attr,
   2489	&dev_attr_pci_info.attr,
   2490	&dev_attr_link_state.attr,
   2491	&dev_attr_zio.attr,
   2492	&dev_attr_zio_timer.attr,
   2493	&dev_attr_beacon.attr,
   2494	&dev_attr_beacon_config.attr,
   2495	&dev_attr_optrom_bios_version.attr,
   2496	&dev_attr_optrom_efi_version.attr,
   2497	&dev_attr_optrom_fcode_version.attr,
   2498	&dev_attr_optrom_fw_version.attr,
   2499	&dev_attr_84xx_fw_version.attr,
   2500	&dev_attr_total_isp_aborts.attr,
   2501	&dev_attr_serdes_version.attr,
   2502	&dev_attr_mpi_version.attr,
   2503	&dev_attr_phy_version.attr,
   2504	&dev_attr_flash_block_size.attr,
   2505	&dev_attr_vlan_id.attr,
   2506	&dev_attr_vn_port_mac_address.attr,
   2507	&dev_attr_fabric_param.attr,
   2508	&dev_attr_fw_state.attr,
   2509	&dev_attr_optrom_gold_fw_version.attr,
   2510	&dev_attr_thermal_temp.attr,
   2511	&dev_attr_diag_requests.attr,
   2512	&dev_attr_diag_megabytes.attr,
   2513	&dev_attr_fw_dump_size.attr,
   2514	&dev_attr_allow_cna_fw_dump.attr,
   2515	&dev_attr_pep_version.attr,
   2516	&dev_attr_min_supported_speed.attr,
   2517	&dev_attr_max_supported_speed.attr,
   2518	&dev_attr_zio_threshold.attr,
   2519	&dev_attr_dif_bundle_statistics.attr,
   2520	&dev_attr_port_speed.attr,
   2521	&dev_attr_port_no.attr,
   2522	&dev_attr_fw_attr.attr,
   2523	&dev_attr_dport_diagnostics.attr,
   2524	&dev_attr_edif_doorbell.attr,
   2525	&dev_attr_mpi_pause.attr,
   2526	&dev_attr_qlini_mode.attr,
   2527	&dev_attr_ql2xiniexchg.attr,
   2528	&dev_attr_ql2xexchoffld.attr,
   2529	NULL,
   2530};
   2531
   2532static umode_t qla_host_attr_is_visible(struct kobject *kobj,
   2533					struct attribute *attr, int i)
   2534{
   2535	if (ql2x_ini_mode != QLA2XXX_INI_MODE_DUAL &&
   2536	    (attr == &dev_attr_qlini_mode.attr ||
   2537	     attr == &dev_attr_ql2xiniexchg.attr ||
   2538	     attr == &dev_attr_ql2xexchoffld.attr))
   2539		return 0;
   2540	return attr->mode;
   2541}
   2542
   2543static const struct attribute_group qla2x00_host_attr_group = {
   2544	.is_visible = qla_host_attr_is_visible,
   2545	.attrs = qla2x00_host_attrs
   2546};
   2547
   2548const struct attribute_group *qla2x00_host_groups[] = {
   2549	&qla2x00_host_attr_group,
   2550	NULL
   2551};
   2552
   2553/* Host attributes. */
   2554
   2555static void
   2556qla2x00_get_host_port_id(struct Scsi_Host *shost)
   2557{
   2558	scsi_qla_host_t *vha = shost_priv(shost);
   2559
   2560	fc_host_port_id(shost) = vha->d_id.b.domain << 16 |
   2561	    vha->d_id.b.area << 8 | vha->d_id.b.al_pa;
   2562}
   2563
   2564static void
   2565qla2x00_get_host_speed(struct Scsi_Host *shost)
   2566{
   2567	scsi_qla_host_t *vha = shost_priv(shost);
   2568	u32 speed;
   2569
   2570	if (IS_QLAFX00(vha->hw)) {
   2571		qlafx00_get_host_speed(shost);
   2572		return;
   2573	}
   2574
   2575	switch (vha->hw->link_data_rate) {
   2576	case PORT_SPEED_1GB:
   2577		speed = FC_PORTSPEED_1GBIT;
   2578		break;
   2579	case PORT_SPEED_2GB:
   2580		speed = FC_PORTSPEED_2GBIT;
   2581		break;
   2582	case PORT_SPEED_4GB:
   2583		speed = FC_PORTSPEED_4GBIT;
   2584		break;
   2585	case PORT_SPEED_8GB:
   2586		speed = FC_PORTSPEED_8GBIT;
   2587		break;
   2588	case PORT_SPEED_10GB:
   2589		speed = FC_PORTSPEED_10GBIT;
   2590		break;
   2591	case PORT_SPEED_16GB:
   2592		speed = FC_PORTSPEED_16GBIT;
   2593		break;
   2594	case PORT_SPEED_32GB:
   2595		speed = FC_PORTSPEED_32GBIT;
   2596		break;
   2597	case PORT_SPEED_64GB:
   2598		speed = FC_PORTSPEED_64GBIT;
   2599		break;
   2600	default:
   2601		speed = FC_PORTSPEED_UNKNOWN;
   2602		break;
   2603	}
   2604
   2605	fc_host_speed(shost) = speed;
   2606}
   2607
   2608static void
   2609qla2x00_get_host_port_type(struct Scsi_Host *shost)
   2610{
   2611	scsi_qla_host_t *vha = shost_priv(shost);
   2612	uint32_t port_type;
   2613
   2614	if (vha->vp_idx) {
   2615		fc_host_port_type(shost) = FC_PORTTYPE_NPIV;
   2616		return;
   2617	}
   2618	switch (vha->hw->current_topology) {
   2619	case ISP_CFG_NL:
   2620		port_type = FC_PORTTYPE_LPORT;
   2621		break;
   2622	case ISP_CFG_FL:
   2623		port_type = FC_PORTTYPE_NLPORT;
   2624		break;
   2625	case ISP_CFG_N:
   2626		port_type = FC_PORTTYPE_PTP;
   2627		break;
   2628	case ISP_CFG_F:
   2629		port_type = FC_PORTTYPE_NPORT;
   2630		break;
   2631	default:
   2632		port_type = FC_PORTTYPE_UNKNOWN;
   2633		break;
   2634	}
   2635
   2636	fc_host_port_type(shost) = port_type;
   2637}
   2638
   2639static void
   2640qla2x00_get_starget_node_name(struct scsi_target *starget)
   2641{
   2642	struct Scsi_Host *host = dev_to_shost(starget->dev.parent);
   2643	scsi_qla_host_t *vha = shost_priv(host);
   2644	fc_port_t *fcport;
   2645	u64 node_name = 0;
   2646
   2647	list_for_each_entry(fcport, &vha->vp_fcports, list) {
   2648		if (fcport->rport &&
   2649		    starget->id == fcport->rport->scsi_target_id) {
   2650			node_name = wwn_to_u64(fcport->node_name);
   2651			break;
   2652		}
   2653	}
   2654
   2655	fc_starget_node_name(starget) = node_name;
   2656}
   2657
   2658static void
   2659qla2x00_get_starget_port_name(struct scsi_target *starget)
   2660{
   2661	struct Scsi_Host *host = dev_to_shost(starget->dev.parent);
   2662	scsi_qla_host_t *vha = shost_priv(host);
   2663	fc_port_t *fcport;
   2664	u64 port_name = 0;
   2665
   2666	list_for_each_entry(fcport, &vha->vp_fcports, list) {
   2667		if (fcport->rport &&
   2668		    starget->id == fcport->rport->scsi_target_id) {
   2669			port_name = wwn_to_u64(fcport->port_name);
   2670			break;
   2671		}
   2672	}
   2673
   2674	fc_starget_port_name(starget) = port_name;
   2675}
   2676
   2677static void
   2678qla2x00_get_starget_port_id(struct scsi_target *starget)
   2679{
   2680	struct Scsi_Host *host = dev_to_shost(starget->dev.parent);
   2681	scsi_qla_host_t *vha = shost_priv(host);
   2682	fc_port_t *fcport;
   2683	uint32_t port_id = ~0U;
   2684
   2685	list_for_each_entry(fcport, &vha->vp_fcports, list) {
   2686		if (fcport->rport &&
   2687		    starget->id == fcport->rport->scsi_target_id) {
   2688			port_id = fcport->d_id.b.domain << 16 |
   2689			    fcport->d_id.b.area << 8 | fcport->d_id.b.al_pa;
   2690			break;
   2691		}
   2692	}
   2693
   2694	fc_starget_port_id(starget) = port_id;
   2695}
   2696
   2697static inline void
   2698qla2x00_set_rport_loss_tmo(struct fc_rport *rport, uint32_t timeout)
   2699{
   2700	fc_port_t *fcport = *(fc_port_t **)rport->dd_data;
   2701
   2702	rport->dev_loss_tmo = timeout ? timeout : 1;
   2703
   2704	if (IS_ENABLED(CONFIG_NVME_FC) && fcport && fcport->nvme_remote_port)
   2705		nvme_fc_set_remoteport_devloss(fcport->nvme_remote_port,
   2706					       rport->dev_loss_tmo);
   2707}
   2708
   2709static void
   2710qla2x00_dev_loss_tmo_callbk(struct fc_rport *rport)
   2711{
   2712	struct Scsi_Host *host = rport_to_shost(rport);
   2713	fc_port_t *fcport = *(fc_port_t **)rport->dd_data;
   2714	unsigned long flags;
   2715
   2716	if (!fcport)
   2717		return;
   2718
   2719	/* Now that the rport has been deleted, set the fcport state to
   2720	   FCS_DEVICE_DEAD */
   2721	qla2x00_set_fcport_state(fcport, FCS_DEVICE_DEAD);
   2722
   2723	/*
   2724	 * Transport has effectively 'deleted' the rport, clear
   2725	 * all local references.
   2726	 */
   2727	spin_lock_irqsave(host->host_lock, flags);
   2728	fcport->rport = fcport->drport = NULL;
   2729	*((fc_port_t **)rport->dd_data) = NULL;
   2730	spin_unlock_irqrestore(host->host_lock, flags);
   2731
   2732	if (test_bit(ABORT_ISP_ACTIVE, &fcport->vha->dpc_flags))
   2733		return;
   2734
   2735	if (unlikely(pci_channel_offline(fcport->vha->hw->pdev))) {
   2736		qla2x00_abort_all_cmds(fcport->vha, DID_NO_CONNECT << 16);
   2737		return;
   2738	}
   2739}
   2740
   2741static void
   2742qla2x00_terminate_rport_io(struct fc_rport *rport)
   2743{
   2744	fc_port_t *fcport = *(fc_port_t **)rport->dd_data;
   2745
   2746	if (!fcport)
   2747		return;
   2748
   2749	if (test_bit(UNLOADING, &fcport->vha->dpc_flags))
   2750		return;
   2751
   2752	if (test_bit(ABORT_ISP_ACTIVE, &fcport->vha->dpc_flags))
   2753		return;
   2754
   2755	if (unlikely(pci_channel_offline(fcport->vha->hw->pdev))) {
   2756		qla2x00_abort_all_cmds(fcport->vha, DID_NO_CONNECT << 16);
   2757		return;
   2758	}
   2759	/*
   2760	 * At this point all fcport's software-states are cleared.  Perform any
   2761	 * final cleanup of firmware resources (PCBs and XCBs).
   2762	 */
   2763	if (fcport->loop_id != FC_NO_LOOP_ID) {
   2764		if (IS_FWI2_CAPABLE(fcport->vha->hw)) {
   2765			if (fcport->loop_id != FC_NO_LOOP_ID)
   2766				fcport->logout_on_delete = 1;
   2767
   2768			if (!EDIF_NEGOTIATION_PENDING(fcport)) {
   2769				ql_dbg(ql_dbg_disc, fcport->vha, 0x911e,
   2770				       "%s %d schedule session deletion\n", __func__,
   2771				       __LINE__);
   2772				qlt_schedule_sess_for_deletion(fcport);
   2773			}
   2774		} else {
   2775			qla2x00_port_logout(fcport->vha, fcport);
   2776		}
   2777	}
   2778}
   2779
   2780static int
   2781qla2x00_issue_lip(struct Scsi_Host *shost)
   2782{
   2783	scsi_qla_host_t *vha = shost_priv(shost);
   2784
   2785	if (IS_QLAFX00(vha->hw))
   2786		return 0;
   2787
   2788	if (vha->hw->flags.port_isolated)
   2789		return 0;
   2790
   2791	qla2x00_loop_reset(vha);
   2792	return 0;
   2793}
   2794
   2795static struct fc_host_statistics *
   2796qla2x00_get_fc_host_stats(struct Scsi_Host *shost)
   2797{
   2798	scsi_qla_host_t *vha = shost_priv(shost);
   2799	struct qla_hw_data *ha = vha->hw;
   2800	struct scsi_qla_host *base_vha = pci_get_drvdata(ha->pdev);
   2801	int rval;
   2802	struct link_statistics *stats;
   2803	dma_addr_t stats_dma;
   2804	struct fc_host_statistics *p = &vha->fc_host_stat;
   2805	struct qla_qpair *qpair;
   2806	int i;
   2807	u64 ib = 0, ob = 0, ir = 0, or = 0;
   2808
   2809	memset(p, -1, sizeof(*p));
   2810
   2811	if (IS_QLAFX00(vha->hw))
   2812		goto done;
   2813
   2814	if (test_bit(UNLOADING, &vha->dpc_flags))
   2815		goto done;
   2816
   2817	if (unlikely(pci_channel_offline(ha->pdev)))
   2818		goto done;
   2819
   2820	if (qla2x00_chip_is_down(vha))
   2821		goto done;
   2822
   2823	stats = dma_alloc_coherent(&ha->pdev->dev, sizeof(*stats), &stats_dma,
   2824				   GFP_KERNEL);
   2825	if (!stats) {
   2826		ql_log(ql_log_warn, vha, 0x707d,
   2827		    "Failed to allocate memory for stats.\n");
   2828		goto done;
   2829	}
   2830
   2831	rval = QLA_FUNCTION_FAILED;
   2832	if (IS_FWI2_CAPABLE(ha)) {
   2833		rval = qla24xx_get_isp_stats(base_vha, stats, stats_dma, 0);
   2834	} else if (atomic_read(&base_vha->loop_state) == LOOP_READY &&
   2835	    !ha->dpc_active) {
   2836		/* Must be in a 'READY' state for statistics retrieval. */
   2837		rval = qla2x00_get_link_status(base_vha, base_vha->loop_id,
   2838						stats, stats_dma);
   2839	}
   2840
   2841	if (rval != QLA_SUCCESS)
   2842		goto done_free;
   2843
   2844	/* --- */
   2845	for (i = 0; i < vha->hw->max_qpairs; i++) {
   2846		qpair = vha->hw->queue_pair_map[i];
   2847		if (!qpair)
   2848			continue;
   2849		ir += qpair->counters.input_requests;
   2850		or += qpair->counters.output_requests;
   2851		ib += qpair->counters.input_bytes;
   2852		ob += qpair->counters.output_bytes;
   2853	}
   2854	ir += ha->base_qpair->counters.input_requests;
   2855	or += ha->base_qpair->counters.output_requests;
   2856	ib += ha->base_qpair->counters.input_bytes;
   2857	ob += ha->base_qpair->counters.output_bytes;
   2858
   2859	ir += vha->qla_stats.input_requests;
   2860	or += vha->qla_stats.output_requests;
   2861	ib += vha->qla_stats.input_bytes;
   2862	ob += vha->qla_stats.output_bytes;
   2863	/* --- */
   2864
   2865	p->link_failure_count = le32_to_cpu(stats->link_fail_cnt);
   2866	p->loss_of_sync_count = le32_to_cpu(stats->loss_sync_cnt);
   2867	p->loss_of_signal_count = le32_to_cpu(stats->loss_sig_cnt);
   2868	p->prim_seq_protocol_err_count = le32_to_cpu(stats->prim_seq_err_cnt);
   2869	p->invalid_tx_word_count = le32_to_cpu(stats->inval_xmit_word_cnt);
   2870	p->invalid_crc_count = le32_to_cpu(stats->inval_crc_cnt);
   2871	if (IS_FWI2_CAPABLE(ha)) {
   2872		p->lip_count = le32_to_cpu(stats->lip_cnt);
   2873		p->tx_frames = le32_to_cpu(stats->tx_frames);
   2874		p->rx_frames = le32_to_cpu(stats->rx_frames);
   2875		p->dumped_frames = le32_to_cpu(stats->discarded_frames);
   2876		p->nos_count = le32_to_cpu(stats->nos_rcvd);
   2877		p->error_frames =
   2878		    le32_to_cpu(stats->dropped_frames) +
   2879		    le32_to_cpu(stats->discarded_frames);
   2880		if (IS_QLA83XX(ha) || IS_QLA27XX(ha) || IS_QLA28XX(ha)) {
   2881			p->rx_words = le64_to_cpu(stats->fpm_recv_word_cnt);
   2882			p->tx_words = le64_to_cpu(stats->fpm_xmit_word_cnt);
   2883		} else {
   2884			p->rx_words = ib >> 2;
   2885			p->tx_words = ob >> 2;
   2886		}
   2887	}
   2888
   2889	p->fcp_control_requests = vha->qla_stats.control_requests;
   2890	p->fcp_input_requests = ir;
   2891	p->fcp_output_requests = or;
   2892	p->fcp_input_megabytes  = ib >> 20;
   2893	p->fcp_output_megabytes = ob >> 20;
   2894	p->seconds_since_last_reset =
   2895	    get_jiffies_64() - vha->qla_stats.jiffies_at_last_reset;
   2896	do_div(p->seconds_since_last_reset, HZ);
   2897
   2898done_free:
   2899	dma_free_coherent(&ha->pdev->dev, sizeof(struct link_statistics),
   2900	    stats, stats_dma);
   2901done:
   2902	return p;
   2903}
   2904
   2905static void
   2906qla2x00_reset_host_stats(struct Scsi_Host *shost)
   2907{
   2908	scsi_qla_host_t *vha = shost_priv(shost);
   2909	struct qla_hw_data *ha = vha->hw;
   2910	struct scsi_qla_host *base_vha = pci_get_drvdata(ha->pdev);
   2911	struct link_statistics *stats;
   2912	dma_addr_t stats_dma;
   2913	int i;
   2914	struct qla_qpair *qpair;
   2915
   2916	memset(&vha->qla_stats, 0, sizeof(vha->qla_stats));
   2917	memset(&vha->fc_host_stat, 0, sizeof(vha->fc_host_stat));
   2918	for (i = 0; i < vha->hw->max_qpairs; i++) {
   2919		qpair = vha->hw->queue_pair_map[i];
   2920		if (!qpair)
   2921			continue;
   2922		memset(&qpair->counters, 0, sizeof(qpair->counters));
   2923	}
   2924	memset(&ha->base_qpair->counters, 0, sizeof(qpair->counters));
   2925
   2926	vha->qla_stats.jiffies_at_last_reset = get_jiffies_64();
   2927
   2928	if (IS_FWI2_CAPABLE(ha)) {
   2929		int rval;
   2930
   2931		stats = dma_alloc_coherent(&ha->pdev->dev,
   2932		    sizeof(*stats), &stats_dma, GFP_KERNEL);
   2933		if (!stats) {
   2934			ql_log(ql_log_warn, vha, 0x70d7,
   2935			    "Failed to allocate memory for stats.\n");
   2936			return;
   2937		}
   2938
   2939		/* reset firmware statistics */
   2940		rval = qla24xx_get_isp_stats(base_vha, stats, stats_dma, BIT_0);
   2941		if (rval != QLA_SUCCESS)
   2942			ql_log(ql_log_warn, vha, 0x70de,
   2943			       "Resetting ISP statistics failed: rval = %d\n",
   2944			       rval);
   2945
   2946		dma_free_coherent(&ha->pdev->dev, sizeof(*stats),
   2947		    stats, stats_dma);
   2948	}
   2949}
   2950
   2951static void
   2952qla2x00_get_host_symbolic_name(struct Scsi_Host *shost)
   2953{
   2954	scsi_qla_host_t *vha = shost_priv(shost);
   2955
   2956	qla2x00_get_sym_node_name(vha, fc_host_symbolic_name(shost),
   2957	    sizeof(fc_host_symbolic_name(shost)));
   2958}
   2959
   2960static void
   2961qla2x00_set_host_system_hostname(struct Scsi_Host *shost)
   2962{
   2963	scsi_qla_host_t *vha = shost_priv(shost);
   2964
   2965	set_bit(REGISTER_FDMI_NEEDED, &vha->dpc_flags);
   2966}
   2967
   2968static void
   2969qla2x00_get_host_fabric_name(struct Scsi_Host *shost)
   2970{
   2971	scsi_qla_host_t *vha = shost_priv(shost);
   2972	static const uint8_t node_name[WWN_SIZE] = {
   2973		0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF
   2974	};
   2975	u64 fabric_name = wwn_to_u64(node_name);
   2976
   2977	if (vha->device_flags & SWITCH_FOUND)
   2978		fabric_name = wwn_to_u64(vha->fabric_node_name);
   2979
   2980	fc_host_fabric_name(shost) = fabric_name;
   2981}
   2982
   2983static void
   2984qla2x00_get_host_port_state(struct Scsi_Host *shost)
   2985{
   2986	scsi_qla_host_t *vha = shost_priv(shost);
   2987	struct scsi_qla_host *base_vha = pci_get_drvdata(vha->hw->pdev);
   2988
   2989	if (!base_vha->flags.online) {
   2990		fc_host_port_state(shost) = FC_PORTSTATE_OFFLINE;
   2991		return;
   2992	}
   2993
   2994	switch (atomic_read(&base_vha->loop_state)) {
   2995	case LOOP_UPDATE:
   2996		fc_host_port_state(shost) = FC_PORTSTATE_DIAGNOSTICS;
   2997		break;
   2998	case LOOP_DOWN:
   2999		if (test_bit(LOOP_RESYNC_NEEDED, &base_vha->dpc_flags))
   3000			fc_host_port_state(shost) = FC_PORTSTATE_DIAGNOSTICS;
   3001		else
   3002			fc_host_port_state(shost) = FC_PORTSTATE_LINKDOWN;
   3003		break;
   3004	case LOOP_DEAD:
   3005		fc_host_port_state(shost) = FC_PORTSTATE_LINKDOWN;
   3006		break;
   3007	case LOOP_READY:
   3008		fc_host_port_state(shost) = FC_PORTSTATE_ONLINE;
   3009		break;
   3010	default:
   3011		fc_host_port_state(shost) = FC_PORTSTATE_UNKNOWN;
   3012		break;
   3013	}
   3014}
   3015
   3016static int
   3017qla24xx_vport_create(struct fc_vport *fc_vport, bool disable)
   3018{
   3019	int	ret = 0;
   3020	uint8_t	qos = 0;
   3021	scsi_qla_host_t *base_vha = shost_priv(fc_vport->shost);
   3022	scsi_qla_host_t *vha = NULL;
   3023	struct qla_hw_data *ha = base_vha->hw;
   3024	int	cnt;
   3025	struct req_que *req = ha->req_q_map[0];
   3026	struct qla_qpair *qpair;
   3027
   3028	ret = qla24xx_vport_create_req_sanity_check(fc_vport);
   3029	if (ret) {
   3030		ql_log(ql_log_warn, vha, 0x707e,
   3031		    "Vport sanity check failed, status %x\n", ret);
   3032		return (ret);
   3033	}
   3034
   3035	vha = qla24xx_create_vhost(fc_vport);
   3036	if (vha == NULL) {
   3037		ql_log(ql_log_warn, vha, 0x707f, "Vport create host failed.\n");
   3038		return FC_VPORT_FAILED;
   3039	}
   3040	if (disable) {
   3041		atomic_set(&vha->vp_state, VP_OFFLINE);
   3042		fc_vport_set_state(fc_vport, FC_VPORT_DISABLED);
   3043	} else
   3044		atomic_set(&vha->vp_state, VP_FAILED);
   3045
   3046	/* ready to create vport */
   3047	ql_log(ql_log_info, vha, 0x7080,
   3048	    "VP entry id %d assigned.\n", vha->vp_idx);
   3049
   3050	/* initialized vport states */
   3051	atomic_set(&vha->loop_state, LOOP_DOWN);
   3052	vha->vp_err_state = VP_ERR_PORTDWN;
   3053	vha->vp_prev_err_state = VP_ERR_UNKWN;
   3054	/* Check if physical ha port is Up */
   3055	if (atomic_read(&base_vha->loop_state) == LOOP_DOWN ||
   3056	    atomic_read(&base_vha->loop_state) == LOOP_DEAD) {
   3057		/* Don't retry or attempt login of this virtual port */
   3058		ql_dbg(ql_dbg_user, vha, 0x7081,
   3059		    "Vport loop state is not UP.\n");
   3060		atomic_set(&vha->loop_state, LOOP_DEAD);
   3061		if (!disable)
   3062			fc_vport_set_state(fc_vport, FC_VPORT_LINKDOWN);
   3063	}
   3064
   3065	if (IS_T10_PI_CAPABLE(ha) && ql2xenabledif) {
   3066		if (ha->fw_attributes & BIT_4) {
   3067			int prot = 0, guard;
   3068
   3069			vha->flags.difdix_supported = 1;
   3070			ql_dbg(ql_dbg_user, vha, 0x7082,
   3071			    "Registered for DIF/DIX type 1 and 3 protection.\n");
   3072			if (ql2xenabledif == 1)
   3073				prot = SHOST_DIX_TYPE0_PROTECTION;
   3074			scsi_host_set_prot(vha->host,
   3075			    prot | SHOST_DIF_TYPE1_PROTECTION
   3076			    | SHOST_DIF_TYPE2_PROTECTION
   3077			    | SHOST_DIF_TYPE3_PROTECTION
   3078			    | SHOST_DIX_TYPE1_PROTECTION
   3079			    | SHOST_DIX_TYPE2_PROTECTION
   3080			    | SHOST_DIX_TYPE3_PROTECTION);
   3081
   3082			guard = SHOST_DIX_GUARD_CRC;
   3083
   3084			if (IS_PI_IPGUARD_CAPABLE(ha) &&
   3085			    (ql2xenabledif > 1 || IS_PI_DIFB_DIX0_CAPABLE(ha)))
   3086				guard |= SHOST_DIX_GUARD_IP;
   3087
   3088			scsi_host_set_guard(vha->host, guard);
   3089		} else
   3090			vha->flags.difdix_supported = 0;
   3091	}
   3092
   3093	if (scsi_add_host_with_dma(vha->host, &fc_vport->dev,
   3094				   &ha->pdev->dev)) {
   3095		ql_dbg(ql_dbg_user, vha, 0x7083,
   3096		    "scsi_add_host failure for VP[%d].\n", vha->vp_idx);
   3097		goto vport_create_failed_2;
   3098	}
   3099
   3100	/* initialize attributes */
   3101	fc_host_dev_loss_tmo(vha->host) = ha->port_down_retry_count;
   3102	fc_host_node_name(vha->host) = wwn_to_u64(vha->node_name);
   3103	fc_host_port_name(vha->host) = wwn_to_u64(vha->port_name);
   3104	fc_host_supported_classes(vha->host) =
   3105		fc_host_supported_classes(base_vha->host);
   3106	fc_host_supported_speeds(vha->host) =
   3107		fc_host_supported_speeds(base_vha->host);
   3108
   3109	qlt_vport_create(vha, ha);
   3110	qla24xx_vport_disable(fc_vport, disable);
   3111
   3112	if (!ql2xmqsupport || !ha->npiv_info)
   3113		goto vport_queue;
   3114
   3115	/* Create a request queue in QoS mode for the vport */
   3116	for (cnt = 0; cnt < ha->nvram_npiv_size; cnt++) {
   3117		if (memcmp(ha->npiv_info[cnt].port_name, vha->port_name, 8) == 0
   3118			&& memcmp(ha->npiv_info[cnt].node_name, vha->node_name,
   3119					8) == 0) {
   3120			qos = ha->npiv_info[cnt].q_qos;
   3121			break;
   3122		}
   3123	}
   3124
   3125	if (qos) {
   3126		qpair = qla2xxx_create_qpair(vha, qos, vha->vp_idx, true);
   3127		if (!qpair)
   3128			ql_log(ql_log_warn, vha, 0x7084,
   3129			    "Can't create qpair for VP[%d]\n",
   3130			    vha->vp_idx);
   3131		else {
   3132			ql_dbg(ql_dbg_multiq, vha, 0xc001,
   3133			    "Queue pair: %d Qos: %d) created for VP[%d]\n",
   3134			    qpair->id, qos, vha->vp_idx);
   3135			ql_dbg(ql_dbg_user, vha, 0x7085,
   3136			    "Queue Pair: %d Qos: %d) created for VP[%d]\n",
   3137			    qpair->id, qos, vha->vp_idx);
   3138			req = qpair->req;
   3139			vha->qpair = qpair;
   3140		}
   3141	}
   3142
   3143vport_queue:
   3144	vha->req = req;
   3145	return 0;
   3146
   3147vport_create_failed_2:
   3148	qla24xx_disable_vp(vha);
   3149	qla24xx_deallocate_vp_id(vha);
   3150	scsi_host_put(vha->host);
   3151	return FC_VPORT_FAILED;
   3152}
   3153
   3154static int
   3155qla24xx_vport_delete(struct fc_vport *fc_vport)
   3156{
   3157	scsi_qla_host_t *vha = fc_vport->dd_data;
   3158	struct qla_hw_data *ha = vha->hw;
   3159	uint16_t id = vha->vp_idx;
   3160
   3161	set_bit(VPORT_DELETE, &vha->dpc_flags);
   3162
   3163	while (test_bit(LOOP_RESYNC_ACTIVE, &vha->dpc_flags) ||
   3164	    test_bit(FCPORT_UPDATE_NEEDED, &vha->dpc_flags))
   3165		msleep(1000);
   3166
   3167
   3168	qla24xx_disable_vp(vha);
   3169	qla2x00_wait_for_sess_deletion(vha);
   3170
   3171	qla_nvme_delete(vha);
   3172	qla_enode_stop(vha);
   3173	qla_edb_stop(vha);
   3174
   3175	vha->flags.delete_progress = 1;
   3176
   3177	qlt_remove_target(ha, vha);
   3178
   3179	fc_remove_host(vha->host);
   3180
   3181	scsi_remove_host(vha->host);
   3182
   3183	/* Allow timer to run to drain queued items, when removing vp */
   3184	qla24xx_deallocate_vp_id(vha);
   3185
   3186	if (vha->timer_active) {
   3187		qla2x00_vp_stop_timer(vha);
   3188		ql_dbg(ql_dbg_user, vha, 0x7086,
   3189		    "Timer for the VP[%d] has stopped\n", vha->vp_idx);
   3190	}
   3191
   3192	qla2x00_free_fcports(vha);
   3193
   3194	mutex_lock(&ha->vport_lock);
   3195	ha->cur_vport_count--;
   3196	clear_bit(vha->vp_idx, ha->vp_idx_map);
   3197	mutex_unlock(&ha->vport_lock);
   3198
   3199	dma_free_coherent(&ha->pdev->dev, vha->gnl.size, vha->gnl.l,
   3200	    vha->gnl.ldma);
   3201
   3202	vha->gnl.l = NULL;
   3203
   3204	vfree(vha->scan.l);
   3205
   3206	if (vha->qpair && vha->qpair->vp_idx == vha->vp_idx) {
   3207		if (qla2xxx_delete_qpair(vha, vha->qpair) != QLA_SUCCESS)
   3208			ql_log(ql_log_warn, vha, 0x7087,
   3209			    "Queue Pair delete failed.\n");
   3210	}
   3211
   3212	ql_log(ql_log_info, vha, 0x7088, "VP[%d] deleted.\n", id);
   3213	scsi_host_put(vha->host);
   3214	return 0;
   3215}
   3216
   3217static int
   3218qla24xx_vport_disable(struct fc_vport *fc_vport, bool disable)
   3219{
   3220	scsi_qla_host_t *vha = fc_vport->dd_data;
   3221
   3222	if (disable)
   3223		qla24xx_disable_vp(vha);
   3224	else
   3225		qla24xx_enable_vp(vha);
   3226
   3227	return 0;
   3228}
   3229
   3230struct fc_function_template qla2xxx_transport_functions = {
   3231
   3232	.show_host_node_name = 1,
   3233	.show_host_port_name = 1,
   3234	.show_host_supported_classes = 1,
   3235	.show_host_supported_speeds = 1,
   3236
   3237	.get_host_port_id = qla2x00_get_host_port_id,
   3238	.show_host_port_id = 1,
   3239	.get_host_speed = qla2x00_get_host_speed,
   3240	.show_host_speed = 1,
   3241	.get_host_port_type = qla2x00_get_host_port_type,
   3242	.show_host_port_type = 1,
   3243	.get_host_symbolic_name = qla2x00_get_host_symbolic_name,
   3244	.show_host_symbolic_name = 1,
   3245	.set_host_system_hostname = qla2x00_set_host_system_hostname,
   3246	.show_host_system_hostname = 1,
   3247	.get_host_fabric_name = qla2x00_get_host_fabric_name,
   3248	.show_host_fabric_name = 1,
   3249	.get_host_port_state = qla2x00_get_host_port_state,
   3250	.show_host_port_state = 1,
   3251
   3252	.dd_fcrport_size = sizeof(struct fc_port *),
   3253	.show_rport_supported_classes = 1,
   3254
   3255	.get_starget_node_name = qla2x00_get_starget_node_name,
   3256	.show_starget_node_name = 1,
   3257	.get_starget_port_name = qla2x00_get_starget_port_name,
   3258	.show_starget_port_name = 1,
   3259	.get_starget_port_id  = qla2x00_get_starget_port_id,
   3260	.show_starget_port_id = 1,
   3261
   3262	.set_rport_dev_loss_tmo = qla2x00_set_rport_loss_tmo,
   3263	.show_rport_dev_loss_tmo = 1,
   3264
   3265	.issue_fc_host_lip = qla2x00_issue_lip,
   3266	.dev_loss_tmo_callbk = qla2x00_dev_loss_tmo_callbk,
   3267	.terminate_rport_io = qla2x00_terminate_rport_io,
   3268	.get_fc_host_stats = qla2x00_get_fc_host_stats,
   3269	.reset_fc_host_stats = qla2x00_reset_host_stats,
   3270
   3271	.vport_create = qla24xx_vport_create,
   3272	.vport_disable = qla24xx_vport_disable,
   3273	.vport_delete = qla24xx_vport_delete,
   3274	.bsg_request = qla24xx_bsg_request,
   3275	.bsg_timeout = qla24xx_bsg_timeout,
   3276};
   3277
   3278struct fc_function_template qla2xxx_transport_vport_functions = {
   3279
   3280	.show_host_node_name = 1,
   3281	.show_host_port_name = 1,
   3282	.show_host_supported_classes = 1,
   3283
   3284	.get_host_port_id = qla2x00_get_host_port_id,
   3285	.show_host_port_id = 1,
   3286	.get_host_speed = qla2x00_get_host_speed,
   3287	.show_host_speed = 1,
   3288	.get_host_port_type = qla2x00_get_host_port_type,
   3289	.show_host_port_type = 1,
   3290	.get_host_symbolic_name = qla2x00_get_host_symbolic_name,
   3291	.show_host_symbolic_name = 1,
   3292	.set_host_system_hostname = qla2x00_set_host_system_hostname,
   3293	.show_host_system_hostname = 1,
   3294	.get_host_fabric_name = qla2x00_get_host_fabric_name,
   3295	.show_host_fabric_name = 1,
   3296	.get_host_port_state = qla2x00_get_host_port_state,
   3297	.show_host_port_state = 1,
   3298
   3299	.dd_fcrport_size = sizeof(struct fc_port *),
   3300	.show_rport_supported_classes = 1,
   3301
   3302	.get_starget_node_name = qla2x00_get_starget_node_name,
   3303	.show_starget_node_name = 1,
   3304	.get_starget_port_name = qla2x00_get_starget_port_name,
   3305	.show_starget_port_name = 1,
   3306	.get_starget_port_id  = qla2x00_get_starget_port_id,
   3307	.show_starget_port_id = 1,
   3308
   3309	.set_rport_dev_loss_tmo = qla2x00_set_rport_loss_tmo,
   3310	.show_rport_dev_loss_tmo = 1,
   3311
   3312	.issue_fc_host_lip = qla2x00_issue_lip,
   3313	.dev_loss_tmo_callbk = qla2x00_dev_loss_tmo_callbk,
   3314	.terminate_rport_io = qla2x00_terminate_rport_io,
   3315	.get_fc_host_stats = qla2x00_get_fc_host_stats,
   3316	.reset_fc_host_stats = qla2x00_reset_host_stats,
   3317
   3318	.bsg_request = qla24xx_bsg_request,
   3319	.bsg_timeout = qla24xx_bsg_timeout,
   3320};
   3321
   3322void
   3323qla2x00_init_host_attr(scsi_qla_host_t *vha)
   3324{
   3325	struct qla_hw_data *ha = vha->hw;
   3326	u32 speeds = FC_PORTSPEED_UNKNOWN;
   3327
   3328	fc_host_dev_loss_tmo(vha->host) = ha->port_down_retry_count;
   3329	fc_host_node_name(vha->host) = wwn_to_u64(vha->node_name);
   3330	fc_host_port_name(vha->host) = wwn_to_u64(vha->port_name);
   3331	fc_host_supported_classes(vha->host) = ha->base_qpair->enable_class_2 ?
   3332			(FC_COS_CLASS2|FC_COS_CLASS3) : FC_COS_CLASS3;
   3333	fc_host_max_npiv_vports(vha->host) = ha->max_npiv_vports;
   3334	fc_host_npiv_vports_inuse(vha->host) = ha->cur_vport_count;
   3335
   3336	speeds = qla25xx_fdmi_port_speed_capability(ha);
   3337
   3338	fc_host_supported_speeds(vha->host) = speeds;
   3339}