diff options
author | James Bottomley <jejb@sparkweed.localdomain> | 2006-09-23 16:33:43 -0400 |
---|---|---|
committer | James Bottomley <jejb@sparkweed.localdomain> | 2006-09-23 16:33:43 -0400 |
commit | c9802cd9574a80444e689c7525627b40d7dc3a06 (patch) | |
tree | 5954e2ac7e97023b51d36127963a1e9262fbcfe0 /drivers/scsi/lpfc | |
parent | 3eeab61aa3ddd3c0bedb7449ada1599de22fdb5a (diff) | |
parent | 2d2f8d59b14bec6c745e219a350ac51d9e00673f (diff) |
Merge mulgrave-w:git/scsi-misc-2.6
Conflicts:
drivers/scsi/iscsi_tcp.c
drivers/scsi/iscsi_tcp.h
Pretty horrible merge between crypto hash consolidation
and crypto_digest_...->crypto_hash_... conversion
Signed-off-by: James Bottomley <James.Bottomley@SteelEye.com>
Diffstat (limited to 'drivers/scsi/lpfc')
-rw-r--r-- | drivers/scsi/lpfc/lpfc.h | 8 | ||||
-rw-r--r-- | drivers/scsi/lpfc/lpfc_attr.c | 285 | ||||
-rw-r--r-- | drivers/scsi/lpfc/lpfc_crtn.h | 3 | ||||
-rw-r--r-- | drivers/scsi/lpfc/lpfc_ct.c | 25 | ||||
-rw-r--r-- | drivers/scsi/lpfc/lpfc_disc.h | 6 | ||||
-rw-r--r-- | drivers/scsi/lpfc/lpfc_els.c | 5 | ||||
-rw-r--r-- | drivers/scsi/lpfc/lpfc_hbadisc.c | 186 | ||||
-rw-r--r-- | drivers/scsi/lpfc/lpfc_init.c | 8 | ||||
-rw-r--r-- | drivers/scsi/lpfc/lpfc_nportdisc.c | 2 | ||||
-rw-r--r-- | drivers/scsi/lpfc/lpfc_scsi.c | 10 | ||||
-rw-r--r-- | drivers/scsi/lpfc/lpfc_version.h | 2 |
11 files changed, 365 insertions, 175 deletions
diff --git a/drivers/scsi/lpfc/lpfc.h b/drivers/scsi/lpfc/lpfc.h index d44f9aac6b8f..3f7f5f8abd75 100644 --- a/drivers/scsi/lpfc/lpfc.h +++ b/drivers/scsi/lpfc/lpfc.h | |||
@@ -285,6 +285,7 @@ struct lpfc_hba { | |||
285 | uint32_t cfg_log_verbose; | 285 | uint32_t cfg_log_verbose; |
286 | uint32_t cfg_lun_queue_depth; | 286 | uint32_t cfg_lun_queue_depth; |
287 | uint32_t cfg_nodev_tmo; | 287 | uint32_t cfg_nodev_tmo; |
288 | uint32_t cfg_devloss_tmo; | ||
288 | uint32_t cfg_hba_queue_depth; | 289 | uint32_t cfg_hba_queue_depth; |
289 | uint32_t cfg_fcp_class; | 290 | uint32_t cfg_fcp_class; |
290 | uint32_t cfg_use_adisc; | 291 | uint32_t cfg_use_adisc; |
@@ -302,6 +303,9 @@ struct lpfc_hba { | |||
302 | uint32_t cfg_poll_tmo; | 303 | uint32_t cfg_poll_tmo; |
303 | uint32_t cfg_sg_seg_cnt; | 304 | uint32_t cfg_sg_seg_cnt; |
304 | uint32_t cfg_sg_dma_buf_size; | 305 | uint32_t cfg_sg_dma_buf_size; |
306 | uint64_t cfg_soft_wwpn; | ||
307 | |||
308 | uint32_t dev_loss_tmo_changed; | ||
305 | 309 | ||
306 | lpfc_vpd_t vpd; /* vital product data */ | 310 | lpfc_vpd_t vpd; /* vital product data */ |
307 | 311 | ||
@@ -351,6 +355,8 @@ struct lpfc_hba { | |||
351 | #define VPD_PORT 0x8 /* valid vpd port data */ | 355 | #define VPD_PORT 0x8 /* valid vpd port data */ |
352 | #define VPD_MASK 0xf /* mask for any vpd data */ | 356 | #define VPD_MASK 0xf /* mask for any vpd data */ |
353 | 357 | ||
358 | uint8_t soft_wwpn_enable; | ||
359 | |||
354 | struct timer_list fcp_poll_timer; | 360 | struct timer_list fcp_poll_timer; |
355 | struct timer_list els_tmofunc; | 361 | struct timer_list els_tmofunc; |
356 | 362 | ||
@@ -391,3 +397,5 @@ struct rnidrsp { | |||
391 | struct list_head list; | 397 | struct list_head list; |
392 | uint32_t data; | 398 | uint32_t data; |
393 | }; | 399 | }; |
400 | |||
401 | #define FC_REG_DUMP_EVENT 0x10 /* Register for Dump events */ | ||
diff --git a/drivers/scsi/lpfc/lpfc_attr.c b/drivers/scsi/lpfc/lpfc_attr.c index d384c16f4a87..9496e87c135e 100644 --- a/drivers/scsi/lpfc/lpfc_attr.c +++ b/drivers/scsi/lpfc/lpfc_attr.c | |||
@@ -39,6 +39,9 @@ | |||
39 | #include "lpfc_compat.h" | 39 | #include "lpfc_compat.h" |
40 | #include "lpfc_crtn.h" | 40 | #include "lpfc_crtn.h" |
41 | 41 | ||
42 | #define LPFC_DEF_DEVLOSS_TMO 30 | ||
43 | #define LPFC_MIN_DEVLOSS_TMO 1 | ||
44 | #define LPFC_MAX_DEVLOSS_TMO 255 | ||
42 | 45 | ||
43 | static void | 46 | static void |
44 | lpfc_jedec_to_ascii(int incr, char hdw[]) | 47 | lpfc_jedec_to_ascii(int incr, char hdw[]) |
@@ -548,6 +551,119 @@ static CLASS_DEVICE_ATTR(board_mode, S_IRUGO | S_IWUSR, | |||
548 | lpfc_board_mode_show, lpfc_board_mode_store); | 551 | lpfc_board_mode_show, lpfc_board_mode_store); |
549 | static CLASS_DEVICE_ATTR(issue_reset, S_IWUSR, NULL, lpfc_issue_reset); | 552 | static CLASS_DEVICE_ATTR(issue_reset, S_IWUSR, NULL, lpfc_issue_reset); |
550 | 553 | ||
554 | |||
555 | static char *lpfc_soft_wwpn_key = "C99G71SL8032A"; | ||
556 | |||
557 | static ssize_t | ||
558 | lpfc_soft_wwpn_enable_store(struct class_device *cdev, const char *buf, | ||
559 | size_t count) | ||
560 | { | ||
561 | struct Scsi_Host *host = class_to_shost(cdev); | ||
562 | struct lpfc_hba *phba = (struct lpfc_hba*)host->hostdata; | ||
563 | unsigned int cnt = count; | ||
564 | |||
565 | /* | ||
566 | * We're doing a simple sanity check for soft_wwpn setting. | ||
567 | * We require that the user write a specific key to enable | ||
568 | * the soft_wwpn attribute to be settable. Once the attribute | ||
569 | * is written, the enable key resets. If further updates are | ||
570 | * desired, the key must be written again to re-enable the | ||
571 | * attribute. | ||
572 | * | ||
573 | * The "key" is not secret - it is a hardcoded string shown | ||
574 | * here. The intent is to protect against the random user or | ||
575 | * application that is just writing attributes. | ||
576 | */ | ||
577 | |||
578 | /* count may include a LF at end of string */ | ||
579 | if (buf[cnt-1] == '\n') | ||
580 | cnt--; | ||
581 | |||
582 | if ((cnt != strlen(lpfc_soft_wwpn_key)) || | ||
583 | (strncmp(buf, lpfc_soft_wwpn_key, strlen(lpfc_soft_wwpn_key)) != 0)) | ||
584 | return -EINVAL; | ||
585 | |||
586 | phba->soft_wwpn_enable = 1; | ||
587 | return count; | ||
588 | } | ||
589 | static CLASS_DEVICE_ATTR(lpfc_soft_wwpn_enable, S_IWUSR, NULL, | ||
590 | lpfc_soft_wwpn_enable_store); | ||
591 | |||
592 | static ssize_t | ||
593 | lpfc_soft_wwpn_show(struct class_device *cdev, char *buf) | ||
594 | { | ||
595 | struct Scsi_Host *host = class_to_shost(cdev); | ||
596 | struct lpfc_hba *phba = (struct lpfc_hba*)host->hostdata; | ||
597 | return snprintf(buf, PAGE_SIZE, "0x%llx\n", phba->cfg_soft_wwpn); | ||
598 | } | ||
599 | |||
600 | |||
601 | static ssize_t | ||
602 | lpfc_soft_wwpn_store(struct class_device *cdev, const char *buf, size_t count) | ||
603 | { | ||
604 | struct Scsi_Host *host = class_to_shost(cdev); | ||
605 | struct lpfc_hba *phba = (struct lpfc_hba*)host->hostdata; | ||
606 | struct completion online_compl; | ||
607 | int stat1=0, stat2=0; | ||
608 | unsigned int i, j, cnt=count; | ||
609 | u8 wwpn[8]; | ||
610 | |||
611 | /* count may include a LF at end of string */ | ||
612 | if (buf[cnt-1] == '\n') | ||
613 | cnt--; | ||
614 | |||
615 | if (!phba->soft_wwpn_enable || (cnt < 16) || (cnt > 18) || | ||
616 | ((cnt == 17) && (*buf++ != 'x')) || | ||
617 | ((cnt == 18) && ((*buf++ != '0') || (*buf++ != 'x')))) | ||
618 | return -EINVAL; | ||
619 | |||
620 | phba->soft_wwpn_enable = 0; | ||
621 | |||
622 | memset(wwpn, 0, sizeof(wwpn)); | ||
623 | |||
624 | /* Validate and store the new name */ | ||
625 | for (i=0, j=0; i < 16; i++) { | ||
626 | if ((*buf >= 'a') && (*buf <= 'f')) | ||
627 | j = ((j << 4) | ((*buf++ -'a') + 10)); | ||
628 | else if ((*buf >= 'A') && (*buf <= 'F')) | ||
629 | j = ((j << 4) | ((*buf++ -'A') + 10)); | ||
630 | else if ((*buf >= '0') && (*buf <= '9')) | ||
631 | j = ((j << 4) | (*buf++ -'0')); | ||
632 | else | ||
633 | return -EINVAL; | ||
634 | if (i % 2) { | ||
635 | wwpn[i/2] = j & 0xff; | ||
636 | j = 0; | ||
637 | } | ||
638 | } | ||
639 | phba->cfg_soft_wwpn = wwn_to_u64(wwpn); | ||
640 | fc_host_port_name(host) = phba->cfg_soft_wwpn; | ||
641 | |||
642 | dev_printk(KERN_NOTICE, &phba->pcidev->dev, | ||
643 | "lpfc%d: Reinitializing to use soft_wwpn\n", phba->brd_no); | ||
644 | |||
645 | init_completion(&online_compl); | ||
646 | lpfc_workq_post_event(phba, &stat1, &online_compl, LPFC_EVT_OFFLINE); | ||
647 | wait_for_completion(&online_compl); | ||
648 | if (stat1) | ||
649 | lpfc_printf_log(phba, KERN_ERR, LOG_INIT, | ||
650 | "%d:0463 lpfc_soft_wwpn attribute set failed to reinit " | ||
651 | "adapter - %d\n", phba->brd_no, stat1); | ||
652 | |||
653 | init_completion(&online_compl); | ||
654 | lpfc_workq_post_event(phba, &stat2, &online_compl, LPFC_EVT_ONLINE); | ||
655 | wait_for_completion(&online_compl); | ||
656 | if (stat2) | ||
657 | lpfc_printf_log(phba, KERN_ERR, LOG_INIT, | ||
658 | "%d:0464 lpfc_soft_wwpn attribute set failed to reinit " | ||
659 | "adapter - %d\n", phba->brd_no, stat2); | ||
660 | |||
661 | return (stat1 || stat2) ? -EIO : count; | ||
662 | } | ||
663 | static CLASS_DEVICE_ATTR(lpfc_soft_wwpn, S_IRUGO | S_IWUSR,\ | ||
664 | lpfc_soft_wwpn_show, lpfc_soft_wwpn_store); | ||
665 | |||
666 | |||
551 | static int lpfc_poll = 0; | 667 | static int lpfc_poll = 0; |
552 | module_param(lpfc_poll, int, 0); | 668 | module_param(lpfc_poll, int, 0); |
553 | MODULE_PARM_DESC(lpfc_poll, "FCP ring polling mode control:" | 669 | MODULE_PARM_DESC(lpfc_poll, "FCP ring polling mode control:" |
@@ -559,6 +675,123 @@ static CLASS_DEVICE_ATTR(lpfc_poll, S_IRUGO | S_IWUSR, | |||
559 | lpfc_poll_show, lpfc_poll_store); | 675 | lpfc_poll_show, lpfc_poll_store); |
560 | 676 | ||
561 | /* | 677 | /* |
678 | # lpfc_nodev_tmo: If set, it will hold all I/O errors on devices that disappear | ||
679 | # until the timer expires. Value range is [0,255]. Default value is 30. | ||
680 | */ | ||
681 | static int lpfc_nodev_tmo = LPFC_DEF_DEVLOSS_TMO; | ||
682 | static int lpfc_devloss_tmo = LPFC_DEF_DEVLOSS_TMO; | ||
683 | module_param(lpfc_nodev_tmo, int, 0); | ||
684 | MODULE_PARM_DESC(lpfc_nodev_tmo, | ||
685 | "Seconds driver will hold I/O waiting " | ||
686 | "for a device to come back"); | ||
687 | static ssize_t | ||
688 | lpfc_nodev_tmo_show(struct class_device *cdev, char *buf) | ||
689 | { | ||
690 | struct Scsi_Host *host = class_to_shost(cdev); | ||
691 | struct lpfc_hba *phba = (struct lpfc_hba*)host->hostdata; | ||
692 | int val = 0; | ||
693 | val = phba->cfg_devloss_tmo; | ||
694 | return snprintf(buf, PAGE_SIZE, "%d\n", | ||
695 | phba->cfg_devloss_tmo); | ||
696 | } | ||
697 | |||
698 | static int | ||
699 | lpfc_nodev_tmo_init(struct lpfc_hba *phba, int val) | ||
700 | { | ||
701 | static int warned; | ||
702 | if (phba->cfg_devloss_tmo != LPFC_DEF_DEVLOSS_TMO) { | ||
703 | phba->cfg_nodev_tmo = phba->cfg_devloss_tmo; | ||
704 | if (!warned && val != LPFC_DEF_DEVLOSS_TMO) { | ||
705 | warned = 1; | ||
706 | lpfc_printf_log(phba, KERN_ERR, LOG_INIT, | ||
707 | "%d:0402 Ignoring nodev_tmo module " | ||
708 | "parameter because devloss_tmo is" | ||
709 | " set.\n", | ||
710 | phba->brd_no); | ||
711 | } | ||
712 | return 0; | ||
713 | } | ||
714 | |||
715 | if (val >= LPFC_MIN_DEVLOSS_TMO && val <= LPFC_MAX_DEVLOSS_TMO) { | ||
716 | phba->cfg_nodev_tmo = val; | ||
717 | phba->cfg_devloss_tmo = val; | ||
718 | return 0; | ||
719 | } | ||
720 | lpfc_printf_log(phba, KERN_ERR, LOG_INIT, | ||
721 | "%d:0400 lpfc_nodev_tmo attribute cannot be set to %d, " | ||
722 | "allowed range is [%d, %d]\n", | ||
723 | phba->brd_no, val, | ||
724 | LPFC_MIN_DEVLOSS_TMO, LPFC_MAX_DEVLOSS_TMO); | ||
725 | phba->cfg_nodev_tmo = LPFC_DEF_DEVLOSS_TMO; | ||
726 | return -EINVAL; | ||
727 | } | ||
728 | |||
729 | static int | ||
730 | lpfc_nodev_tmo_set(struct lpfc_hba *phba, int val) | ||
731 | { | ||
732 | if (phba->dev_loss_tmo_changed || | ||
733 | (lpfc_devloss_tmo != LPFC_DEF_DEVLOSS_TMO)) { | ||
734 | lpfc_printf_log(phba, KERN_ERR, LOG_INIT, | ||
735 | "%d:0401 Ignoring change to nodev_tmo " | ||
736 | "because devloss_tmo is set.\n", | ||
737 | phba->brd_no); | ||
738 | return 0; | ||
739 | } | ||
740 | |||
741 | if (val >= LPFC_MIN_DEVLOSS_TMO && val <= LPFC_MAX_DEVLOSS_TMO) { | ||
742 | phba->cfg_nodev_tmo = val; | ||
743 | phba->cfg_devloss_tmo = val; | ||
744 | return 0; | ||
745 | } | ||
746 | |||
747 | lpfc_printf_log(phba, KERN_ERR, LOG_INIT, | ||
748 | "%d:0403 lpfc_nodev_tmo attribute cannot be set to %d, " | ||
749 | "allowed range is [%d, %d]\n", | ||
750 | phba->brd_no, val, LPFC_MIN_DEVLOSS_TMO, | ||
751 | LPFC_MAX_DEVLOSS_TMO); | ||
752 | return -EINVAL; | ||
753 | } | ||
754 | |||
755 | lpfc_param_store(nodev_tmo) | ||
756 | |||
757 | static CLASS_DEVICE_ATTR(lpfc_nodev_tmo, S_IRUGO | S_IWUSR, | ||
758 | lpfc_nodev_tmo_show, lpfc_nodev_tmo_store); | ||
759 | |||
760 | /* | ||
761 | # lpfc_devloss_tmo: If set, it will hold all I/O errors on devices that | ||
762 | # disappear until the timer expires. Value range is [0,255]. Default | ||
763 | # value is 30. | ||
764 | */ | ||
765 | module_param(lpfc_devloss_tmo, int, 0); | ||
766 | MODULE_PARM_DESC(lpfc_devloss_tmo, | ||
767 | "Seconds driver will hold I/O waiting " | ||
768 | "for a device to come back"); | ||
769 | lpfc_param_init(devloss_tmo, LPFC_DEF_DEVLOSS_TMO, | ||
770 | LPFC_MIN_DEVLOSS_TMO, LPFC_MAX_DEVLOSS_TMO) | ||
771 | lpfc_param_show(devloss_tmo) | ||
772 | static int | ||
773 | lpfc_devloss_tmo_set(struct lpfc_hba *phba, int val) | ||
774 | { | ||
775 | if (val >= LPFC_MIN_DEVLOSS_TMO && val <= LPFC_MAX_DEVLOSS_TMO) { | ||
776 | phba->cfg_nodev_tmo = val; | ||
777 | phba->cfg_devloss_tmo = val; | ||
778 | phba->dev_loss_tmo_changed = 1; | ||
779 | return 0; | ||
780 | } | ||
781 | |||
782 | lpfc_printf_log(phba, KERN_ERR, LOG_INIT, | ||
783 | "%d:0404 lpfc_devloss_tmo attribute cannot be set to" | ||
784 | " %d, allowed range is [%d, %d]\n", | ||
785 | phba->brd_no, val, LPFC_MIN_DEVLOSS_TMO, | ||
786 | LPFC_MAX_DEVLOSS_TMO); | ||
787 | return -EINVAL; | ||
788 | } | ||
789 | |||
790 | lpfc_param_store(devloss_tmo) | ||
791 | static CLASS_DEVICE_ATTR(lpfc_devloss_tmo, S_IRUGO | S_IWUSR, | ||
792 | lpfc_devloss_tmo_show, lpfc_devloss_tmo_store); | ||
793 | |||
794 | /* | ||
562 | # lpfc_log_verbose: Only turn this flag on if you are willing to risk being | 795 | # lpfc_log_verbose: Only turn this flag on if you are willing to risk being |
563 | # deluged with LOTS of information. | 796 | # deluged with LOTS of information. |
564 | # You can set a bit mask to record specific types of verbose messages: | 797 | # You can set a bit mask to record specific types of verbose messages: |
@@ -617,14 +850,6 @@ LPFC_ATTR_R(scan_down, 1, 0, 1, | |||
617 | "Start scanning for devices from highest ALPA to lowest"); | 850 | "Start scanning for devices from highest ALPA to lowest"); |
618 | 851 | ||
619 | /* | 852 | /* |
620 | # lpfc_nodev_tmo: If set, it will hold all I/O errors on devices that disappear | ||
621 | # until the timer expires. Value range is [0,255]. Default value is 30. | ||
622 | # NOTE: this MUST be less then the SCSI Layer command timeout - 1. | ||
623 | */ | ||
624 | LPFC_ATTR_RW(nodev_tmo, 30, 0, 255, | ||
625 | "Seconds driver will hold I/O waiting for a device to come back"); | ||
626 | |||
627 | /* | ||
628 | # lpfc_topology: link topology for init link | 853 | # lpfc_topology: link topology for init link |
629 | # 0x0 = attempt loop mode then point-to-point | 854 | # 0x0 = attempt loop mode then point-to-point |
630 | # 0x01 = internal loopback mode | 855 | # 0x01 = internal loopback mode |
@@ -720,6 +945,7 @@ LPFC_ATTR_R(max_luns, 255, 0, 65535, | |||
720 | LPFC_ATTR_RW(poll_tmo, 10, 1, 255, | 945 | LPFC_ATTR_RW(poll_tmo, 10, 1, 255, |
721 | "Milliseconds driver will wait between polling FCP ring"); | 946 | "Milliseconds driver will wait between polling FCP ring"); |
722 | 947 | ||
948 | |||
723 | struct class_device_attribute *lpfc_host_attrs[] = { | 949 | struct class_device_attribute *lpfc_host_attrs[] = { |
724 | &class_device_attr_info, | 950 | &class_device_attr_info, |
725 | &class_device_attr_serialnum, | 951 | &class_device_attr_serialnum, |
@@ -737,6 +963,7 @@ struct class_device_attribute *lpfc_host_attrs[] = { | |||
737 | &class_device_attr_lpfc_lun_queue_depth, | 963 | &class_device_attr_lpfc_lun_queue_depth, |
738 | &class_device_attr_lpfc_hba_queue_depth, | 964 | &class_device_attr_lpfc_hba_queue_depth, |
739 | &class_device_attr_lpfc_nodev_tmo, | 965 | &class_device_attr_lpfc_nodev_tmo, |
966 | &class_device_attr_lpfc_devloss_tmo, | ||
740 | &class_device_attr_lpfc_fcp_class, | 967 | &class_device_attr_lpfc_fcp_class, |
741 | &class_device_attr_lpfc_use_adisc, | 968 | &class_device_attr_lpfc_use_adisc, |
742 | &class_device_attr_lpfc_ack0, | 969 | &class_device_attr_lpfc_ack0, |
@@ -754,6 +981,8 @@ struct class_device_attribute *lpfc_host_attrs[] = { | |||
754 | &class_device_attr_issue_reset, | 981 | &class_device_attr_issue_reset, |
755 | &class_device_attr_lpfc_poll, | 982 | &class_device_attr_lpfc_poll, |
756 | &class_device_attr_lpfc_poll_tmo, | 983 | &class_device_attr_lpfc_poll_tmo, |
984 | &class_device_attr_lpfc_soft_wwpn, | ||
985 | &class_device_attr_lpfc_soft_wwpn_enable, | ||
757 | NULL, | 986 | NULL, |
758 | }; | 987 | }; |
759 | 988 | ||
@@ -1204,6 +1433,15 @@ lpfc_get_host_fabric_name (struct Scsi_Host *shost) | |||
1204 | fc_host_fabric_name(shost) = node_name; | 1433 | fc_host_fabric_name(shost) = node_name; |
1205 | } | 1434 | } |
1206 | 1435 | ||
1436 | static void | ||
1437 | lpfc_get_host_symbolic_name (struct Scsi_Host *shost) | ||
1438 | { | ||
1439 | struct lpfc_hba *phba = (struct lpfc_hba*)shost->hostdata; | ||
1440 | |||
1441 | spin_lock_irq(shost->host_lock); | ||
1442 | lpfc_get_hba_sym_node_name(phba, fc_host_symbolic_name(shost)); | ||
1443 | spin_unlock_irq(shost->host_lock); | ||
1444 | } | ||
1207 | 1445 | ||
1208 | static struct fc_host_statistics * | 1446 | static struct fc_host_statistics * |
1209 | lpfc_get_stats(struct Scsi_Host *shost) | 1447 | lpfc_get_stats(struct Scsi_Host *shost) |
@@ -1441,27 +1679,12 @@ lpfc_get_starget_port_name(struct scsi_target *starget) | |||
1441 | } | 1679 | } |
1442 | 1680 | ||
1443 | static void | 1681 | static void |
1444 | lpfc_get_rport_loss_tmo(struct fc_rport *rport) | ||
1445 | { | ||
1446 | /* | ||
1447 | * Return the driver's global value for device loss timeout plus | ||
1448 | * five seconds to allow the driver's nodev timer to run. | ||
1449 | */ | ||
1450 | rport->dev_loss_tmo = lpfc_nodev_tmo + 5; | ||
1451 | } | ||
1452 | |||
1453 | static void | ||
1454 | lpfc_set_rport_loss_tmo(struct fc_rport *rport, uint32_t timeout) | 1682 | lpfc_set_rport_loss_tmo(struct fc_rport *rport, uint32_t timeout) |
1455 | { | 1683 | { |
1456 | /* | ||
1457 | * The driver doesn't have a per-target timeout setting. Set | ||
1458 | * this value globally. lpfc_nodev_tmo should be greater then 0. | ||
1459 | */ | ||
1460 | if (timeout) | 1684 | if (timeout) |
1461 | lpfc_nodev_tmo = timeout; | 1685 | rport->dev_loss_tmo = timeout; |
1462 | else | 1686 | else |
1463 | lpfc_nodev_tmo = 1; | 1687 | rport->dev_loss_tmo = 1; |
1464 | rport->dev_loss_tmo = lpfc_nodev_tmo + 5; | ||
1465 | } | 1688 | } |
1466 | 1689 | ||
1467 | 1690 | ||
@@ -1486,7 +1709,6 @@ struct fc_function_template lpfc_transport_functions = { | |||
1486 | .show_host_port_name = 1, | 1709 | .show_host_port_name = 1, |
1487 | .show_host_supported_classes = 1, | 1710 | .show_host_supported_classes = 1, |
1488 | .show_host_supported_fc4s = 1, | 1711 | .show_host_supported_fc4s = 1, |
1489 | .show_host_symbolic_name = 1, | ||
1490 | .show_host_supported_speeds = 1, | 1712 | .show_host_supported_speeds = 1, |
1491 | .show_host_maxframe_size = 1, | 1713 | .show_host_maxframe_size = 1, |
1492 | 1714 | ||
@@ -1509,6 +1731,9 @@ struct fc_function_template lpfc_transport_functions = { | |||
1509 | .get_host_fabric_name = lpfc_get_host_fabric_name, | 1731 | .get_host_fabric_name = lpfc_get_host_fabric_name, |
1510 | .show_host_fabric_name = 1, | 1732 | .show_host_fabric_name = 1, |
1511 | 1733 | ||
1734 | .get_host_symbolic_name = lpfc_get_host_symbolic_name, | ||
1735 | .show_host_symbolic_name = 1, | ||
1736 | |||
1512 | /* | 1737 | /* |
1513 | * The LPFC driver treats linkdown handling as target loss events | 1738 | * The LPFC driver treats linkdown handling as target loss events |
1514 | * so there are no sysfs handlers for link_down_tmo. | 1739 | * so there are no sysfs handlers for link_down_tmo. |
@@ -1521,7 +1746,6 @@ struct fc_function_template lpfc_transport_functions = { | |||
1521 | .show_rport_maxframe_size = 1, | 1746 | .show_rport_maxframe_size = 1, |
1522 | .show_rport_supported_classes = 1, | 1747 | .show_rport_supported_classes = 1, |
1523 | 1748 | ||
1524 | .get_rport_dev_loss_tmo = lpfc_get_rport_loss_tmo, | ||
1525 | .set_rport_dev_loss_tmo = lpfc_set_rport_loss_tmo, | 1749 | .set_rport_dev_loss_tmo = lpfc_set_rport_loss_tmo, |
1526 | .show_rport_dev_loss_tmo = 1, | 1750 | .show_rport_dev_loss_tmo = 1, |
1527 | 1751 | ||
@@ -1535,6 +1759,8 @@ struct fc_function_template lpfc_transport_functions = { | |||
1535 | .show_starget_port_name = 1, | 1759 | .show_starget_port_name = 1, |
1536 | 1760 | ||
1537 | .issue_fc_host_lip = lpfc_issue_lip, | 1761 | .issue_fc_host_lip = lpfc_issue_lip, |
1762 | .dev_loss_tmo_callbk = lpfc_dev_loss_tmo_callbk, | ||
1763 | .terminate_rport_io = lpfc_terminate_rport_io, | ||
1538 | }; | 1764 | }; |
1539 | 1765 | ||
1540 | void | 1766 | void |
@@ -1550,14 +1776,15 @@ lpfc_get_cfgparam(struct lpfc_hba *phba) | |||
1550 | lpfc_ack0_init(phba, lpfc_ack0); | 1776 | lpfc_ack0_init(phba, lpfc_ack0); |
1551 | lpfc_topology_init(phba, lpfc_topology); | 1777 | lpfc_topology_init(phba, lpfc_topology); |
1552 | lpfc_scan_down_init(phba, lpfc_scan_down); | 1778 | lpfc_scan_down_init(phba, lpfc_scan_down); |
1553 | lpfc_nodev_tmo_init(phba, lpfc_nodev_tmo); | ||
1554 | lpfc_link_speed_init(phba, lpfc_link_speed); | 1779 | lpfc_link_speed_init(phba, lpfc_link_speed); |
1555 | lpfc_fdmi_on_init(phba, lpfc_fdmi_on); | 1780 | lpfc_fdmi_on_init(phba, lpfc_fdmi_on); |
1556 | lpfc_discovery_threads_init(phba, lpfc_discovery_threads); | 1781 | lpfc_discovery_threads_init(phba, lpfc_discovery_threads); |
1557 | lpfc_max_luns_init(phba, lpfc_max_luns); | 1782 | lpfc_max_luns_init(phba, lpfc_max_luns); |
1558 | lpfc_poll_tmo_init(phba, lpfc_poll_tmo); | 1783 | lpfc_poll_tmo_init(phba, lpfc_poll_tmo); |
1559 | 1784 | lpfc_devloss_tmo_init(phba, lpfc_devloss_tmo); | |
1785 | lpfc_nodev_tmo_init(phba, lpfc_nodev_tmo); | ||
1560 | phba->cfg_poll = lpfc_poll; | 1786 | phba->cfg_poll = lpfc_poll; |
1787 | phba->cfg_soft_wwpn = 0L; | ||
1561 | 1788 | ||
1562 | /* | 1789 | /* |
1563 | * The total number of segments is the configuration value plus 2 | 1790 | * The total number of segments is the configuration value plus 2 |
diff --git a/drivers/scsi/lpfc/lpfc_crtn.h b/drivers/scsi/lpfc/lpfc_crtn.h index 2a176467f71b..3d684496acde 100644 --- a/drivers/scsi/lpfc/lpfc_crtn.h +++ b/drivers/scsi/lpfc/lpfc_crtn.h | |||
@@ -18,6 +18,7 @@ | |||
18 | * included with this package. * | 18 | * included with this package. * |
19 | *******************************************************************/ | 19 | *******************************************************************/ |
20 | 20 | ||
21 | struct fc_rport; | ||
21 | void lpfc_dump_mem(struct lpfc_hba *, LPFC_MBOXQ_t *, uint16_t); | 22 | void lpfc_dump_mem(struct lpfc_hba *, LPFC_MBOXQ_t *, uint16_t); |
22 | void lpfc_read_nv(struct lpfc_hba *, LPFC_MBOXQ_t *); | 23 | void lpfc_read_nv(struct lpfc_hba *, LPFC_MBOXQ_t *); |
23 | int lpfc_read_la(struct lpfc_hba * phba, LPFC_MBOXQ_t * pmb, | 24 | int lpfc_read_la(struct lpfc_hba * phba, LPFC_MBOXQ_t * pmb, |
@@ -200,6 +201,8 @@ extern struct scsi_host_template lpfc_template; | |||
200 | extern struct fc_function_template lpfc_transport_functions; | 201 | extern struct fc_function_template lpfc_transport_functions; |
201 | 202 | ||
202 | void lpfc_get_hba_sym_node_name(struct lpfc_hba * phba, uint8_t * symbp); | 203 | void lpfc_get_hba_sym_node_name(struct lpfc_hba * phba, uint8_t * symbp); |
204 | void lpfc_terminate_rport_io(struct fc_rport *); | ||
205 | void lpfc_dev_loss_tmo_callbk(struct fc_rport *rport); | ||
203 | 206 | ||
204 | #define ScsiResult(host_code, scsi_code) (((host_code) << 16) | scsi_code) | 207 | #define ScsiResult(host_code, scsi_code) (((host_code) << 16) | scsi_code) |
205 | #define HBA_EVENT_RSCN 5 | 208 | #define HBA_EVENT_RSCN 5 |
diff --git a/drivers/scsi/lpfc/lpfc_ct.c b/drivers/scsi/lpfc/lpfc_ct.c index bbb7310210b0..ae4106458991 100644 --- a/drivers/scsi/lpfc/lpfc_ct.c +++ b/drivers/scsi/lpfc/lpfc_ct.c | |||
@@ -324,7 +324,6 @@ lpfc_ns_rsp(struct lpfc_hba * phba, struct lpfc_dmabuf * mp, uint32_t Size) | |||
324 | struct lpfc_sli_ct_request *Response = | 324 | struct lpfc_sli_ct_request *Response = |
325 | (struct lpfc_sli_ct_request *) mp->virt; | 325 | (struct lpfc_sli_ct_request *) mp->virt; |
326 | struct lpfc_nodelist *ndlp = NULL; | 326 | struct lpfc_nodelist *ndlp = NULL; |
327 | struct lpfc_nodelist *next_ndlp; | ||
328 | struct lpfc_dmabuf *mlast, *next_mp; | 327 | struct lpfc_dmabuf *mlast, *next_mp; |
329 | uint32_t *ctptr = (uint32_t *) & Response->un.gid.PortType; | 328 | uint32_t *ctptr = (uint32_t *) & Response->un.gid.PortType; |
330 | uint32_t Did; | 329 | uint32_t Did; |
@@ -399,30 +398,6 @@ nsout1: | |||
399 | * current driver state. | 398 | * current driver state. |
400 | */ | 399 | */ |
401 | if (phba->hba_state == LPFC_HBA_READY) { | 400 | if (phba->hba_state == LPFC_HBA_READY) { |
402 | |||
403 | /* | ||
404 | * Switch ports that connect a loop of multiple targets need | ||
405 | * special consideration. The driver wants to unregister the | ||
406 | * rpi only on the target that was pulled from the loop. On | ||
407 | * RSCN, the driver wants to rediscover an NPort only if the | ||
408 | * driver flagged it as NLP_NPR_2B_DISC. Provided adisc is | ||
409 | * not enabled and the NPort is not capable of retransmissions | ||
410 | * (FC Tape) prevent timing races with the scsi error handler by | ||
411 | * unregistering the Nport's RPI. This action causes all | ||
412 | * outstanding IO to flush back to the midlayer. | ||
413 | */ | ||
414 | list_for_each_entry_safe(ndlp, next_ndlp, &phba->fc_npr_list, | ||
415 | nlp_listp) { | ||
416 | if (!(ndlp->nlp_flag & NLP_NPR_2B_DISC) && | ||
417 | (lpfc_rscn_payload_check(phba, ndlp->nlp_DID))) { | ||
418 | if ((phba->cfg_use_adisc == 0) && | ||
419 | !(ndlp->nlp_fcp_info & | ||
420 | NLP_FCP_2_DEVICE)) { | ||
421 | lpfc_unreg_rpi(phba, ndlp); | ||
422 | ndlp->nlp_flag &= ~NLP_NPR_ADISC; | ||
423 | } | ||
424 | } | ||
425 | } | ||
426 | lpfc_els_flush_rscn(phba); | 401 | lpfc_els_flush_rscn(phba); |
427 | spin_lock_irq(phba->host->host_lock); | 402 | spin_lock_irq(phba->host->host_lock); |
428 | phba->fc_flag |= FC_RSCN_MODE; /* we are still in RSCN mode */ | 403 | phba->fc_flag |= FC_RSCN_MODE; /* we are still in RSCN mode */ |
diff --git a/drivers/scsi/lpfc/lpfc_disc.h b/drivers/scsi/lpfc/lpfc_disc.h index 41cf5d3ea6ce..9766f909c9c6 100644 --- a/drivers/scsi/lpfc/lpfc_disc.h +++ b/drivers/scsi/lpfc/lpfc_disc.h | |||
@@ -30,7 +30,6 @@ | |||
30 | 30 | ||
31 | /* worker thread events */ | 31 | /* worker thread events */ |
32 | enum lpfc_work_type { | 32 | enum lpfc_work_type { |
33 | LPFC_EVT_NODEV_TMO, | ||
34 | LPFC_EVT_ONLINE, | 33 | LPFC_EVT_ONLINE, |
35 | LPFC_EVT_OFFLINE, | 34 | LPFC_EVT_OFFLINE, |
36 | LPFC_EVT_WARM_START, | 35 | LPFC_EVT_WARM_START, |
@@ -74,11 +73,9 @@ struct lpfc_nodelist { | |||
74 | #define NLP_FCP_2_DEVICE 0x10 /* FCP-2 device */ | 73 | #define NLP_FCP_2_DEVICE 0x10 /* FCP-2 device */ |
75 | 74 | ||
76 | struct timer_list nlp_delayfunc; /* Used for delayed ELS cmds */ | 75 | struct timer_list nlp_delayfunc; /* Used for delayed ELS cmds */ |
77 | struct timer_list nlp_tmofunc; /* Used for nodev tmo */ | ||
78 | struct fc_rport *rport; /* Corresponding FC transport | 76 | struct fc_rport *rport; /* Corresponding FC transport |
79 | port structure */ | 77 | port structure */ |
80 | struct lpfc_hba *nlp_phba; | 78 | struct lpfc_hba *nlp_phba; |
81 | struct lpfc_work_evt nodev_timeout_evt; | ||
82 | struct lpfc_work_evt els_retry_evt; | 79 | struct lpfc_work_evt els_retry_evt; |
83 | unsigned long last_ramp_up_time; /* jiffy of last ramp up */ | 80 | unsigned long last_ramp_up_time; /* jiffy of last ramp up */ |
84 | unsigned long last_q_full_time; /* jiffy of last queue full */ | 81 | unsigned long last_q_full_time; /* jiffy of last queue full */ |
@@ -102,7 +99,6 @@ struct lpfc_nodelist { | |||
102 | #define NLP_LOGO_SND 0x100 /* sent LOGO request for this entry */ | 99 | #define NLP_LOGO_SND 0x100 /* sent LOGO request for this entry */ |
103 | #define NLP_RNID_SND 0x400 /* sent RNID request for this entry */ | 100 | #define NLP_RNID_SND 0x400 /* sent RNID request for this entry */ |
104 | #define NLP_ELS_SND_MASK 0x7e0 /* sent ELS request for this entry */ | 101 | #define NLP_ELS_SND_MASK 0x7e0 /* sent ELS request for this entry */ |
105 | #define NLP_NODEV_TMO 0x10000 /* nodev timeout is running for node */ | ||
106 | #define NLP_DELAY_TMO 0x20000 /* delay timeout is running for node */ | 102 | #define NLP_DELAY_TMO 0x20000 /* delay timeout is running for node */ |
107 | #define NLP_NPR_2B_DISC 0x40000 /* node is included in num_disc_nodes */ | 103 | #define NLP_NPR_2B_DISC 0x40000 /* node is included in num_disc_nodes */ |
108 | #define NLP_RCV_PLOGI 0x80000 /* Rcv'ed PLOGI from remote system */ | 104 | #define NLP_RCV_PLOGI 0x80000 /* Rcv'ed PLOGI from remote system */ |
@@ -169,7 +165,7 @@ struct lpfc_nodelist { | |||
169 | */ | 165 | */ |
170 | /* | 166 | /* |
171 | * For a Link Down, all nodes on the ADISC, PLOGI, unmapped or mapped | 167 | * For a Link Down, all nodes on the ADISC, PLOGI, unmapped or mapped |
172 | * lists will receive a DEVICE_RECOVERY event. If the linkdown or nodev timers | 168 | * lists will receive a DEVICE_RECOVERY event. If the linkdown or devloss timers |
173 | * expire, all effected nodes will receive a DEVICE_RM event. | 169 | * expire, all effected nodes will receive a DEVICE_RM event. |
174 | */ | 170 | */ |
175 | /* | 171 | /* |
diff --git a/drivers/scsi/lpfc/lpfc_els.c b/drivers/scsi/lpfc/lpfc_els.c index 3567de613162..71864cdc6c71 100644 --- a/drivers/scsi/lpfc/lpfc_els.c +++ b/drivers/scsi/lpfc/lpfc_els.c | |||
@@ -2506,6 +2506,7 @@ lpfc_els_rcv_rscn(struct lpfc_hba * phba, | |||
2506 | uint32_t *lp; | 2506 | uint32_t *lp; |
2507 | IOCB_t *icmd; | 2507 | IOCB_t *icmd; |
2508 | uint32_t payload_len, cmd; | 2508 | uint32_t payload_len, cmd; |
2509 | int i; | ||
2509 | 2510 | ||
2510 | icmd = &cmdiocb->iocb; | 2511 | icmd = &cmdiocb->iocb; |
2511 | pcmd = (struct lpfc_dmabuf *) cmdiocb->context2; | 2512 | pcmd = (struct lpfc_dmabuf *) cmdiocb->context2; |
@@ -2524,6 +2525,10 @@ lpfc_els_rcv_rscn(struct lpfc_hba * phba, | |||
2524 | phba->brd_no, | 2525 | phba->brd_no, |
2525 | phba->fc_flag, payload_len, *lp, phba->fc_rscn_id_cnt); | 2526 | phba->fc_flag, payload_len, *lp, phba->fc_rscn_id_cnt); |
2526 | 2527 | ||
2528 | for (i = 0; i < payload_len/sizeof(uint32_t); i++) | ||
2529 | fc_host_post_event(phba->host, fc_get_event_number(), | ||
2530 | FCH_EVT_RSCN, lp[i]); | ||
2531 | |||
2527 | /* If we are about to begin discovery, just ACC the RSCN. | 2532 | /* If we are about to begin discovery, just ACC the RSCN. |
2528 | * Discovery processing will satisfy it. | 2533 | * Discovery processing will satisfy it. |
2529 | */ | 2534 | */ |
diff --git a/drivers/scsi/lpfc/lpfc_hbadisc.c b/drivers/scsi/lpfc/lpfc_hbadisc.c index b2f1552f1848..d586c3d3b0d0 100644 --- a/drivers/scsi/lpfc/lpfc_hbadisc.c +++ b/drivers/scsi/lpfc/lpfc_hbadisc.c | |||
@@ -56,28 +56,63 @@ static uint8_t lpfcAlpaArray[] = { | |||
56 | 56 | ||
57 | static void lpfc_disc_timeout_handler(struct lpfc_hba *); | 57 | static void lpfc_disc_timeout_handler(struct lpfc_hba *); |
58 | 58 | ||
59 | static void | 59 | void |
60 | lpfc_process_nodev_timeout(struct lpfc_hba *phba, struct lpfc_nodelist *ndlp) | 60 | lpfc_terminate_rport_io(struct fc_rport *rport) |
61 | { | 61 | { |
62 | uint8_t *name = (uint8_t *)&ndlp->nlp_portname; | 62 | struct lpfc_rport_data *rdata; |
63 | int warn_on = 0; | 63 | struct lpfc_nodelist * ndlp; |
64 | struct lpfc_hba *phba; | ||
64 | 65 | ||
65 | spin_lock_irq(phba->host->host_lock); | 66 | rdata = rport->dd_data; |
66 | if (!(ndlp->nlp_flag & NLP_NODEV_TMO)) { | 67 | ndlp = rdata->pnode; |
67 | spin_unlock_irq(phba->host->host_lock); | 68 | |
69 | if (!ndlp) { | ||
70 | if (rport->roles & FC_RPORT_ROLE_FCP_TARGET) | ||
71 | printk(KERN_ERR "Cannot find remote node" | ||
72 | " to terminate I/O Data x%x\n", | ||
73 | rport->port_id); | ||
68 | return; | 74 | return; |
69 | } | 75 | } |
70 | 76 | ||
71 | /* | 77 | phba = ndlp->nlp_phba; |
72 | * If a discovery event readded nodev_timer after timer | 78 | |
73 | * firing and before processing the timer, cancel the | ||
74 | * nlp_tmofunc. | ||
75 | */ | ||
76 | spin_unlock_irq(phba->host->host_lock); | ||
77 | del_timer_sync(&ndlp->nlp_tmofunc); | ||
78 | spin_lock_irq(phba->host->host_lock); | 79 | spin_lock_irq(phba->host->host_lock); |
80 | if (ndlp->nlp_sid != NLP_NO_SID) { | ||
81 | lpfc_sli_abort_iocb(phba, &phba->sli.ring[phba->sli.fcp_ring], | ||
82 | ndlp->nlp_sid, 0, 0, LPFC_CTX_TGT); | ||
83 | } | ||
84 | spin_unlock_irq(phba->host->host_lock); | ||
79 | 85 | ||
80 | ndlp->nlp_flag &= ~NLP_NODEV_TMO; | 86 | return; |
87 | } | ||
88 | |||
89 | /* | ||
90 | * This function will be called when dev_loss_tmo fire. | ||
91 | */ | ||
92 | void | ||
93 | lpfc_dev_loss_tmo_callbk(struct fc_rport *rport) | ||
94 | { | ||
95 | struct lpfc_rport_data *rdata; | ||
96 | struct lpfc_nodelist * ndlp; | ||
97 | uint8_t *name; | ||
98 | int warn_on = 0; | ||
99 | struct lpfc_hba *phba; | ||
100 | |||
101 | rdata = rport->dd_data; | ||
102 | ndlp = rdata->pnode; | ||
103 | |||
104 | if (!ndlp) { | ||
105 | if (rport->roles & FC_RPORT_ROLE_FCP_TARGET) | ||
106 | printk(KERN_ERR "Cannot find remote node" | ||
107 | " for rport in dev_loss_tmo_callbk x%x\n", | ||
108 | rport->port_id); | ||
109 | return; | ||
110 | } | ||
111 | |||
112 | name = (uint8_t *)&ndlp->nlp_portname; | ||
113 | phba = ndlp->nlp_phba; | ||
114 | |||
115 | spin_lock_irq(phba->host->host_lock); | ||
81 | 116 | ||
82 | if (ndlp->nlp_sid != NLP_NO_SID) { | 117 | if (ndlp->nlp_sid != NLP_NO_SID) { |
83 | warn_on = 1; | 118 | warn_on = 1; |
@@ -85,11 +120,14 @@ lpfc_process_nodev_timeout(struct lpfc_hba *phba, struct lpfc_nodelist *ndlp) | |||
85 | lpfc_sli_abort_iocb(phba, &phba->sli.ring[phba->sli.fcp_ring], | 120 | lpfc_sli_abort_iocb(phba, &phba->sli.ring[phba->sli.fcp_ring], |
86 | ndlp->nlp_sid, 0, 0, LPFC_CTX_TGT); | 121 | ndlp->nlp_sid, 0, 0, LPFC_CTX_TGT); |
87 | } | 122 | } |
123 | if (phba->fc_flag & FC_UNLOADING) | ||
124 | warn_on = 0; | ||
125 | |||
88 | spin_unlock_irq(phba->host->host_lock); | 126 | spin_unlock_irq(phba->host->host_lock); |
89 | 127 | ||
90 | if (warn_on) { | 128 | if (warn_on) { |
91 | lpfc_printf_log(phba, KERN_ERR, LOG_DISCOVERY, | 129 | lpfc_printf_log(phba, KERN_ERR, LOG_DISCOVERY, |
92 | "%d:0203 Nodev timeout on " | 130 | "%d:0203 Devloss timeout on " |
93 | "WWPN %x:%x:%x:%x:%x:%x:%x:%x " | 131 | "WWPN %x:%x:%x:%x:%x:%x:%x:%x " |
94 | "NPort x%x Data: x%x x%x x%x\n", | 132 | "NPort x%x Data: x%x x%x x%x\n", |
95 | phba->brd_no, | 133 | phba->brd_no, |
@@ -99,7 +137,7 @@ lpfc_process_nodev_timeout(struct lpfc_hba *phba, struct lpfc_nodelist *ndlp) | |||
99 | ndlp->nlp_state, ndlp->nlp_rpi); | 137 | ndlp->nlp_state, ndlp->nlp_rpi); |
100 | } else { | 138 | } else { |
101 | lpfc_printf_log(phba, KERN_INFO, LOG_DISCOVERY, | 139 | lpfc_printf_log(phba, KERN_INFO, LOG_DISCOVERY, |
102 | "%d:0204 Nodev timeout on " | 140 | "%d:0204 Devloss timeout on " |
103 | "WWPN %x:%x:%x:%x:%x:%x:%x:%x " | 141 | "WWPN %x:%x:%x:%x:%x:%x:%x:%x " |
104 | "NPort x%x Data: x%x x%x x%x\n", | 142 | "NPort x%x Data: x%x x%x x%x\n", |
105 | phba->brd_no, | 143 | phba->brd_no, |
@@ -109,7 +147,12 @@ lpfc_process_nodev_timeout(struct lpfc_hba *phba, struct lpfc_nodelist *ndlp) | |||
109 | ndlp->nlp_state, ndlp->nlp_rpi); | 147 | ndlp->nlp_state, ndlp->nlp_rpi); |
110 | } | 148 | } |
111 | 149 | ||
112 | lpfc_disc_state_machine(phba, ndlp, NULL, NLP_EVT_DEVICE_RM); | 150 | ndlp->rport = NULL; |
151 | rdata->pnode = NULL; | ||
152 | |||
153 | if (!(phba->fc_flag & FC_UNLOADING)) | ||
154 | lpfc_disc_state_machine(phba, ndlp, NULL, NLP_EVT_DEVICE_RM); | ||
155 | |||
113 | return; | 156 | return; |
114 | } | 157 | } |
115 | 158 | ||
@@ -127,11 +170,6 @@ lpfc_work_list_done(struct lpfc_hba * phba) | |||
127 | spin_unlock_irq(phba->host->host_lock); | 170 | spin_unlock_irq(phba->host->host_lock); |
128 | free_evt = 1; | 171 | free_evt = 1; |
129 | switch (evtp->evt) { | 172 | switch (evtp->evt) { |
130 | case LPFC_EVT_NODEV_TMO: | ||
131 | ndlp = (struct lpfc_nodelist *)(evtp->evt_arg1); | ||
132 | lpfc_process_nodev_timeout(phba, ndlp); | ||
133 | free_evt = 0; | ||
134 | break; | ||
135 | case LPFC_EVT_ELS_RETRY: | 173 | case LPFC_EVT_ELS_RETRY: |
136 | ndlp = (struct lpfc_nodelist *)(evtp->evt_arg1); | 174 | ndlp = (struct lpfc_nodelist *)(evtp->evt_arg1); |
137 | lpfc_els_retry_delay_handler(ndlp); | 175 | lpfc_els_retry_delay_handler(ndlp); |
@@ -340,6 +378,9 @@ lpfc_linkdown(struct lpfc_hba * phba) | |||
340 | spin_unlock_irq(phba->host->host_lock); | 378 | spin_unlock_irq(phba->host->host_lock); |
341 | } | 379 | } |
342 | 380 | ||
381 | fc_host_post_event(phba->host, fc_get_event_number(), | ||
382 | FCH_EVT_LINKDOWN, 0); | ||
383 | |||
343 | /* Clean up any firmware default rpi's */ | 384 | /* Clean up any firmware default rpi's */ |
344 | if ((mb = mempool_alloc(phba->mbox_mem_pool, GFP_KERNEL))) { | 385 | if ((mb = mempool_alloc(phba->mbox_mem_pool, GFP_KERNEL))) { |
345 | lpfc_unreg_did(phba, 0xffffffff, mb); | 386 | lpfc_unreg_did(phba, 0xffffffff, mb); |
@@ -374,16 +415,6 @@ lpfc_linkdown(struct lpfc_hba * phba) | |||
374 | rc = lpfc_disc_state_machine(phba, ndlp, NULL, | 415 | rc = lpfc_disc_state_machine(phba, ndlp, NULL, |
375 | NLP_EVT_DEVICE_RECOVERY); | 416 | NLP_EVT_DEVICE_RECOVERY); |
376 | 417 | ||
377 | /* Check config parameter use-adisc or FCP-2 */ | ||
378 | if ((rc != NLP_STE_FREED_NODE) && | ||
379 | (phba->cfg_use_adisc == 0) && | ||
380 | !(ndlp->nlp_fcp_info & NLP_FCP_2_DEVICE)) { | ||
381 | /* We know we will have to relogin, so | ||
382 | * unreglogin the rpi right now to fail | ||
383 | * any outstanding I/Os quickly. | ||
384 | */ | ||
385 | lpfc_unreg_rpi(phba, ndlp); | ||
386 | } | ||
387 | } | 418 | } |
388 | } | 419 | } |
389 | 420 | ||
@@ -427,6 +458,9 @@ lpfc_linkup(struct lpfc_hba * phba) | |||
427 | struct list_head *listp, *node_list[7]; | 458 | struct list_head *listp, *node_list[7]; |
428 | int i; | 459 | int i; |
429 | 460 | ||
461 | fc_host_post_event(phba->host, fc_get_event_number(), | ||
462 | FCH_EVT_LINKUP, 0); | ||
463 | |||
430 | spin_lock_irq(phba->host->host_lock); | 464 | spin_lock_irq(phba->host->host_lock); |
431 | phba->hba_state = LPFC_LINK_UP; | 465 | phba->hba_state = LPFC_LINK_UP; |
432 | phba->fc_flag &= ~(FC_PT2PT | FC_PT2PT_PLOGI | FC_ABORT_DISCOVERY | | 466 | phba->fc_flag &= ~(FC_PT2PT | FC_PT2PT_PLOGI | FC_ABORT_DISCOVERY | |
@@ -638,6 +672,8 @@ lpfc_mbx_cmpl_read_sparam(struct lpfc_hba * phba, LPFC_MBOXQ_t * pmb) | |||
638 | 672 | ||
639 | memcpy((uint8_t *) & phba->fc_sparam, (uint8_t *) mp->virt, | 673 | memcpy((uint8_t *) & phba->fc_sparam, (uint8_t *) mp->virt, |
640 | sizeof (struct serv_parm)); | 674 | sizeof (struct serv_parm)); |
675 | if (phba->cfg_soft_wwpn) | ||
676 | u64_to_wwn(phba->cfg_soft_wwpn, phba->fc_sparam.portName.u.wwn); | ||
641 | memcpy((uint8_t *) & phba->fc_nodename, | 677 | memcpy((uint8_t *) & phba->fc_nodename, |
642 | (uint8_t *) & phba->fc_sparam.nodeName, | 678 | (uint8_t *) & phba->fc_sparam.nodeName, |
643 | sizeof (struct lpfc_name)); | 679 | sizeof (struct lpfc_name)); |
@@ -1098,8 +1134,11 @@ lpfc_unregister_remote_port(struct lpfc_hba * phba, | |||
1098 | struct fc_rport *rport = ndlp->rport; | 1134 | struct fc_rport *rport = ndlp->rport; |
1099 | struct lpfc_rport_data *rdata = rport->dd_data; | 1135 | struct lpfc_rport_data *rdata = rport->dd_data; |
1100 | 1136 | ||
1101 | ndlp->rport = NULL; | 1137 | if (rport->scsi_target_id == -1) { |
1102 | rdata->pnode = NULL; | 1138 | ndlp->rport = NULL; |
1139 | rdata->pnode = NULL; | ||
1140 | } | ||
1141 | |||
1103 | fc_remote_port_delete(rport); | 1142 | fc_remote_port_delete(rport); |
1104 | 1143 | ||
1105 | return; | 1144 | return; |
@@ -1227,17 +1266,6 @@ lpfc_nlp_list(struct lpfc_hba * phba, struct lpfc_nodelist * nlp, int list) | |||
1227 | list_add_tail(&nlp->nlp_listp, &phba->fc_nlpunmap_list); | 1266 | list_add_tail(&nlp->nlp_listp, &phba->fc_nlpunmap_list); |
1228 | phba->fc_unmap_cnt++; | 1267 | phba->fc_unmap_cnt++; |
1229 | phba->nport_event_cnt++; | 1268 | phba->nport_event_cnt++; |
1230 | /* stop nodev tmo if running */ | ||
1231 | if (nlp->nlp_flag & NLP_NODEV_TMO) { | ||
1232 | nlp->nlp_flag &= ~NLP_NODEV_TMO; | ||
1233 | spin_unlock_irq(phba->host->host_lock); | ||
1234 | del_timer_sync(&nlp->nlp_tmofunc); | ||
1235 | spin_lock_irq(phba->host->host_lock); | ||
1236 | if (!list_empty(&nlp->nodev_timeout_evt.evt_listp)) | ||
1237 | list_del_init(&nlp->nodev_timeout_evt. | ||
1238 | evt_listp); | ||
1239 | |||
1240 | } | ||
1241 | nlp->nlp_flag &= ~NLP_NODEV_REMOVE; | 1269 | nlp->nlp_flag &= ~NLP_NODEV_REMOVE; |
1242 | nlp->nlp_type |= NLP_FC_NODE; | 1270 | nlp->nlp_type |= NLP_FC_NODE; |
1243 | break; | 1271 | break; |
@@ -1248,17 +1276,6 @@ lpfc_nlp_list(struct lpfc_hba * phba, struct lpfc_nodelist * nlp, int list) | |||
1248 | list_add_tail(&nlp->nlp_listp, &phba->fc_nlpmap_list); | 1276 | list_add_tail(&nlp->nlp_listp, &phba->fc_nlpmap_list); |
1249 | phba->fc_map_cnt++; | 1277 | phba->fc_map_cnt++; |
1250 | phba->nport_event_cnt++; | 1278 | phba->nport_event_cnt++; |
1251 | /* stop nodev tmo if running */ | ||
1252 | if (nlp->nlp_flag & NLP_NODEV_TMO) { | ||
1253 | nlp->nlp_flag &= ~NLP_NODEV_TMO; | ||
1254 | spin_unlock_irq(phba->host->host_lock); | ||
1255 | del_timer_sync(&nlp->nlp_tmofunc); | ||
1256 | spin_lock_irq(phba->host->host_lock); | ||
1257 | if (!list_empty(&nlp->nodev_timeout_evt.evt_listp)) | ||
1258 | list_del_init(&nlp->nodev_timeout_evt. | ||
1259 | evt_listp); | ||
1260 | |||
1261 | } | ||
1262 | nlp->nlp_flag &= ~NLP_NODEV_REMOVE; | 1279 | nlp->nlp_flag &= ~NLP_NODEV_REMOVE; |
1263 | break; | 1280 | break; |
1264 | case NLP_NPR_LIST: | 1281 | case NLP_NPR_LIST: |
@@ -1267,11 +1284,6 @@ lpfc_nlp_list(struct lpfc_hba * phba, struct lpfc_nodelist * nlp, int list) | |||
1267 | list_add_tail(&nlp->nlp_listp, &phba->fc_npr_list); | 1284 | list_add_tail(&nlp->nlp_listp, &phba->fc_npr_list); |
1268 | phba->fc_npr_cnt++; | 1285 | phba->fc_npr_cnt++; |
1269 | 1286 | ||
1270 | if (!(nlp->nlp_flag & NLP_NODEV_TMO)) | ||
1271 | mod_timer(&nlp->nlp_tmofunc, | ||
1272 | jiffies + HZ * phba->cfg_nodev_tmo); | ||
1273 | |||
1274 | nlp->nlp_flag |= NLP_NODEV_TMO; | ||
1275 | nlp->nlp_flag &= ~NLP_RCV_PLOGI; | 1287 | nlp->nlp_flag &= ~NLP_RCV_PLOGI; |
1276 | break; | 1288 | break; |
1277 | case NLP_JUST_DQ: | 1289 | case NLP_JUST_DQ: |
@@ -1301,7 +1313,8 @@ lpfc_nlp_list(struct lpfc_hba * phba, struct lpfc_nodelist * nlp, int list) | |||
1301 | * already. If we have, and it's a scsi entity, be | 1313 | * already. If we have, and it's a scsi entity, be |
1302 | * sure to unblock any attached scsi devices | 1314 | * sure to unblock any attached scsi devices |
1303 | */ | 1315 | */ |
1304 | if (!nlp->rport) | 1316 | if ((!nlp->rport) || (nlp->rport->port_state == |
1317 | FC_PORTSTATE_BLOCKED)) | ||
1305 | lpfc_register_remote_port(phba, nlp); | 1318 | lpfc_register_remote_port(phba, nlp); |
1306 | 1319 | ||
1307 | /* | 1320 | /* |
@@ -1575,15 +1588,12 @@ lpfc_freenode(struct lpfc_hba * phba, struct lpfc_nodelist * ndlp) | |||
1575 | 1588 | ||
1576 | lpfc_els_abort(phba,ndlp,0); | 1589 | lpfc_els_abort(phba,ndlp,0); |
1577 | spin_lock_irq(phba->host->host_lock); | 1590 | spin_lock_irq(phba->host->host_lock); |
1578 | ndlp->nlp_flag &= ~(NLP_NODEV_TMO|NLP_DELAY_TMO); | 1591 | ndlp->nlp_flag &= ~NLP_DELAY_TMO; |
1579 | spin_unlock_irq(phba->host->host_lock); | 1592 | spin_unlock_irq(phba->host->host_lock); |
1580 | del_timer_sync(&ndlp->nlp_tmofunc); | ||
1581 | 1593 | ||
1582 | ndlp->nlp_last_elscmd = 0; | 1594 | ndlp->nlp_last_elscmd = 0; |
1583 | del_timer_sync(&ndlp->nlp_delayfunc); | 1595 | del_timer_sync(&ndlp->nlp_delayfunc); |
1584 | 1596 | ||
1585 | if (!list_empty(&ndlp->nodev_timeout_evt.evt_listp)) | ||
1586 | list_del_init(&ndlp->nodev_timeout_evt.evt_listp); | ||
1587 | if (!list_empty(&ndlp->els_retry_evt.evt_listp)) | 1597 | if (!list_empty(&ndlp->els_retry_evt.evt_listp)) |
1588 | list_del_init(&ndlp->els_retry_evt.evt_listp); | 1598 | list_del_init(&ndlp->els_retry_evt.evt_listp); |
1589 | 1599 | ||
@@ -1600,16 +1610,6 @@ lpfc_freenode(struct lpfc_hba * phba, struct lpfc_nodelist * ndlp) | |||
1600 | int | 1610 | int |
1601 | lpfc_nlp_remove(struct lpfc_hba * phba, struct lpfc_nodelist * ndlp) | 1611 | lpfc_nlp_remove(struct lpfc_hba * phba, struct lpfc_nodelist * ndlp) |
1602 | { | 1612 | { |
1603 | if (ndlp->nlp_flag & NLP_NODEV_TMO) { | ||
1604 | spin_lock_irq(phba->host->host_lock); | ||
1605 | ndlp->nlp_flag &= ~NLP_NODEV_TMO; | ||
1606 | spin_unlock_irq(phba->host->host_lock); | ||
1607 | del_timer_sync(&ndlp->nlp_tmofunc); | ||
1608 | if (!list_empty(&ndlp->nodev_timeout_evt.evt_listp)) | ||
1609 | list_del_init(&ndlp->nodev_timeout_evt.evt_listp); | ||
1610 | |||
1611 | } | ||
1612 | |||
1613 | 1613 | ||
1614 | if (ndlp->nlp_flag & NLP_DELAY_TMO) { | 1614 | if (ndlp->nlp_flag & NLP_DELAY_TMO) { |
1615 | lpfc_cancel_retry_delay_tmo(phba, ndlp); | 1615 | lpfc_cancel_retry_delay_tmo(phba, ndlp); |
@@ -2424,34 +2424,6 @@ lpfc_disc_timeout_handler(struct lpfc_hba *phba) | |||
2424 | return; | 2424 | return; |
2425 | } | 2425 | } |
2426 | 2426 | ||
2427 | static void | ||
2428 | lpfc_nodev_timeout(unsigned long ptr) | ||
2429 | { | ||
2430 | struct lpfc_hba *phba; | ||
2431 | struct lpfc_nodelist *ndlp; | ||
2432 | unsigned long iflag; | ||
2433 | struct lpfc_work_evt *evtp; | ||
2434 | |||
2435 | ndlp = (struct lpfc_nodelist *)ptr; | ||
2436 | phba = ndlp->nlp_phba; | ||
2437 | evtp = &ndlp->nodev_timeout_evt; | ||
2438 | spin_lock_irqsave(phba->host->host_lock, iflag); | ||
2439 | |||
2440 | if (!list_empty(&evtp->evt_listp)) { | ||
2441 | spin_unlock_irqrestore(phba->host->host_lock, iflag); | ||
2442 | return; | ||
2443 | } | ||
2444 | evtp->evt_arg1 = ndlp; | ||
2445 | evtp->evt = LPFC_EVT_NODEV_TMO; | ||
2446 | list_add_tail(&evtp->evt_listp, &phba->work_list); | ||
2447 | if (phba->work_wait) | ||
2448 | wake_up(phba->work_wait); | ||
2449 | |||
2450 | spin_unlock_irqrestore(phba->host->host_lock, iflag); | ||
2451 | return; | ||
2452 | } | ||
2453 | |||
2454 | |||
2455 | /* | 2427 | /* |
2456 | * This routine handles processing a NameServer REG_LOGIN mailbox | 2428 | * This routine handles processing a NameServer REG_LOGIN mailbox |
2457 | * command upon completion. It is setup in the LPFC_MBOXQ | 2429 | * command upon completion. It is setup in the LPFC_MBOXQ |
@@ -2575,11 +2547,7 @@ lpfc_nlp_init(struct lpfc_hba * phba, struct lpfc_nodelist * ndlp, | |||
2575 | uint32_t did) | 2547 | uint32_t did) |
2576 | { | 2548 | { |
2577 | memset(ndlp, 0, sizeof (struct lpfc_nodelist)); | 2549 | memset(ndlp, 0, sizeof (struct lpfc_nodelist)); |
2578 | INIT_LIST_HEAD(&ndlp->nodev_timeout_evt.evt_listp); | ||
2579 | INIT_LIST_HEAD(&ndlp->els_retry_evt.evt_listp); | 2550 | INIT_LIST_HEAD(&ndlp->els_retry_evt.evt_listp); |
2580 | init_timer(&ndlp->nlp_tmofunc); | ||
2581 | ndlp->nlp_tmofunc.function = lpfc_nodev_timeout; | ||
2582 | ndlp->nlp_tmofunc.data = (unsigned long)ndlp; | ||
2583 | init_timer(&ndlp->nlp_delayfunc); | 2551 | init_timer(&ndlp->nlp_delayfunc); |
2584 | ndlp->nlp_delayfunc.function = lpfc_els_retry_delay; | 2552 | ndlp->nlp_delayfunc.function = lpfc_els_retry_delay; |
2585 | ndlp->nlp_delayfunc.data = (unsigned long)ndlp; | 2553 | ndlp->nlp_delayfunc.data = (unsigned long)ndlp; |
diff --git a/drivers/scsi/lpfc/lpfc_init.c b/drivers/scsi/lpfc/lpfc_init.c index f6948ffe689a..4cdf3464267f 100644 --- a/drivers/scsi/lpfc/lpfc_init.c +++ b/drivers/scsi/lpfc/lpfc_init.c | |||
@@ -268,6 +268,8 @@ lpfc_config_port_post(struct lpfc_hba * phba) | |||
268 | kfree(mp); | 268 | kfree(mp); |
269 | pmb->context1 = NULL; | 269 | pmb->context1 = NULL; |
270 | 270 | ||
271 | if (phba->cfg_soft_wwpn) | ||
272 | u64_to_wwn(phba->cfg_soft_wwpn, phba->fc_sparam.portName.u.wwn); | ||
271 | memcpy(&phba->fc_nodename, &phba->fc_sparam.nodeName, | 273 | memcpy(&phba->fc_nodename, &phba->fc_sparam.nodeName, |
272 | sizeof (struct lpfc_name)); | 274 | sizeof (struct lpfc_name)); |
273 | memcpy(&phba->fc_portname, &phba->fc_sparam.portName, | 275 | memcpy(&phba->fc_portname, &phba->fc_sparam.portName, |
@@ -511,6 +513,7 @@ lpfc_handle_eratt(struct lpfc_hba * phba) | |||
511 | { | 513 | { |
512 | struct lpfc_sli *psli = &phba->sli; | 514 | struct lpfc_sli *psli = &phba->sli; |
513 | struct lpfc_sli_ring *pring; | 515 | struct lpfc_sli_ring *pring; |
516 | uint32_t event_data; | ||
514 | 517 | ||
515 | if (phba->work_hs & HS_FFER6) { | 518 | if (phba->work_hs & HS_FFER6) { |
516 | /* Re-establishing Link */ | 519 | /* Re-establishing Link */ |
@@ -555,6 +558,11 @@ lpfc_handle_eratt(struct lpfc_hba * phba) | |||
555 | phba->brd_no, phba->work_hs, | 558 | phba->brd_no, phba->work_hs, |
556 | phba->work_status[0], phba->work_status[1]); | 559 | phba->work_status[0], phba->work_status[1]); |
557 | 560 | ||
561 | event_data = FC_REG_DUMP_EVENT; | ||
562 | fc_host_post_vendor_event(phba->host, fc_get_event_number(), | ||
563 | sizeof(event_data), (char *) &event_data, | ||
564 | SCSI_NL_VID_TYPE_PCI | PCI_VENDOR_ID_EMULEX); | ||
565 | |||
558 | psli->sli_flag &= ~LPFC_SLI2_ACTIVE; | 566 | psli->sli_flag &= ~LPFC_SLI2_ACTIVE; |
559 | lpfc_offline(phba); | 567 | lpfc_offline(phba); |
560 | phba->hba_state = LPFC_HBA_ERROR; | 568 | phba->hba_state = LPFC_HBA_ERROR; |
diff --git a/drivers/scsi/lpfc/lpfc_nportdisc.c b/drivers/scsi/lpfc/lpfc_nportdisc.c index 20449a8dd53d..d5f415007db2 100644 --- a/drivers/scsi/lpfc/lpfc_nportdisc.c +++ b/drivers/scsi/lpfc/lpfc_nportdisc.c | |||
@@ -1813,7 +1813,7 @@ lpfc_device_recov_npr_node(struct lpfc_hba * phba, | |||
1813 | */ | 1813 | */ |
1814 | /* | 1814 | /* |
1815 | * For a Link Down, all nodes on the ADISC, PLOGI, unmapped or mapped | 1815 | * For a Link Down, all nodes on the ADISC, PLOGI, unmapped or mapped |
1816 | * lists will receive a DEVICE_RECOVERY event. If the linkdown or nodev timers | 1816 | * lists will receive a DEVICE_RECOVERY event. If the linkdown or devloss timers |
1817 | * expire, all effected nodes will receive a DEVICE_RM event. | 1817 | * expire, all effected nodes will receive a DEVICE_RM event. |
1818 | */ | 1818 | */ |
1819 | /* | 1819 | /* |
diff --git a/drivers/scsi/lpfc/lpfc_scsi.c b/drivers/scsi/lpfc/lpfc_scsi.c index a8816a8738f8..97ae98dc95d0 100644 --- a/drivers/scsi/lpfc/lpfc_scsi.c +++ b/drivers/scsi/lpfc/lpfc_scsi.c | |||
@@ -935,7 +935,7 @@ lpfc_abort_handler(struct scsi_cmnd *cmnd) | |||
935 | schedule_timeout_uninterruptible(LPFC_ABORT_WAIT*HZ); | 935 | schedule_timeout_uninterruptible(LPFC_ABORT_WAIT*HZ); |
936 | spin_lock_irq(phba->host->host_lock); | 936 | spin_lock_irq(phba->host->host_lock); |
937 | if (++loop_count | 937 | if (++loop_count |
938 | > (2 * phba->cfg_nodev_tmo)/LPFC_ABORT_WAIT) | 938 | > (2 * phba->cfg_devloss_tmo)/LPFC_ABORT_WAIT) |
939 | break; | 939 | break; |
940 | } | 940 | } |
941 | 941 | ||
@@ -978,7 +978,7 @@ lpfc_reset_lun_handler(struct scsi_cmnd *cmnd) | |||
978 | spin_lock_irq(shost->host_lock); | 978 | spin_lock_irq(shost->host_lock); |
979 | /* | 979 | /* |
980 | * If target is not in a MAPPED state, delay the reset until | 980 | * If target is not in a MAPPED state, delay the reset until |
981 | * target is rediscovered or nodev timeout expires. | 981 | * target is rediscovered or devloss timeout expires. |
982 | */ | 982 | */ |
983 | while ( 1 ) { | 983 | while ( 1 ) { |
984 | if (!pnode) | 984 | if (!pnode) |
@@ -1050,7 +1050,7 @@ lpfc_reset_lun_handler(struct scsi_cmnd *cmnd) | |||
1050 | spin_lock_irq(phba->host->host_lock); | 1050 | spin_lock_irq(phba->host->host_lock); |
1051 | 1051 | ||
1052 | if (++loopcnt | 1052 | if (++loopcnt |
1053 | > (2 * phba->cfg_nodev_tmo)/LPFC_RESET_WAIT) | 1053 | > (2 * phba->cfg_devloss_tmo)/LPFC_RESET_WAIT) |
1054 | break; | 1054 | break; |
1055 | 1055 | ||
1056 | cnt = lpfc_sli_sum_iocb(phba, | 1056 | cnt = lpfc_sli_sum_iocb(phba, |
@@ -1151,7 +1151,7 @@ lpfc_reset_bus_handler(struct scsi_cmnd *cmnd) | |||
1151 | spin_lock_irq(phba->host->host_lock); | 1151 | spin_lock_irq(phba->host->host_lock); |
1152 | 1152 | ||
1153 | if (++loopcnt | 1153 | if (++loopcnt |
1154 | > (2 * phba->cfg_nodev_tmo)/LPFC_RESET_WAIT) | 1154 | > (2 * phba->cfg_devloss_tmo)/LPFC_RESET_WAIT) |
1155 | break; | 1155 | break; |
1156 | 1156 | ||
1157 | cnt = lpfc_sli_sum_iocb(phba, | 1157 | cnt = lpfc_sli_sum_iocb(phba, |
@@ -1249,7 +1249,7 @@ lpfc_slave_configure(struct scsi_device *sdev) | |||
1249 | * target pointer is stored in the starget_data for the | 1249 | * target pointer is stored in the starget_data for the |
1250 | * driver's sysfs entry point functions. | 1250 | * driver's sysfs entry point functions. |
1251 | */ | 1251 | */ |
1252 | rport->dev_loss_tmo = phba->cfg_nodev_tmo + 5; | 1252 | rport->dev_loss_tmo = phba->cfg_devloss_tmo; |
1253 | 1253 | ||
1254 | if (phba->cfg_poll & ENABLE_FCP_RING_POLLING) { | 1254 | if (phba->cfg_poll & ENABLE_FCP_RING_POLLING) { |
1255 | lpfc_sli_poll_fcp_ring(phba); | 1255 | lpfc_sli_poll_fcp_ring(phba); |
diff --git a/drivers/scsi/lpfc/lpfc_version.h b/drivers/scsi/lpfc/lpfc_version.h index c7091ea29f3f..ac417908b407 100644 --- a/drivers/scsi/lpfc/lpfc_version.h +++ b/drivers/scsi/lpfc/lpfc_version.h | |||
@@ -18,7 +18,7 @@ | |||
18 | * included with this package. * | 18 | * included with this package. * |
19 | *******************************************************************/ | 19 | *******************************************************************/ |
20 | 20 | ||
21 | #define LPFC_DRIVER_VERSION "8.1.9" | 21 | #define LPFC_DRIVER_VERSION "8.1.10" |
22 | 22 | ||
23 | #define LPFC_DRIVER_NAME "lpfc" | 23 | #define LPFC_DRIVER_NAME "lpfc" |
24 | 24 | ||