• Home
  • History
  • Annotate
  • Line#
  • Navigate
  • Raw
  • Download
  • only in /asuswrt-rt-n18u-9.0.0.4.380.2695/release/src-rt-6.x.4708/linux/linux-2.6.36/drivers/scsi/qla2xxx/
1/*
2 * QLogic Fibre Channel HBA Driver
3 * Copyright (c)  2003-2010 QLogic Corporation
4 *
5 * See LICENSE.qla2xxx for copyright and licensing details.
6 */
7#include "qla_def.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
27	if (ha->fw_dump_reading == 0)
28		return 0;
29
30	return memory_read_from_buffer(buf, count, &off, ha->fw_dump,
31					ha->fw_dump_len);
32}
33
34static ssize_t
35qla2x00_sysfs_write_fw_dump(struct file *filp, struct kobject *kobj,
36			    struct bin_attribute *bin_attr,
37			    char *buf, loff_t off, size_t count)
38{
39	struct scsi_qla_host *vha = shost_priv(dev_to_shost(container_of(kobj,
40	    struct device, kobj)));
41	struct qla_hw_data *ha = vha->hw;
42	int reading;
43
44	if (IS_QLA82XX(ha)) {
45		DEBUG2(qla_printk(KERN_INFO, ha,
46			"Firmware dump not supported for ISP82xx\n"));
47		return count;
48	}
49
50	if (off != 0)
51		return (0);
52
53	reading = simple_strtol(buf, NULL, 10);
54	switch (reading) {
55	case 0:
56		if (!ha->fw_dump_reading)
57			break;
58
59		qla_printk(KERN_INFO, ha,
60		    "Firmware dump cleared on (%ld).\n", vha->host_no);
61
62		ha->fw_dump_reading = 0;
63		ha->fw_dumped = 0;
64		break;
65	case 1:
66		if (ha->fw_dumped && !ha->fw_dump_reading) {
67			ha->fw_dump_reading = 1;
68
69			qla_printk(KERN_INFO, ha,
70			    "Raw firmware dump ready for read on (%ld).\n",
71			    vha->host_no);
72		}
73		break;
74	case 2:
75		qla2x00_alloc_fw_dump(vha);
76		break;
77	case 3:
78		qla2x00_system_error(vha);
79		break;
80	}
81	return (count);
82}
83
84static struct bin_attribute sysfs_fw_dump_attr = {
85	.attr = {
86		.name = "fw_dump",
87		.mode = S_IRUSR | S_IWUSR,
88	},
89	.size = 0,
90	.read = qla2x00_sysfs_read_fw_dump,
91	.write = qla2x00_sysfs_write_fw_dump,
92};
93
94static ssize_t
95qla2x00_sysfs_read_nvram(struct file *filp, struct kobject *kobj,
96			 struct bin_attribute *bin_attr,
97			 char *buf, loff_t off, size_t count)
98{
99	struct scsi_qla_host *vha = shost_priv(dev_to_shost(container_of(kobj,
100	    struct device, kobj)));
101	struct qla_hw_data *ha = vha->hw;
102
103	if (!capable(CAP_SYS_ADMIN))
104		return 0;
105
106	if (IS_NOCACHE_VPD_TYPE(ha))
107		ha->isp_ops->read_optrom(vha, ha->nvram, ha->flt_region_nvram << 2,
108		    ha->nvram_size);
109	return memory_read_from_buffer(buf, count, &off, ha->nvram,
110					ha->nvram_size);
111}
112
113static ssize_t
114qla2x00_sysfs_write_nvram(struct file *filp, struct kobject *kobj,
115			  struct bin_attribute *bin_attr,
116			  char *buf, loff_t off, size_t count)
117{
118	struct scsi_qla_host *vha = shost_priv(dev_to_shost(container_of(kobj,
119	    struct device, kobj)));
120	struct qla_hw_data *ha = vha->hw;
121	uint16_t	cnt;
122
123	if (!capable(CAP_SYS_ADMIN) || off != 0 || count != ha->nvram_size ||
124	    !ha->isp_ops->write_nvram)
125		return 0;
126
127	/* Checksum NVRAM. */
128	if (IS_FWI2_CAPABLE(ha)) {
129		uint32_t *iter;
130		uint32_t chksum;
131
132		iter = (uint32_t *)buf;
133		chksum = 0;
134		for (cnt = 0; cnt < ((count >> 2) - 1); cnt++)
135			chksum += le32_to_cpu(*iter++);
136		chksum = ~chksum + 1;
137		*iter = cpu_to_le32(chksum);
138	} else {
139		uint8_t *iter;
140		uint8_t chksum;
141
142		iter = (uint8_t *)buf;
143		chksum = 0;
144		for (cnt = 0; cnt < count - 1; cnt++)
145			chksum += *iter++;
146		chksum = ~chksum + 1;
147		*iter = chksum;
148	}
149
150	if (qla2x00_wait_for_hba_online(vha) != QLA_SUCCESS) {
151		qla_printk(KERN_WARNING, ha,
152		    "HBA not online, failing NVRAM update.\n");
153		return -EAGAIN;
154	}
155
156	/* Write NVRAM. */
157	ha->isp_ops->write_nvram(vha, (uint8_t *)buf, ha->nvram_base, count);
158	ha->isp_ops->read_nvram(vha, (uint8_t *)ha->nvram, ha->nvram_base,
159	    count);
160
161	/* NVRAM settings take effect immediately. */
162	set_bit(ISP_ABORT_NEEDED, &vha->dpc_flags);
163	qla2xxx_wake_dpc(vha);
164	qla2x00_wait_for_chip_reset(vha);
165
166	return (count);
167}
168
169static struct bin_attribute sysfs_nvram_attr = {
170	.attr = {
171		.name = "nvram",
172		.mode = S_IRUSR | S_IWUSR,
173	},
174	.size = 512,
175	.read = qla2x00_sysfs_read_nvram,
176	.write = qla2x00_sysfs_write_nvram,
177};
178
179static ssize_t
180qla2x00_sysfs_read_optrom(struct file *filp, struct kobject *kobj,
181			  struct bin_attribute *bin_attr,
182			  char *buf, loff_t off, size_t count)
183{
184	struct scsi_qla_host *vha = shost_priv(dev_to_shost(container_of(kobj,
185	    struct device, kobj)));
186	struct qla_hw_data *ha = vha->hw;
187
188	if (ha->optrom_state != QLA_SREADING)
189		return 0;
190
191	return memory_read_from_buffer(buf, count, &off, ha->optrom_buffer,
192					ha->optrom_region_size);
193}
194
195static ssize_t
196qla2x00_sysfs_write_optrom(struct file *filp, struct kobject *kobj,
197			   struct bin_attribute *bin_attr,
198			   char *buf, loff_t off, size_t count)
199{
200	struct scsi_qla_host *vha = shost_priv(dev_to_shost(container_of(kobj,
201	    struct device, kobj)));
202	struct qla_hw_data *ha = vha->hw;
203
204	if (ha->optrom_state != QLA_SWRITING)
205		return -EINVAL;
206	if (off > ha->optrom_region_size)
207		return -ERANGE;
208	if (off + count > ha->optrom_region_size)
209		count = ha->optrom_region_size - off;
210
211	memcpy(&ha->optrom_buffer[off], buf, count);
212
213	return count;
214}
215
216static struct bin_attribute sysfs_optrom_attr = {
217	.attr = {
218		.name = "optrom",
219		.mode = S_IRUSR | S_IWUSR,
220	},
221	.size = 0,
222	.read = qla2x00_sysfs_read_optrom,
223	.write = qla2x00_sysfs_write_optrom,
224};
225
226static ssize_t
227qla2x00_sysfs_write_optrom_ctl(struct file *filp, struct kobject *kobj,
228			       struct bin_attribute *bin_attr,
229			       char *buf, loff_t off, size_t count)
230{
231	struct scsi_qla_host *vha = shost_priv(dev_to_shost(container_of(kobj,
232	    struct device, kobj)));
233	struct qla_hw_data *ha = vha->hw;
234
235	uint32_t start = 0;
236	uint32_t size = ha->optrom_size;
237	int val, valid;
238
239	if (off)
240		return 0;
241
242	if (unlikely(pci_channel_offline(ha->pdev)))
243		return 0;
244
245	if (sscanf(buf, "%d:%x:%x", &val, &start, &size) < 1)
246		return -EINVAL;
247	if (start > ha->optrom_size)
248		return -EINVAL;
249
250	switch (val) {
251	case 0:
252		if (ha->optrom_state != QLA_SREADING &&
253		    ha->optrom_state != QLA_SWRITING)
254			break;
255
256		ha->optrom_state = QLA_SWAITING;
257
258		DEBUG2(qla_printk(KERN_INFO, ha,
259		    "Freeing flash region allocation -- 0x%x bytes.\n",
260		    ha->optrom_region_size));
261
262		vfree(ha->optrom_buffer);
263		ha->optrom_buffer = NULL;
264		break;
265	case 1:
266		if (ha->optrom_state != QLA_SWAITING)
267			break;
268
269		ha->optrom_region_start = start;
270		ha->optrom_region_size = start + size > ha->optrom_size ?
271		    ha->optrom_size - start : size;
272
273		ha->optrom_state = QLA_SREADING;
274		ha->optrom_buffer = vmalloc(ha->optrom_region_size);
275		if (ha->optrom_buffer == NULL) {
276			qla_printk(KERN_WARNING, ha,
277			    "Unable to allocate memory for optrom retrieval "
278			    "(%x).\n", ha->optrom_region_size);
279
280			ha->optrom_state = QLA_SWAITING;
281			return count;
282		}
283
284		if (qla2x00_wait_for_hba_online(vha) != QLA_SUCCESS) {
285			qla_printk(KERN_WARNING, ha,
286				"HBA not online, failing NVRAM update.\n");
287			return -EAGAIN;
288		}
289
290		DEBUG2(qla_printk(KERN_INFO, ha,
291		    "Reading flash region -- 0x%x/0x%x.\n",
292		    ha->optrom_region_start, ha->optrom_region_size));
293
294		memset(ha->optrom_buffer, 0, ha->optrom_region_size);
295		ha->isp_ops->read_optrom(vha, ha->optrom_buffer,
296		    ha->optrom_region_start, ha->optrom_region_size);
297		break;
298	case 2:
299		if (ha->optrom_state != QLA_SWAITING)
300			break;
301
302		/*
303		 * We need to be more restrictive on which FLASH regions are
304		 * allowed to be updated via user-space.  Regions accessible
305		 * via this method include:
306		 *
307		 * ISP21xx/ISP22xx/ISP23xx type boards:
308		 *
309		 * 	0x000000 -> 0x020000 -- Boot code.
310		 *
311		 * ISP2322/ISP24xx type boards:
312		 *
313		 * 	0x000000 -> 0x07ffff -- Boot code.
314		 * 	0x080000 -> 0x0fffff -- Firmware.
315		 *
316		 * ISP25xx type boards:
317		 *
318		 * 	0x000000 -> 0x07ffff -- Boot code.
319		 * 	0x080000 -> 0x0fffff -- Firmware.
320		 * 	0x120000 -> 0x12ffff -- VPD and HBA parameters.
321		 */
322		valid = 0;
323		if (ha->optrom_size == OPTROM_SIZE_2300 && start == 0)
324			valid = 1;
325		else if (start == (ha->flt_region_boot * 4) ||
326		    start == (ha->flt_region_fw * 4))
327			valid = 1;
328		else if (IS_QLA25XX(ha) || IS_QLA8XXX_TYPE(ha))
329			valid = 1;
330		if (!valid) {
331			qla_printk(KERN_WARNING, ha,
332			    "Invalid start region 0x%x/0x%x.\n", start, size);
333			return -EINVAL;
334		}
335
336		ha->optrom_region_start = start;
337		ha->optrom_region_size = start + size > ha->optrom_size ?
338		    ha->optrom_size - start : size;
339
340		ha->optrom_state = QLA_SWRITING;
341		ha->optrom_buffer = vmalloc(ha->optrom_region_size);
342		if (ha->optrom_buffer == NULL) {
343			qla_printk(KERN_WARNING, ha,
344			    "Unable to allocate memory for optrom update "
345			    "(%x).\n", ha->optrom_region_size);
346
347			ha->optrom_state = QLA_SWAITING;
348			return count;
349		}
350
351		DEBUG2(qla_printk(KERN_INFO, ha,
352		    "Staging flash region write -- 0x%x/0x%x.\n",
353		    ha->optrom_region_start, ha->optrom_region_size));
354
355		memset(ha->optrom_buffer, 0, ha->optrom_region_size);
356		break;
357	case 3:
358		if (ha->optrom_state != QLA_SWRITING)
359			break;
360
361		if (qla2x00_wait_for_hba_online(vha) != QLA_SUCCESS) {
362			qla_printk(KERN_WARNING, ha,
363			    "HBA not online, failing flash update.\n");
364			return -EAGAIN;
365		}
366
367		DEBUG2(qla_printk(KERN_INFO, ha,
368		    "Writing flash region -- 0x%x/0x%x.\n",
369		    ha->optrom_region_start, ha->optrom_region_size));
370
371		ha->isp_ops->write_optrom(vha, ha->optrom_buffer,
372		    ha->optrom_region_start, ha->optrom_region_size);
373		break;
374	default:
375		count = -EINVAL;
376	}
377	return count;
378}
379
380static struct bin_attribute sysfs_optrom_ctl_attr = {
381	.attr = {
382		.name = "optrom_ctl",
383		.mode = S_IWUSR,
384	},
385	.size = 0,
386	.write = qla2x00_sysfs_write_optrom_ctl,
387};
388
389static ssize_t
390qla2x00_sysfs_read_vpd(struct file *filp, struct kobject *kobj,
391		       struct bin_attribute *bin_attr,
392		       char *buf, loff_t off, size_t count)
393{
394	struct scsi_qla_host *vha = shost_priv(dev_to_shost(container_of(kobj,
395	    struct device, kobj)));
396	struct qla_hw_data *ha = vha->hw;
397
398	if (unlikely(pci_channel_offline(ha->pdev)))
399		return 0;
400
401	if (!capable(CAP_SYS_ADMIN))
402		return 0;
403
404	if (IS_NOCACHE_VPD_TYPE(ha))
405		ha->isp_ops->read_optrom(vha, ha->vpd, ha->flt_region_vpd << 2,
406		    ha->vpd_size);
407	return memory_read_from_buffer(buf, count, &off, ha->vpd, ha->vpd_size);
408}
409
410static ssize_t
411qla2x00_sysfs_write_vpd(struct file *filp, struct kobject *kobj,
412			struct bin_attribute *bin_attr,
413			char *buf, loff_t off, size_t count)
414{
415	struct scsi_qla_host *vha = shost_priv(dev_to_shost(container_of(kobj,
416	    struct device, kobj)));
417	struct qla_hw_data *ha = vha->hw;
418	uint8_t *tmp_data;
419
420	if (unlikely(pci_channel_offline(ha->pdev)))
421		return 0;
422
423	if (!capable(CAP_SYS_ADMIN) || off != 0 || count != ha->vpd_size ||
424	    !ha->isp_ops->write_nvram)
425		return 0;
426
427	if (qla2x00_wait_for_hba_online(vha) != QLA_SUCCESS) {
428		qla_printk(KERN_WARNING, ha,
429		    "HBA not online, failing VPD update.\n");
430		return -EAGAIN;
431	}
432
433	/* Write NVRAM. */
434	ha->isp_ops->write_nvram(vha, (uint8_t *)buf, ha->vpd_base, count);
435	ha->isp_ops->read_nvram(vha, (uint8_t *)ha->vpd, ha->vpd_base, count);
436
437	/* Update flash version information for 4Gb & above. */
438	if (!IS_FWI2_CAPABLE(ha))
439		goto done;
440
441	tmp_data = vmalloc(256);
442	if (!tmp_data) {
443		qla_printk(KERN_WARNING, ha,
444		    "Unable to allocate memory for VPD information update.\n");
445		goto done;
446	}
447	ha->isp_ops->get_flash_version(vha, tmp_data);
448	vfree(tmp_data);
449done:
450	return count;
451}
452
453static struct bin_attribute sysfs_vpd_attr = {
454	.attr = {
455		.name = "vpd",
456		.mode = S_IRUSR | S_IWUSR,
457	},
458	.size = 0,
459	.read = qla2x00_sysfs_read_vpd,
460	.write = qla2x00_sysfs_write_vpd,
461};
462
463static ssize_t
464qla2x00_sysfs_read_sfp(struct file *filp, struct kobject *kobj,
465		       struct bin_attribute *bin_attr,
466		       char *buf, loff_t off, size_t count)
467{
468	struct scsi_qla_host *vha = shost_priv(dev_to_shost(container_of(kobj,
469	    struct device, kobj)));
470	struct qla_hw_data *ha = vha->hw;
471	uint16_t iter, addr, offset;
472	int rval;
473
474	if (!capable(CAP_SYS_ADMIN) || off != 0 || count != SFP_DEV_SIZE * 2)
475		return 0;
476
477	if (ha->sfp_data)
478		goto do_read;
479
480	ha->sfp_data = dma_pool_alloc(ha->s_dma_pool, GFP_KERNEL,
481	    &ha->sfp_data_dma);
482	if (!ha->sfp_data) {
483		qla_printk(KERN_WARNING, ha,
484		    "Unable to allocate memory for SFP read-data.\n");
485		return 0;
486	}
487
488do_read:
489	memset(ha->sfp_data, 0, SFP_BLOCK_SIZE);
490	addr = 0xa0;
491	for (iter = 0, offset = 0; iter < (SFP_DEV_SIZE * 2) / SFP_BLOCK_SIZE;
492	    iter++, offset += SFP_BLOCK_SIZE) {
493		if (iter == 4) {
494			/* Skip to next device address. */
495			addr = 0xa2;
496			offset = 0;
497		}
498
499		rval = qla2x00_read_sfp(vha, ha->sfp_data_dma, addr, offset,
500		    SFP_BLOCK_SIZE);
501		if (rval != QLA_SUCCESS) {
502			qla_printk(KERN_WARNING, ha,
503			    "Unable to read SFP data (%x/%x/%x).\n", rval,
504			    addr, offset);
505			count = 0;
506			break;
507		}
508		memcpy(buf, ha->sfp_data, SFP_BLOCK_SIZE);
509		buf += SFP_BLOCK_SIZE;
510	}
511
512	return count;
513}
514
515static struct bin_attribute sysfs_sfp_attr = {
516	.attr = {
517		.name = "sfp",
518		.mode = S_IRUSR | S_IWUSR,
519	},
520	.size = SFP_DEV_SIZE * 2,
521	.read = qla2x00_sysfs_read_sfp,
522};
523
524static ssize_t
525qla2x00_sysfs_write_reset(struct file *filp, struct kobject *kobj,
526			struct bin_attribute *bin_attr,
527			char *buf, loff_t off, size_t count)
528{
529	struct scsi_qla_host *vha = shost_priv(dev_to_shost(container_of(kobj,
530	    struct device, kobj)));
531	struct qla_hw_data *ha = vha->hw;
532	struct scsi_qla_host *base_vha = pci_get_drvdata(ha->pdev);
533	int type;
534
535	if (off != 0)
536		return 0;
537
538	type = simple_strtol(buf, NULL, 10);
539	switch (type) {
540	case 0x2025c:
541		qla_printk(KERN_INFO, ha,
542		    "Issuing ISP reset on (%ld).\n", vha->host_no);
543
544		scsi_block_requests(vha->host);
545		set_bit(ISP_ABORT_NEEDED, &vha->dpc_flags);
546		qla2xxx_wake_dpc(vha);
547		qla2x00_wait_for_chip_reset(vha);
548		scsi_unblock_requests(vha->host);
549		break;
550	case 0x2025d:
551		if (!IS_QLA81XX(ha))
552			break;
553
554		qla_printk(KERN_INFO, ha,
555		    "Issuing MPI reset on (%ld).\n", vha->host_no);
556
557		/* Make sure FC side is not in reset */
558		qla2x00_wait_for_hba_online(vha);
559
560		/* Issue MPI reset */
561		scsi_block_requests(vha->host);
562		if (qla81xx_restart_mpi_firmware(vha) != QLA_SUCCESS)
563			qla_printk(KERN_WARNING, ha,
564			    "MPI reset failed on (%ld).\n", vha->host_no);
565		scsi_unblock_requests(vha->host);
566		break;
567	case 0x2025e:
568		if (!IS_QLA82XX(ha) || vha != base_vha) {
569			qla_printk(KERN_INFO, ha,
570			    "FCoE ctx reset not supported for host%ld.\n",
571			    vha->host_no);
572			return count;
573		}
574
575		qla_printk(KERN_INFO, ha,
576		    "Issuing FCoE CTX reset on host%ld.\n", vha->host_no);
577		set_bit(FCOE_CTX_RESET_NEEDED, &vha->dpc_flags);
578		qla2xxx_wake_dpc(vha);
579		qla2x00_wait_for_fcoe_ctx_reset(vha);
580		break;
581	}
582	return count;
583}
584
585static struct bin_attribute sysfs_reset_attr = {
586	.attr = {
587		.name = "reset",
588		.mode = S_IWUSR,
589	},
590	.size = 0,
591	.write = qla2x00_sysfs_write_reset,
592};
593
594static ssize_t
595qla2x00_sysfs_write_edc(struct file *filp, struct kobject *kobj,
596			struct bin_attribute *bin_attr,
597			char *buf, loff_t off, size_t count)
598{
599	struct scsi_qla_host *vha = shost_priv(dev_to_shost(container_of(kobj,
600	    struct device, kobj)));
601	struct qla_hw_data *ha = vha->hw;
602	uint16_t dev, adr, opt, len;
603	int rval;
604
605	ha->edc_data_len = 0;
606
607	if (!capable(CAP_SYS_ADMIN) || off != 0 || count < 8)
608		return 0;
609
610	if (!ha->edc_data) {
611		ha->edc_data = dma_pool_alloc(ha->s_dma_pool, GFP_KERNEL,
612		    &ha->edc_data_dma);
613		if (!ha->edc_data) {
614			DEBUG2(qla_printk(KERN_INFO, ha,
615			    "Unable to allocate memory for EDC write.\n"));
616			return 0;
617		}
618	}
619
620	dev = le16_to_cpup((void *)&buf[0]);
621	adr = le16_to_cpup((void *)&buf[2]);
622	opt = le16_to_cpup((void *)&buf[4]);
623	len = le16_to_cpup((void *)&buf[6]);
624
625	if (!(opt & BIT_0))
626		if (len == 0 || len > DMA_POOL_SIZE || len > count - 8)
627			return -EINVAL;
628
629	memcpy(ha->edc_data, &buf[8], len);
630
631	rval = qla2x00_write_edc(vha, dev, adr, ha->edc_data_dma,
632	    ha->edc_data, len, opt);
633	if (rval != QLA_SUCCESS) {
634		DEBUG2(qla_printk(KERN_INFO, ha,
635		    "Unable to write EDC (%x) %02x:%02x:%04x:%02x:%02x.\n",
636		    rval, dev, adr, opt, len, *buf));
637		return 0;
638	}
639
640	return count;
641}
642
643static struct bin_attribute sysfs_edc_attr = {
644	.attr = {
645		.name = "edc",
646		.mode = S_IWUSR,
647	},
648	.size = 0,
649	.write = qla2x00_sysfs_write_edc,
650};
651
652static ssize_t
653qla2x00_sysfs_write_edc_status(struct file *filp, struct kobject *kobj,
654			struct bin_attribute *bin_attr,
655			char *buf, loff_t off, size_t count)
656{
657	struct scsi_qla_host *vha = shost_priv(dev_to_shost(container_of(kobj,
658	    struct device, kobj)));
659	struct qla_hw_data *ha = vha->hw;
660	uint16_t dev, adr, opt, len;
661	int rval;
662
663	ha->edc_data_len = 0;
664
665	if (!capable(CAP_SYS_ADMIN) || off != 0 || count < 8)
666		return 0;
667
668	if (!ha->edc_data) {
669		ha->edc_data = dma_pool_alloc(ha->s_dma_pool, GFP_KERNEL,
670		    &ha->edc_data_dma);
671		if (!ha->edc_data) {
672			DEBUG2(qla_printk(KERN_INFO, ha,
673			    "Unable to allocate memory for EDC status.\n"));
674			return 0;
675		}
676	}
677
678	dev = le16_to_cpup((void *)&buf[0]);
679	adr = le16_to_cpup((void *)&buf[2]);
680	opt = le16_to_cpup((void *)&buf[4]);
681	len = le16_to_cpup((void *)&buf[6]);
682
683	if (!(opt & BIT_0))
684		if (len == 0 || len > DMA_POOL_SIZE)
685			return -EINVAL;
686
687	memset(ha->edc_data, 0, len);
688	rval = qla2x00_read_edc(vha, dev, adr, ha->edc_data_dma,
689	    ha->edc_data, len, opt);
690	if (rval != QLA_SUCCESS) {
691		DEBUG2(qla_printk(KERN_INFO, ha,
692		    "Unable to write EDC status (%x) %02x:%02x:%04x:%02x.\n",
693		    rval, dev, adr, opt, len));
694		return 0;
695	}
696
697	ha->edc_data_len = len;
698
699	return count;
700}
701
702static ssize_t
703qla2x00_sysfs_read_edc_status(struct file *filp, struct kobject *kobj,
704			   struct bin_attribute *bin_attr,
705			   char *buf, loff_t off, size_t count)
706{
707	struct scsi_qla_host *vha = shost_priv(dev_to_shost(container_of(kobj,
708	    struct device, kobj)));
709	struct qla_hw_data *ha = vha->hw;
710
711	if (!capable(CAP_SYS_ADMIN) || off != 0 || count == 0)
712		return 0;
713
714	if (!ha->edc_data || ha->edc_data_len == 0 || ha->edc_data_len > count)
715		return -EINVAL;
716
717	memcpy(buf, ha->edc_data, ha->edc_data_len);
718
719	return ha->edc_data_len;
720}
721
722static struct bin_attribute sysfs_edc_status_attr = {
723	.attr = {
724		.name = "edc_status",
725		.mode = S_IRUSR | S_IWUSR,
726	},
727	.size = 0,
728	.write = qla2x00_sysfs_write_edc_status,
729	.read = qla2x00_sysfs_read_edc_status,
730};
731
732static ssize_t
733qla2x00_sysfs_read_xgmac_stats(struct file *filp, struct kobject *kobj,
734		       struct bin_attribute *bin_attr,
735		       char *buf, loff_t off, size_t count)
736{
737	struct scsi_qla_host *vha = shost_priv(dev_to_shost(container_of(kobj,
738	    struct device, kobj)));
739	struct qla_hw_data *ha = vha->hw;
740	int rval;
741	uint16_t actual_size;
742
743	if (!capable(CAP_SYS_ADMIN) || off != 0 || count > XGMAC_DATA_SIZE)
744		return 0;
745
746	if (ha->xgmac_data)
747		goto do_read;
748
749	ha->xgmac_data = dma_alloc_coherent(&ha->pdev->dev, XGMAC_DATA_SIZE,
750	    &ha->xgmac_data_dma, GFP_KERNEL);
751	if (!ha->xgmac_data) {
752		qla_printk(KERN_WARNING, ha,
753		    "Unable to allocate memory for XGMAC read-data.\n");
754		return 0;
755	}
756
757do_read:
758	actual_size = 0;
759	memset(ha->xgmac_data, 0, XGMAC_DATA_SIZE);
760
761	rval = qla2x00_get_xgmac_stats(vha, ha->xgmac_data_dma,
762	    XGMAC_DATA_SIZE, &actual_size);
763	if (rval != QLA_SUCCESS) {
764		qla_printk(KERN_WARNING, ha,
765		    "Unable to read XGMAC data (%x).\n", rval);
766		count = 0;
767	}
768
769	count = actual_size > count ? count: actual_size;
770	memcpy(buf, ha->xgmac_data, count);
771
772	return count;
773}
774
775static struct bin_attribute sysfs_xgmac_stats_attr = {
776	.attr = {
777		.name = "xgmac_stats",
778		.mode = S_IRUSR,
779	},
780	.size = 0,
781	.read = qla2x00_sysfs_read_xgmac_stats,
782};
783
784static ssize_t
785qla2x00_sysfs_read_dcbx_tlv(struct file *filp, struct kobject *kobj,
786		       struct bin_attribute *bin_attr,
787		       char *buf, loff_t off, size_t count)
788{
789	struct scsi_qla_host *vha = shost_priv(dev_to_shost(container_of(kobj,
790	    struct device, kobj)));
791	struct qla_hw_data *ha = vha->hw;
792	int rval;
793	uint16_t actual_size;
794
795	if (!capable(CAP_SYS_ADMIN) || off != 0 || count > DCBX_TLV_DATA_SIZE)
796		return 0;
797
798	if (ha->dcbx_tlv)
799		goto do_read;
800
801	ha->dcbx_tlv = dma_alloc_coherent(&ha->pdev->dev, DCBX_TLV_DATA_SIZE,
802	    &ha->dcbx_tlv_dma, GFP_KERNEL);
803	if (!ha->dcbx_tlv) {
804		qla_printk(KERN_WARNING, ha,
805		    "Unable to allocate memory for DCBX TLV read-data.\n");
806		return 0;
807	}
808
809do_read:
810	actual_size = 0;
811	memset(ha->dcbx_tlv, 0, DCBX_TLV_DATA_SIZE);
812
813	rval = qla2x00_get_dcbx_params(vha, ha->dcbx_tlv_dma,
814	    DCBX_TLV_DATA_SIZE);
815	if (rval != QLA_SUCCESS) {
816		qla_printk(KERN_WARNING, ha,
817		    "Unable to read DCBX TLV data (%x).\n", rval);
818		count = 0;
819	}
820
821	memcpy(buf, ha->dcbx_tlv, count);
822
823	return count;
824}
825
826static struct bin_attribute sysfs_dcbx_tlv_attr = {
827	.attr = {
828		.name = "dcbx_tlv",
829		.mode = S_IRUSR,
830	},
831	.size = 0,
832	.read = qla2x00_sysfs_read_dcbx_tlv,
833};
834
835static struct sysfs_entry {
836	char *name;
837	struct bin_attribute *attr;
838	int is4GBp_only;
839} bin_file_entries[] = {
840	{ "fw_dump", &sysfs_fw_dump_attr, },
841	{ "nvram", &sysfs_nvram_attr, },
842	{ "optrom", &sysfs_optrom_attr, },
843	{ "optrom_ctl", &sysfs_optrom_ctl_attr, },
844	{ "vpd", &sysfs_vpd_attr, 1 },
845	{ "sfp", &sysfs_sfp_attr, 1 },
846	{ "reset", &sysfs_reset_attr, },
847	{ "edc", &sysfs_edc_attr, 2 },
848	{ "edc_status", &sysfs_edc_status_attr, 2 },
849	{ "xgmac_stats", &sysfs_xgmac_stats_attr, 3 },
850	{ "dcbx_tlv", &sysfs_dcbx_tlv_attr, 3 },
851	{ NULL },
852};
853
854void
855qla2x00_alloc_sysfs_attr(scsi_qla_host_t *vha)
856{
857	struct Scsi_Host *host = vha->host;
858	struct sysfs_entry *iter;
859	int ret;
860
861	for (iter = bin_file_entries; iter->name; iter++) {
862		if (iter->is4GBp_only && !IS_FWI2_CAPABLE(vha->hw))
863			continue;
864		if (iter->is4GBp_only == 2 && !IS_QLA25XX(vha->hw))
865			continue;
866		if (iter->is4GBp_only == 3 && !(IS_QLA8XXX_TYPE(vha->hw)))
867			continue;
868
869		ret = sysfs_create_bin_file(&host->shost_gendev.kobj,
870		    iter->attr);
871		if (ret)
872			qla_printk(KERN_INFO, vha->hw,
873			    "Unable to create sysfs %s binary attribute "
874			    "(%d).\n", iter->name, ret);
875	}
876}
877
878void
879qla2x00_free_sysfs_attr(scsi_qla_host_t *vha)
880{
881	struct Scsi_Host *host = vha->host;
882	struct sysfs_entry *iter;
883	struct qla_hw_data *ha = vha->hw;
884
885	for (iter = bin_file_entries; iter->name; iter++) {
886		if (iter->is4GBp_only && !IS_FWI2_CAPABLE(ha))
887			continue;
888		if (iter->is4GBp_only == 2 && !IS_QLA25XX(ha))
889			continue;
890		if (iter->is4GBp_only == 3 && !!(IS_QLA8XXX_TYPE(vha->hw)))
891			continue;
892
893		sysfs_remove_bin_file(&host->shost_gendev.kobj,
894		    iter->attr);
895	}
896
897	if (ha->beacon_blink_led == 1)
898		ha->isp_ops->beacon_off(vha);
899}
900
901/* Scsi_Host attributes. */
902
903static ssize_t
904qla2x00_drvr_version_show(struct device *dev,
905			  struct device_attribute *attr, char *buf)
906{
907	return snprintf(buf, PAGE_SIZE, "%s\n", qla2x00_version_str);
908}
909
910static ssize_t
911qla2x00_fw_version_show(struct device *dev,
912			struct device_attribute *attr, char *buf)
913{
914	scsi_qla_host_t *vha = shost_priv(class_to_shost(dev));
915	struct qla_hw_data *ha = vha->hw;
916	char fw_str[128];
917
918	return snprintf(buf, PAGE_SIZE, "%s\n",
919	    ha->isp_ops->fw_version_str(vha, fw_str));
920}
921
922static ssize_t
923qla2x00_serial_num_show(struct device *dev, struct device_attribute *attr,
924			char *buf)
925{
926	scsi_qla_host_t *vha = shost_priv(class_to_shost(dev));
927	struct qla_hw_data *ha = vha->hw;
928	uint32_t sn;
929
930	if (IS_FWI2_CAPABLE(ha)) {
931		qla2xxx_get_vpd_field(vha, "SN", buf, PAGE_SIZE);
932		return snprintf(buf, PAGE_SIZE, "%s\n", buf);
933	}
934
935	sn = ((ha->serial0 & 0x1f) << 16) | (ha->serial2 << 8) | ha->serial1;
936	return snprintf(buf, PAGE_SIZE, "%c%05d\n", 'A' + sn / 100000,
937	    sn % 100000);
938}
939
940static ssize_t
941qla2x00_isp_name_show(struct device *dev, struct device_attribute *attr,
942		      char *buf)
943{
944	scsi_qla_host_t *vha = shost_priv(class_to_shost(dev));
945	return snprintf(buf, PAGE_SIZE, "ISP%04X\n", vha->hw->pdev->device);
946}
947
948static ssize_t
949qla2x00_isp_id_show(struct device *dev, struct device_attribute *attr,
950		    char *buf)
951{
952	scsi_qla_host_t *vha = shost_priv(class_to_shost(dev));
953	struct qla_hw_data *ha = vha->hw;
954	return snprintf(buf, PAGE_SIZE, "%04x %04x %04x %04x\n",
955	    ha->product_id[0], ha->product_id[1], ha->product_id[2],
956	    ha->product_id[3]);
957}
958
959static ssize_t
960qla2x00_model_name_show(struct device *dev, struct device_attribute *attr,
961			char *buf)
962{
963	scsi_qla_host_t *vha = shost_priv(class_to_shost(dev));
964	return snprintf(buf, PAGE_SIZE, "%s\n", vha->hw->model_number);
965}
966
967static ssize_t
968qla2x00_model_desc_show(struct device *dev, struct device_attribute *attr,
969			char *buf)
970{
971	scsi_qla_host_t *vha = shost_priv(class_to_shost(dev));
972	return snprintf(buf, PAGE_SIZE, "%s\n",
973	    vha->hw->model_desc ? vha->hw->model_desc : "");
974}
975
976static ssize_t
977qla2x00_pci_info_show(struct device *dev, struct device_attribute *attr,
978		      char *buf)
979{
980	scsi_qla_host_t *vha = shost_priv(class_to_shost(dev));
981	char pci_info[30];
982
983	return snprintf(buf, PAGE_SIZE, "%s\n",
984	    vha->hw->isp_ops->pci_info_str(vha, pci_info));
985}
986
987static ssize_t
988qla2x00_link_state_show(struct device *dev, struct device_attribute *attr,
989			char *buf)
990{
991	scsi_qla_host_t *vha = shost_priv(class_to_shost(dev));
992	struct qla_hw_data *ha = vha->hw;
993	int len = 0;
994
995	if (atomic_read(&vha->loop_state) == LOOP_DOWN ||
996	    atomic_read(&vha->loop_state) == LOOP_DEAD ||
997	    vha->device_flags & DFLG_NO_CABLE)
998		len = snprintf(buf, PAGE_SIZE, "Link Down\n");
999	else if (atomic_read(&vha->loop_state) != LOOP_READY ||
1000	    test_bit(ABORT_ISP_ACTIVE, &vha->dpc_flags) ||
1001	    test_bit(ISP_ABORT_NEEDED, &vha->dpc_flags))
1002		len = snprintf(buf, PAGE_SIZE, "Unknown Link State\n");
1003	else {
1004		len = snprintf(buf, PAGE_SIZE, "Link Up - ");
1005
1006		switch (ha->current_topology) {
1007		case ISP_CFG_NL:
1008			len += snprintf(buf + len, PAGE_SIZE-len, "Loop\n");
1009			break;
1010		case ISP_CFG_FL:
1011			len += snprintf(buf + len, PAGE_SIZE-len, "FL_Port\n");
1012			break;
1013		case ISP_CFG_N:
1014			len += snprintf(buf + len, PAGE_SIZE-len,
1015			    "N_Port to N_Port\n");
1016			break;
1017		case ISP_CFG_F:
1018			len += snprintf(buf + len, PAGE_SIZE-len, "F_Port\n");
1019			break;
1020		default:
1021			len += snprintf(buf + len, PAGE_SIZE-len, "Loop\n");
1022			break;
1023		}
1024	}
1025	return len;
1026}
1027
1028static ssize_t
1029qla2x00_zio_show(struct device *dev, struct device_attribute *attr,
1030		 char *buf)
1031{
1032	scsi_qla_host_t *vha = shost_priv(class_to_shost(dev));
1033	int len = 0;
1034
1035	switch (vha->hw->zio_mode) {
1036	case QLA_ZIO_MODE_6:
1037		len += snprintf(buf + len, PAGE_SIZE-len, "Mode 6\n");
1038		break;
1039	case QLA_ZIO_DISABLED:
1040		len += snprintf(buf + len, PAGE_SIZE-len, "Disabled\n");
1041		break;
1042	}
1043	return len;
1044}
1045
1046static ssize_t
1047qla2x00_zio_store(struct device *dev, struct device_attribute *attr,
1048		  const char *buf, size_t count)
1049{
1050	scsi_qla_host_t *vha = shost_priv(class_to_shost(dev));
1051	struct qla_hw_data *ha = vha->hw;
1052	int val = 0;
1053	uint16_t zio_mode;
1054
1055	if (!IS_ZIO_SUPPORTED(ha))
1056		return -ENOTSUPP;
1057
1058	if (sscanf(buf, "%d", &val) != 1)
1059		return -EINVAL;
1060
1061	if (val)
1062		zio_mode = QLA_ZIO_MODE_6;
1063	else
1064		zio_mode = QLA_ZIO_DISABLED;
1065
1066	/* Update per-hba values and queue a reset. */
1067	if (zio_mode != QLA_ZIO_DISABLED || ha->zio_mode != QLA_ZIO_DISABLED) {
1068		ha->zio_mode = zio_mode;
1069		set_bit(ISP_ABORT_NEEDED, &vha->dpc_flags);
1070	}
1071	return strlen(buf);
1072}
1073
1074static ssize_t
1075qla2x00_zio_timer_show(struct device *dev, struct device_attribute *attr,
1076		       char *buf)
1077{
1078	scsi_qla_host_t *vha = shost_priv(class_to_shost(dev));
1079
1080	return snprintf(buf, PAGE_SIZE, "%d us\n", vha->hw->zio_timer * 100);
1081}
1082
1083static ssize_t
1084qla2x00_zio_timer_store(struct device *dev, struct device_attribute *attr,
1085			const char *buf, size_t count)
1086{
1087	scsi_qla_host_t *vha = shost_priv(class_to_shost(dev));
1088	int val = 0;
1089	uint16_t zio_timer;
1090
1091	if (sscanf(buf, "%d", &val) != 1)
1092		return -EINVAL;
1093	if (val > 25500 || val < 100)
1094		return -ERANGE;
1095
1096	zio_timer = (uint16_t)(val / 100);
1097	vha->hw->zio_timer = zio_timer;
1098
1099	return strlen(buf);
1100}
1101
1102static ssize_t
1103qla2x00_beacon_show(struct device *dev, struct device_attribute *attr,
1104		    char *buf)
1105{
1106	scsi_qla_host_t *vha = shost_priv(class_to_shost(dev));
1107	int len = 0;
1108
1109	if (vha->hw->beacon_blink_led)
1110		len += snprintf(buf + len, PAGE_SIZE-len, "Enabled\n");
1111	else
1112		len += snprintf(buf + len, PAGE_SIZE-len, "Disabled\n");
1113	return len;
1114}
1115
1116static ssize_t
1117qla2x00_beacon_store(struct device *dev, struct device_attribute *attr,
1118		     const char *buf, size_t count)
1119{
1120	scsi_qla_host_t *vha = shost_priv(class_to_shost(dev));
1121	struct qla_hw_data *ha = vha->hw;
1122	int val = 0;
1123	int rval;
1124
1125	if (IS_QLA2100(ha) || IS_QLA2200(ha))
1126		return -EPERM;
1127
1128	if (test_bit(ABORT_ISP_ACTIVE, &vha->dpc_flags)) {
1129		qla_printk(KERN_WARNING, ha,
1130		    "Abort ISP active -- ignoring beacon request.\n");
1131		return -EBUSY;
1132	}
1133
1134	if (sscanf(buf, "%d", &val) != 1)
1135		return -EINVAL;
1136
1137	if (val)
1138		rval = ha->isp_ops->beacon_on(vha);
1139	else
1140		rval = ha->isp_ops->beacon_off(vha);
1141
1142	if (rval != QLA_SUCCESS)
1143		count = 0;
1144
1145	return count;
1146}
1147
1148static ssize_t
1149qla2x00_optrom_bios_version_show(struct device *dev,
1150				 struct device_attribute *attr, char *buf)
1151{
1152	scsi_qla_host_t *vha = shost_priv(class_to_shost(dev));
1153	struct qla_hw_data *ha = vha->hw;
1154	return snprintf(buf, PAGE_SIZE, "%d.%02d\n", ha->bios_revision[1],
1155	    ha->bios_revision[0]);
1156}
1157
1158static ssize_t
1159qla2x00_optrom_efi_version_show(struct device *dev,
1160				struct device_attribute *attr, char *buf)
1161{
1162	scsi_qla_host_t *vha = shost_priv(class_to_shost(dev));
1163	struct qla_hw_data *ha = vha->hw;
1164	return snprintf(buf, PAGE_SIZE, "%d.%02d\n", ha->efi_revision[1],
1165	    ha->efi_revision[0]);
1166}
1167
1168static ssize_t
1169qla2x00_optrom_fcode_version_show(struct device *dev,
1170				  struct device_attribute *attr, char *buf)
1171{
1172	scsi_qla_host_t *vha = shost_priv(class_to_shost(dev));
1173	struct qla_hw_data *ha = vha->hw;
1174	return snprintf(buf, PAGE_SIZE, "%d.%02d\n", ha->fcode_revision[1],
1175	    ha->fcode_revision[0]);
1176}
1177
1178static ssize_t
1179qla2x00_optrom_fw_version_show(struct device *dev,
1180			       struct device_attribute *attr, char *buf)
1181{
1182	scsi_qla_host_t *vha = shost_priv(class_to_shost(dev));
1183	struct qla_hw_data *ha = vha->hw;
1184	return snprintf(buf, PAGE_SIZE, "%d.%02d.%02d %d\n",
1185	    ha->fw_revision[0], ha->fw_revision[1], ha->fw_revision[2],
1186	    ha->fw_revision[3]);
1187}
1188
1189static ssize_t
1190qla2x00_optrom_gold_fw_version_show(struct device *dev,
1191    struct device_attribute *attr, char *buf)
1192{
1193	scsi_qla_host_t *vha = shost_priv(class_to_shost(dev));
1194	struct qla_hw_data *ha = vha->hw;
1195
1196	if (!IS_QLA81XX(ha))
1197		return snprintf(buf, PAGE_SIZE, "\n");
1198
1199	return snprintf(buf, PAGE_SIZE, "%d.%02d.%02d (%d)\n",
1200	    ha->gold_fw_version[0], ha->gold_fw_version[1],
1201	    ha->gold_fw_version[2], ha->gold_fw_version[3]);
1202}
1203
1204static ssize_t
1205qla2x00_total_isp_aborts_show(struct device *dev,
1206			      struct device_attribute *attr, char *buf)
1207{
1208	scsi_qla_host_t *vha = shost_priv(class_to_shost(dev));
1209	struct qla_hw_data *ha = vha->hw;
1210	return snprintf(buf, PAGE_SIZE, "%d\n",
1211	    ha->qla_stats.total_isp_aborts);
1212}
1213
1214static ssize_t
1215qla24xx_84xx_fw_version_show(struct device *dev,
1216	struct device_attribute *attr, char *buf)
1217{
1218	int rval = QLA_SUCCESS;
1219	uint16_t status[2] = {0, 0};
1220	scsi_qla_host_t *vha = shost_priv(class_to_shost(dev));
1221	struct qla_hw_data *ha = vha->hw;
1222
1223	if (!IS_QLA84XX(ha))
1224		return snprintf(buf, PAGE_SIZE, "\n");
1225
1226	if (ha->cs84xx->op_fw_version == 0)
1227		rval = qla84xx_verify_chip(vha, status);
1228
1229	if ((rval == QLA_SUCCESS) && (status[0] == 0))
1230		return snprintf(buf, PAGE_SIZE, "%u\n",
1231			(uint32_t)ha->cs84xx->op_fw_version);
1232
1233	return snprintf(buf, PAGE_SIZE, "\n");
1234}
1235
1236static ssize_t
1237qla2x00_mpi_version_show(struct device *dev, struct device_attribute *attr,
1238    char *buf)
1239{
1240	scsi_qla_host_t *vha = shost_priv(class_to_shost(dev));
1241	struct qla_hw_data *ha = vha->hw;
1242
1243	if (!IS_QLA81XX(ha))
1244		return snprintf(buf, PAGE_SIZE, "\n");
1245
1246	return snprintf(buf, PAGE_SIZE, "%d.%02d.%02d (%x)\n",
1247	    ha->mpi_version[0], ha->mpi_version[1], ha->mpi_version[2],
1248	    ha->mpi_capabilities);
1249}
1250
1251static ssize_t
1252qla2x00_phy_version_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	struct qla_hw_data *ha = vha->hw;
1257
1258	if (!IS_QLA81XX(ha))
1259		return snprintf(buf, PAGE_SIZE, "\n");
1260
1261	return snprintf(buf, PAGE_SIZE, "%d.%02d.%02d\n",
1262	    ha->phy_version[0], ha->phy_version[1], ha->phy_version[2]);
1263}
1264
1265static ssize_t
1266qla2x00_flash_block_size_show(struct device *dev,
1267			      struct device_attribute *attr, char *buf)
1268{
1269	scsi_qla_host_t *vha = shost_priv(class_to_shost(dev));
1270	struct qla_hw_data *ha = vha->hw;
1271
1272	return snprintf(buf, PAGE_SIZE, "0x%x\n", ha->fdt_block_size);
1273}
1274
1275static ssize_t
1276qla2x00_vlan_id_show(struct device *dev, struct device_attribute *attr,
1277    char *buf)
1278{
1279	scsi_qla_host_t *vha = shost_priv(class_to_shost(dev));
1280
1281	if (!IS_QLA8XXX_TYPE(vha->hw))
1282		return snprintf(buf, PAGE_SIZE, "\n");
1283
1284	return snprintf(buf, PAGE_SIZE, "%d\n", vha->fcoe_vlan_id);
1285}
1286
1287static ssize_t
1288qla2x00_vn_port_mac_address_show(struct device *dev,
1289    struct device_attribute *attr, char *buf)
1290{
1291	scsi_qla_host_t *vha = shost_priv(class_to_shost(dev));
1292
1293	if (!IS_QLA8XXX_TYPE(vha->hw))
1294		return snprintf(buf, PAGE_SIZE, "\n");
1295
1296	return snprintf(buf, PAGE_SIZE, "%02x:%02x:%02x:%02x:%02x:%02x\n",
1297	    vha->fcoe_vn_port_mac[5], vha->fcoe_vn_port_mac[4],
1298	    vha->fcoe_vn_port_mac[3], vha->fcoe_vn_port_mac[2],
1299	    vha->fcoe_vn_port_mac[1], vha->fcoe_vn_port_mac[0]);
1300}
1301
1302static ssize_t
1303qla2x00_fabric_param_show(struct device *dev, struct device_attribute *attr,
1304    char *buf)
1305{
1306	scsi_qla_host_t *vha = shost_priv(class_to_shost(dev));
1307
1308	return snprintf(buf, PAGE_SIZE, "%d\n", vha->hw->switch_cap);
1309}
1310
1311static ssize_t
1312qla2x00_fw_state_show(struct device *dev, struct device_attribute *attr,
1313    char *buf)
1314{
1315	scsi_qla_host_t *vha = shost_priv(class_to_shost(dev));
1316	int rval = QLA_FUNCTION_FAILED;
1317	uint16_t state[5];
1318
1319	if (test_bit(ABORT_ISP_ACTIVE, &vha->dpc_flags) ||
1320		test_bit(ISP_ABORT_NEEDED, &vha->dpc_flags))
1321		DEBUG2_3_11(printk("%s(%ld): isp reset in progress.\n",
1322			__func__, vha->host_no));
1323	else if (!vha->hw->flags.eeh_busy)
1324		rval = qla2x00_get_firmware_state(vha, state);
1325	if (rval != QLA_SUCCESS)
1326		memset(state, -1, sizeof(state));
1327
1328	return snprintf(buf, PAGE_SIZE, "0x%x 0x%x 0x%x 0x%x 0x%x\n", state[0],
1329	    state[1], state[2], state[3], state[4]);
1330}
1331
1332static DEVICE_ATTR(driver_version, S_IRUGO, qla2x00_drvr_version_show, NULL);
1333static DEVICE_ATTR(fw_version, S_IRUGO, qla2x00_fw_version_show, NULL);
1334static DEVICE_ATTR(serial_num, S_IRUGO, qla2x00_serial_num_show, NULL);
1335static DEVICE_ATTR(isp_name, S_IRUGO, qla2x00_isp_name_show, NULL);
1336static DEVICE_ATTR(isp_id, S_IRUGO, qla2x00_isp_id_show, NULL);
1337static DEVICE_ATTR(model_name, S_IRUGO, qla2x00_model_name_show, NULL);
1338static DEVICE_ATTR(model_desc, S_IRUGO, qla2x00_model_desc_show, NULL);
1339static DEVICE_ATTR(pci_info, S_IRUGO, qla2x00_pci_info_show, NULL);
1340static DEVICE_ATTR(link_state, S_IRUGO, qla2x00_link_state_show, NULL);
1341static DEVICE_ATTR(zio, S_IRUGO | S_IWUSR, qla2x00_zio_show, qla2x00_zio_store);
1342static DEVICE_ATTR(zio_timer, S_IRUGO | S_IWUSR, qla2x00_zio_timer_show,
1343		   qla2x00_zio_timer_store);
1344static DEVICE_ATTR(beacon, S_IRUGO | S_IWUSR, qla2x00_beacon_show,
1345		   qla2x00_beacon_store);
1346static DEVICE_ATTR(optrom_bios_version, S_IRUGO,
1347		   qla2x00_optrom_bios_version_show, NULL);
1348static DEVICE_ATTR(optrom_efi_version, S_IRUGO,
1349		   qla2x00_optrom_efi_version_show, NULL);
1350static DEVICE_ATTR(optrom_fcode_version, S_IRUGO,
1351		   qla2x00_optrom_fcode_version_show, NULL);
1352static DEVICE_ATTR(optrom_fw_version, S_IRUGO, qla2x00_optrom_fw_version_show,
1353		   NULL);
1354static DEVICE_ATTR(optrom_gold_fw_version, S_IRUGO,
1355    qla2x00_optrom_gold_fw_version_show, NULL);
1356static DEVICE_ATTR(84xx_fw_version, S_IRUGO, qla24xx_84xx_fw_version_show,
1357		   NULL);
1358static DEVICE_ATTR(total_isp_aborts, S_IRUGO, qla2x00_total_isp_aborts_show,
1359		   NULL);
1360static DEVICE_ATTR(mpi_version, S_IRUGO, qla2x00_mpi_version_show, NULL);
1361static DEVICE_ATTR(phy_version, S_IRUGO, qla2x00_phy_version_show, NULL);
1362static DEVICE_ATTR(flash_block_size, S_IRUGO, qla2x00_flash_block_size_show,
1363		   NULL);
1364static DEVICE_ATTR(vlan_id, S_IRUGO, qla2x00_vlan_id_show, NULL);
1365static DEVICE_ATTR(vn_port_mac_address, S_IRUGO,
1366		   qla2x00_vn_port_mac_address_show, NULL);
1367static DEVICE_ATTR(fabric_param, S_IRUGO, qla2x00_fabric_param_show, NULL);
1368static DEVICE_ATTR(fw_state, S_IRUGO, qla2x00_fw_state_show, NULL);
1369
1370struct device_attribute *qla2x00_host_attrs[] = {
1371	&dev_attr_driver_version,
1372	&dev_attr_fw_version,
1373	&dev_attr_serial_num,
1374	&dev_attr_isp_name,
1375	&dev_attr_isp_id,
1376	&dev_attr_model_name,
1377	&dev_attr_model_desc,
1378	&dev_attr_pci_info,
1379	&dev_attr_link_state,
1380	&dev_attr_zio,
1381	&dev_attr_zio_timer,
1382	&dev_attr_beacon,
1383	&dev_attr_optrom_bios_version,
1384	&dev_attr_optrom_efi_version,
1385	&dev_attr_optrom_fcode_version,
1386	&dev_attr_optrom_fw_version,
1387	&dev_attr_84xx_fw_version,
1388	&dev_attr_total_isp_aborts,
1389	&dev_attr_mpi_version,
1390	&dev_attr_phy_version,
1391	&dev_attr_flash_block_size,
1392	&dev_attr_vlan_id,
1393	&dev_attr_vn_port_mac_address,
1394	&dev_attr_fabric_param,
1395	&dev_attr_fw_state,
1396	&dev_attr_optrom_gold_fw_version,
1397	NULL,
1398};
1399
1400/* Host attributes. */
1401
1402static void
1403qla2x00_get_host_port_id(struct Scsi_Host *shost)
1404{
1405	scsi_qla_host_t *vha = shost_priv(shost);
1406
1407	fc_host_port_id(shost) = vha->d_id.b.domain << 16 |
1408	    vha->d_id.b.area << 8 | vha->d_id.b.al_pa;
1409}
1410
1411static void
1412qla2x00_get_host_speed(struct Scsi_Host *shost)
1413{
1414	struct qla_hw_data *ha = ((struct scsi_qla_host *)
1415					(shost_priv(shost)))->hw;
1416	u32 speed = FC_PORTSPEED_UNKNOWN;
1417
1418	switch (ha->link_data_rate) {
1419	case PORT_SPEED_1GB:
1420		speed = FC_PORTSPEED_1GBIT;
1421		break;
1422	case PORT_SPEED_2GB:
1423		speed = FC_PORTSPEED_2GBIT;
1424		break;
1425	case PORT_SPEED_4GB:
1426		speed = FC_PORTSPEED_4GBIT;
1427		break;
1428	case PORT_SPEED_8GB:
1429		speed = FC_PORTSPEED_8GBIT;
1430		break;
1431	case PORT_SPEED_10GB:
1432		speed = FC_PORTSPEED_10GBIT;
1433		break;
1434	}
1435	fc_host_speed(shost) = speed;
1436}
1437
1438static void
1439qla2x00_get_host_port_type(struct Scsi_Host *shost)
1440{
1441	scsi_qla_host_t *vha = shost_priv(shost);
1442	uint32_t port_type = FC_PORTTYPE_UNKNOWN;
1443
1444	if (vha->vp_idx) {
1445		fc_host_port_type(shost) = FC_PORTTYPE_NPIV;
1446		return;
1447	}
1448	switch (vha->hw->current_topology) {
1449	case ISP_CFG_NL:
1450		port_type = FC_PORTTYPE_LPORT;
1451		break;
1452	case ISP_CFG_FL:
1453		port_type = FC_PORTTYPE_NLPORT;
1454		break;
1455	case ISP_CFG_N:
1456		port_type = FC_PORTTYPE_PTP;
1457		break;
1458	case ISP_CFG_F:
1459		port_type = FC_PORTTYPE_NPORT;
1460		break;
1461	}
1462	fc_host_port_type(shost) = port_type;
1463}
1464
1465static void
1466qla2x00_get_starget_node_name(struct scsi_target *starget)
1467{
1468	struct Scsi_Host *host = dev_to_shost(starget->dev.parent);
1469	scsi_qla_host_t *vha = shost_priv(host);
1470	fc_port_t *fcport;
1471	u64 node_name = 0;
1472
1473	list_for_each_entry(fcport, &vha->vp_fcports, list) {
1474		if (fcport->rport &&
1475		    starget->id == fcport->rport->scsi_target_id) {
1476			node_name = wwn_to_u64(fcport->node_name);
1477			break;
1478		}
1479	}
1480
1481	fc_starget_node_name(starget) = node_name;
1482}
1483
1484static void
1485qla2x00_get_starget_port_name(struct scsi_target *starget)
1486{
1487	struct Scsi_Host *host = dev_to_shost(starget->dev.parent);
1488	scsi_qla_host_t *vha = shost_priv(host);
1489	fc_port_t *fcport;
1490	u64 port_name = 0;
1491
1492	list_for_each_entry(fcport, &vha->vp_fcports, list) {
1493		if (fcport->rport &&
1494		    starget->id == fcport->rport->scsi_target_id) {
1495			port_name = wwn_to_u64(fcport->port_name);
1496			break;
1497		}
1498	}
1499
1500	fc_starget_port_name(starget) = port_name;
1501}
1502
1503static void
1504qla2x00_get_starget_port_id(struct scsi_target *starget)
1505{
1506	struct Scsi_Host *host = dev_to_shost(starget->dev.parent);
1507	scsi_qla_host_t *vha = shost_priv(host);
1508	fc_port_t *fcport;
1509	uint32_t port_id = ~0U;
1510
1511	list_for_each_entry(fcport, &vha->vp_fcports, list) {
1512		if (fcport->rport &&
1513		    starget->id == fcport->rport->scsi_target_id) {
1514			port_id = fcport->d_id.b.domain << 16 |
1515			    fcport->d_id.b.area << 8 | fcport->d_id.b.al_pa;
1516			break;
1517		}
1518	}
1519
1520	fc_starget_port_id(starget) = port_id;
1521}
1522
1523static void
1524qla2x00_set_rport_loss_tmo(struct fc_rport *rport, uint32_t timeout)
1525{
1526	if (timeout)
1527		rport->dev_loss_tmo = timeout;
1528	else
1529		rport->dev_loss_tmo = 1;
1530}
1531
1532static void
1533qla2x00_dev_loss_tmo_callbk(struct fc_rport *rport)
1534{
1535	struct Scsi_Host *host = rport_to_shost(rport);
1536	fc_port_t *fcport = *(fc_port_t **)rport->dd_data;
1537
1538	if (!fcport)
1539		return;
1540
1541	if (test_bit(ABORT_ISP_ACTIVE, &fcport->vha->dpc_flags))
1542		return;
1543
1544	if (unlikely(pci_channel_offline(fcport->vha->hw->pdev))) {
1545		qla2x00_abort_all_cmds(fcport->vha, DID_NO_CONNECT << 16);
1546		return;
1547	}
1548
1549	/*
1550	 * Transport has effectively 'deleted' the rport, clear
1551	 * all local references.
1552	 */
1553	spin_lock_irq(host->host_lock);
1554	fcport->rport = NULL;
1555	*((fc_port_t **)rport->dd_data) = NULL;
1556	spin_unlock_irq(host->host_lock);
1557}
1558
1559static void
1560qla2x00_terminate_rport_io(struct fc_rport *rport)
1561{
1562	fc_port_t *fcport = *(fc_port_t **)rport->dd_data;
1563
1564	if (!fcport)
1565		return;
1566
1567	if (test_bit(ABORT_ISP_ACTIVE, &fcport->vha->dpc_flags))
1568		return;
1569
1570	if (unlikely(pci_channel_offline(fcport->vha->hw->pdev))) {
1571		qla2x00_abort_all_cmds(fcport->vha, DID_NO_CONNECT << 16);
1572		return;
1573	}
1574	/*
1575	 * At this point all fcport's software-states are cleared.  Perform any
1576	 * final cleanup of firmware resources (PCBs and XCBs).
1577	 */
1578	if (fcport->loop_id != FC_NO_LOOP_ID &&
1579	    !test_bit(UNLOADING, &fcport->vha->dpc_flags))
1580		fcport->vha->hw->isp_ops->fabric_logout(fcport->vha,
1581			fcport->loop_id, fcport->d_id.b.domain,
1582			fcport->d_id.b.area, fcport->d_id.b.al_pa);
1583}
1584
1585static int
1586qla2x00_issue_lip(struct Scsi_Host *shost)
1587{
1588	scsi_qla_host_t *vha = shost_priv(shost);
1589
1590	qla2x00_loop_reset(vha);
1591	return 0;
1592}
1593
1594static struct fc_host_statistics *
1595qla2x00_get_fc_host_stats(struct Scsi_Host *shost)
1596{
1597	scsi_qla_host_t *vha = shost_priv(shost);
1598	struct qla_hw_data *ha = vha->hw;
1599	struct scsi_qla_host *base_vha = pci_get_drvdata(ha->pdev);
1600	int rval;
1601	struct link_statistics *stats;
1602	dma_addr_t stats_dma;
1603	struct fc_host_statistics *pfc_host_stat;
1604
1605	pfc_host_stat = &ha->fc_host_stat;
1606	memset(pfc_host_stat, -1, sizeof(struct fc_host_statistics));
1607
1608	if (test_bit(UNLOADING, &vha->dpc_flags))
1609		goto done;
1610
1611	if (unlikely(pci_channel_offline(ha->pdev)))
1612		goto done;
1613
1614	stats = dma_pool_alloc(ha->s_dma_pool, GFP_KERNEL, &stats_dma);
1615	if (stats == NULL) {
1616		DEBUG2_3_11(printk("%s(%ld): Failed to allocate memory.\n",
1617		    __func__, base_vha->host_no));
1618		goto done;
1619	}
1620	memset(stats, 0, DMA_POOL_SIZE);
1621
1622	rval = QLA_FUNCTION_FAILED;
1623	if (IS_FWI2_CAPABLE(ha)) {
1624		rval = qla24xx_get_isp_stats(base_vha, stats, stats_dma);
1625	} else if (atomic_read(&base_vha->loop_state) == LOOP_READY &&
1626		    !test_bit(ABORT_ISP_ACTIVE, &base_vha->dpc_flags) &&
1627		    !test_bit(ISP_ABORT_NEEDED, &base_vha->dpc_flags) &&
1628		    !ha->dpc_active) {
1629		/* Must be in a 'READY' state for statistics retrieval. */
1630		rval = qla2x00_get_link_status(base_vha, base_vha->loop_id,
1631						stats, stats_dma);
1632	}
1633
1634	if (rval != QLA_SUCCESS)
1635		goto done_free;
1636
1637	pfc_host_stat->link_failure_count = stats->link_fail_cnt;
1638	pfc_host_stat->loss_of_sync_count = stats->loss_sync_cnt;
1639	pfc_host_stat->loss_of_signal_count = stats->loss_sig_cnt;
1640	pfc_host_stat->prim_seq_protocol_err_count = stats->prim_seq_err_cnt;
1641	pfc_host_stat->invalid_tx_word_count = stats->inval_xmit_word_cnt;
1642	pfc_host_stat->invalid_crc_count = stats->inval_crc_cnt;
1643	if (IS_FWI2_CAPABLE(ha)) {
1644		pfc_host_stat->lip_count = stats->lip_cnt;
1645		pfc_host_stat->tx_frames = stats->tx_frames;
1646		pfc_host_stat->rx_frames = stats->rx_frames;
1647		pfc_host_stat->dumped_frames = stats->dumped_frames;
1648		pfc_host_stat->nos_count = stats->nos_rcvd;
1649	}
1650	pfc_host_stat->fcp_input_megabytes = ha->qla_stats.input_bytes >> 20;
1651	pfc_host_stat->fcp_output_megabytes = ha->qla_stats.output_bytes >> 20;
1652
1653done_free:
1654        dma_pool_free(ha->s_dma_pool, stats, stats_dma);
1655done:
1656	return pfc_host_stat;
1657}
1658
1659static void
1660qla2x00_get_host_symbolic_name(struct Scsi_Host *shost)
1661{
1662	scsi_qla_host_t *vha = shost_priv(shost);
1663
1664	qla2x00_get_sym_node_name(vha, fc_host_symbolic_name(shost));
1665}
1666
1667static void
1668qla2x00_set_host_system_hostname(struct Scsi_Host *shost)
1669{
1670	scsi_qla_host_t *vha = shost_priv(shost);
1671
1672	set_bit(REGISTER_FDMI_NEEDED, &vha->dpc_flags);
1673}
1674
1675static void
1676qla2x00_get_host_fabric_name(struct Scsi_Host *shost)
1677{
1678	scsi_qla_host_t *vha = shost_priv(shost);
1679	u64 node_name;
1680
1681	if (vha->device_flags & SWITCH_FOUND)
1682		node_name = wwn_to_u64(vha->fabric_node_name);
1683	else
1684		node_name = wwn_to_u64(vha->node_name);
1685
1686	fc_host_fabric_name(shost) = node_name;
1687}
1688
1689static void
1690qla2x00_get_host_port_state(struct Scsi_Host *shost)
1691{
1692	scsi_qla_host_t *vha = shost_priv(shost);
1693	struct scsi_qla_host *base_vha = pci_get_drvdata(vha->hw->pdev);
1694
1695	if (!base_vha->flags.online)
1696		fc_host_port_state(shost) = FC_PORTSTATE_OFFLINE;
1697	else if (atomic_read(&base_vha->loop_state) == LOOP_TIMEOUT)
1698		fc_host_port_state(shost) = FC_PORTSTATE_UNKNOWN;
1699	else
1700		fc_host_port_state(shost) = FC_PORTSTATE_ONLINE;
1701}
1702
1703static int
1704qla24xx_vport_create(struct fc_vport *fc_vport, bool disable)
1705{
1706	int	ret = 0;
1707	uint8_t	qos = 0;
1708	scsi_qla_host_t *base_vha = shost_priv(fc_vport->shost);
1709	scsi_qla_host_t *vha = NULL;
1710	struct qla_hw_data *ha = base_vha->hw;
1711	uint16_t options = 0;
1712	int	cnt;
1713	struct req_que *req = ha->req_q_map[0];
1714
1715	ret = qla24xx_vport_create_req_sanity_check(fc_vport);
1716	if (ret) {
1717		DEBUG15(printk("qla24xx_vport_create_req_sanity_check failed, "
1718		    "status %x\n", ret));
1719		return (ret);
1720	}
1721
1722	vha = qla24xx_create_vhost(fc_vport);
1723	if (vha == NULL) {
1724		DEBUG15(printk ("qla24xx_create_vhost failed, vha = %p\n",
1725		    vha));
1726		return FC_VPORT_FAILED;
1727	}
1728	if (disable) {
1729		atomic_set(&vha->vp_state, VP_OFFLINE);
1730		fc_vport_set_state(fc_vport, FC_VPORT_DISABLED);
1731	} else
1732		atomic_set(&vha->vp_state, VP_FAILED);
1733
1734	/* ready to create vport */
1735	qla_printk(KERN_INFO, vha->hw, "VP entry id %d assigned.\n",
1736							vha->vp_idx);
1737
1738	/* initialized vport states */
1739	atomic_set(&vha->loop_state, LOOP_DOWN);
1740	vha->vp_err_state=  VP_ERR_PORTDWN;
1741	vha->vp_prev_err_state=  VP_ERR_UNKWN;
1742	/* Check if physical ha port is Up */
1743	if (atomic_read(&base_vha->loop_state) == LOOP_DOWN ||
1744	    atomic_read(&base_vha->loop_state) == LOOP_DEAD) {
1745		/* Don't retry or attempt login of this virtual port */
1746		DEBUG15(printk ("scsi(%ld): pport loop_state is not UP.\n",
1747		    base_vha->host_no));
1748		atomic_set(&vha->loop_state, LOOP_DEAD);
1749		if (!disable)
1750			fc_vport_set_state(fc_vport, FC_VPORT_LINKDOWN);
1751	}
1752
1753	if ((IS_QLA25XX(ha) || IS_QLA81XX(ha)) && ql2xenabledif) {
1754		if (ha->fw_attributes & BIT_4) {
1755			vha->flags.difdix_supported = 1;
1756			DEBUG18(qla_printk(KERN_INFO, ha,
1757			    "Registering for DIF/DIX type 1 and 3"
1758			    " protection.\n"));
1759			scsi_host_set_prot(vha->host,
1760			    SHOST_DIF_TYPE1_PROTECTION
1761			    | SHOST_DIF_TYPE2_PROTECTION
1762			    | SHOST_DIF_TYPE3_PROTECTION
1763			    | SHOST_DIX_TYPE1_PROTECTION
1764			    | SHOST_DIX_TYPE2_PROTECTION
1765			    | SHOST_DIX_TYPE3_PROTECTION);
1766			scsi_host_set_guard(vha->host, SHOST_DIX_GUARD_CRC);
1767		} else
1768			vha->flags.difdix_supported = 0;
1769	}
1770
1771	if (scsi_add_host_with_dma(vha->host, &fc_vport->dev,
1772				   &ha->pdev->dev)) {
1773		DEBUG15(printk("scsi(%ld): scsi_add_host failure for VP[%d].\n",
1774			vha->host_no, vha->vp_idx));
1775		goto vport_create_failed_2;
1776	}
1777
1778	/* initialize attributes */
1779	fc_host_node_name(vha->host) = wwn_to_u64(vha->node_name);
1780	fc_host_port_name(vha->host) = wwn_to_u64(vha->port_name);
1781	fc_host_supported_classes(vha->host) =
1782		fc_host_supported_classes(base_vha->host);
1783	fc_host_supported_speeds(vha->host) =
1784		fc_host_supported_speeds(base_vha->host);
1785
1786	qla24xx_vport_disable(fc_vport, disable);
1787
1788	if (ha->flags.cpu_affinity_enabled) {
1789		req = ha->req_q_map[1];
1790		goto vport_queue;
1791	} else if (ql2xmaxqueues == 1 || !ha->npiv_info)
1792		goto vport_queue;
1793	/* Create a request queue in QoS mode for the vport */
1794	for (cnt = 0; cnt < ha->nvram_npiv_size; cnt++) {
1795		if (memcmp(ha->npiv_info[cnt].port_name, vha->port_name, 8) == 0
1796			&& memcmp(ha->npiv_info[cnt].node_name, vha->node_name,
1797					8) == 0) {
1798			qos = ha->npiv_info[cnt].q_qos;
1799			break;
1800		}
1801	}
1802	if (qos) {
1803		ret = qla25xx_create_req_que(ha, options, vha->vp_idx, 0, 0,
1804			qos);
1805		if (!ret)
1806			qla_printk(KERN_WARNING, ha,
1807			"Can't create request queue for vp_idx:%d\n",
1808			vha->vp_idx);
1809		else {
1810			DEBUG2(qla_printk(KERN_INFO, ha,
1811			"Request Que:%d (QoS: %d) created for vp_idx:%d\n",
1812			ret, qos, vha->vp_idx));
1813			req = ha->req_q_map[ret];
1814		}
1815	}
1816
1817vport_queue:
1818	vha->req = req;
1819	return 0;
1820
1821vport_create_failed_2:
1822	qla24xx_disable_vp(vha);
1823	qla24xx_deallocate_vp_id(vha);
1824	scsi_host_put(vha->host);
1825	return FC_VPORT_FAILED;
1826}
1827
1828static int
1829qla24xx_vport_delete(struct fc_vport *fc_vport)
1830{
1831	scsi_qla_host_t *vha = fc_vport->dd_data;
1832	struct qla_hw_data *ha = vha->hw;
1833	uint16_t id = vha->vp_idx;
1834
1835	while (test_bit(LOOP_RESYNC_ACTIVE, &vha->dpc_flags) ||
1836	    test_bit(FCPORT_UPDATE_NEEDED, &vha->dpc_flags))
1837		msleep(1000);
1838
1839	qla24xx_disable_vp(vha);
1840
1841	vha->flags.delete_progress = 1;
1842
1843	fc_remove_host(vha->host);
1844
1845	scsi_remove_host(vha->host);
1846
1847	if (vha->timer_active) {
1848		qla2x00_vp_stop_timer(vha);
1849		DEBUG15(printk(KERN_INFO "scsi(%ld): timer for the vport[%d]"
1850		" = %p has stopped\n", vha->host_no, vha->vp_idx, vha));
1851	}
1852
1853	qla24xx_deallocate_vp_id(vha);
1854
1855	/* No pending activities shall be there on the vha now */
1856	DEBUG(msleep(random32()%10));  /* Just to see if something falls on
1857					* the net we have placed below */
1858
1859	BUG_ON(atomic_read(&vha->vref_count));
1860
1861	qla2x00_free_fcports(vha);
1862
1863	mutex_lock(&ha->vport_lock);
1864	ha->cur_vport_count--;
1865	clear_bit(vha->vp_idx, ha->vp_idx_map);
1866	mutex_unlock(&ha->vport_lock);
1867
1868	if (vha->req->id && !ha->flags.cpu_affinity_enabled) {
1869		if (qla25xx_delete_req_que(vha, vha->req) != QLA_SUCCESS)
1870			qla_printk(KERN_WARNING, ha,
1871				"Queue delete failed.\n");
1872	}
1873
1874	scsi_host_put(vha->host);
1875	qla_printk(KERN_INFO, ha, "vport %d deleted\n", id);
1876	return 0;
1877}
1878
1879static int
1880qla24xx_vport_disable(struct fc_vport *fc_vport, bool disable)
1881{
1882	scsi_qla_host_t *vha = fc_vport->dd_data;
1883
1884	if (disable)
1885		qla24xx_disable_vp(vha);
1886	else
1887		qla24xx_enable_vp(vha);
1888
1889	return 0;
1890}
1891
1892struct fc_function_template qla2xxx_transport_functions = {
1893
1894	.show_host_node_name = 1,
1895	.show_host_port_name = 1,
1896	.show_host_supported_classes = 1,
1897	.show_host_supported_speeds = 1,
1898
1899	.get_host_port_id = qla2x00_get_host_port_id,
1900	.show_host_port_id = 1,
1901	.get_host_speed = qla2x00_get_host_speed,
1902	.show_host_speed = 1,
1903	.get_host_port_type = qla2x00_get_host_port_type,
1904	.show_host_port_type = 1,
1905	.get_host_symbolic_name = qla2x00_get_host_symbolic_name,
1906	.show_host_symbolic_name = 1,
1907	.set_host_system_hostname = qla2x00_set_host_system_hostname,
1908	.show_host_system_hostname = 1,
1909	.get_host_fabric_name = qla2x00_get_host_fabric_name,
1910	.show_host_fabric_name = 1,
1911	.get_host_port_state = qla2x00_get_host_port_state,
1912	.show_host_port_state = 1,
1913
1914	.dd_fcrport_size = sizeof(struct fc_port *),
1915	.show_rport_supported_classes = 1,
1916
1917	.get_starget_node_name = qla2x00_get_starget_node_name,
1918	.show_starget_node_name = 1,
1919	.get_starget_port_name = qla2x00_get_starget_port_name,
1920	.show_starget_port_name = 1,
1921	.get_starget_port_id  = qla2x00_get_starget_port_id,
1922	.show_starget_port_id = 1,
1923
1924	.set_rport_dev_loss_tmo = qla2x00_set_rport_loss_tmo,
1925	.show_rport_dev_loss_tmo = 1,
1926
1927	.issue_fc_host_lip = qla2x00_issue_lip,
1928	.dev_loss_tmo_callbk = qla2x00_dev_loss_tmo_callbk,
1929	.terminate_rport_io = qla2x00_terminate_rport_io,
1930	.get_fc_host_stats = qla2x00_get_fc_host_stats,
1931
1932	.vport_create = qla24xx_vport_create,
1933	.vport_disable = qla24xx_vport_disable,
1934	.vport_delete = qla24xx_vport_delete,
1935	.bsg_request = qla24xx_bsg_request,
1936	.bsg_timeout = qla24xx_bsg_timeout,
1937};
1938
1939struct fc_function_template qla2xxx_transport_vport_functions = {
1940
1941	.show_host_node_name = 1,
1942	.show_host_port_name = 1,
1943	.show_host_supported_classes = 1,
1944
1945	.get_host_port_id = qla2x00_get_host_port_id,
1946	.show_host_port_id = 1,
1947	.get_host_speed = qla2x00_get_host_speed,
1948	.show_host_speed = 1,
1949	.get_host_port_type = qla2x00_get_host_port_type,
1950	.show_host_port_type = 1,
1951	.get_host_symbolic_name = qla2x00_get_host_symbolic_name,
1952	.show_host_symbolic_name = 1,
1953	.set_host_system_hostname = qla2x00_set_host_system_hostname,
1954	.show_host_system_hostname = 1,
1955	.get_host_fabric_name = qla2x00_get_host_fabric_name,
1956	.show_host_fabric_name = 1,
1957	.get_host_port_state = qla2x00_get_host_port_state,
1958	.show_host_port_state = 1,
1959
1960	.dd_fcrport_size = sizeof(struct fc_port *),
1961	.show_rport_supported_classes = 1,
1962
1963	.get_starget_node_name = qla2x00_get_starget_node_name,
1964	.show_starget_node_name = 1,
1965	.get_starget_port_name = qla2x00_get_starget_port_name,
1966	.show_starget_port_name = 1,
1967	.get_starget_port_id  = qla2x00_get_starget_port_id,
1968	.show_starget_port_id = 1,
1969
1970	.set_rport_dev_loss_tmo = qla2x00_set_rport_loss_tmo,
1971	.show_rport_dev_loss_tmo = 1,
1972
1973	.issue_fc_host_lip = qla2x00_issue_lip,
1974	.dev_loss_tmo_callbk = qla2x00_dev_loss_tmo_callbk,
1975	.terminate_rport_io = qla2x00_terminate_rport_io,
1976	.get_fc_host_stats = qla2x00_get_fc_host_stats,
1977	.bsg_request = qla24xx_bsg_request,
1978	.bsg_timeout = qla24xx_bsg_timeout,
1979};
1980
1981void
1982qla2x00_init_host_attr(scsi_qla_host_t *vha)
1983{
1984	struct qla_hw_data *ha = vha->hw;
1985	u32 speed = FC_PORTSPEED_UNKNOWN;
1986
1987	fc_host_node_name(vha->host) = wwn_to_u64(vha->node_name);
1988	fc_host_port_name(vha->host) = wwn_to_u64(vha->port_name);
1989	fc_host_supported_classes(vha->host) = FC_COS_CLASS3;
1990	fc_host_max_npiv_vports(vha->host) = ha->max_npiv_vports;
1991	fc_host_npiv_vports_inuse(vha->host) = ha->cur_vport_count;
1992
1993	if (IS_QLA8XXX_TYPE(ha))
1994		speed = FC_PORTSPEED_10GBIT;
1995	else if (IS_QLA25XX(ha))
1996		speed = FC_PORTSPEED_8GBIT | FC_PORTSPEED_4GBIT |
1997		    FC_PORTSPEED_2GBIT | FC_PORTSPEED_1GBIT;
1998	else if (IS_QLA24XX_TYPE(ha))
1999		speed = FC_PORTSPEED_4GBIT | FC_PORTSPEED_2GBIT |
2000		    FC_PORTSPEED_1GBIT;
2001	else if (IS_QLA23XX(ha))
2002		speed = FC_PORTSPEED_2GBIT | FC_PORTSPEED_1GBIT;
2003	else
2004		speed = FC_PORTSPEED_1GBIT;
2005	fc_host_supported_speeds(vha->host) = speed;
2006}
2007