diff options
Diffstat (limited to 'drivers/message/fusion')
-rw-r--r-- | drivers/message/fusion/mptbase.h | 2 | ||||
-rw-r--r-- | drivers/message/fusion/mptfc.c | 66 |
2 files changed, 68 insertions, 0 deletions
diff --git a/drivers/message/fusion/mptbase.h b/drivers/message/fusion/mptbase.h index 04ef0a37a764..1197eba45bf5 100644 --- a/drivers/message/fusion/mptbase.h +++ b/drivers/message/fusion/mptbase.h | |||
@@ -698,6 +698,8 @@ typedef struct _MPT_ADAPTER | |||
698 | 698 | ||
699 | struct work_struct fc_setup_reset_work; | 699 | struct work_struct fc_setup_reset_work; |
700 | struct list_head fc_rports; | 700 | struct list_head fc_rports; |
701 | struct work_struct fc_lsc_work; | ||
702 | u8 fc_link_speed[2]; | ||
701 | spinlock_t fc_rescan_work_lock; | 703 | spinlock_t fc_rescan_work_lock; |
702 | struct work_struct fc_rescan_work; | 704 | struct work_struct fc_rescan_work; |
703 | char fc_rescan_work_q_name[KOBJ_NAME_LEN]; | 705 | char fc_rescan_work_q_name[KOBJ_NAME_LEN]; |
diff --git a/drivers/message/fusion/mptfc.c b/drivers/message/fusion/mptfc.c index 2b3e27a58035..aadb0711cb61 100644 --- a/drivers/message/fusion/mptfc.c +++ b/drivers/message/fusion/mptfc.c | |||
@@ -675,6 +675,50 @@ mptfc_qcmd(struct scsi_cmnd *SCpnt, void (*done)(struct scsi_cmnd *)) | |||
675 | } | 675 | } |
676 | 676 | ||
677 | /* | 677 | /* |
678 | * mptfc_display_port_link_speed - displaying link speed | ||
679 | * @ioc: Pointer to MPT_ADAPTER structure | ||
680 | * @portnum: IOC Port number | ||
681 | * @pp0dest: port page0 data payload | ||
682 | * | ||
683 | */ | ||
684 | static void | ||
685 | mptfc_display_port_link_speed(MPT_ADAPTER *ioc, int portnum, FCPortPage0_t *pp0dest) | ||
686 | { | ||
687 | u8 old_speed, new_speed, state; | ||
688 | char *old, *new; | ||
689 | |||
690 | if (portnum >= 2) | ||
691 | return; | ||
692 | |||
693 | old_speed = ioc->fc_link_speed[portnum]; | ||
694 | new_speed = pp0dest->CurrentSpeed; | ||
695 | state = pp0dest->PortState; | ||
696 | |||
697 | if (state != MPI_FCPORTPAGE0_PORTSTATE_OFFLINE && | ||
698 | new_speed != MPI_FCPORTPAGE0_CURRENT_SPEED_UKNOWN) { | ||
699 | |||
700 | old = old_speed == MPI_FCPORTPAGE0_CURRENT_SPEED_1GBIT ? "1 Gbps" : | ||
701 | old_speed == MPI_FCPORTPAGE0_CURRENT_SPEED_2GBIT ? "2 Gbps" : | ||
702 | old_speed == MPI_FCPORTPAGE0_CURRENT_SPEED_4GBIT ? "4 Gbps" : | ||
703 | "Unknown"; | ||
704 | new = new_speed == MPI_FCPORTPAGE0_CURRENT_SPEED_1GBIT ? "1 Gbps" : | ||
705 | new_speed == MPI_FCPORTPAGE0_CURRENT_SPEED_2GBIT ? "2 Gbps" : | ||
706 | new_speed == MPI_FCPORTPAGE0_CURRENT_SPEED_4GBIT ? "4 Gbps" : | ||
707 | "Unknown"; | ||
708 | if (old_speed == 0) | ||
709 | printk(MYIOC_s_NOTE_FMT | ||
710 | "FC Link Established, Speed = %s\n", | ||
711 | ioc->name, new); | ||
712 | else if (old_speed != new_speed) | ||
713 | printk(MYIOC_s_WARN_FMT | ||
714 | "FC Link Speed Change, Old Speed = %s, New Speed = %s\n", | ||
715 | ioc->name, old, new); | ||
716 | |||
717 | ioc->fc_link_speed[portnum] = new_speed; | ||
718 | } | ||
719 | } | ||
720 | |||
721 | /* | ||
678 | * mptfc_GetFcPortPage0 - Fetch FCPort config Page0. | 722 | * mptfc_GetFcPortPage0 - Fetch FCPort config Page0. |
679 | * @ioc: Pointer to MPT_ADAPTER structure | 723 | * @ioc: Pointer to MPT_ADAPTER structure |
680 | * @portnum: IOC Port number | 724 | * @portnum: IOC Port number |
@@ -773,6 +817,7 @@ mptfc_GetFcPortPage0(MPT_ADAPTER *ioc, int portnum) | |||
773 | " complete.\n", | 817 | " complete.\n", |
774 | ioc->name); | 818 | ioc->name); |
775 | } | 819 | } |
820 | mptfc_display_port_link_speed(ioc, portnum, pp0dest); | ||
776 | } | 821 | } |
777 | 822 | ||
778 | pci_free_consistent(ioc->pcidev, data_sz, (u8 *) ppage0_alloc, page0_dma); | 823 | pci_free_consistent(ioc->pcidev, data_sz, (u8 *) ppage0_alloc, page0_dma); |
@@ -1023,6 +1068,18 @@ mptfc_init_host_attr(MPT_ADAPTER *ioc,int portnum) | |||
1023 | } | 1068 | } |
1024 | 1069 | ||
1025 | static void | 1070 | static void |
1071 | mptfc_link_status_change(struct work_struct *work) | ||
1072 | { | ||
1073 | MPT_ADAPTER *ioc = | ||
1074 | container_of(work, MPT_ADAPTER, fc_rescan_work); | ||
1075 | int ii; | ||
1076 | |||
1077 | for (ii=0; ii < ioc->facts.NumberOfPorts; ii++) | ||
1078 | (void) mptfc_GetFcPortPage0(ioc, ii); | ||
1079 | |||
1080 | } | ||
1081 | |||
1082 | static void | ||
1026 | mptfc_setup_reset(struct work_struct *work) | 1083 | mptfc_setup_reset(struct work_struct *work) |
1027 | { | 1084 | { |
1028 | MPT_ADAPTER *ioc = | 1085 | MPT_ADAPTER *ioc = |
@@ -1163,6 +1220,7 @@ mptfc_probe(struct pci_dev *pdev, const struct pci_device_id *id) | |||
1163 | spin_lock_init(&ioc->fc_rescan_work_lock); | 1220 | spin_lock_init(&ioc->fc_rescan_work_lock); |
1164 | INIT_WORK(&ioc->fc_rescan_work, mptfc_rescan_devices); | 1221 | INIT_WORK(&ioc->fc_rescan_work, mptfc_rescan_devices); |
1165 | INIT_WORK(&ioc->fc_setup_reset_work, mptfc_setup_reset); | 1222 | INIT_WORK(&ioc->fc_setup_reset_work, mptfc_setup_reset); |
1223 | INIT_WORK(&ioc->fc_lsc_work, mptfc_link_status_change); | ||
1166 | 1224 | ||
1167 | spin_lock_irqsave(&ioc->FreeQlock, flags); | 1225 | spin_lock_irqsave(&ioc->FreeQlock, flags); |
1168 | 1226 | ||
@@ -1337,6 +1395,14 @@ mptfc_event_process(MPT_ADAPTER *ioc, EventNotificationReply_t *pEvReply) | |||
1337 | } | 1395 | } |
1338 | spin_unlock_irqrestore(&ioc->fc_rescan_work_lock, flags); | 1396 | spin_unlock_irqrestore(&ioc->fc_rescan_work_lock, flags); |
1339 | break; | 1397 | break; |
1398 | case MPI_EVENT_LINK_STATUS_CHANGE: | ||
1399 | spin_lock_irqsave(&ioc->fc_rescan_work_lock, flags); | ||
1400 | if (ioc->fc_rescan_work_q) { | ||
1401 | queue_work(ioc->fc_rescan_work_q, | ||
1402 | &ioc->fc_lsc_work); | ||
1403 | } | ||
1404 | spin_unlock_irqrestore(&ioc->fc_rescan_work_lock, flags); | ||
1405 | break; | ||
1340 | default: | 1406 | default: |
1341 | rc = mptscsih_event_process(ioc,pEvReply); | 1407 | rc = mptscsih_event_process(ioc,pEvReply); |
1342 | break; | 1408 | break; |