GNU Linux-libre 4.9.333-gnu1
[releases.git] / drivers / scsi / qla2xxx / qla_attr.c
1 /*
2  * QLogic Fibre Channel HBA Driver
3  * Copyright (c)  2003-2014 QLogic Corporation
4  *
5  * See LICENSE.qla2xxx for copyright and licensing details.
6  */
7 #include "qla_def.h"
8 #include "qla_target.h"
9
10 #include <linux/kthread.h>
11 #include <linux/vmalloc.h>
12 #include <linux/slab.h>
13 #include <linux/delay.h>
14
15 static int qla24xx_vport_disable(struct fc_vport *, bool);
16
17 /* SYSFS attributes --------------------------------------------------------- */
18
19 static ssize_t
20 qla2x00_sysfs_read_fw_dump(struct file *filp, struct kobject *kobj,
21                            struct bin_attribute *bin_attr,
22                            char *buf, loff_t off, size_t count)
23 {
24         struct scsi_qla_host *vha = shost_priv(dev_to_shost(container_of(kobj,
25             struct device, kobj)));
26         struct qla_hw_data *ha = vha->hw;
27         int rval = 0;
28
29         if (!(ha->fw_dump_reading || ha->mctp_dump_reading))
30                 return 0;
31
32         if (IS_P3P_TYPE(ha)) {
33                 if (off < ha->md_template_size) {
34                         rval = memory_read_from_buffer(buf, count,
35                             &off, ha->md_tmplt_hdr, ha->md_template_size);
36                         return rval;
37                 }
38                 off -= ha->md_template_size;
39                 rval = memory_read_from_buffer(buf, count,
40                     &off, ha->md_dump, ha->md_dump_size);
41                 return rval;
42         } else if (ha->mctp_dumped && ha->mctp_dump_reading)
43                 return memory_read_from_buffer(buf, count, &off, ha->mctp_dump,
44                     MCTP_DUMP_SIZE);
45         else if (ha->fw_dump_reading)
46                 return memory_read_from_buffer(buf, count, &off, ha->fw_dump,
47                                         ha->fw_dump_len);
48         else
49                 return 0;
50 }
51
52 static ssize_t
53 qla2x00_sysfs_write_fw_dump(struct file *filp, struct kobject *kobj,
54                             struct bin_attribute *bin_attr,
55                             char *buf, loff_t off, size_t count)
56 {
57         struct scsi_qla_host *vha = shost_priv(dev_to_shost(container_of(kobj,
58             struct device, kobj)));
59         struct qla_hw_data *ha = vha->hw;
60         int reading;
61
62         if (off != 0)
63                 return (0);
64
65         reading = simple_strtol(buf, NULL, 10);
66         switch (reading) {
67         case 0:
68                 if (!ha->fw_dump_reading)
69                         break;
70
71                 ql_log(ql_log_info, vha, 0x705d,
72                     "Firmware dump cleared on (%ld).\n", vha->host_no);
73
74                 if (IS_P3P_TYPE(ha)) {
75                         qla82xx_md_free(vha);
76                         qla82xx_md_prep(vha);
77                 }
78                 ha->fw_dump_reading = 0;
79                 ha->fw_dumped = 0;
80                 break;
81         case 1:
82                 if (ha->fw_dumped && !ha->fw_dump_reading) {
83                         ha->fw_dump_reading = 1;
84
85                         ql_log(ql_log_info, vha, 0x705e,
86                             "Raw firmware dump ready for read on (%ld).\n",
87                             vha->host_no);
88                 }
89                 break;
90         case 2:
91                 qla2x00_alloc_fw_dump(vha);
92                 break;
93         case 3:
94                 if (IS_QLA82XX(ha)) {
95                         qla82xx_idc_lock(ha);
96                         qla82xx_set_reset_owner(vha);
97                         qla82xx_idc_unlock(ha);
98                 } else if (IS_QLA8044(ha)) {
99                         qla8044_idc_lock(ha);
100                         qla82xx_set_reset_owner(vha);
101                         qla8044_idc_unlock(ha);
102                 } else
103                         qla2x00_system_error(vha);
104                 break;
105         case 4:
106                 if (IS_P3P_TYPE(ha)) {
107                         if (ha->md_tmplt_hdr)
108                                 ql_dbg(ql_dbg_user, vha, 0x705b,
109                                     "MiniDump supported with this firmware.\n");
110                         else
111                                 ql_dbg(ql_dbg_user, vha, 0x709d,
112                                     "MiniDump not supported with this firmware.\n");
113                 }
114                 break;
115         case 5:
116                 if (IS_P3P_TYPE(ha))
117                         set_bit(ISP_ABORT_NEEDED, &vha->dpc_flags);
118                 break;
119         case 6:
120                 if (!ha->mctp_dump_reading)
121                         break;
122                 ql_log(ql_log_info, vha, 0x70c1,
123                     "MCTP dump cleared on (%ld).\n", vha->host_no);
124                 ha->mctp_dump_reading = 0;
125                 ha->mctp_dumped = 0;
126                 break;
127         case 7:
128                 if (ha->mctp_dumped && !ha->mctp_dump_reading) {
129                         ha->mctp_dump_reading = 1;
130                         ql_log(ql_log_info, vha, 0x70c2,
131                             "Raw mctp dump ready for read on (%ld).\n",
132                             vha->host_no);
133                 }
134                 break;
135         }
136         return count;
137 }
138
139 static struct bin_attribute sysfs_fw_dump_attr = {
140         .attr = {
141                 .name = "fw_dump",
142                 .mode = S_IRUSR | S_IWUSR,
143         },
144         .size = 0,
145         .read = qla2x00_sysfs_read_fw_dump,
146         .write = qla2x00_sysfs_write_fw_dump,
147 };
148
149 static ssize_t
150 qla2x00_sysfs_read_nvram(struct file *filp, struct kobject *kobj,
151                          struct bin_attribute *bin_attr,
152                          char *buf, loff_t off, size_t count)
153 {
154         struct scsi_qla_host *vha = shost_priv(dev_to_shost(container_of(kobj,
155             struct device, kobj)));
156         struct qla_hw_data *ha = vha->hw;
157
158         if (!capable(CAP_SYS_ADMIN))
159                 return 0;
160
161         if (IS_NOCACHE_VPD_TYPE(ha))
162                 ha->isp_ops->read_optrom(vha, ha->nvram, ha->flt_region_nvram << 2,
163                     ha->nvram_size);
164         return memory_read_from_buffer(buf, count, &off, ha->nvram,
165                                         ha->nvram_size);
166 }
167
168 static ssize_t
169 qla2x00_sysfs_write_nvram(struct file *filp, struct kobject *kobj,
170                           struct bin_attribute *bin_attr,
171                           char *buf, loff_t off, size_t count)
172 {
173         struct scsi_qla_host *vha = shost_priv(dev_to_shost(container_of(kobj,
174             struct device, kobj)));
175         struct qla_hw_data *ha = vha->hw;
176         uint16_t        cnt;
177
178         if (!capable(CAP_SYS_ADMIN) || off != 0 || count != ha->nvram_size ||
179             !ha->isp_ops->write_nvram)
180                 return -EINVAL;
181
182         /* Checksum NVRAM. */
183         if (IS_FWI2_CAPABLE(ha)) {
184                 uint32_t *iter;
185                 uint32_t chksum;
186
187                 iter = (uint32_t *)buf;
188                 chksum = 0;
189                 for (cnt = 0; cnt < ((count >> 2) - 1); cnt++, iter++)
190                         chksum += le32_to_cpu(*iter);
191                 chksum = ~chksum + 1;
192                 *iter = cpu_to_le32(chksum);
193         } else {
194                 uint8_t *iter;
195                 uint8_t chksum;
196
197                 iter = (uint8_t *)buf;
198                 chksum = 0;
199                 for (cnt = 0; cnt < count - 1; cnt++)
200                         chksum += *iter++;
201                 chksum = ~chksum + 1;
202                 *iter = chksum;
203         }
204
205         if (qla2x00_wait_for_hba_online(vha) != QLA_SUCCESS) {
206                 ql_log(ql_log_warn, vha, 0x705f,
207                     "HBA not online, failing NVRAM update.\n");
208                 return -EAGAIN;
209         }
210
211         /* Write NVRAM. */
212         ha->isp_ops->write_nvram(vha, (uint8_t *)buf, ha->nvram_base, count);
213         ha->isp_ops->read_nvram(vha, (uint8_t *)ha->nvram, ha->nvram_base,
214             count);
215
216         ql_dbg(ql_dbg_user, vha, 0x7060,
217             "Setting ISP_ABORT_NEEDED\n");
218         /* NVRAM settings take effect immediately. */
219         set_bit(ISP_ABORT_NEEDED, &vha->dpc_flags);
220         qla2xxx_wake_dpc(vha);
221         qla2x00_wait_for_chip_reset(vha);
222
223         return count;
224 }
225
226 static struct bin_attribute sysfs_nvram_attr = {
227         .attr = {
228                 .name = "nvram",
229                 .mode = S_IRUSR | S_IWUSR,
230         },
231         .size = 512,
232         .read = qla2x00_sysfs_read_nvram,
233         .write = qla2x00_sysfs_write_nvram,
234 };
235
236 static ssize_t
237 qla2x00_sysfs_read_optrom(struct file *filp, struct kobject *kobj,
238                           struct bin_attribute *bin_attr,
239                           char *buf, loff_t off, size_t count)
240 {
241         struct scsi_qla_host *vha = shost_priv(dev_to_shost(container_of(kobj,
242             struct device, kobj)));
243         struct qla_hw_data *ha = vha->hw;
244         ssize_t rval = 0;
245
246         mutex_lock(&ha->optrom_mutex);
247
248         if (ha->optrom_state != QLA_SREADING)
249                 goto out;
250
251         rval = memory_read_from_buffer(buf, count, &off, ha->optrom_buffer,
252             ha->optrom_region_size);
253
254 out:
255         mutex_unlock(&ha->optrom_mutex);
256
257         return rval;
258 }
259
260 static ssize_t
261 qla2x00_sysfs_write_optrom(struct file *filp, struct kobject *kobj,
262                            struct bin_attribute *bin_attr,
263                            char *buf, loff_t off, size_t count)
264 {
265         struct scsi_qla_host *vha = shost_priv(dev_to_shost(container_of(kobj,
266             struct device, kobj)));
267         struct qla_hw_data *ha = vha->hw;
268
269         mutex_lock(&ha->optrom_mutex);
270
271         if (ha->optrom_state != QLA_SWRITING) {
272                 mutex_unlock(&ha->optrom_mutex);
273                 return -EINVAL;
274         }
275         if (off > ha->optrom_region_size) {
276                 mutex_unlock(&ha->optrom_mutex);
277                 return -ERANGE;
278         }
279         if (off + count > ha->optrom_region_size)
280                 count = ha->optrom_region_size - off;
281
282         memcpy(&ha->optrom_buffer[off], buf, count);
283         mutex_unlock(&ha->optrom_mutex);
284
285         return count;
286 }
287
288 static struct bin_attribute sysfs_optrom_attr = {
289         .attr = {
290                 .name = "optrom",
291                 .mode = S_IRUSR | S_IWUSR,
292         },
293         .size = 0,
294         .read = qla2x00_sysfs_read_optrom,
295         .write = qla2x00_sysfs_write_optrom,
296 };
297
298 static ssize_t
299 qla2x00_sysfs_write_optrom_ctl(struct file *filp, struct kobject *kobj,
300                                struct bin_attribute *bin_attr,
301                                char *buf, loff_t off, size_t count)
302 {
303         struct scsi_qla_host *vha = shost_priv(dev_to_shost(container_of(kobj,
304             struct device, kobj)));
305         struct qla_hw_data *ha = vha->hw;
306         uint32_t start = 0;
307         uint32_t size = ha->optrom_size;
308         int val, valid;
309         ssize_t rval = count;
310
311         if (off)
312                 return -EINVAL;
313
314         if (unlikely(pci_channel_offline(ha->pdev)))
315                 return -EAGAIN;
316
317         if (sscanf(buf, "%d:%x:%x", &val, &start, &size) < 1)
318                 return -EINVAL;
319         if (start > ha->optrom_size)
320                 return -EINVAL;
321         if (size > ha->optrom_size - start)
322                 size = ha->optrom_size - start;
323
324         mutex_lock(&ha->optrom_mutex);
325         switch (val) {
326         case 0:
327                 if (ha->optrom_state != QLA_SREADING &&
328                     ha->optrom_state != QLA_SWRITING) {
329                         rval =  -EINVAL;
330                         goto out;
331                 }
332                 ha->optrom_state = QLA_SWAITING;
333
334                 ql_dbg(ql_dbg_user, vha, 0x7061,
335                     "Freeing flash region allocation -- 0x%x bytes.\n",
336                     ha->optrom_region_size);
337
338                 vfree(ha->optrom_buffer);
339                 ha->optrom_buffer = NULL;
340                 break;
341         case 1:
342                 if (ha->optrom_state != QLA_SWAITING) {
343                         rval = -EINVAL;
344                         goto out;
345                 }
346
347                 ha->optrom_region_start = start;
348                 ha->optrom_region_size = size;
349
350                 ha->optrom_state = QLA_SREADING;
351                 ha->optrom_buffer = vmalloc(ha->optrom_region_size);
352                 if (ha->optrom_buffer == NULL) {
353                         ql_log(ql_log_warn, vha, 0x7062,
354                             "Unable to allocate memory for optrom retrieval "
355                             "(%x).\n", ha->optrom_region_size);
356
357                         ha->optrom_state = QLA_SWAITING;
358                         rval = -ENOMEM;
359                         goto out;
360                 }
361
362                 if (qla2x00_wait_for_hba_online(vha) != QLA_SUCCESS) {
363                         ql_log(ql_log_warn, vha, 0x7063,
364                             "HBA not online, failing NVRAM update.\n");
365                         rval = -EAGAIN;
366                         goto out;
367                 }
368
369                 ql_dbg(ql_dbg_user, vha, 0x7064,
370                     "Reading flash region -- 0x%x/0x%x.\n",
371                     ha->optrom_region_start, ha->optrom_region_size);
372
373                 memset(ha->optrom_buffer, 0, ha->optrom_region_size);
374                 ha->isp_ops->read_optrom(vha, ha->optrom_buffer,
375                     ha->optrom_region_start, ha->optrom_region_size);
376                 break;
377         case 2:
378                 if (ha->optrom_state != QLA_SWAITING) {
379                         rval = -EINVAL;
380                         goto out;
381                 }
382
383                 /*
384                  * We need to be more restrictive on which FLASH regions are
385                  * allowed to be updated via user-space.  Regions accessible
386                  * via this method include:
387                  *
388                  * ISP21xx/ISP22xx/ISP23xx type boards:
389                  *
390                  *      0x000000 -> 0x020000 -- Boot code.
391                  *
392                  * ISP2322/ISP24xx type boards:
393                  *
394                  *      0x000000 -> 0x07ffff -- Boot code.
395                  *      0x080000 -> 0x0fffff -- Firmware.
396                  *
397                  * ISP25xx type boards:
398                  *
399                  *      0x000000 -> 0x07ffff -- Boot code.
400                  *      0x080000 -> 0x0fffff -- Firmware.
401                  *      0x120000 -> 0x12ffff -- VPD and HBA parameters.
402                  */
403                 valid = 0;
404                 if (ha->optrom_size == OPTROM_SIZE_2300 && start == 0)
405                         valid = 1;
406                 else if (start == (ha->flt_region_boot * 4) ||
407                     start == (ha->flt_region_fw * 4))
408                         valid = 1;
409                 else if (IS_QLA24XX_TYPE(ha) || IS_QLA25XX(ha)
410                         || IS_CNA_CAPABLE(ha) || IS_QLA2031(ha)
411                         || IS_QLA27XX(ha))
412                         valid = 1;
413                 if (!valid) {
414                         ql_log(ql_log_warn, vha, 0x7065,
415                             "Invalid start region 0x%x/0x%x.\n", start, size);
416                         rval = -EINVAL;
417                         goto out;
418                 }
419
420                 ha->optrom_region_start = start;
421                 ha->optrom_region_size = size;
422
423                 ha->optrom_state = QLA_SWRITING;
424                 ha->optrom_buffer = vmalloc(ha->optrom_region_size);
425                 if (ha->optrom_buffer == NULL) {
426                         ql_log(ql_log_warn, vha, 0x7066,
427                             "Unable to allocate memory for optrom update "
428                             "(%x)\n", ha->optrom_region_size);
429
430                         ha->optrom_state = QLA_SWAITING;
431                         rval = -ENOMEM;
432                         goto out;
433                 }
434
435                 ql_dbg(ql_dbg_user, vha, 0x7067,
436                     "Staging flash region write -- 0x%x/0x%x.\n",
437                     ha->optrom_region_start, ha->optrom_region_size);
438
439                 memset(ha->optrom_buffer, 0, ha->optrom_region_size);
440                 break;
441         case 3:
442                 if (ha->optrom_state != QLA_SWRITING) {
443                         rval = -EINVAL;
444                         goto out;
445                 }
446
447                 if (qla2x00_wait_for_hba_online(vha) != QLA_SUCCESS) {
448                         ql_log(ql_log_warn, vha, 0x7068,
449                             "HBA not online, failing flash update.\n");
450                         rval = -EAGAIN;
451                         goto out;
452                 }
453
454                 ql_dbg(ql_dbg_user, vha, 0x7069,
455                     "Writing flash region -- 0x%x/0x%x.\n",
456                     ha->optrom_region_start, ha->optrom_region_size);
457
458                 ha->isp_ops->write_optrom(vha, ha->optrom_buffer,
459                     ha->optrom_region_start, ha->optrom_region_size);
460                 break;
461         default:
462                 rval = -EINVAL;
463         }
464
465 out:
466         mutex_unlock(&ha->optrom_mutex);
467         return rval;
468 }
469
470 static struct bin_attribute sysfs_optrom_ctl_attr = {
471         .attr = {
472                 .name = "optrom_ctl",
473                 .mode = S_IWUSR,
474         },
475         .size = 0,
476         .write = qla2x00_sysfs_write_optrom_ctl,
477 };
478
479 static ssize_t
480 qla2x00_sysfs_read_vpd(struct file *filp, struct kobject *kobj,
481                        struct bin_attribute *bin_attr,
482                        char *buf, loff_t off, size_t count)
483 {
484         struct scsi_qla_host *vha = shost_priv(dev_to_shost(container_of(kobj,
485             struct device, kobj)));
486         struct qla_hw_data *ha = vha->hw;
487         uint32_t faddr;
488
489         if (unlikely(pci_channel_offline(ha->pdev)))
490                 return -EAGAIN;
491
492         if (!capable(CAP_SYS_ADMIN))
493                 return -EINVAL;
494
495         if (IS_NOCACHE_VPD_TYPE(ha)) {
496                 faddr = ha->flt_region_vpd << 2;
497
498                 if (IS_QLA27XX(ha) &&
499                     qla27xx_find_valid_image(vha) == QLA27XX_SECONDARY_IMAGE)
500                         faddr = ha->flt_region_vpd_sec << 2;
501
502                 ha->isp_ops->read_optrom(vha, ha->vpd, faddr,
503                     ha->vpd_size);
504         }
505         return memory_read_from_buffer(buf, count, &off, ha->vpd, ha->vpd_size);
506 }
507
508 static ssize_t
509 qla2x00_sysfs_write_vpd(struct file *filp, struct kobject *kobj,
510                         struct bin_attribute *bin_attr,
511                         char *buf, loff_t off, size_t count)
512 {
513         struct scsi_qla_host *vha = shost_priv(dev_to_shost(container_of(kobj,
514             struct device, kobj)));
515         struct qla_hw_data *ha = vha->hw;
516         uint8_t *tmp_data;
517
518         if (unlikely(pci_channel_offline(ha->pdev)))
519                 return 0;
520
521         if (!capable(CAP_SYS_ADMIN) || off != 0 || count != ha->vpd_size ||
522             !ha->isp_ops->write_nvram)
523                 return 0;
524
525         if (qla2x00_wait_for_hba_online(vha) != QLA_SUCCESS) {
526                 ql_log(ql_log_warn, vha, 0x706a,
527                     "HBA not online, failing VPD update.\n");
528                 return -EAGAIN;
529         }
530
531         /* Write NVRAM. */
532         ha->isp_ops->write_nvram(vha, (uint8_t *)buf, ha->vpd_base, count);
533         ha->isp_ops->read_nvram(vha, (uint8_t *)ha->vpd, ha->vpd_base, count);
534
535         /* Update flash version information for 4Gb & above. */
536         if (!IS_FWI2_CAPABLE(ha))
537                 return -EINVAL;
538
539         tmp_data = vmalloc(256);
540         if (!tmp_data) {
541                 ql_log(ql_log_warn, vha, 0x706b,
542                     "Unable to allocate memory for VPD information update.\n");
543                 return -ENOMEM;
544         }
545         ha->isp_ops->get_flash_version(vha, tmp_data);
546         vfree(tmp_data);
547
548         return count;
549 }
550
551 static struct bin_attribute sysfs_vpd_attr = {
552         .attr = {
553                 .name = "vpd",
554                 .mode = S_IRUSR | S_IWUSR,
555         },
556         .size = 0,
557         .read = qla2x00_sysfs_read_vpd,
558         .write = qla2x00_sysfs_write_vpd,
559 };
560
561 static ssize_t
562 qla2x00_sysfs_read_sfp(struct file *filp, struct kobject *kobj,
563                        struct bin_attribute *bin_attr,
564                        char *buf, loff_t off, size_t count)
565 {
566         struct scsi_qla_host *vha = shost_priv(dev_to_shost(container_of(kobj,
567             struct device, kobj)));
568         struct qla_hw_data *ha = vha->hw;
569         uint16_t iter, addr, offset;
570         int rval;
571
572         if (!capable(CAP_SYS_ADMIN) || off != 0 || count != SFP_DEV_SIZE * 2)
573                 return 0;
574
575         if (ha->sfp_data)
576                 goto do_read;
577
578         ha->sfp_data = dma_pool_alloc(ha->s_dma_pool, GFP_KERNEL,
579             &ha->sfp_data_dma);
580         if (!ha->sfp_data) {
581                 ql_log(ql_log_warn, vha, 0x706c,
582                     "Unable to allocate memory for SFP read-data.\n");
583                 return 0;
584         }
585
586 do_read:
587         memset(ha->sfp_data, 0, SFP_BLOCK_SIZE);
588         addr = 0xa0;
589         for (iter = 0, offset = 0; iter < (SFP_DEV_SIZE * 2) / SFP_BLOCK_SIZE;
590             iter++, offset += SFP_BLOCK_SIZE) {
591                 if (iter == 4) {
592                         /* Skip to next device address. */
593                         addr = 0xa2;
594                         offset = 0;
595                 }
596
597                 rval = qla2x00_read_sfp(vha, ha->sfp_data_dma, ha->sfp_data,
598                     addr, offset, SFP_BLOCK_SIZE, BIT_1);
599                 if (rval != QLA_SUCCESS) {
600                         ql_log(ql_log_warn, vha, 0x706d,
601                             "Unable to read SFP data (%x/%x/%x).\n", rval,
602                             addr, offset);
603
604                         return -EIO;
605                 }
606                 memcpy(buf, ha->sfp_data, SFP_BLOCK_SIZE);
607                 buf += SFP_BLOCK_SIZE;
608         }
609
610         return count;
611 }
612
613 static struct bin_attribute sysfs_sfp_attr = {
614         .attr = {
615                 .name = "sfp",
616                 .mode = S_IRUSR | S_IWUSR,
617         },
618         .size = SFP_DEV_SIZE * 2,
619         .read = qla2x00_sysfs_read_sfp,
620 };
621
622 static ssize_t
623 qla2x00_sysfs_write_reset(struct file *filp, struct kobject *kobj,
624                         struct bin_attribute *bin_attr,
625                         char *buf, loff_t off, size_t count)
626 {
627         struct scsi_qla_host *vha = shost_priv(dev_to_shost(container_of(kobj,
628             struct device, kobj)));
629         struct qla_hw_data *ha = vha->hw;
630         struct scsi_qla_host *base_vha = pci_get_drvdata(ha->pdev);
631         int type;
632         uint32_t idc_control;
633         uint8_t *tmp_data = NULL;
634         if (off != 0)
635                 return -EINVAL;
636
637         type = simple_strtol(buf, NULL, 10);
638         switch (type) {
639         case 0x2025c:
640                 ql_log(ql_log_info, vha, 0x706e,
641                     "Issuing ISP reset.\n");
642
643                 scsi_block_requests(vha->host);
644                 if (IS_QLA82XX(ha)) {
645                         ha->flags.isp82xx_no_md_cap = 1;
646                         qla82xx_idc_lock(ha);
647                         qla82xx_set_reset_owner(vha);
648                         qla82xx_idc_unlock(ha);
649                 } else if (IS_QLA8044(ha)) {
650                         qla8044_idc_lock(ha);
651                         idc_control = qla8044_rd_reg(ha,
652                             QLA8044_IDC_DRV_CTRL);
653                         qla8044_wr_reg(ha, QLA8044_IDC_DRV_CTRL,
654                             (idc_control | GRACEFUL_RESET_BIT1));
655                         qla82xx_set_reset_owner(vha);
656                         qla8044_idc_unlock(ha);
657                 } else {
658                         set_bit(ISP_ABORT_NEEDED, &vha->dpc_flags);
659                         qla2xxx_wake_dpc(vha);
660                 }
661                 qla2x00_wait_for_chip_reset(vha);
662                 scsi_unblock_requests(vha->host);
663                 break;
664         case 0x2025d:
665                 if (!IS_QLA81XX(ha) && !IS_QLA83XX(ha))
666                         return -EPERM;
667
668                 ql_log(ql_log_info, vha, 0x706f,
669                     "Issuing MPI reset.\n");
670
671                 if (IS_QLA83XX(ha) || IS_QLA27XX(ha)) {
672                         uint32_t idc_control;
673
674                         qla83xx_idc_lock(vha, 0);
675                         __qla83xx_get_idc_control(vha, &idc_control);
676                         idc_control |= QLA83XX_IDC_GRACEFUL_RESET;
677                         __qla83xx_set_idc_control(vha, idc_control);
678                         qla83xx_wr_reg(vha, QLA83XX_IDC_DEV_STATE,
679                             QLA8XXX_DEV_NEED_RESET);
680                         qla83xx_idc_audit(vha, IDC_AUDIT_TIMESTAMP);
681                         qla83xx_idc_unlock(vha, 0);
682                         break;
683                 } else {
684                         /* Make sure FC side is not in reset */
685                         WARN_ON_ONCE(qla2x00_wait_for_hba_online(vha) !=
686                                      QLA_SUCCESS);
687
688                         /* Issue MPI reset */
689                         scsi_block_requests(vha->host);
690                         if (qla81xx_restart_mpi_firmware(vha) != QLA_SUCCESS)
691                                 ql_log(ql_log_warn, vha, 0x7070,
692                                     "MPI reset failed.\n");
693                         scsi_unblock_requests(vha->host);
694                         break;
695                 }
696         case 0x2025e:
697                 if (!IS_P3P_TYPE(ha) || vha != base_vha) {
698                         ql_log(ql_log_info, vha, 0x7071,
699                             "FCoE ctx reset no supported.\n");
700                         return -EPERM;
701                 }
702
703                 ql_log(ql_log_info, vha, 0x7072,
704                     "Issuing FCoE ctx reset.\n");
705                 set_bit(FCOE_CTX_RESET_NEEDED, &vha->dpc_flags);
706                 qla2xxx_wake_dpc(vha);
707                 qla2x00_wait_for_fcoe_ctx_reset(vha);
708                 break;
709         case 0x2025f:
710                 if (!IS_QLA8031(ha))
711                         return -EPERM;
712                 ql_log(ql_log_info, vha, 0x70bc,
713                     "Disabling Reset by IDC control\n");
714                 qla83xx_idc_lock(vha, 0);
715                 __qla83xx_get_idc_control(vha, &idc_control);
716                 idc_control |= QLA83XX_IDC_RESET_DISABLED;
717                 __qla83xx_set_idc_control(vha, idc_control);
718                 qla83xx_idc_unlock(vha, 0);
719                 break;
720         case 0x20260:
721                 if (!IS_QLA8031(ha))
722                         return -EPERM;
723                 ql_log(ql_log_info, vha, 0x70bd,
724                     "Enabling Reset by IDC control\n");
725                 qla83xx_idc_lock(vha, 0);
726                 __qla83xx_get_idc_control(vha, &idc_control);
727                 idc_control &= ~QLA83XX_IDC_RESET_DISABLED;
728                 __qla83xx_set_idc_control(vha, idc_control);
729                 qla83xx_idc_unlock(vha, 0);
730                 break;
731         case 0x20261:
732                 ql_dbg(ql_dbg_user, vha, 0x70e0,
733                     "Updating cache versions without reset ");
734
735                 tmp_data = vmalloc(256);
736                 if (!tmp_data) {
737                         ql_log(ql_log_warn, vha, 0x70e1,
738                             "Unable to allocate memory for VPD information update.\n");
739                         return -ENOMEM;
740                 }
741                 ha->isp_ops->get_flash_version(vha, tmp_data);
742                 vfree(tmp_data);
743                 break;
744         }
745         return count;
746 }
747
748 static struct bin_attribute sysfs_reset_attr = {
749         .attr = {
750                 .name = "reset",
751                 .mode = S_IWUSR,
752         },
753         .size = 0,
754         .write = qla2x00_sysfs_write_reset,
755 };
756
757 static ssize_t
758 qla2x00_issue_logo(struct file *filp, struct kobject *kobj,
759                         struct bin_attribute *bin_attr,
760                         char *buf, loff_t off, size_t count)
761 {
762         struct scsi_qla_host *vha = shost_priv(dev_to_shost(container_of(kobj,
763             struct device, kobj)));
764         int type;
765         int rval = 0;
766         port_id_t did;
767
768         type = simple_strtol(buf, NULL, 10);
769
770         did.b.domain = (type & 0x00ff0000) >> 16;
771         did.b.area = (type & 0x0000ff00) >> 8;
772         did.b.al_pa = (type & 0x000000ff);
773
774         ql_log(ql_log_info, vha, 0x70e3, "portid=%02x%02x%02x done\n",
775             did.b.domain, did.b.area, did.b.al_pa);
776
777         ql_log(ql_log_info, vha, 0x70e4, "%s: %d\n", __func__, type);
778
779         rval = qla24xx_els_dcmd_iocb(vha, ELS_DCMD_LOGO, did);
780         return count;
781 }
782
783 static struct bin_attribute sysfs_issue_logo_attr = {
784         .attr = {
785                 .name = "issue_logo",
786                 .mode = S_IWUSR,
787         },
788         .size = 0,
789         .write = qla2x00_issue_logo,
790 };
791
792 static ssize_t
793 qla2x00_sysfs_read_xgmac_stats(struct file *filp, struct kobject *kobj,
794                        struct bin_attribute *bin_attr,
795                        char *buf, loff_t off, size_t count)
796 {
797         struct scsi_qla_host *vha = shost_priv(dev_to_shost(container_of(kobj,
798             struct device, kobj)));
799         struct qla_hw_data *ha = vha->hw;
800         int rval;
801         uint16_t actual_size;
802
803         if (!capable(CAP_SYS_ADMIN) || off != 0 || count > XGMAC_DATA_SIZE)
804                 return 0;
805
806         if (ha->xgmac_data)
807                 goto do_read;
808
809         ha->xgmac_data = dma_alloc_coherent(&ha->pdev->dev, XGMAC_DATA_SIZE,
810             &ha->xgmac_data_dma, GFP_KERNEL);
811         if (!ha->xgmac_data) {
812                 ql_log(ql_log_warn, vha, 0x7076,
813                     "Unable to allocate memory for XGMAC read-data.\n");
814                 return 0;
815         }
816
817 do_read:
818         actual_size = 0;
819         memset(ha->xgmac_data, 0, XGMAC_DATA_SIZE);
820
821         rval = qla2x00_get_xgmac_stats(vha, ha->xgmac_data_dma,
822             XGMAC_DATA_SIZE, &actual_size);
823         if (rval != QLA_SUCCESS) {
824                 ql_log(ql_log_warn, vha, 0x7077,
825                     "Unable to read XGMAC data (%x).\n", rval);
826                 count = 0;
827         }
828
829         count = actual_size > count ? count: actual_size;
830         memcpy(buf, ha->xgmac_data, count);
831
832         return count;
833 }
834
835 static struct bin_attribute sysfs_xgmac_stats_attr = {
836         .attr = {
837                 .name = "xgmac_stats",
838                 .mode = S_IRUSR,
839         },
840         .size = 0,
841         .read = qla2x00_sysfs_read_xgmac_stats,
842 };
843
844 static ssize_t
845 qla2x00_sysfs_read_dcbx_tlv(struct file *filp, struct kobject *kobj,
846                        struct bin_attribute *bin_attr,
847                        char *buf, loff_t off, size_t count)
848 {
849         struct scsi_qla_host *vha = shost_priv(dev_to_shost(container_of(kobj,
850             struct device, kobj)));
851         struct qla_hw_data *ha = vha->hw;
852         int rval;
853
854         if (!capable(CAP_SYS_ADMIN) || off != 0 || count > DCBX_TLV_DATA_SIZE)
855                 return 0;
856
857         if (ha->dcbx_tlv)
858                 goto do_read;
859
860         ha->dcbx_tlv = dma_alloc_coherent(&ha->pdev->dev, DCBX_TLV_DATA_SIZE,
861             &ha->dcbx_tlv_dma, GFP_KERNEL);
862         if (!ha->dcbx_tlv) {
863                 ql_log(ql_log_warn, vha, 0x7078,
864                     "Unable to allocate memory for DCBX TLV read-data.\n");
865                 return -ENOMEM;
866         }
867
868 do_read:
869         memset(ha->dcbx_tlv, 0, DCBX_TLV_DATA_SIZE);
870
871         rval = qla2x00_get_dcbx_params(vha, ha->dcbx_tlv_dma,
872             DCBX_TLV_DATA_SIZE);
873         if (rval != QLA_SUCCESS) {
874                 ql_log(ql_log_warn, vha, 0x7079,
875                     "Unable to read DCBX TLV (%x).\n", rval);
876                 return -EIO;
877         }
878
879         memcpy(buf, ha->dcbx_tlv, count);
880
881         return count;
882 }
883
884 static struct bin_attribute sysfs_dcbx_tlv_attr = {
885         .attr = {
886                 .name = "dcbx_tlv",
887                 .mode = S_IRUSR,
888         },
889         .size = 0,
890         .read = qla2x00_sysfs_read_dcbx_tlv,
891 };
892
893 static struct sysfs_entry {
894         char *name;
895         struct bin_attribute *attr;
896         int is4GBp_only;
897 } bin_file_entries[] = {
898         { "fw_dump", &sysfs_fw_dump_attr, },
899         { "nvram", &sysfs_nvram_attr, },
900         { "optrom", &sysfs_optrom_attr, },
901         { "optrom_ctl", &sysfs_optrom_ctl_attr, },
902         { "vpd", &sysfs_vpd_attr, 1 },
903         { "sfp", &sysfs_sfp_attr, 1 },
904         { "reset", &sysfs_reset_attr, },
905         { "issue_logo", &sysfs_issue_logo_attr, },
906         { "xgmac_stats", &sysfs_xgmac_stats_attr, 3 },
907         { "dcbx_tlv", &sysfs_dcbx_tlv_attr, 3 },
908         { NULL },
909 };
910
911 void
912 qla2x00_alloc_sysfs_attr(scsi_qla_host_t *vha)
913 {
914         struct Scsi_Host *host = vha->host;
915         struct sysfs_entry *iter;
916         int ret;
917
918         for (iter = bin_file_entries; iter->name; iter++) {
919                 if (iter->is4GBp_only && !IS_FWI2_CAPABLE(vha->hw))
920                         continue;
921                 if (iter->is4GBp_only == 2 && !IS_QLA25XX(vha->hw))
922                         continue;
923                 if (iter->is4GBp_only == 3 && !(IS_CNA_CAPABLE(vha->hw)))
924                         continue;
925
926                 ret = sysfs_create_bin_file(&host->shost_gendev.kobj,
927                     iter->attr);
928                 if (ret)
929                         ql_log(ql_log_warn, vha, 0x00f3,
930                             "Unable to create sysfs %s binary attribute (%d).\n",
931                             iter->name, ret);
932                 else
933                         ql_dbg(ql_dbg_init, vha, 0x00f4,
934                             "Successfully created sysfs %s binary attribure.\n",
935                             iter->name);
936         }
937 }
938
939 void
940 qla2x00_free_sysfs_attr(scsi_qla_host_t *vha, bool stop_beacon)
941 {
942         struct Scsi_Host *host = vha->host;
943         struct sysfs_entry *iter;
944         struct qla_hw_data *ha = vha->hw;
945
946         for (iter = bin_file_entries; iter->name; iter++) {
947                 if (iter->is4GBp_only && !IS_FWI2_CAPABLE(ha))
948                         continue;
949                 if (iter->is4GBp_only == 2 && !IS_QLA25XX(ha))
950                         continue;
951                 if (iter->is4GBp_only == 3 && !(IS_CNA_CAPABLE(vha->hw)))
952                         continue;
953                 if (iter->is4GBp_only == 0x27 && !IS_QLA27XX(vha->hw))
954                         continue;
955
956                 sysfs_remove_bin_file(&host->shost_gendev.kobj,
957                     iter->attr);
958         }
959
960         if (stop_beacon && ha->beacon_blink_led == 1)
961                 ha->isp_ops->beacon_off(vha);
962 }
963
964 /* Scsi_Host attributes. */
965
966 static ssize_t
967 qla2x00_drvr_version_show(struct device *dev,
968                           struct device_attribute *attr, char *buf)
969 {
970         return scnprintf(buf, PAGE_SIZE, "%s\n", qla2x00_version_str);
971 }
972
973 static ssize_t
974 qla2x00_fw_version_show(struct device *dev,
975                         struct device_attribute *attr, char *buf)
976 {
977         scsi_qla_host_t *vha = shost_priv(class_to_shost(dev));
978         struct qla_hw_data *ha = vha->hw;
979         char fw_str[128];
980
981         return scnprintf(buf, PAGE_SIZE, "%s\n",
982             ha->isp_ops->fw_version_str(vha, fw_str, sizeof(fw_str)));
983 }
984
985 static ssize_t
986 qla2x00_serial_num_show(struct device *dev, struct device_attribute *attr,
987                         char *buf)
988 {
989         scsi_qla_host_t *vha = shost_priv(class_to_shost(dev));
990         struct qla_hw_data *ha = vha->hw;
991         uint32_t sn;
992
993         if (IS_QLAFX00(vha->hw)) {
994                 return scnprintf(buf, PAGE_SIZE, "%s\n",
995                     vha->hw->mr.serial_num);
996         } else if (IS_FWI2_CAPABLE(ha)) {
997                 qla2xxx_get_vpd_field(vha, "SN", buf, PAGE_SIZE - 1);
998                 return strlen(strcat(buf, "\n"));
999         }
1000
1001         sn = ((ha->serial0 & 0x1f) << 16) | (ha->serial2 << 8) | ha->serial1;
1002         return scnprintf(buf, PAGE_SIZE, "%c%05d\n", 'A' + sn / 100000,
1003             sn % 100000);
1004 }
1005
1006 static ssize_t
1007 qla2x00_isp_name_show(struct device *dev, struct device_attribute *attr,
1008                       char *buf)
1009 {
1010         scsi_qla_host_t *vha = shost_priv(class_to_shost(dev));
1011         return scnprintf(buf, PAGE_SIZE, "ISP%04X\n", vha->hw->pdev->device);
1012 }
1013
1014 static ssize_t
1015 qla2x00_isp_id_show(struct device *dev, struct device_attribute *attr,
1016                     char *buf)
1017 {
1018         scsi_qla_host_t *vha = shost_priv(class_to_shost(dev));
1019         struct qla_hw_data *ha = vha->hw;
1020
1021         if (IS_QLAFX00(vha->hw))
1022                 return scnprintf(buf, PAGE_SIZE, "%s\n",
1023                     vha->hw->mr.hw_version);
1024
1025         return scnprintf(buf, PAGE_SIZE, "%04x %04x %04x %04x\n",
1026             ha->product_id[0], ha->product_id[1], ha->product_id[2],
1027             ha->product_id[3]);
1028 }
1029
1030 static ssize_t
1031 qla2x00_model_name_show(struct device *dev, struct device_attribute *attr,
1032                         char *buf)
1033 {
1034         scsi_qla_host_t *vha = shost_priv(class_to_shost(dev));
1035
1036         return scnprintf(buf, PAGE_SIZE, "%s\n", vha->hw->model_number);
1037 }
1038
1039 static ssize_t
1040 qla2x00_model_desc_show(struct device *dev, struct device_attribute *attr,
1041                         char *buf)
1042 {
1043         scsi_qla_host_t *vha = shost_priv(class_to_shost(dev));
1044         return scnprintf(buf, PAGE_SIZE, "%s\n", vha->hw->model_desc);
1045 }
1046
1047 static ssize_t
1048 qla2x00_pci_info_show(struct device *dev, struct device_attribute *attr,
1049                       char *buf)
1050 {
1051         scsi_qla_host_t *vha = shost_priv(class_to_shost(dev));
1052         char pci_info[30];
1053
1054         return scnprintf(buf, PAGE_SIZE, "%s\n",
1055             vha->hw->isp_ops->pci_info_str(vha, pci_info));
1056 }
1057
1058 static ssize_t
1059 qla2x00_link_state_show(struct device *dev, struct device_attribute *attr,
1060                         char *buf)
1061 {
1062         scsi_qla_host_t *vha = shost_priv(class_to_shost(dev));
1063         struct qla_hw_data *ha = vha->hw;
1064         int len = 0;
1065
1066         if (atomic_read(&vha->loop_state) == LOOP_DOWN ||
1067             atomic_read(&vha->loop_state) == LOOP_DEAD ||
1068             vha->device_flags & DFLG_NO_CABLE)
1069                 len = scnprintf(buf, PAGE_SIZE, "Link Down\n");
1070         else if (atomic_read(&vha->loop_state) != LOOP_READY ||
1071             qla2x00_reset_active(vha))
1072                 len = scnprintf(buf, PAGE_SIZE, "Unknown Link State\n");
1073         else {
1074                 len = scnprintf(buf, PAGE_SIZE, "Link Up - ");
1075
1076                 switch (ha->current_topology) {
1077                 case ISP_CFG_NL:
1078                         len += scnprintf(buf + len, PAGE_SIZE-len, "Loop\n");
1079                         break;
1080                 case ISP_CFG_FL:
1081                         len += scnprintf(buf + len, PAGE_SIZE-len, "FL_Port\n");
1082                         break;
1083                 case ISP_CFG_N:
1084                         len += scnprintf(buf + len, PAGE_SIZE-len,
1085                             "N_Port to N_Port\n");
1086                         break;
1087                 case ISP_CFG_F:
1088                         len += scnprintf(buf + len, PAGE_SIZE-len, "F_Port\n");
1089                         break;
1090                 default:
1091                         len += scnprintf(buf + len, PAGE_SIZE-len, "Loop\n");
1092                         break;
1093                 }
1094         }
1095         return len;
1096 }
1097
1098 static ssize_t
1099 qla2x00_zio_show(struct device *dev, struct device_attribute *attr,
1100                  char *buf)
1101 {
1102         scsi_qla_host_t *vha = shost_priv(class_to_shost(dev));
1103         int len = 0;
1104
1105         switch (vha->hw->zio_mode) {
1106         case QLA_ZIO_MODE_6:
1107                 len += scnprintf(buf + len, PAGE_SIZE-len, "Mode 6\n");
1108                 break;
1109         case QLA_ZIO_DISABLED:
1110                 len += scnprintf(buf + len, PAGE_SIZE-len, "Disabled\n");
1111                 break;
1112         }
1113         return len;
1114 }
1115
1116 static ssize_t
1117 qla2x00_zio_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         uint16_t zio_mode;
1124
1125         if (!IS_ZIO_SUPPORTED(ha))
1126                 return -ENOTSUPP;
1127
1128         if (sscanf(buf, "%d", &val) != 1)
1129                 return -EINVAL;
1130
1131         if (val)
1132                 zio_mode = QLA_ZIO_MODE_6;
1133         else
1134                 zio_mode = QLA_ZIO_DISABLED;
1135
1136         /* Update per-hba values and queue a reset. */
1137         if (zio_mode != QLA_ZIO_DISABLED || ha->zio_mode != QLA_ZIO_DISABLED) {
1138                 ha->zio_mode = zio_mode;
1139                 set_bit(ISP_ABORT_NEEDED, &vha->dpc_flags);
1140         }
1141         return strlen(buf);
1142 }
1143
1144 static ssize_t
1145 qla2x00_zio_timer_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, "%d us\n", vha->hw->zio_timer * 100);
1151 }
1152
1153 static ssize_t
1154 qla2x00_zio_timer_store(struct device *dev, struct device_attribute *attr,
1155                         const char *buf, size_t count)
1156 {
1157         scsi_qla_host_t *vha = shost_priv(class_to_shost(dev));
1158         int val = 0;
1159         uint16_t zio_timer;
1160
1161         if (sscanf(buf, "%d", &val) != 1)
1162                 return -EINVAL;
1163         if (val > 25500 || val < 100)
1164                 return -ERANGE;
1165
1166         zio_timer = (uint16_t)(val / 100);
1167         vha->hw->zio_timer = zio_timer;
1168
1169         return strlen(buf);
1170 }
1171
1172 static ssize_t
1173 qla2x00_beacon_show(struct device *dev, struct device_attribute *attr,
1174                     char *buf)
1175 {
1176         scsi_qla_host_t *vha = shost_priv(class_to_shost(dev));
1177         int len = 0;
1178
1179         if (vha->hw->beacon_blink_led)
1180                 len += scnprintf(buf + len, PAGE_SIZE-len, "Enabled\n");
1181         else
1182                 len += scnprintf(buf + len, PAGE_SIZE-len, "Disabled\n");
1183         return len;
1184 }
1185
1186 static ssize_t
1187 qla2x00_beacon_store(struct device *dev, struct device_attribute *attr,
1188                      const char *buf, size_t count)
1189 {
1190         scsi_qla_host_t *vha = shost_priv(class_to_shost(dev));
1191         struct qla_hw_data *ha = vha->hw;
1192         int val = 0;
1193         int rval;
1194
1195         if (IS_QLA2100(ha) || IS_QLA2200(ha))
1196                 return -EPERM;
1197
1198         if (test_bit(ABORT_ISP_ACTIVE, &vha->dpc_flags)) {
1199                 ql_log(ql_log_warn, vha, 0x707a,
1200                     "Abort ISP active -- ignoring beacon request.\n");
1201                 return -EBUSY;
1202         }
1203
1204         if (sscanf(buf, "%d", &val) != 1)
1205                 return -EINVAL;
1206
1207         if (val)
1208                 rval = ha->isp_ops->beacon_on(vha);
1209         else
1210                 rval = ha->isp_ops->beacon_off(vha);
1211
1212         if (rval != QLA_SUCCESS)
1213                 count = 0;
1214
1215         return count;
1216 }
1217
1218 static ssize_t
1219 qla2x00_optrom_bios_version_show(struct device *dev,
1220                                  struct device_attribute *attr, char *buf)
1221 {
1222         scsi_qla_host_t *vha = shost_priv(class_to_shost(dev));
1223         struct qla_hw_data *ha = vha->hw;
1224         return scnprintf(buf, PAGE_SIZE, "%d.%02d\n", ha->bios_revision[1],
1225             ha->bios_revision[0]);
1226 }
1227
1228 static ssize_t
1229 qla2x00_optrom_efi_version_show(struct device *dev,
1230                                 struct device_attribute *attr, char *buf)
1231 {
1232         scsi_qla_host_t *vha = shost_priv(class_to_shost(dev));
1233         struct qla_hw_data *ha = vha->hw;
1234         return scnprintf(buf, PAGE_SIZE, "%d.%02d\n", ha->efi_revision[1],
1235             ha->efi_revision[0]);
1236 }
1237
1238 static ssize_t
1239 qla2x00_optrom_fcode_version_show(struct device *dev,
1240                                   struct device_attribute *attr, char *buf)
1241 {
1242         scsi_qla_host_t *vha = shost_priv(class_to_shost(dev));
1243         struct qla_hw_data *ha = vha->hw;
1244         return scnprintf(buf, PAGE_SIZE, "%d.%02d\n", ha->fcode_revision[1],
1245             ha->fcode_revision[0]);
1246 }
1247
1248 static ssize_t
1249 qla2x00_optrom_fw_version_show(struct device *dev,
1250                                struct device_attribute *attr, char *buf)
1251 {
1252         scsi_qla_host_t *vha = shost_priv(class_to_shost(dev));
1253         struct qla_hw_data *ha = vha->hw;
1254         return scnprintf(buf, PAGE_SIZE, "%d.%02d.%02d %d\n",
1255             ha->fw_revision[0], ha->fw_revision[1], ha->fw_revision[2],
1256             ha->fw_revision[3]);
1257 }
1258
1259 static ssize_t
1260 qla2x00_optrom_gold_fw_version_show(struct device *dev,
1261     struct device_attribute *attr, char *buf)
1262 {
1263         scsi_qla_host_t *vha = shost_priv(class_to_shost(dev));
1264         struct qla_hw_data *ha = vha->hw;
1265
1266         if (!IS_QLA81XX(ha) && !IS_QLA83XX(ha) && !IS_QLA27XX(ha))
1267                 return scnprintf(buf, PAGE_SIZE, "\n");
1268
1269         return scnprintf(buf, PAGE_SIZE, "%d.%02d.%02d (%d)\n",
1270             ha->gold_fw_version[0], ha->gold_fw_version[1],
1271             ha->gold_fw_version[2], ha->gold_fw_version[3]);
1272 }
1273
1274 static ssize_t
1275 qla2x00_total_isp_aborts_show(struct device *dev,
1276                               struct device_attribute *attr, char *buf)
1277 {
1278         scsi_qla_host_t *vha = shost_priv(class_to_shost(dev));
1279         return scnprintf(buf, PAGE_SIZE, "%d\n",
1280             vha->qla_stats.total_isp_aborts);
1281 }
1282
1283 static ssize_t
1284 qla24xx_84xx_fw_version_show(struct device *dev,
1285         struct device_attribute *attr, char *buf)
1286 {
1287         int rval = QLA_SUCCESS;
1288         uint16_t status[2] = {0, 0};
1289         scsi_qla_host_t *vha = shost_priv(class_to_shost(dev));
1290         struct qla_hw_data *ha = vha->hw;
1291
1292         if (!IS_QLA84XX(ha))
1293                 return scnprintf(buf, PAGE_SIZE, "\n");
1294
1295         if (ha->cs84xx->op_fw_version == 0)
1296                 rval = qla84xx_verify_chip(vha, status);
1297
1298         if ((rval == QLA_SUCCESS) && (status[0] == 0))
1299                 return scnprintf(buf, PAGE_SIZE, "%u\n",
1300                         (uint32_t)ha->cs84xx->op_fw_version);
1301
1302         return scnprintf(buf, PAGE_SIZE, "\n");
1303 }
1304
1305 static ssize_t
1306 qla2x00_mpi_version_show(struct device *dev, struct device_attribute *attr,
1307     char *buf)
1308 {
1309         scsi_qla_host_t *vha = shost_priv(class_to_shost(dev));
1310         struct qla_hw_data *ha = vha->hw;
1311
1312         if (!IS_QLA81XX(ha) && !IS_QLA8031(ha) && !IS_QLA8044(ha) &&
1313             !IS_QLA27XX(ha))
1314                 return scnprintf(buf, PAGE_SIZE, "\n");
1315
1316         return scnprintf(buf, PAGE_SIZE, "%d.%02d.%02d (%x)\n",
1317             ha->mpi_version[0], ha->mpi_version[1], ha->mpi_version[2],
1318             ha->mpi_capabilities);
1319 }
1320
1321 static ssize_t
1322 qla2x00_phy_version_show(struct device *dev, struct device_attribute *attr,
1323     char *buf)
1324 {
1325         scsi_qla_host_t *vha = shost_priv(class_to_shost(dev));
1326         struct qla_hw_data *ha = vha->hw;
1327
1328         if (!IS_QLA81XX(ha) && !IS_QLA8031(ha))
1329                 return scnprintf(buf, PAGE_SIZE, "\n");
1330
1331         return scnprintf(buf, PAGE_SIZE, "%d.%02d.%02d\n",
1332             ha->phy_version[0], ha->phy_version[1], ha->phy_version[2]);
1333 }
1334
1335 static ssize_t
1336 qla2x00_flash_block_size_show(struct device *dev,
1337                               struct device_attribute *attr, char *buf)
1338 {
1339         scsi_qla_host_t *vha = shost_priv(class_to_shost(dev));
1340         struct qla_hw_data *ha = vha->hw;
1341
1342         return scnprintf(buf, PAGE_SIZE, "0x%x\n", ha->fdt_block_size);
1343 }
1344
1345 static ssize_t
1346 qla2x00_vlan_id_show(struct device *dev, struct device_attribute *attr,
1347     char *buf)
1348 {
1349         scsi_qla_host_t *vha = shost_priv(class_to_shost(dev));
1350
1351         if (!IS_CNA_CAPABLE(vha->hw))
1352                 return scnprintf(buf, PAGE_SIZE, "\n");
1353
1354         return scnprintf(buf, PAGE_SIZE, "%d\n", vha->fcoe_vlan_id);
1355 }
1356
1357 static ssize_t
1358 qla2x00_vn_port_mac_address_show(struct device *dev,
1359     struct device_attribute *attr, char *buf)
1360 {
1361         scsi_qla_host_t *vha = shost_priv(class_to_shost(dev));
1362
1363         if (!IS_CNA_CAPABLE(vha->hw))
1364                 return scnprintf(buf, PAGE_SIZE, "\n");
1365
1366         return scnprintf(buf, PAGE_SIZE, "%pMR\n", vha->fcoe_vn_port_mac);
1367 }
1368
1369 static ssize_t
1370 qla2x00_fabric_param_show(struct device *dev, struct device_attribute *attr,
1371     char *buf)
1372 {
1373         scsi_qla_host_t *vha = shost_priv(class_to_shost(dev));
1374
1375         return scnprintf(buf, PAGE_SIZE, "%d\n", vha->hw->switch_cap);
1376 }
1377
1378 static ssize_t
1379 qla2x00_thermal_temp_show(struct device *dev,
1380         struct device_attribute *attr, char *buf)
1381 {
1382         scsi_qla_host_t *vha = shost_priv(class_to_shost(dev));
1383         uint16_t temp = 0;
1384
1385         if (qla2x00_reset_active(vha)) {
1386                 ql_log(ql_log_warn, vha, 0x70dc, "ISP reset active.\n");
1387                 goto done;
1388         }
1389
1390         if (vha->hw->flags.eeh_busy) {
1391                 ql_log(ql_log_warn, vha, 0x70dd, "PCI EEH busy.\n");
1392                 goto done;
1393         }
1394
1395         if (qla2x00_get_thermal_temp(vha, &temp) == QLA_SUCCESS)
1396                 return scnprintf(buf, PAGE_SIZE, "%d\n", temp);
1397
1398 done:
1399         return scnprintf(buf, PAGE_SIZE, "\n");
1400 }
1401
1402 static ssize_t
1403 qla2x00_fw_state_show(struct device *dev, struct device_attribute *attr,
1404     char *buf)
1405 {
1406         scsi_qla_host_t *vha = shost_priv(class_to_shost(dev));
1407         int rval = QLA_FUNCTION_FAILED;
1408         uint16_t state[6];
1409         uint32_t pstate;
1410
1411         if (IS_QLAFX00(vha->hw)) {
1412                 pstate = qlafx00_fw_state_show(dev, attr, buf);
1413                 return scnprintf(buf, PAGE_SIZE, "0x%x\n", pstate);
1414         }
1415
1416         if (qla2x00_reset_active(vha))
1417                 ql_log(ql_log_warn, vha, 0x707c,
1418                     "ISP reset active.\n");
1419         else if (!vha->hw->flags.eeh_busy)
1420                 rval = qla2x00_get_firmware_state(vha, state);
1421         if (rval != QLA_SUCCESS)
1422                 memset(state, -1, sizeof(state));
1423
1424         return scnprintf(buf, PAGE_SIZE, "0x%x 0x%x 0x%x 0x%x 0x%x 0x%x\n",
1425             state[0], state[1], state[2], state[3], state[4], state[5]);
1426 }
1427
1428 static ssize_t
1429 qla2x00_diag_requests_show(struct device *dev,
1430         struct device_attribute *attr, char *buf)
1431 {
1432         scsi_qla_host_t *vha = shost_priv(class_to_shost(dev));
1433
1434         if (!IS_BIDI_CAPABLE(vha->hw))
1435                 return scnprintf(buf, PAGE_SIZE, "\n");
1436
1437         return scnprintf(buf, PAGE_SIZE, "%llu\n", vha->bidi_stats.io_count);
1438 }
1439
1440 static ssize_t
1441 qla2x00_diag_megabytes_show(struct device *dev,
1442         struct device_attribute *attr, char *buf)
1443 {
1444         scsi_qla_host_t *vha = shost_priv(class_to_shost(dev));
1445
1446         if (!IS_BIDI_CAPABLE(vha->hw))
1447                 return scnprintf(buf, PAGE_SIZE, "\n");
1448
1449         return scnprintf(buf, PAGE_SIZE, "%llu\n",
1450             vha->bidi_stats.transfer_bytes >> 20);
1451 }
1452
1453 static ssize_t
1454 qla2x00_fw_dump_size_show(struct device *dev, struct device_attribute *attr,
1455         char *buf)
1456 {
1457         scsi_qla_host_t *vha = shost_priv(class_to_shost(dev));
1458         struct qla_hw_data *ha = vha->hw;
1459         uint32_t size;
1460
1461         if (!ha->fw_dumped)
1462                 size = 0;
1463         else if (IS_P3P_TYPE(ha))
1464                 size = ha->md_template_size + ha->md_dump_size;
1465         else
1466                 size = ha->fw_dump_len;
1467
1468         return scnprintf(buf, PAGE_SIZE, "%d\n", size);
1469 }
1470
1471 static ssize_t
1472 qla2x00_allow_cna_fw_dump_show(struct device *dev,
1473         struct device_attribute *attr, char *buf)
1474 {
1475         scsi_qla_host_t *vha = shost_priv(class_to_shost(dev));
1476
1477         if (!IS_P3P_TYPE(vha->hw))
1478                 return scnprintf(buf, PAGE_SIZE, "\n");
1479         else
1480                 return scnprintf(buf, PAGE_SIZE, "%s\n",
1481                     vha->hw->allow_cna_fw_dump ? "true" : "false");
1482 }
1483
1484 static ssize_t
1485 qla2x00_allow_cna_fw_dump_store(struct device *dev,
1486         struct device_attribute *attr, const char *buf, size_t count)
1487 {
1488         scsi_qla_host_t *vha = shost_priv(class_to_shost(dev));
1489         int val = 0;
1490
1491         if (!IS_P3P_TYPE(vha->hw))
1492                 return -EINVAL;
1493
1494         if (sscanf(buf, "%d", &val) != 1)
1495                 return -EINVAL;
1496
1497         vha->hw->allow_cna_fw_dump = val != 0;
1498
1499         return strlen(buf);
1500 }
1501
1502 static ssize_t
1503 qla2x00_pep_version_show(struct device *dev, struct device_attribute *attr,
1504         char *buf)
1505 {
1506         scsi_qla_host_t *vha = shost_priv(class_to_shost(dev));
1507         struct qla_hw_data *ha = vha->hw;
1508
1509         if (!IS_QLA27XX(ha))
1510                 return scnprintf(buf, PAGE_SIZE, "\n");
1511
1512         return scnprintf(buf, PAGE_SIZE, "%d.%02d.%02d\n",
1513             ha->pep_version[0], ha->pep_version[1], ha->pep_version[2]);
1514 }
1515
1516 static DEVICE_ATTR(driver_version, S_IRUGO, qla2x00_drvr_version_show, NULL);
1517 static DEVICE_ATTR(fw_version, S_IRUGO, qla2x00_fw_version_show, NULL);
1518 static DEVICE_ATTR(serial_num, S_IRUGO, qla2x00_serial_num_show, NULL);
1519 static DEVICE_ATTR(isp_name, S_IRUGO, qla2x00_isp_name_show, NULL);
1520 static DEVICE_ATTR(isp_id, S_IRUGO, qla2x00_isp_id_show, NULL);
1521 static DEVICE_ATTR(model_name, S_IRUGO, qla2x00_model_name_show, NULL);
1522 static DEVICE_ATTR(model_desc, S_IRUGO, qla2x00_model_desc_show, NULL);
1523 static DEVICE_ATTR(pci_info, S_IRUGO, qla2x00_pci_info_show, NULL);
1524 static DEVICE_ATTR(link_state, S_IRUGO, qla2x00_link_state_show, NULL);
1525 static DEVICE_ATTR(zio, S_IRUGO | S_IWUSR, qla2x00_zio_show, qla2x00_zio_store);
1526 static DEVICE_ATTR(zio_timer, S_IRUGO | S_IWUSR, qla2x00_zio_timer_show,
1527                    qla2x00_zio_timer_store);
1528 static DEVICE_ATTR(beacon, S_IRUGO | S_IWUSR, qla2x00_beacon_show,
1529                    qla2x00_beacon_store);
1530 static DEVICE_ATTR(optrom_bios_version, S_IRUGO,
1531                    qla2x00_optrom_bios_version_show, NULL);
1532 static DEVICE_ATTR(optrom_efi_version, S_IRUGO,
1533                    qla2x00_optrom_efi_version_show, NULL);
1534 static DEVICE_ATTR(optrom_fcode_version, S_IRUGO,
1535                    qla2x00_optrom_fcode_version_show, NULL);
1536 static DEVICE_ATTR(optrom_fw_version, S_IRUGO, qla2x00_optrom_fw_version_show,
1537                    NULL);
1538 static DEVICE_ATTR(optrom_gold_fw_version, S_IRUGO,
1539     qla2x00_optrom_gold_fw_version_show, NULL);
1540 static DEVICE_ATTR(84xx_fw_version, S_IRUGO, qla24xx_84xx_fw_version_show,
1541                    NULL);
1542 static DEVICE_ATTR(total_isp_aborts, S_IRUGO, qla2x00_total_isp_aborts_show,
1543                    NULL);
1544 static DEVICE_ATTR(mpi_version, S_IRUGO, qla2x00_mpi_version_show, NULL);
1545 static DEVICE_ATTR(phy_version, S_IRUGO, qla2x00_phy_version_show, NULL);
1546 static DEVICE_ATTR(flash_block_size, S_IRUGO, qla2x00_flash_block_size_show,
1547                    NULL);
1548 static DEVICE_ATTR(vlan_id, S_IRUGO, qla2x00_vlan_id_show, NULL);
1549 static DEVICE_ATTR(vn_port_mac_address, S_IRUGO,
1550                    qla2x00_vn_port_mac_address_show, NULL);
1551 static DEVICE_ATTR(fabric_param, S_IRUGO, qla2x00_fabric_param_show, NULL);
1552 static DEVICE_ATTR(fw_state, S_IRUGO, qla2x00_fw_state_show, NULL);
1553 static DEVICE_ATTR(thermal_temp, S_IRUGO, qla2x00_thermal_temp_show, NULL);
1554 static DEVICE_ATTR(diag_requests, S_IRUGO, qla2x00_diag_requests_show, NULL);
1555 static DEVICE_ATTR(diag_megabytes, S_IRUGO, qla2x00_diag_megabytes_show, NULL);
1556 static DEVICE_ATTR(fw_dump_size, S_IRUGO, qla2x00_fw_dump_size_show, NULL);
1557 static DEVICE_ATTR(allow_cna_fw_dump, S_IRUGO | S_IWUSR,
1558                    qla2x00_allow_cna_fw_dump_show,
1559                    qla2x00_allow_cna_fw_dump_store);
1560 static DEVICE_ATTR(pep_version, S_IRUGO, qla2x00_pep_version_show, NULL);
1561
1562 struct device_attribute *qla2x00_host_attrs[] = {
1563         &dev_attr_driver_version,
1564         &dev_attr_fw_version,
1565         &dev_attr_serial_num,
1566         &dev_attr_isp_name,
1567         &dev_attr_isp_id,
1568         &dev_attr_model_name,
1569         &dev_attr_model_desc,
1570         &dev_attr_pci_info,
1571         &dev_attr_link_state,
1572         &dev_attr_zio,
1573         &dev_attr_zio_timer,
1574         &dev_attr_beacon,
1575         &dev_attr_optrom_bios_version,
1576         &dev_attr_optrom_efi_version,
1577         &dev_attr_optrom_fcode_version,
1578         &dev_attr_optrom_fw_version,
1579         &dev_attr_84xx_fw_version,
1580         &dev_attr_total_isp_aborts,
1581         &dev_attr_mpi_version,
1582         &dev_attr_phy_version,
1583         &dev_attr_flash_block_size,
1584         &dev_attr_vlan_id,
1585         &dev_attr_vn_port_mac_address,
1586         &dev_attr_fabric_param,
1587         &dev_attr_fw_state,
1588         &dev_attr_optrom_gold_fw_version,
1589         &dev_attr_thermal_temp,
1590         &dev_attr_diag_requests,
1591         &dev_attr_diag_megabytes,
1592         &dev_attr_fw_dump_size,
1593         &dev_attr_allow_cna_fw_dump,
1594         &dev_attr_pep_version,
1595         NULL,
1596 };
1597
1598 /* Host attributes. */
1599
1600 static void
1601 qla2x00_get_host_port_id(struct Scsi_Host *shost)
1602 {
1603         scsi_qla_host_t *vha = shost_priv(shost);
1604
1605         fc_host_port_id(shost) = vha->d_id.b.domain << 16 |
1606             vha->d_id.b.area << 8 | vha->d_id.b.al_pa;
1607 }
1608
1609 static void
1610 qla2x00_get_host_speed(struct Scsi_Host *shost)
1611 {
1612         struct qla_hw_data *ha = ((struct scsi_qla_host *)
1613                                         (shost_priv(shost)))->hw;
1614         u32 speed = FC_PORTSPEED_UNKNOWN;
1615
1616         if (IS_QLAFX00(ha)) {
1617                 qlafx00_get_host_speed(shost);
1618                 return;
1619         }
1620
1621         switch (ha->link_data_rate) {
1622         case PORT_SPEED_1GB:
1623                 speed = FC_PORTSPEED_1GBIT;
1624                 break;
1625         case PORT_SPEED_2GB:
1626                 speed = FC_PORTSPEED_2GBIT;
1627                 break;
1628         case PORT_SPEED_4GB:
1629                 speed = FC_PORTSPEED_4GBIT;
1630                 break;
1631         case PORT_SPEED_8GB:
1632                 speed = FC_PORTSPEED_8GBIT;
1633                 break;
1634         case PORT_SPEED_10GB:
1635                 speed = FC_PORTSPEED_10GBIT;
1636                 break;
1637         case PORT_SPEED_16GB:
1638                 speed = FC_PORTSPEED_16GBIT;
1639                 break;
1640         case PORT_SPEED_32GB:
1641                 speed = FC_PORTSPEED_32GBIT;
1642                 break;
1643         }
1644         fc_host_speed(shost) = speed;
1645 }
1646
1647 static void
1648 qla2x00_get_host_port_type(struct Scsi_Host *shost)
1649 {
1650         scsi_qla_host_t *vha = shost_priv(shost);
1651         uint32_t port_type = FC_PORTTYPE_UNKNOWN;
1652
1653         if (vha->vp_idx) {
1654                 fc_host_port_type(shost) = FC_PORTTYPE_NPIV;
1655                 return;
1656         }
1657         switch (vha->hw->current_topology) {
1658         case ISP_CFG_NL:
1659                 port_type = FC_PORTTYPE_LPORT;
1660                 break;
1661         case ISP_CFG_FL:
1662                 port_type = FC_PORTTYPE_NLPORT;
1663                 break;
1664         case ISP_CFG_N:
1665                 port_type = FC_PORTTYPE_PTP;
1666                 break;
1667         case ISP_CFG_F:
1668                 port_type = FC_PORTTYPE_NPORT;
1669                 break;
1670         }
1671         fc_host_port_type(shost) = port_type;
1672 }
1673
1674 static void
1675 qla2x00_get_starget_node_name(struct scsi_target *starget)
1676 {
1677         struct Scsi_Host *host = dev_to_shost(starget->dev.parent);
1678         scsi_qla_host_t *vha = shost_priv(host);
1679         fc_port_t *fcport;
1680         u64 node_name = 0;
1681
1682         list_for_each_entry(fcport, &vha->vp_fcports, list) {
1683                 if (fcport->rport &&
1684                     starget->id == fcport->rport->scsi_target_id) {
1685                         node_name = wwn_to_u64(fcport->node_name);
1686                         break;
1687                 }
1688         }
1689
1690         fc_starget_node_name(starget) = node_name;
1691 }
1692
1693 static void
1694 qla2x00_get_starget_port_name(struct scsi_target *starget)
1695 {
1696         struct Scsi_Host *host = dev_to_shost(starget->dev.parent);
1697         scsi_qla_host_t *vha = shost_priv(host);
1698         fc_port_t *fcport;
1699         u64 port_name = 0;
1700
1701         list_for_each_entry(fcport, &vha->vp_fcports, list) {
1702                 if (fcport->rport &&
1703                     starget->id == fcport->rport->scsi_target_id) {
1704                         port_name = wwn_to_u64(fcport->port_name);
1705                         break;
1706                 }
1707         }
1708
1709         fc_starget_port_name(starget) = port_name;
1710 }
1711
1712 static void
1713 qla2x00_get_starget_port_id(struct scsi_target *starget)
1714 {
1715         struct Scsi_Host *host = dev_to_shost(starget->dev.parent);
1716         scsi_qla_host_t *vha = shost_priv(host);
1717         fc_port_t *fcport;
1718         uint32_t port_id = ~0U;
1719
1720         list_for_each_entry(fcport, &vha->vp_fcports, list) {
1721                 if (fcport->rport &&
1722                     starget->id == fcport->rport->scsi_target_id) {
1723                         port_id = fcport->d_id.b.domain << 16 |
1724                             fcport->d_id.b.area << 8 | fcport->d_id.b.al_pa;
1725                         break;
1726                 }
1727         }
1728
1729         fc_starget_port_id(starget) = port_id;
1730 }
1731
1732 static void
1733 qla2x00_set_rport_loss_tmo(struct fc_rport *rport, uint32_t timeout)
1734 {
1735         if (timeout)
1736                 rport->dev_loss_tmo = timeout;
1737         else
1738                 rport->dev_loss_tmo = 1;
1739 }
1740
1741 static void
1742 qla2x00_dev_loss_tmo_callbk(struct fc_rport *rport)
1743 {
1744         struct Scsi_Host *host = rport_to_shost(rport);
1745         fc_port_t *fcport = *(fc_port_t **)rport->dd_data;
1746         unsigned long flags;
1747
1748         if (!fcport)
1749                 return;
1750
1751         /* Now that the rport has been deleted, set the fcport state to
1752            FCS_DEVICE_DEAD */
1753         qla2x00_set_fcport_state(fcport, FCS_DEVICE_DEAD);
1754
1755         /*
1756          * Transport has effectively 'deleted' the rport, clear
1757          * all local references.
1758          */
1759         spin_lock_irqsave(host->host_lock, flags);
1760         fcport->rport = fcport->drport = NULL;
1761         *((fc_port_t **)rport->dd_data) = NULL;
1762         spin_unlock_irqrestore(host->host_lock, flags);
1763
1764         if (test_bit(ABORT_ISP_ACTIVE, &fcport->vha->dpc_flags))
1765                 return;
1766
1767         if (unlikely(pci_channel_offline(fcport->vha->hw->pdev))) {
1768                 qla2x00_abort_all_cmds(fcport->vha, DID_NO_CONNECT << 16);
1769                 return;
1770         }
1771 }
1772
1773 static void
1774 qla2x00_terminate_rport_io(struct fc_rport *rport)
1775 {
1776         fc_port_t *fcport = *(fc_port_t **)rport->dd_data;
1777
1778         if (!fcport)
1779                 return;
1780
1781         if (test_bit(UNLOADING, &fcport->vha->dpc_flags))
1782                 return;
1783
1784         if (test_bit(ABORT_ISP_ACTIVE, &fcport->vha->dpc_flags))
1785                 return;
1786
1787         if (unlikely(pci_channel_offline(fcport->vha->hw->pdev))) {
1788                 qla2x00_abort_all_cmds(fcport->vha, DID_NO_CONNECT << 16);
1789                 return;
1790         }
1791         /*
1792          * At this point all fcport's software-states are cleared.  Perform any
1793          * final cleanup of firmware resources (PCBs and XCBs).
1794          */
1795         if (fcport->loop_id != FC_NO_LOOP_ID) {
1796                 if (IS_FWI2_CAPABLE(fcport->vha->hw))
1797                         fcport->vha->hw->isp_ops->fabric_logout(fcport->vha,
1798                             fcport->loop_id, fcport->d_id.b.domain,
1799                             fcport->d_id.b.area, fcport->d_id.b.al_pa);
1800                 else
1801                         qla2x00_port_logout(fcport->vha, fcport);
1802         }
1803 }
1804
1805 static int
1806 qla2x00_issue_lip(struct Scsi_Host *shost)
1807 {
1808         scsi_qla_host_t *vha = shost_priv(shost);
1809
1810         if (IS_QLAFX00(vha->hw))
1811                 return 0;
1812
1813         qla2x00_loop_reset(vha);
1814         return 0;
1815 }
1816
1817 static struct fc_host_statistics *
1818 qla2x00_get_fc_host_stats(struct Scsi_Host *shost)
1819 {
1820         scsi_qla_host_t *vha = shost_priv(shost);
1821         struct qla_hw_data *ha = vha->hw;
1822         struct scsi_qla_host *base_vha = pci_get_drvdata(ha->pdev);
1823         int rval;
1824         struct link_statistics *stats;
1825         dma_addr_t stats_dma;
1826         struct fc_host_statistics *p = &vha->fc_host_stat;
1827
1828         memset(p, -1, sizeof(*p));
1829
1830         if (IS_QLAFX00(vha->hw))
1831                 goto done;
1832
1833         if (test_bit(UNLOADING, &vha->dpc_flags))
1834                 goto done;
1835
1836         if (unlikely(pci_channel_offline(ha->pdev)))
1837                 goto done;
1838
1839         if (qla2x00_reset_active(vha))
1840                 goto done;
1841
1842         stats = dma_alloc_coherent(&ha->pdev->dev,
1843             sizeof(*stats), &stats_dma, GFP_KERNEL);
1844         if (!stats) {
1845                 ql_log(ql_log_warn, vha, 0x707d,
1846                     "Failed to allocate memory for stats.\n");
1847                 goto done;
1848         }
1849         memset(stats, 0, sizeof(*stats));
1850
1851         rval = QLA_FUNCTION_FAILED;
1852         if (IS_FWI2_CAPABLE(ha)) {
1853                 rval = qla24xx_get_isp_stats(base_vha, stats, stats_dma, 0);
1854         } else if (atomic_read(&base_vha->loop_state) == LOOP_READY &&
1855             !ha->dpc_active) {
1856                 /* Must be in a 'READY' state for statistics retrieval. */
1857                 rval = qla2x00_get_link_status(base_vha, base_vha->loop_id,
1858                                                 stats, stats_dma);
1859         }
1860
1861         if (rval != QLA_SUCCESS)
1862                 goto done_free;
1863
1864         p->link_failure_count = stats->link_fail_cnt;
1865         p->loss_of_sync_count = stats->loss_sync_cnt;
1866         p->loss_of_signal_count = stats->loss_sig_cnt;
1867         p->prim_seq_protocol_err_count = stats->prim_seq_err_cnt;
1868         p->invalid_tx_word_count = stats->inval_xmit_word_cnt;
1869         p->invalid_crc_count = stats->inval_crc_cnt;
1870         if (IS_FWI2_CAPABLE(ha)) {
1871                 p->lip_count = stats->lip_cnt;
1872                 p->tx_frames = stats->tx_frames;
1873                 p->rx_frames = stats->rx_frames;
1874                 p->dumped_frames = stats->discarded_frames;
1875                 p->nos_count = stats->nos_rcvd;
1876                 p->error_frames =
1877                         stats->dropped_frames + stats->discarded_frames;
1878                 p->rx_words = vha->qla_stats.input_bytes;
1879                 p->tx_words = vha->qla_stats.output_bytes;
1880         }
1881         p->fcp_control_requests = vha->qla_stats.control_requests;
1882         p->fcp_input_requests = vha->qla_stats.input_requests;
1883         p->fcp_output_requests = vha->qla_stats.output_requests;
1884         p->fcp_input_megabytes = vha->qla_stats.input_bytes >> 20;
1885         p->fcp_output_megabytes = vha->qla_stats.output_bytes >> 20;
1886         p->seconds_since_last_reset =
1887                 get_jiffies_64() - vha->qla_stats.jiffies_at_last_reset;
1888         do_div(p->seconds_since_last_reset, HZ);
1889
1890 done_free:
1891         dma_free_coherent(&ha->pdev->dev, sizeof(struct link_statistics),
1892             stats, stats_dma);
1893 done:
1894         return p;
1895 }
1896
1897 static void
1898 qla2x00_reset_host_stats(struct Scsi_Host *shost)
1899 {
1900         scsi_qla_host_t *vha = shost_priv(shost);
1901         struct qla_hw_data *ha = vha->hw;
1902         struct scsi_qla_host *base_vha = pci_get_drvdata(ha->pdev);
1903         struct link_statistics *stats;
1904         dma_addr_t stats_dma;
1905
1906         memset(&vha->qla_stats, 0, sizeof(vha->qla_stats));
1907         memset(&vha->fc_host_stat, 0, sizeof(vha->fc_host_stat));
1908
1909         vha->qla_stats.jiffies_at_last_reset = get_jiffies_64();
1910
1911         if (IS_FWI2_CAPABLE(ha)) {
1912                 int rval;
1913
1914                 stats = dma_alloc_coherent(&ha->pdev->dev,
1915                     sizeof(*stats), &stats_dma, GFP_KERNEL);
1916                 if (!stats) {
1917                         ql_log(ql_log_warn, vha, 0x70d7,
1918                             "Failed to allocate memory for stats.\n");
1919                         return;
1920                 }
1921
1922                 /* reset firmware statistics */
1923                 rval = qla24xx_get_isp_stats(base_vha, stats, stats_dma, BIT_0);
1924                 if (rval != QLA_SUCCESS)
1925                         ql_log(ql_log_warn, vha, 0x70de,
1926                                "Resetting ISP statistics failed: rval = %d\n",
1927                                rval);
1928
1929                 dma_free_coherent(&ha->pdev->dev, sizeof(*stats),
1930                     stats, stats_dma);
1931         }
1932 }
1933
1934 static void
1935 qla2x00_get_host_symbolic_name(struct Scsi_Host *shost)
1936 {
1937         scsi_qla_host_t *vha = shost_priv(shost);
1938
1939         qla2x00_get_sym_node_name(vha, fc_host_symbolic_name(shost),
1940             sizeof(fc_host_symbolic_name(shost)));
1941 }
1942
1943 static void
1944 qla2x00_set_host_system_hostname(struct Scsi_Host *shost)
1945 {
1946         scsi_qla_host_t *vha = shost_priv(shost);
1947
1948         set_bit(REGISTER_FDMI_NEEDED, &vha->dpc_flags);
1949 }
1950
1951 static void
1952 qla2x00_get_host_fabric_name(struct Scsi_Host *shost)
1953 {
1954         scsi_qla_host_t *vha = shost_priv(shost);
1955         uint8_t node_name[WWN_SIZE] = { 0xFF, 0xFF, 0xFF, 0xFF, \
1956                 0xFF, 0xFF, 0xFF, 0xFF};
1957         u64 fabric_name = wwn_to_u64(node_name);
1958
1959         if (vha->device_flags & SWITCH_FOUND)
1960                 fabric_name = wwn_to_u64(vha->fabric_node_name);
1961
1962         fc_host_fabric_name(shost) = fabric_name;
1963 }
1964
1965 static void
1966 qla2x00_get_host_port_state(struct Scsi_Host *shost)
1967 {
1968         scsi_qla_host_t *vha = shost_priv(shost);
1969         struct scsi_qla_host *base_vha = pci_get_drvdata(vha->hw->pdev);
1970
1971         if (!base_vha->flags.online) {
1972                 fc_host_port_state(shost) = FC_PORTSTATE_OFFLINE;
1973                 return;
1974         }
1975
1976         switch (atomic_read(&base_vha->loop_state)) {
1977         case LOOP_UPDATE:
1978                 fc_host_port_state(shost) = FC_PORTSTATE_DIAGNOSTICS;
1979                 break;
1980         case LOOP_DOWN:
1981                 if (test_bit(LOOP_RESYNC_NEEDED, &base_vha->dpc_flags))
1982                         fc_host_port_state(shost) = FC_PORTSTATE_DIAGNOSTICS;
1983                 else
1984                         fc_host_port_state(shost) = FC_PORTSTATE_LINKDOWN;
1985                 break;
1986         case LOOP_DEAD:
1987                 fc_host_port_state(shost) = FC_PORTSTATE_LINKDOWN;
1988                 break;
1989         case LOOP_READY:
1990                 fc_host_port_state(shost) = FC_PORTSTATE_ONLINE;
1991                 break;
1992         default:
1993                 fc_host_port_state(shost) = FC_PORTSTATE_UNKNOWN;
1994                 break;
1995         }
1996 }
1997
1998 static int
1999 qla24xx_vport_create(struct fc_vport *fc_vport, bool disable)
2000 {
2001         int     ret = 0;
2002         uint8_t qos = 0;
2003         scsi_qla_host_t *base_vha = shost_priv(fc_vport->shost);
2004         scsi_qla_host_t *vha = NULL;
2005         struct qla_hw_data *ha = base_vha->hw;
2006         uint16_t options = 0;
2007         int     cnt;
2008         struct req_que *req = ha->req_q_map[0];
2009
2010         ret = qla24xx_vport_create_req_sanity_check(fc_vport);
2011         if (ret) {
2012                 ql_log(ql_log_warn, vha, 0x707e,
2013                     "Vport sanity check failed, status %x\n", ret);
2014                 return (ret);
2015         }
2016
2017         vha = qla24xx_create_vhost(fc_vport);
2018         if (vha == NULL) {
2019                 ql_log(ql_log_warn, vha, 0x707f, "Vport create host failed.\n");
2020                 return FC_VPORT_FAILED;
2021         }
2022         if (disable) {
2023                 atomic_set(&vha->vp_state, VP_OFFLINE);
2024                 fc_vport_set_state(fc_vport, FC_VPORT_DISABLED);
2025         } else
2026                 atomic_set(&vha->vp_state, VP_FAILED);
2027
2028         /* ready to create vport */
2029         ql_log(ql_log_info, vha, 0x7080,
2030             "VP entry id %d assigned.\n", vha->vp_idx);
2031
2032         /* initialized vport states */
2033         atomic_set(&vha->loop_state, LOOP_DOWN);
2034         vha->vp_err_state=  VP_ERR_PORTDWN;
2035         vha->vp_prev_err_state=  VP_ERR_UNKWN;
2036         /* Check if physical ha port is Up */
2037         if (atomic_read(&base_vha->loop_state) == LOOP_DOWN ||
2038             atomic_read(&base_vha->loop_state) == LOOP_DEAD) {
2039                 /* Don't retry or attempt login of this virtual port */
2040                 ql_dbg(ql_dbg_user, vha, 0x7081,
2041                     "Vport loop state is not UP.\n");
2042                 atomic_set(&vha->loop_state, LOOP_DEAD);
2043                 if (!disable)
2044                         fc_vport_set_state(fc_vport, FC_VPORT_LINKDOWN);
2045         }
2046
2047         if (IS_T10_PI_CAPABLE(ha) && ql2xenabledif) {
2048                 if (ha->fw_attributes & BIT_4) {
2049                         int prot = 0, guard;
2050                         vha->flags.difdix_supported = 1;
2051                         ql_dbg(ql_dbg_user, vha, 0x7082,
2052                             "Registered for DIF/DIX type 1 and 3 protection.\n");
2053                         if (ql2xenabledif == 1)
2054                                 prot = SHOST_DIX_TYPE0_PROTECTION;
2055                         scsi_host_set_prot(vha->host,
2056                             prot | SHOST_DIF_TYPE1_PROTECTION
2057                             | SHOST_DIF_TYPE2_PROTECTION
2058                             | SHOST_DIF_TYPE3_PROTECTION
2059                             | SHOST_DIX_TYPE1_PROTECTION
2060                             | SHOST_DIX_TYPE2_PROTECTION
2061                             | SHOST_DIX_TYPE3_PROTECTION);
2062
2063                         guard = SHOST_DIX_GUARD_CRC;
2064
2065                         if (IS_PI_IPGUARD_CAPABLE(ha) &&
2066                             (ql2xenabledif > 1 || IS_PI_DIFB_DIX0_CAPABLE(ha)))
2067                                 guard |= SHOST_DIX_GUARD_IP;
2068
2069                         scsi_host_set_guard(vha->host, guard);
2070                 } else
2071                         vha->flags.difdix_supported = 0;
2072         }
2073
2074         if (scsi_add_host_with_dma(vha->host, &fc_vport->dev,
2075                                    &ha->pdev->dev)) {
2076                 ql_dbg(ql_dbg_user, vha, 0x7083,
2077                     "scsi_add_host failure for VP[%d].\n", vha->vp_idx);
2078                 goto vport_create_failed_2;
2079         }
2080
2081         /* initialize attributes */
2082         fc_host_dev_loss_tmo(vha->host) = ha->port_down_retry_count;
2083         fc_host_node_name(vha->host) = wwn_to_u64(vha->node_name);
2084         fc_host_port_name(vha->host) = wwn_to_u64(vha->port_name);
2085         fc_host_supported_classes(vha->host) =
2086                 fc_host_supported_classes(base_vha->host);
2087         fc_host_supported_speeds(vha->host) =
2088                 fc_host_supported_speeds(base_vha->host);
2089
2090         qlt_vport_create(vha, ha);
2091         qla24xx_vport_disable(fc_vport, disable);
2092
2093         if (ha->flags.cpu_affinity_enabled) {
2094                 req = ha->req_q_map[1];
2095                 ql_dbg(ql_dbg_multiq, vha, 0xc000,
2096                     "Request queue %p attached with "
2097                     "VP[%d], cpu affinity =%d\n",
2098                     req, vha->vp_idx, ha->flags.cpu_affinity_enabled);
2099                 goto vport_queue;
2100         } else if (ql2xmaxqueues == 1 || !ha->npiv_info)
2101                 goto vport_queue;
2102         /* Create a request queue in QoS mode for the vport */
2103         for (cnt = 0; cnt < ha->nvram_npiv_size; cnt++) {
2104                 if (memcmp(ha->npiv_info[cnt].port_name, vha->port_name, 8) == 0
2105                         && memcmp(ha->npiv_info[cnt].node_name, vha->node_name,
2106                                         8) == 0) {
2107                         qos = ha->npiv_info[cnt].q_qos;
2108                         break;
2109                 }
2110         }
2111
2112         if (qos) {
2113                 ret = qla25xx_create_req_que(ha, options, vha->vp_idx, 0, 0,
2114                         qos);
2115                 if (!ret)
2116                         ql_log(ql_log_warn, vha, 0x7084,
2117                             "Can't create request queue for VP[%d]\n",
2118                             vha->vp_idx);
2119                 else {
2120                         ql_dbg(ql_dbg_multiq, vha, 0xc001,
2121                             "Request Que:%d Q0s: %d) created for VP[%d]\n",
2122                             ret, qos, vha->vp_idx);
2123                         ql_dbg(ql_dbg_user, vha, 0x7085,
2124                             "Request Que:%d Q0s: %d) created for VP[%d]\n",
2125                             ret, qos, vha->vp_idx);
2126                         req = ha->req_q_map[ret];
2127                 }
2128         }
2129
2130 vport_queue:
2131         vha->req = req;
2132         return 0;
2133
2134 vport_create_failed_2:
2135         qla24xx_disable_vp(vha);
2136         qla24xx_deallocate_vp_id(vha);
2137         scsi_host_put(vha->host);
2138         return FC_VPORT_FAILED;
2139 }
2140
2141 static int
2142 qla24xx_vport_delete(struct fc_vport *fc_vport)
2143 {
2144         scsi_qla_host_t *vha = fc_vport->dd_data;
2145         struct qla_hw_data *ha = vha->hw;
2146         uint16_t id = vha->vp_idx;
2147
2148         while (test_bit(LOOP_RESYNC_ACTIVE, &vha->dpc_flags) ||
2149             test_bit(FCPORT_UPDATE_NEEDED, &vha->dpc_flags))
2150                 msleep(1000);
2151
2152         qla24xx_disable_vp(vha);
2153
2154         vha->flags.delete_progress = 1;
2155
2156         qlt_remove_target(ha, vha);
2157
2158         fc_remove_host(vha->host);
2159
2160         scsi_remove_host(vha->host);
2161
2162         /* Allow timer to run to drain queued items, when removing vp */
2163         qla24xx_deallocate_vp_id(vha);
2164
2165         if (vha->timer_active) {
2166                 qla2x00_vp_stop_timer(vha);
2167                 ql_dbg(ql_dbg_user, vha, 0x7086,
2168                     "Timer for the VP[%d] has stopped\n", vha->vp_idx);
2169         }
2170
2171         qla2x00_free_fcports(vha);
2172
2173         mutex_lock(&ha->vport_lock);
2174         ha->cur_vport_count--;
2175         clear_bit(vha->vp_idx, ha->vp_idx_map);
2176         mutex_unlock(&ha->vport_lock);
2177
2178         if (vha->req->id && !ha->flags.cpu_affinity_enabled) {
2179                 if (qla25xx_delete_req_que(vha, vha->req) != QLA_SUCCESS)
2180                         ql_log(ql_log_warn, vha, 0x7087,
2181                             "Queue delete failed.\n");
2182         }
2183
2184         ql_log(ql_log_info, vha, 0x7088, "VP[%d] deleted.\n", id);
2185         scsi_host_put(vha->host);
2186         return 0;
2187 }
2188
2189 static int
2190 qla24xx_vport_disable(struct fc_vport *fc_vport, bool disable)
2191 {
2192         scsi_qla_host_t *vha = fc_vport->dd_data;
2193
2194         if (disable)
2195                 qla24xx_disable_vp(vha);
2196         else
2197                 qla24xx_enable_vp(vha);
2198
2199         return 0;
2200 }
2201
2202 struct fc_function_template qla2xxx_transport_functions = {
2203
2204         .show_host_node_name = 1,
2205         .show_host_port_name = 1,
2206         .show_host_supported_classes = 1,
2207         .show_host_supported_speeds = 1,
2208
2209         .get_host_port_id = qla2x00_get_host_port_id,
2210         .show_host_port_id = 1,
2211         .get_host_speed = qla2x00_get_host_speed,
2212         .show_host_speed = 1,
2213         .get_host_port_type = qla2x00_get_host_port_type,
2214         .show_host_port_type = 1,
2215         .get_host_symbolic_name = qla2x00_get_host_symbolic_name,
2216         .show_host_symbolic_name = 1,
2217         .set_host_system_hostname = qla2x00_set_host_system_hostname,
2218         .show_host_system_hostname = 1,
2219         .get_host_fabric_name = qla2x00_get_host_fabric_name,
2220         .show_host_fabric_name = 1,
2221         .get_host_port_state = qla2x00_get_host_port_state,
2222         .show_host_port_state = 1,
2223
2224         .dd_fcrport_size = sizeof(struct fc_port *),
2225         .show_rport_supported_classes = 1,
2226
2227         .get_starget_node_name = qla2x00_get_starget_node_name,
2228         .show_starget_node_name = 1,
2229         .get_starget_port_name = qla2x00_get_starget_port_name,
2230         .show_starget_port_name = 1,
2231         .get_starget_port_id  = qla2x00_get_starget_port_id,
2232         .show_starget_port_id = 1,
2233
2234         .set_rport_dev_loss_tmo = qla2x00_set_rport_loss_tmo,
2235         .show_rport_dev_loss_tmo = 1,
2236
2237         .issue_fc_host_lip = qla2x00_issue_lip,
2238         .dev_loss_tmo_callbk = qla2x00_dev_loss_tmo_callbk,
2239         .terminate_rport_io = qla2x00_terminate_rport_io,
2240         .get_fc_host_stats = qla2x00_get_fc_host_stats,
2241         .reset_fc_host_stats = qla2x00_reset_host_stats,
2242
2243         .vport_create = qla24xx_vport_create,
2244         .vport_disable = qla24xx_vport_disable,
2245         .vport_delete = qla24xx_vport_delete,
2246         .bsg_request = qla24xx_bsg_request,
2247         .bsg_timeout = qla24xx_bsg_timeout,
2248 };
2249
2250 struct fc_function_template qla2xxx_transport_vport_functions = {
2251
2252         .show_host_node_name = 1,
2253         .show_host_port_name = 1,
2254         .show_host_supported_classes = 1,
2255
2256         .get_host_port_id = qla2x00_get_host_port_id,
2257         .show_host_port_id = 1,
2258         .get_host_speed = qla2x00_get_host_speed,
2259         .show_host_speed = 1,
2260         .get_host_port_type = qla2x00_get_host_port_type,
2261         .show_host_port_type = 1,
2262         .get_host_symbolic_name = qla2x00_get_host_symbolic_name,
2263         .show_host_symbolic_name = 1,
2264         .set_host_system_hostname = qla2x00_set_host_system_hostname,
2265         .show_host_system_hostname = 1,
2266         .get_host_fabric_name = qla2x00_get_host_fabric_name,
2267         .show_host_fabric_name = 1,
2268         .get_host_port_state = qla2x00_get_host_port_state,
2269         .show_host_port_state = 1,
2270
2271         .dd_fcrport_size = sizeof(struct fc_port *),
2272         .show_rport_supported_classes = 1,
2273
2274         .get_starget_node_name = qla2x00_get_starget_node_name,
2275         .show_starget_node_name = 1,
2276         .get_starget_port_name = qla2x00_get_starget_port_name,
2277         .show_starget_port_name = 1,
2278         .get_starget_port_id  = qla2x00_get_starget_port_id,
2279         .show_starget_port_id = 1,
2280
2281         .set_rport_dev_loss_tmo = qla2x00_set_rport_loss_tmo,
2282         .show_rport_dev_loss_tmo = 1,
2283
2284         .issue_fc_host_lip = qla2x00_issue_lip,
2285         .dev_loss_tmo_callbk = qla2x00_dev_loss_tmo_callbk,
2286         .terminate_rport_io = qla2x00_terminate_rport_io,
2287         .get_fc_host_stats = qla2x00_get_fc_host_stats,
2288         .reset_fc_host_stats = qla2x00_reset_host_stats,
2289
2290         .bsg_request = qla24xx_bsg_request,
2291         .bsg_timeout = qla24xx_bsg_timeout,
2292 };
2293
2294 void
2295 qla2x00_init_host_attr(scsi_qla_host_t *vha)
2296 {
2297         struct qla_hw_data *ha = vha->hw;
2298         u32 speed = FC_PORTSPEED_UNKNOWN;
2299
2300         fc_host_dev_loss_tmo(vha->host) = ha->port_down_retry_count;
2301         fc_host_node_name(vha->host) = wwn_to_u64(vha->node_name);
2302         fc_host_port_name(vha->host) = wwn_to_u64(vha->port_name);
2303         fc_host_supported_classes(vha->host) = ha->tgt.enable_class_2 ?
2304                         (FC_COS_CLASS2|FC_COS_CLASS3) : FC_COS_CLASS3;
2305         fc_host_max_npiv_vports(vha->host) = ha->max_npiv_vports;
2306         fc_host_npiv_vports_inuse(vha->host) = ha->cur_vport_count;
2307
2308         if (IS_CNA_CAPABLE(ha))
2309                 speed = FC_PORTSPEED_10GBIT;
2310         else if (IS_QLA2031(ha))
2311                 speed = FC_PORTSPEED_16GBIT | FC_PORTSPEED_8GBIT |
2312                     FC_PORTSPEED_4GBIT;
2313         else if (IS_QLA25XX(ha))
2314                 speed = FC_PORTSPEED_8GBIT | FC_PORTSPEED_4GBIT |
2315                     FC_PORTSPEED_2GBIT | FC_PORTSPEED_1GBIT;
2316         else if (IS_QLA24XX_TYPE(ha))
2317                 speed = FC_PORTSPEED_4GBIT | FC_PORTSPEED_2GBIT |
2318                     FC_PORTSPEED_1GBIT;
2319         else if (IS_QLA23XX(ha))
2320                 speed = FC_PORTSPEED_2GBIT | FC_PORTSPEED_1GBIT;
2321         else if (IS_QLAFX00(ha))
2322                 speed = FC_PORTSPEED_8GBIT | FC_PORTSPEED_4GBIT |
2323                     FC_PORTSPEED_2GBIT | FC_PORTSPEED_1GBIT;
2324         else if (IS_QLA27XX(ha))
2325                 speed = FC_PORTSPEED_32GBIT | FC_PORTSPEED_16GBIT |
2326                     FC_PORTSPEED_8GBIT;
2327         else
2328                 speed = FC_PORTSPEED_1GBIT;
2329         fc_host_supported_speeds(vha->host) = speed;
2330 }