diff options
Diffstat (limited to 'drivers/scsi/lpfc/lpfc_hbadisc.c')
-rw-r--r-- | drivers/scsi/lpfc/lpfc_hbadisc.c | 69 |
1 files changed, 40 insertions, 29 deletions
diff --git a/drivers/scsi/lpfc/lpfc_hbadisc.c b/drivers/scsi/lpfc/lpfc_hbadisc.c index a1a70d9ffc2a..8c64494444bf 100644 --- a/drivers/scsi/lpfc/lpfc_hbadisc.c +++ b/drivers/scsi/lpfc/lpfc_hbadisc.c | |||
@@ -350,7 +350,7 @@ lpfc_send_fastpath_evt(struct lpfc_hba *phba, | |||
350 | evt_data_size = sizeof(fast_evt_data->un. | 350 | evt_data_size = sizeof(fast_evt_data->un. |
351 | read_check_error); | 351 | read_check_error); |
352 | } else if ((evt_sub_category == LPFC_EVENT_FABRIC_BUSY) || | 352 | } else if ((evt_sub_category == LPFC_EVENT_FABRIC_BUSY) || |
353 | (evt_sub_category == IOSTAT_NPORT_BSY)) { | 353 | (evt_sub_category == LPFC_EVENT_PORT_BUSY)) { |
354 | evt_data = (char *) &fast_evt_data->un.fabric_evt; | 354 | evt_data = (char *) &fast_evt_data->un.fabric_evt; |
355 | evt_data_size = sizeof(fast_evt_data->un.fabric_evt); | 355 | evt_data_size = sizeof(fast_evt_data->un.fabric_evt); |
356 | } else { | 356 | } else { |
@@ -387,7 +387,7 @@ lpfc_send_fastpath_evt(struct lpfc_hba *phba, | |||
387 | fc_get_event_number(), | 387 | fc_get_event_number(), |
388 | evt_data_size, | 388 | evt_data_size, |
389 | evt_data, | 389 | evt_data, |
390 | SCSI_NL_VID_TYPE_PCI | PCI_VENDOR_ID_EMULEX); | 390 | LPFC_NL_VENDOR_ID); |
391 | 391 | ||
392 | lpfc_free_fast_evt(phba, fast_evt_data); | 392 | lpfc_free_fast_evt(phba, fast_evt_data); |
393 | return; | 393 | return; |
@@ -585,20 +585,25 @@ lpfc_do_work(void *p) | |||
585 | set_user_nice(current, -20); | 585 | set_user_nice(current, -20); |
586 | phba->data_flags = 0; | 586 | phba->data_flags = 0; |
587 | 587 | ||
588 | while (1) { | 588 | while (!kthread_should_stop()) { |
589 | /* wait and check worker queue activities */ | 589 | /* wait and check worker queue activities */ |
590 | rc = wait_event_interruptible(phba->work_waitq, | 590 | rc = wait_event_interruptible(phba->work_waitq, |
591 | (test_and_clear_bit(LPFC_DATA_READY, | 591 | (test_and_clear_bit(LPFC_DATA_READY, |
592 | &phba->data_flags) | 592 | &phba->data_flags) |
593 | || kthread_should_stop())); | 593 | || kthread_should_stop())); |
594 | BUG_ON(rc); | 594 | /* Signal wakeup shall terminate the worker thread */ |
595 | 595 | if (rc) { | |
596 | if (kthread_should_stop()) | 596 | lpfc_printf_log(phba, KERN_ERR, LOG_ELS, |
597 | "0433 Wakeup on signal: rc=x%x\n", rc); | ||
597 | break; | 598 | break; |
599 | } | ||
598 | 600 | ||
599 | /* Attend pending lpfc data processing */ | 601 | /* Attend pending lpfc data processing */ |
600 | lpfc_work_done(phba); | 602 | lpfc_work_done(phba); |
601 | } | 603 | } |
604 | phba->worker_thread = NULL; | ||
605 | lpfc_printf_log(phba, KERN_INFO, LOG_ELS, | ||
606 | "0432 Worker thread stopped.\n"); | ||
602 | return 0; | 607 | return 0; |
603 | } | 608 | } |
604 | 609 | ||
@@ -1852,6 +1857,32 @@ lpfc_disable_node(struct lpfc_vport *vport, struct lpfc_nodelist *ndlp) | |||
1852 | lpfc_nlp_state_cleanup(vport, ndlp, ndlp->nlp_state, | 1857 | lpfc_nlp_state_cleanup(vport, ndlp, ndlp->nlp_state, |
1853 | NLP_STE_UNUSED_NODE); | 1858 | NLP_STE_UNUSED_NODE); |
1854 | } | 1859 | } |
1860 | /** | ||
1861 | * lpfc_initialize_node: Initialize all fields of node object. | ||
1862 | * @vport: Pointer to Virtual Port object. | ||
1863 | * @ndlp: Pointer to FC node object. | ||
1864 | * @did: FC_ID of the node. | ||
1865 | * This function is always called when node object need to | ||
1866 | * be initialized. It initializes all the fields of the node | ||
1867 | * object. | ||
1868 | **/ | ||
1869 | static inline void | ||
1870 | lpfc_initialize_node(struct lpfc_vport *vport, struct lpfc_nodelist *ndlp, | ||
1871 | uint32_t did) | ||
1872 | { | ||
1873 | INIT_LIST_HEAD(&ndlp->els_retry_evt.evt_listp); | ||
1874 | INIT_LIST_HEAD(&ndlp->dev_loss_evt.evt_listp); | ||
1875 | init_timer(&ndlp->nlp_delayfunc); | ||
1876 | ndlp->nlp_delayfunc.function = lpfc_els_retry_delay; | ||
1877 | ndlp->nlp_delayfunc.data = (unsigned long)ndlp; | ||
1878 | ndlp->nlp_DID = did; | ||
1879 | ndlp->vport = vport; | ||
1880 | ndlp->nlp_sid = NLP_NO_SID; | ||
1881 | kref_init(&ndlp->kref); | ||
1882 | NLP_INT_NODE_ACT(ndlp); | ||
1883 | atomic_set(&ndlp->cmd_pending, 0); | ||
1884 | ndlp->cmd_qdepth = LPFC_MAX_TGT_QDEPTH; | ||
1885 | } | ||
1855 | 1886 | ||
1856 | struct lpfc_nodelist * | 1887 | struct lpfc_nodelist * |
1857 | lpfc_enable_node(struct lpfc_vport *vport, struct lpfc_nodelist *ndlp, | 1888 | lpfc_enable_node(struct lpfc_vport *vport, struct lpfc_nodelist *ndlp, |
@@ -1892,17 +1923,7 @@ lpfc_enable_node(struct lpfc_vport *vport, struct lpfc_nodelist *ndlp, | |||
1892 | /* re-initialize ndlp except of ndlp linked list pointer */ | 1923 | /* re-initialize ndlp except of ndlp linked list pointer */ |
1893 | memset((((char *)ndlp) + sizeof (struct list_head)), 0, | 1924 | memset((((char *)ndlp) + sizeof (struct list_head)), 0, |
1894 | sizeof (struct lpfc_nodelist) - sizeof (struct list_head)); | 1925 | sizeof (struct lpfc_nodelist) - sizeof (struct list_head)); |
1895 | INIT_LIST_HEAD(&ndlp->els_retry_evt.evt_listp); | 1926 | lpfc_initialize_node(vport, ndlp, did); |
1896 | INIT_LIST_HEAD(&ndlp->dev_loss_evt.evt_listp); | ||
1897 | init_timer(&ndlp->nlp_delayfunc); | ||
1898 | ndlp->nlp_delayfunc.function = lpfc_els_retry_delay; | ||
1899 | ndlp->nlp_delayfunc.data = (unsigned long)ndlp; | ||
1900 | ndlp->nlp_DID = did; | ||
1901 | ndlp->vport = vport; | ||
1902 | ndlp->nlp_sid = NLP_NO_SID; | ||
1903 | /* ndlp management re-initialize */ | ||
1904 | kref_init(&ndlp->kref); | ||
1905 | NLP_INT_NODE_ACT(ndlp); | ||
1906 | 1927 | ||
1907 | spin_unlock_irqrestore(&phba->ndlp_lock, flags); | 1928 | spin_unlock_irqrestore(&phba->ndlp_lock, flags); |
1908 | 1929 | ||
@@ -3116,19 +3137,9 @@ lpfc_nlp_init(struct lpfc_vport *vport, struct lpfc_nodelist *ndlp, | |||
3116 | uint32_t did) | 3137 | uint32_t did) |
3117 | { | 3138 | { |
3118 | memset(ndlp, 0, sizeof (struct lpfc_nodelist)); | 3139 | memset(ndlp, 0, sizeof (struct lpfc_nodelist)); |
3119 | INIT_LIST_HEAD(&ndlp->els_retry_evt.evt_listp); | 3140 | |
3120 | INIT_LIST_HEAD(&ndlp->dev_loss_evt.evt_listp); | 3141 | lpfc_initialize_node(vport, ndlp, did); |
3121 | init_timer(&ndlp->nlp_delayfunc); | ||
3122 | ndlp->nlp_delayfunc.function = lpfc_els_retry_delay; | ||
3123 | ndlp->nlp_delayfunc.data = (unsigned long)ndlp; | ||
3124 | ndlp->nlp_DID = did; | ||
3125 | ndlp->vport = vport; | ||
3126 | ndlp->nlp_sid = NLP_NO_SID; | ||
3127 | INIT_LIST_HEAD(&ndlp->nlp_listp); | 3142 | INIT_LIST_HEAD(&ndlp->nlp_listp); |
3128 | kref_init(&ndlp->kref); | ||
3129 | NLP_INT_NODE_ACT(ndlp); | ||
3130 | atomic_set(&ndlp->cmd_pending, 0); | ||
3131 | ndlp->cmd_qdepth = LPFC_MAX_TGT_QDEPTH; | ||
3132 | 3143 | ||
3133 | lpfc_debugfs_disc_trc(vport, LPFC_DISC_TRC_NODE, | 3144 | lpfc_debugfs_disc_trc(vport, LPFC_DISC_TRC_NODE, |
3134 | "node init: did:x%x", | 3145 | "node init: did:x%x", |