Merge tag 'scsi-misc' of git://git.kernel.org/pub/scm/linux/kernel/git/jejb/scsi
[deliverable/linux.git] / drivers / scsi / lpfc / lpfc_hbadisc.c
index 8ab3e9622714273b2d8e42881769cafc99109ec5..326e05a65a7314d7648a16f0097485bb5d439a0b 100644 (file)
@@ -1735,7 +1735,7 @@ lpfc_check_pending_fcoe_event(struct lpfc_hba *phba, uint8_t unreg_fcf)
  * use through a sequence of @fcf_cnt eligible FCF records with equal
  * probability. To perform integer manunipulation of random numbers with
  * size unit32_t, the lower 16 bits of the 32-bit random number returned
- * from random32() are taken as the random random number generated.
+ * from prandom_u32() are taken as the random random number generated.
  *
  * Returns true when outcome is for the newly read FCF record should be
  * chosen; otherwise, return false when outcome is for keeping the previously
@@ -1747,7 +1747,7 @@ lpfc_sli4_new_fcf_random_select(struct lpfc_hba *phba, uint32_t fcf_cnt)
        uint32_t rand_num;
 
        /* Get 16-bit uniform random number */
-       rand_num = (0xFFFF & random32());
+       rand_num = 0xFFFF & prandom_u32();
 
        /* Decision with probability 1/fcf_cnt */
        if ((fcf_cnt * rand_num) < 0xFFFF)
@@ -2385,7 +2385,7 @@ lpfc_mbx_cmpl_fcf_scan_read_fcf_rec(struct lpfc_hba *phba, LPFC_MBOXQ_t *mboxq)
                phba->fcf.eligible_fcf_cnt = 1;
                /* Seeding the random number generator for random selection */
                seed = (uint32_t)(0xFFFFFFFF & jiffies);
-               srandom32(seed);
+               prandom_seed(seed);
        }
        spin_unlock_irq(&phba->hbalock);
        goto read_next_fcf;
@@ -2990,6 +2990,7 @@ lpfc_mbx_process_link_up(struct lpfc_hba *phba, struct lpfc_mbx_read_top *la)
        struct lpfc_dmabuf *mp;
        int rc;
        struct fcf_record *fcf_record;
+       uint32_t fc_flags = 0;
 
        spin_lock_irq(&phba->hbalock);
        switch (bf_get(lpfc_mbx_read_top_link_spd, la)) {
@@ -3021,11 +3022,8 @@ lpfc_mbx_process_link_up(struct lpfc_hba *phba, struct lpfc_mbx_read_top *la)
                                "1309 Link Up Event npiv not supported in loop "
                                "topology\n");
                                /* Get Loop Map information */
-               if (bf_get(lpfc_mbx_read_top_il, la)) {
-                       spin_lock(shost->host_lock);
-                       vport->fc_flag |= FC_LBIT;
-                       spin_unlock(shost->host_lock);
-               }
+               if (bf_get(lpfc_mbx_read_top_il, la))
+                       fc_flags |= FC_LBIT;
 
                vport->fc_myDID = bf_get(lpfc_mbx_read_top_alpa_granted, la);
                i = la->lilpBde64.tus.f.bdeSize;
@@ -3074,12 +3072,16 @@ lpfc_mbx_process_link_up(struct lpfc_hba *phba, struct lpfc_mbx_read_top *la)
                                phba->sli3_options |= LPFC_SLI3_NPIV_ENABLED;
                }
                vport->fc_myDID = phba->fc_pref_DID;
-               spin_lock(shost->host_lock);
-               vport->fc_flag |= FC_LBIT;
-               spin_unlock(shost->host_lock);
+               fc_flags |= FC_LBIT;
        }
        spin_unlock_irq(&phba->hbalock);
 
+       if (fc_flags) {
+               spin_lock_irq(shost->host_lock);
+               vport->fc_flag |= fc_flags;
+               spin_unlock_irq(shost->host_lock);
+       }
+
        lpfc_linkup(phba);
        sparam_mbox = mempool_alloc(phba->mbox_mem_pool, GFP_KERNEL);
        if (!sparam_mbox)
