aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/scsi/lpfc/lpfc_hbadisc.c
diff options
context:
space:
mode:
Diffstat (limited to 'drivers/scsi/lpfc/lpfc_hbadisc.c')
-rw-r--r--drivers/scsi/lpfc/lpfc_hbadisc.c151
1 files changed, 135 insertions, 16 deletions
diff --git a/drivers/scsi/lpfc/lpfc_hbadisc.c b/drivers/scsi/lpfc/lpfc_hbadisc.c
index d1c5c52b1c25..7cd5c47a66ea 100644
--- a/drivers/scsi/lpfc/lpfc_hbadisc.c
+++ b/drivers/scsi/lpfc/lpfc_hbadisc.c
@@ -1300,7 +1300,7 @@ lpfc_register_fcf(struct lpfc_hba *phba)
1300 * used for this FCF when the function returns. 1300 * used for this FCF when the function returns.
1301 * If the FCF record need to be used with a particular vlan id, the vlan is 1301 * If the FCF record need to be used with a particular vlan id, the vlan is
1302 * set in the vlan_id on return of the function. If not VLAN tagging need to 1302 * set in the vlan_id on return of the function. If not VLAN tagging need to
1303 * be used with the FCF vlan_id will be set to 0xFFFF; 1303 * be used with the FCF vlan_id will be set to LPFC_FCOE_NULL_VID;
1304 **/ 1304 **/
1305static int 1305static int
1306lpfc_match_fcf_conn_list(struct lpfc_hba *phba, 1306lpfc_match_fcf_conn_list(struct lpfc_hba *phba,
@@ -1336,7 +1336,7 @@ lpfc_match_fcf_conn_list(struct lpfc_hba *phba,
1336 if (phba->valid_vlan) 1336 if (phba->valid_vlan)
1337 *vlan_id = phba->vlan_id; 1337 *vlan_id = phba->vlan_id;
1338 else 1338 else
1339 *vlan_id = 0xFFFF; 1339 *vlan_id = LPFC_FCOE_NULL_VID;
1340 return 1; 1340 return 1;
1341 } 1341 }
1342 1342
@@ -1360,7 +1360,7 @@ lpfc_match_fcf_conn_list(struct lpfc_hba *phba,
1360 if (fcf_vlan_id) 1360 if (fcf_vlan_id)
1361 *vlan_id = fcf_vlan_id; 1361 *vlan_id = fcf_vlan_id;
1362 else 1362 else
1363 *vlan_id = 0xFFFF; 1363 *vlan_id = LPFC_FCOE_NULL_VID;
1364 return 1; 1364 return 1;
1365 } 1365 }
1366 1366
@@ -1469,7 +1469,7 @@ lpfc_match_fcf_conn_list(struct lpfc_hba *phba,
1469 else if (fcf_vlan_id) 1469 else if (fcf_vlan_id)
1470 *vlan_id = fcf_vlan_id; 1470 *vlan_id = fcf_vlan_id;
1471 else 1471 else
1472 *vlan_id = 0xFFFF; 1472 *vlan_id = LPFC_FCOE_NULL_VID;
1473 1473
1474 return 1; 1474 return 1;
1475 } 1475 }
@@ -1521,6 +1521,9 @@ lpfc_check_pending_fcoe_event(struct lpfc_hba *phba, uint8_t unreg_fcf)
1521 * Do not continue FCF discovery and clear FCF_DISC_INPROGRESS 1521 * Do not continue FCF discovery and clear FCF_DISC_INPROGRESS
1522 * flag 1522 * flag
1523 */ 1523 */
1524 lpfc_printf_log(phba, KERN_INFO, LOG_FIP | LOG_DISCOVERY,
1525 "2833 Stop FCF discovery process due to link "
1526 "state change (x%x)\n", phba->link_state);
1524 spin_lock_irq(&phba->hbalock); 1527 spin_lock_irq(&phba->hbalock);
1525 phba->hba_flag &= ~FCF_DISC_INPROGRESS; 1528 phba->hba_flag &= ~FCF_DISC_INPROGRESS;
1526 phba->fcf.fcf_flag &= ~(FCF_REDISC_FOV | FCF_DISCOVERY); 1529 phba->fcf.fcf_flag &= ~(FCF_REDISC_FOV | FCF_DISCOVERY);
@@ -1696,6 +1699,37 @@ lpfc_sli4_log_fcf_record_info(struct lpfc_hba *phba,
1696} 1699}
1697 1700
1698/** 1701/**
1702 lpfc_sli4_fcf_record_match - testing new FCF record for matching existing FCF
1703 * @phba: pointer to lpfc hba data structure.
1704 * @fcf_rec: pointer to an existing FCF record.
1705 * @new_fcf_record: pointer to a new FCF record.
1706 * @new_vlan_id: vlan id from the new FCF record.
1707 *
1708 * This function performs matching test of a new FCF record against an existing
1709 * FCF record. If the new_vlan_id passed in is LPFC_FCOE_IGNORE_VID, vlan id
1710 * will not be used as part of the FCF record matching criteria.
1711 *
1712 * Returns true if all the fields matching, otherwise returns false.
1713 */
1714static bool
1715lpfc_sli4_fcf_record_match(struct lpfc_hba *phba,
1716 struct lpfc_fcf_rec *fcf_rec,
1717 struct fcf_record *new_fcf_record,
1718 uint16_t new_vlan_id)
1719{
1720 if (new_vlan_id != LPFC_FCOE_IGNORE_VID)
1721 if (!lpfc_vlan_id_match(fcf_rec->vlan_id, new_vlan_id))
1722 return false;
1723 if (!lpfc_mac_addr_match(fcf_rec->mac_addr, new_fcf_record))
1724 return false;
1725 if (!lpfc_sw_name_match(fcf_rec->switch_name, new_fcf_record))
1726 return false;
1727 if (!lpfc_fab_name_match(fcf_rec->fabric_name, new_fcf_record))
1728 return false;
1729 return true;
1730}
1731
1732/**
1699 * lpfc_mbx_cmpl_fcf_scan_read_fcf_rec - fcf scan read_fcf mbox cmpl handler. 1733 * lpfc_mbx_cmpl_fcf_scan_read_fcf_rec - fcf scan read_fcf mbox cmpl handler.
1700 * @phba: pointer to lpfc hba data structure. 1734 * @phba: pointer to lpfc hba data structure.
1701 * @mboxq: pointer to mailbox object. 1735 * @mboxq: pointer to mailbox object.
@@ -1758,7 +1792,7 @@ lpfc_mbx_cmpl_fcf_scan_read_fcf_rec(struct lpfc_hba *phba, LPFC_MBOXQ_t *mboxq)
1758 */ 1792 */
1759 if (!rc) { 1793 if (!rc) {
1760 lpfc_printf_log(phba, KERN_WARNING, LOG_FIP, 1794 lpfc_printf_log(phba, KERN_WARNING, LOG_FIP,
1761 "2781 FCF record fcf_index:x%x failed FCF " 1795 "2781 FCF record (x%x) failed FCF "
1762 "connection list check, fcf_avail:x%x, " 1796 "connection list check, fcf_avail:x%x, "
1763 "fcf_valid:x%x\n", 1797 "fcf_valid:x%x\n",
1764 bf_get(lpfc_fcf_record_fcf_index, 1798 bf_get(lpfc_fcf_record_fcf_index,
@@ -1767,6 +1801,32 @@ lpfc_mbx_cmpl_fcf_scan_read_fcf_rec(struct lpfc_hba *phba, LPFC_MBOXQ_t *mboxq)
1767 new_fcf_record), 1801 new_fcf_record),
1768 bf_get(lpfc_fcf_record_fcf_valid, 1802 bf_get(lpfc_fcf_record_fcf_valid,
1769 new_fcf_record)); 1803 new_fcf_record));
1804 if ((phba->fcf.fcf_flag & FCF_IN_USE) &&
1805 lpfc_sli4_fcf_record_match(phba, &phba->fcf.current_rec,
1806 new_fcf_record, LPFC_FCOE_IGNORE_VID)) {
1807 /*
1808 * In case the current in-use FCF record becomes
1809 * invalid/unavailable during FCF discovery that
1810 * was not triggered by fast FCF failover process,
1811 * treat it as fast FCF failover.
1812 */
1813 if (!(phba->fcf.fcf_flag & FCF_REDISC_PEND) &&
1814 !(phba->fcf.fcf_flag & FCF_REDISC_FOV)) {
1815 lpfc_printf_log(phba, KERN_WARNING, LOG_FIP,
1816 "2835 Invalid in-use FCF "
1817 "record (x%x) reported, "
1818 "entering fast FCF failover "
1819 "mode scanning.\n",
1820 phba->fcf.current_rec.fcf_indx);
1821 spin_lock_irq(&phba->hbalock);
1822 phba->fcf.fcf_flag |= FCF_REDISC_FOV;
1823 spin_unlock_irq(&phba->hbalock);
1824 lpfc_sli4_mbox_cmd_free(phba, mboxq);
1825 lpfc_sli4_fcf_scan_read_fcf_rec(phba,
1826 LPFC_FCOE_FCF_GET_FIRST);
1827 return;
1828 }
1829 }
1770 goto read_next_fcf; 1830 goto read_next_fcf;
1771 } else { 1831 } else {
1772 fcf_index = bf_get(lpfc_fcf_record_fcf_index, new_fcf_record); 1832 fcf_index = bf_get(lpfc_fcf_record_fcf_index, new_fcf_record);
@@ -1783,14 +1843,8 @@ lpfc_mbx_cmpl_fcf_scan_read_fcf_rec(struct lpfc_hba *phba, LPFC_MBOXQ_t *mboxq)
1783 */ 1843 */
1784 spin_lock_irq(&phba->hbalock); 1844 spin_lock_irq(&phba->hbalock);
1785 if (phba->fcf.fcf_flag & FCF_IN_USE) { 1845 if (phba->fcf.fcf_flag & FCF_IN_USE) {
1786 if (lpfc_fab_name_match(phba->fcf.current_rec.fabric_name, 1846 if (lpfc_sli4_fcf_record_match(phba, &phba->fcf.current_rec,
1787 new_fcf_record) && 1847 new_fcf_record, vlan_id)) {
1788 lpfc_sw_name_match(phba->fcf.current_rec.switch_name,
1789 new_fcf_record) &&
1790 lpfc_mac_addr_match(phba->fcf.current_rec.mac_addr,
1791 new_fcf_record) &&
1792 lpfc_vlan_id_match(phba->fcf.current_rec.vlan_id,
1793 vlan_id)) {
1794 phba->fcf.fcf_flag |= FCF_AVAILABLE; 1848 phba->fcf.fcf_flag |= FCF_AVAILABLE;
1795 if (phba->fcf.fcf_flag & FCF_REDISC_PEND) 1849 if (phba->fcf.fcf_flag & FCF_REDISC_PEND)
1796 /* Stop FCF redisc wait timer if pending */ 1850 /* Stop FCF redisc wait timer if pending */
@@ -1800,6 +1854,13 @@ lpfc_mbx_cmpl_fcf_scan_read_fcf_rec(struct lpfc_hba *phba, LPFC_MBOXQ_t *mboxq)
1800 phba->fcf.fcf_flag &= ~(FCF_REDISC_FOV | 1854 phba->fcf.fcf_flag &= ~(FCF_REDISC_FOV |
1801 FCF_DISCOVERY); 1855 FCF_DISCOVERY);
1802 spin_unlock_irq(&phba->hbalock); 1856 spin_unlock_irq(&phba->hbalock);
1857 lpfc_printf_log(phba, KERN_INFO, LOG_FIP,
1858 "2836 The new FCF record (x%x) "
1859 "matches the in-use FCF record "
1860 "(x%x)\n",
1861 phba->fcf.current_rec.fcf_indx,
1862 bf_get(lpfc_fcf_record_fcf_index,
1863 new_fcf_record));
1803 goto out; 1864 goto out;
1804 } 1865 }
1805 /* 1866 /*
@@ -1831,6 +1892,12 @@ lpfc_mbx_cmpl_fcf_scan_read_fcf_rec(struct lpfc_hba *phba, LPFC_MBOXQ_t *mboxq)
1831 */ 1892 */
1832 if (boot_flag && !(fcf_rec->flag & BOOT_ENABLE)) { 1893 if (boot_flag && !(fcf_rec->flag & BOOT_ENABLE)) {
1833 /* Choose this FCF record */ 1894 /* Choose this FCF record */
1895 lpfc_printf_log(phba, KERN_INFO, LOG_FIP,
1896 "2837 Update current FCF record "
1897 "(x%x) with new FCF record (x%x)\n",
1898 fcf_rec->fcf_indx,
1899 bf_get(lpfc_fcf_record_fcf_index,
1900 new_fcf_record));
1834 __lpfc_update_fcf_record(phba, fcf_rec, new_fcf_record, 1901 __lpfc_update_fcf_record(phba, fcf_rec, new_fcf_record,
1835 addr_mode, vlan_id, BOOT_ENABLE); 1902 addr_mode, vlan_id, BOOT_ENABLE);
1836 spin_unlock_irq(&phba->hbalock); 1903 spin_unlock_irq(&phba->hbalock);
@@ -1851,6 +1918,12 @@ lpfc_mbx_cmpl_fcf_scan_read_fcf_rec(struct lpfc_hba *phba, LPFC_MBOXQ_t *mboxq)
1851 */ 1918 */
1852 if (new_fcf_record->fip_priority < fcf_rec->priority) { 1919 if (new_fcf_record->fip_priority < fcf_rec->priority) {
1853 /* Choose the new FCF record with lower priority */ 1920 /* Choose the new FCF record with lower priority */
1921 lpfc_printf_log(phba, KERN_INFO, LOG_FIP,
1922 "2838 Update current FCF record "
1923 "(x%x) with new FCF record (x%x)\n",
1924 fcf_rec->fcf_indx,
1925 bf_get(lpfc_fcf_record_fcf_index,
1926 new_fcf_record));
1854 __lpfc_update_fcf_record(phba, fcf_rec, new_fcf_record, 1927 __lpfc_update_fcf_record(phba, fcf_rec, new_fcf_record,
1855 addr_mode, vlan_id, 0); 1928 addr_mode, vlan_id, 0);
1856 /* Reset running random FCF selection count */ 1929 /* Reset running random FCF selection count */
@@ -1860,11 +1933,18 @@ lpfc_mbx_cmpl_fcf_scan_read_fcf_rec(struct lpfc_hba *phba, LPFC_MBOXQ_t *mboxq)
1860 phba->fcf.eligible_fcf_cnt++; 1933 phba->fcf.eligible_fcf_cnt++;
1861 select_new_fcf = lpfc_sli4_new_fcf_random_select(phba, 1934 select_new_fcf = lpfc_sli4_new_fcf_random_select(phba,
1862 phba->fcf.eligible_fcf_cnt); 1935 phba->fcf.eligible_fcf_cnt);
1863 if (select_new_fcf) 1936 if (select_new_fcf) {
1937 lpfc_printf_log(phba, KERN_INFO, LOG_FIP,
1938 "2839 Update current FCF record "
1939 "(x%x) with new FCF record (x%x)\n",
1940 fcf_rec->fcf_indx,
1941 bf_get(lpfc_fcf_record_fcf_index,
1942 new_fcf_record));
1864 /* Choose the new FCF by random selection */ 1943 /* Choose the new FCF by random selection */
1865 __lpfc_update_fcf_record(phba, fcf_rec, 1944 __lpfc_update_fcf_record(phba, fcf_rec,
1866 new_fcf_record, 1945 new_fcf_record,
1867 addr_mode, vlan_id, 0); 1946 addr_mode, vlan_id, 0);
1947 }
1868 } 1948 }
1869 spin_unlock_irq(&phba->hbalock); 1949 spin_unlock_irq(&phba->hbalock);
1870 goto read_next_fcf; 1950 goto read_next_fcf;
@@ -1874,6 +1954,11 @@ lpfc_mbx_cmpl_fcf_scan_read_fcf_rec(struct lpfc_hba *phba, LPFC_MBOXQ_t *mboxq)
1874 * initial best-fit FCF. 1954 * initial best-fit FCF.
1875 */ 1955 */
1876 if (fcf_rec) { 1956 if (fcf_rec) {
1957 lpfc_printf_log(phba, KERN_INFO, LOG_FIP,
1958 "2840 Update current FCF record "
1959 "with initial FCF record (x%x)\n",
1960 bf_get(lpfc_fcf_record_fcf_index,
1961 new_fcf_record));
1877 __lpfc_update_fcf_record(phba, fcf_rec, new_fcf_record, 1962 __lpfc_update_fcf_record(phba, fcf_rec, new_fcf_record,
1878 addr_mode, vlan_id, (boot_flag ? 1963 addr_mode, vlan_id, (boot_flag ?
1879 BOOT_ENABLE : 0)); 1964 BOOT_ENABLE : 0));
@@ -1931,6 +2016,12 @@ read_next_fcf:
1931 lpfc_unregister_fcf(phba); 2016 lpfc_unregister_fcf(phba);
1932 2017
1933 /* Replace in-use record with the new record */ 2018 /* Replace in-use record with the new record */
2019 lpfc_printf_log(phba, KERN_INFO, LOG_FIP,
2020 "2842 Replace the current in-use "
2021 "FCF record (x%x) with failover FCF "
2022 "record (x%x)\n",
2023 phba->fcf.current_rec.fcf_indx,
2024 phba->fcf.failover_rec.fcf_indx);
1934 memcpy(&phba->fcf.current_rec, 2025 memcpy(&phba->fcf.current_rec,
1935 &phba->fcf.failover_rec, 2026 &phba->fcf.failover_rec,
1936 sizeof(struct lpfc_fcf_rec)); 2027 sizeof(struct lpfc_fcf_rec));
@@ -1954,6 +2045,28 @@ read_next_fcf:
1954 if ((phba->fcf.fcf_flag & FCF_REDISC_EVT) || 2045 if ((phba->fcf.fcf_flag & FCF_REDISC_EVT) ||
1955 (phba->fcf.fcf_flag & FCF_REDISC_PEND)) 2046 (phba->fcf.fcf_flag & FCF_REDISC_PEND))
1956 return; 2047 return;
2048
2049 if (phba->fcf.fcf_flag & FCF_IN_USE) {
2050 /*
2051 * In case the current in-use FCF record no
2052 * longer existed during FCF discovery that
2053 * was not triggered by fast FCF failover
2054 * process, treat it as fast FCF failover.
2055 */
2056 lpfc_printf_log(phba, KERN_INFO, LOG_FIP,
2057 "2841 In-use FCF record (x%x) "
2058 "not reported, entering fast "
2059 "FCF failover mode scanning.\n",
2060 phba->fcf.current_rec.fcf_indx);
2061 spin_lock_irq(&phba->hbalock);
2062 phba->fcf.fcf_flag |= FCF_REDISC_FOV;
2063 spin_unlock_irq(&phba->hbalock);
2064 lpfc_sli4_mbox_cmd_free(phba, mboxq);
2065 lpfc_sli4_fcf_scan_read_fcf_rec(phba,
2066 LPFC_FCOE_FCF_GET_FIRST);
2067 return;
2068 }
2069
1957 /* 2070 /*
1958 * Otherwise, initial scan or post linkdown rescan, 2071 * Otherwise, initial scan or post linkdown rescan,
1959 * register with the best FCF record found so far 2072 * register with the best FCF record found so far
@@ -2036,6 +2149,11 @@ lpfc_mbx_cmpl_fcf_rr_read_fcf_rec(struct lpfc_hba *phba, LPFC_MBOXQ_t *mboxq)
2036 next_fcf_index); 2149 next_fcf_index);
2037 2150
2038 /* Upload new FCF record to the failover FCF record */ 2151 /* Upload new FCF record to the failover FCF record */
2152 lpfc_printf_log(phba, KERN_INFO, LOG_FIP,
2153 "2834 Update the current FCF record (x%x) "
2154 "with the next FCF record (x%x)\n",
2155 phba->fcf.failover_rec.fcf_indx,
2156 bf_get(lpfc_fcf_record_fcf_index, new_fcf_record));
2039 spin_lock_irq(&phba->hbalock); 2157 spin_lock_irq(&phba->hbalock);
2040 __lpfc_update_fcf_record(phba, &phba->fcf.failover_rec, 2158 __lpfc_update_fcf_record(phba, &phba->fcf.failover_rec,
2041 new_fcf_record, addr_mode, vlan_id, 2159 new_fcf_record, addr_mode, vlan_id,
@@ -2053,7 +2171,7 @@ lpfc_mbx_cmpl_fcf_rr_read_fcf_rec(struct lpfc_hba *phba, LPFC_MBOXQ_t *mboxq)
2053 2171
2054 lpfc_printf_log(phba, KERN_INFO, LOG_FIP, 2172 lpfc_printf_log(phba, KERN_INFO, LOG_FIP,
2055 "2783 FLOGI round robin FCF failover from FCF " 2173 "2783 FLOGI round robin FCF failover from FCF "
2056 "(index:x%x) to FCF (index:x%x).\n", 2174 "(x%x) to FCF (x%x).\n",
2057 current_fcf_index, 2175 current_fcf_index,
2058 bf_get(lpfc_fcf_record_fcf_index, new_fcf_record)); 2176 bf_get(lpfc_fcf_record_fcf_index, new_fcf_record));
2059 2177
@@ -5217,7 +5335,8 @@ lpfc_unregister_unused_fcf(struct lpfc_hba *phba)
5217 spin_lock_irq(&phba->hbalock); 5335 spin_lock_irq(&phba->hbalock);
5218 if (!(phba->hba_flag & HBA_FCOE_SUPPORT) || 5336 if (!(phba->hba_flag & HBA_FCOE_SUPPORT) ||
5219 !(phba->fcf.fcf_flag & FCF_REGISTERED) || 5337 !(phba->fcf.fcf_flag & FCF_REGISTERED) ||
5220 !(phba->hba_flag & HBA_FIP_SUPPORT)) { 5338 !(phba->hba_flag & HBA_FIP_SUPPORT) ||
5339 (phba->pport->port_state == LPFC_FLOGI)) {
5221 spin_unlock_irq(&phba->hbalock); 5340 spin_unlock_irq(&phba->hbalock);
5222 return; 5341 return;
5223 } 5342 }