@@ -3247,8 +3249,7 @@ lpfc_mbx_cmpl_read_topology(struct lpfc_hba *phba, LPFC_MBOXQ_t *pmb)
                vport->fc_flag &= ~FC_BYPASSED_MODE;
        spin_unlock_irq(shost->host_lock);
 
-       if ((phba->fc_eventTag  < la->eventTag) ||
-           (phba->fc_eventTag == la->eventTag)) {
+       if (phba->fc_eventTag <= la->eventTag) {
                phba->fc_stat.LinkMultiEvent++;
                if (bf_get(lpfc_mbx_read_top_att_type, la) == LPFC_ATT_LINK_UP)
                        if (phba->fc_eventTag != 0)
@@ -3256,16 +3257,18 @@ lpfc_mbx_cmpl_read_topology(struct lpfc_hba *phba, LPFC_MBOXQ_t *pmb)
        }
 
        phba->fc_eventTag = la->eventTag;
-       spin_lock_irq(&phba->hbalock);
-       if (bf_get(lpfc_mbx_read_top_mm, la))
-               phba->sli.sli_flag |= LPFC_MENLO_MAINT;
-       else
-               phba->sli.sli_flag &= ~LPFC_MENLO_MAINT;
-       spin_unlock_irq(&phba->hbalock);
+       if (phba->sli_rev < LPFC_SLI_REV4) {
+               spin_lock_irq(&phba->hbalock);
+               if (bf_get(lpfc_mbx_read_top_mm, la))
+                       phba->sli.sli_flag |= LPFC_MENLO_MAINT;
+               else
+                       phba->sli.sli_flag &= ~LPFC_MENLO_MAINT;
+               spin_unlock_irq(&phba->hbalock);
+       }
 
        phba->link_events++;
        if ((bf_get(lpfc_mbx_read_top_att_type, la) == LPFC_ATT_LINK_UP) &&
-           (!bf_get(lpfc_mbx_read_top_mm, la))) {
+           !(phba->sli.sli_flag & LPFC_MENLO_MAINT)) {
                phba->fc_stat.LinkUp++;
                if (phba->link_flag & LS_LOOPBACK_MODE) {
                        lpfc_printf_log(phba, KERN_ERR, LOG_LINK_EVENT,
@@ -3310,8 +3313,8 @@ lpfc_mbx_cmpl_read_topology(struct lpfc_hba *phba, LPFC_MBOXQ_t *pmb)
                                bf_get(lpfc_mbx_read_top_fa, la));
                lpfc_mbx_issue_link_down(phba);
        }
-       if ((bf_get(lpfc_mbx_read_top_mm, la)) &&
-           (bf_get(lpfc_mbx_read_top_att_type, la) == LPFC_ATT_LINK_UP)) {
+       if ((phba->sli.sli_flag & LPFC_MENLO_MAINT) &&
+           ((bf_get(lpfc_mbx_read_top_att_type, la) == LPFC_ATT_LINK_UP))) {
                if (phba->link_state != LPFC_LINK_DOWN) {
                        phba->fc_stat.LinkDown++;
                        lpfc_printf_log(phba, KERN_ERR, LOG_LINK_EVENT,
@@ -3339,8 +3342,9 @@ lpfc_mbx_cmpl_read_topology(struct lpfc_hba *phba, LPFC_MBOXQ_t *pmb)
                }
        }
 
-       if (bf_get(lpfc_mbx_read_top_fa, la)) {
-               if (bf_get(lpfc_mbx_read_top_mm, la))
+       if ((phba->sli_rev < LPFC_SLI_REV4) &&
+           bf_get(lpfc_mbx_read_top_fa, la)) {
+               if (phba->sli.sli_flag & LPFC_MENLO_MAINT)
                        lpfc_issue_clear_la(phba, vport);
                lpfc_printf_log(phba, KERN_INFO, LOG_LINK_EVENT,
                                "1311 fa %d\n",
This page took 0.027155 seconds and 5 git commands to generate.