diff options
Diffstat (limited to 'drivers/scsi/lpfc/lpfc_hbadisc.c')
-rw-r--r-- | drivers/scsi/lpfc/lpfc_hbadisc.c | 259 |
1 files changed, 231 insertions, 28 deletions
diff --git a/drivers/scsi/lpfc/lpfc_hbadisc.c b/drivers/scsi/lpfc/lpfc_hbadisc.c index ed46b24a338..e6a47e25b21 100644 --- a/drivers/scsi/lpfc/lpfc_hbadisc.c +++ b/drivers/scsi/lpfc/lpfc_hbadisc.c | |||
@@ -61,6 +61,7 @@ static uint8_t lpfcAlpaArray[] = { | |||
61 | 61 | ||
62 | static void lpfc_disc_timeout_handler(struct lpfc_vport *); | 62 | static void lpfc_disc_timeout_handler(struct lpfc_vport *); |
63 | static void lpfc_disc_flush_list(struct lpfc_vport *vport); | 63 | static void lpfc_disc_flush_list(struct lpfc_vport *vport); |
64 | static void lpfc_unregister_fcfi_cmpl(struct lpfc_hba *, LPFC_MBOXQ_t *); | ||
64 | 65 | ||
65 | void | 66 | void |
66 | lpfc_terminate_rport_io(struct fc_rport *rport) | 67 | lpfc_terminate_rport_io(struct fc_rport *rport) |
@@ -1009,9 +1010,15 @@ lpfc_mbx_cmpl_reg_fcfi(struct lpfc_hba *phba, LPFC_MBOXQ_t *mboxq) | |||
1009 | spin_lock_irqsave(&phba->hbalock, flags); | 1010 | spin_lock_irqsave(&phba->hbalock, flags); |
1010 | phba->fcf.fcf_flag |= FCF_REGISTERED; | 1011 | phba->fcf.fcf_flag |= FCF_REGISTERED; |
1011 | spin_unlock_irqrestore(&phba->hbalock, flags); | 1012 | spin_unlock_irqrestore(&phba->hbalock, flags); |
1013 | /* If there is a pending FCoE event, restart FCF table scan. */ | ||
1014 | if (lpfc_check_pending_fcoe_event(phba, 1)) { | ||
1015 | mempool_free(mboxq, phba->mbox_mem_pool); | ||
1016 | return; | ||
1017 | } | ||
1012 | if (vport->port_state != LPFC_FLOGI) { | 1018 | if (vport->port_state != LPFC_FLOGI) { |
1013 | spin_lock_irqsave(&phba->hbalock, flags); | 1019 | spin_lock_irqsave(&phba->hbalock, flags); |
1014 | phba->fcf.fcf_flag |= (FCF_DISCOVERED | FCF_IN_USE); | 1020 | phba->fcf.fcf_flag |= (FCF_DISCOVERED | FCF_IN_USE); |
1021 | phba->hba_flag &= ~FCF_DISC_INPROGRESS; | ||
1015 | spin_unlock_irqrestore(&phba->hbalock, flags); | 1022 | spin_unlock_irqrestore(&phba->hbalock, flags); |
1016 | lpfc_initial_flogi(vport); | 1023 | lpfc_initial_flogi(vport); |
1017 | } | 1024 | } |
@@ -1054,6 +1061,39 @@ lpfc_fab_name_match(uint8_t *fab_name, struct fcf_record *new_fcf_record) | |||
1054 | } | 1061 | } |
1055 | 1062 | ||
1056 | /** | 1063 | /** |
1064 | * lpfc_sw_name_match - Check if the fcf switch name match. | ||
1065 | * @fab_name: pointer to fabric name. | ||
1066 | * @new_fcf_record: pointer to fcf record. | ||
1067 | * | ||
1068 | * This routine compare the fcf record's switch name with provided | ||
1069 | * switch name. If the switch name are identical this function | ||
1070 | * returns 1 else return 0. | ||
1071 | **/ | ||
1072 | static uint32_t | ||
1073 | lpfc_sw_name_match(uint8_t *sw_name, struct fcf_record *new_fcf_record) | ||
1074 | { | ||
1075 | if ((sw_name[0] == | ||
1076 | bf_get(lpfc_fcf_record_switch_name_0, new_fcf_record)) && | ||
1077 | (sw_name[1] == | ||
1078 | bf_get(lpfc_fcf_record_switch_name_1, new_fcf_record)) && | ||
1079 | (sw_name[2] == | ||
1080 | bf_get(lpfc_fcf_record_switch_name_2, new_fcf_record)) && | ||
1081 | (sw_name[3] == | ||
1082 | bf_get(lpfc_fcf_record_switch_name_3, new_fcf_record)) && | ||
1083 | (sw_name[4] == | ||
1084 | bf_get(lpfc_fcf_record_switch_name_4, new_fcf_record)) && | ||
1085 | (sw_name[5] == | ||
1086 | bf_get(lpfc_fcf_record_switch_name_5, new_fcf_record)) && | ||
1087 | (sw_name[6] == | ||
1088 | bf_get(lpfc_fcf_record_switch_name_6, new_fcf_record)) && | ||
1089 | (sw_name[7] == | ||
1090 | bf_get(lpfc_fcf_record_switch_name_7, new_fcf_record))) | ||
1091 | return 1; | ||
1092 | else | ||
1093 | return 0; | ||
1094 | } | ||
1095 | |||
1096 | /** | ||
1057 | * lpfc_mac_addr_match - Check if the fcf mac address match. | 1097 | * lpfc_mac_addr_match - Check if the fcf mac address match. |
1058 | * @phba: pointer to lpfc hba data structure. | 1098 | * @phba: pointer to lpfc hba data structure. |
1059 | * @new_fcf_record: pointer to fcf record. | 1099 | * @new_fcf_record: pointer to fcf record. |
@@ -1123,6 +1163,22 @@ lpfc_copy_fcf_record(struct lpfc_hba *phba, struct fcf_record *new_fcf_record) | |||
1123 | bf_get(lpfc_fcf_record_mac_5, new_fcf_record); | 1163 | bf_get(lpfc_fcf_record_mac_5, new_fcf_record); |
1124 | phba->fcf.fcf_indx = bf_get(lpfc_fcf_record_fcf_index, new_fcf_record); | 1164 | phba->fcf.fcf_indx = bf_get(lpfc_fcf_record_fcf_index, new_fcf_record); |
1125 | phba->fcf.priority = new_fcf_record->fip_priority; | 1165 | phba->fcf.priority = new_fcf_record->fip_priority; |
1166 | phba->fcf.switch_name[0] = | ||
1167 | bf_get(lpfc_fcf_record_switch_name_0, new_fcf_record); | ||
1168 | phba->fcf.switch_name[1] = | ||
1169 | bf_get(lpfc_fcf_record_switch_name_1, new_fcf_record); | ||
1170 | phba->fcf.switch_name[2] = | ||
1171 | bf_get(lpfc_fcf_record_switch_name_2, new_fcf_record); | ||
1172 | phba->fcf.switch_name[3] = | ||
1173 | bf_get(lpfc_fcf_record_switch_name_3, new_fcf_record); | ||
1174 | phba->fcf.switch_name[4] = | ||
1175 | bf_get(lpfc_fcf_record_switch_name_4, new_fcf_record); | ||
1176 | phba->fcf.switch_name[5] = | ||
1177 | bf_get(lpfc_fcf_record_switch_name_5, new_fcf_record); | ||
1178 | phba->fcf.switch_name[6] = | ||
1179 | bf_get(lpfc_fcf_record_switch_name_6, new_fcf_record); | ||
1180 | phba->fcf.switch_name[7] = | ||
1181 | bf_get(lpfc_fcf_record_switch_name_7, new_fcf_record); | ||
1126 | } | 1182 | } |
1127 | 1183 | ||
1128 | /** | 1184 | /** |
@@ -1150,6 +1206,7 @@ lpfc_register_fcf(struct lpfc_hba *phba) | |||
1150 | /* The FCF is already registered, start discovery */ | 1206 | /* The FCF is already registered, start discovery */ |
1151 | if (phba->fcf.fcf_flag & FCF_REGISTERED) { | 1207 | if (phba->fcf.fcf_flag & FCF_REGISTERED) { |
1152 | phba->fcf.fcf_flag |= (FCF_DISCOVERED | FCF_IN_USE); | 1208 | phba->fcf.fcf_flag |= (FCF_DISCOVERED | FCF_IN_USE); |
1209 | phba->hba_flag &= ~FCF_DISC_INPROGRESS; | ||
1153 | spin_unlock_irqrestore(&phba->hbalock, flags); | 1210 | spin_unlock_irqrestore(&phba->hbalock, flags); |
1154 | if (phba->pport->port_state != LPFC_FLOGI) | 1211 | if (phba->pport->port_state != LPFC_FLOGI) |
1155 | lpfc_initial_flogi(phba->pport); | 1212 | lpfc_initial_flogi(phba->pport); |
@@ -1239,9 +1296,12 @@ lpfc_match_fcf_conn_list(struct lpfc_hba *phba, | |||
1239 | 1296 | ||
1240 | if ((conn_entry->conn_rec.flags & FCFCNCT_FBNM_VALID) && | 1297 | if ((conn_entry->conn_rec.flags & FCFCNCT_FBNM_VALID) && |
1241 | !lpfc_fab_name_match(conn_entry->conn_rec.fabric_name, | 1298 | !lpfc_fab_name_match(conn_entry->conn_rec.fabric_name, |
1242 | new_fcf_record)) | 1299 | new_fcf_record)) |
1300 | continue; | ||
1301 | if ((conn_entry->conn_rec.flags & FCFCNCT_SWNM_VALID) && | ||
1302 | !lpfc_sw_name_match(conn_entry->conn_rec.switch_name, | ||
1303 | new_fcf_record)) | ||
1243 | continue; | 1304 | continue; |
1244 | |||
1245 | if (conn_entry->conn_rec.flags & FCFCNCT_VLAN_VALID) { | 1305 | if (conn_entry->conn_rec.flags & FCFCNCT_VLAN_VALID) { |
1246 | /* | 1306 | /* |
1247 | * If the vlan bit map does not have the bit set for the | 1307 | * If the vlan bit map does not have the bit set for the |
@@ -1336,6 +1396,60 @@ lpfc_match_fcf_conn_list(struct lpfc_hba *phba, | |||
1336 | } | 1396 | } |
1337 | 1397 | ||
1338 | /** | 1398 | /** |
1399 | * lpfc_check_pending_fcoe_event - Check if there is pending fcoe event. | ||
1400 | * @phba: pointer to lpfc hba data structure. | ||
1401 | * @unreg_fcf: Unregister FCF if FCF table need to be re-scaned. | ||
1402 | * | ||
1403 | * This function check if there is any fcoe event pending while driver | ||
1404 | * scan FCF entries. If there is any pending event, it will restart the | ||
1405 | * FCF saning and return 1 else return 0. | ||
1406 | */ | ||
1407 | int | ||
1408 | lpfc_check_pending_fcoe_event(struct lpfc_hba *phba, uint8_t unreg_fcf) | ||
1409 | { | ||
1410 | LPFC_MBOXQ_t *mbox; | ||
1411 | int rc; | ||
1412 | /* | ||
1413 | * If the Link is up and no FCoE events while in the | ||
1414 | * FCF discovery, no need to restart FCF discovery. | ||
1415 | */ | ||
1416 | if ((phba->link_state >= LPFC_LINK_UP) && | ||
1417 | (phba->fcoe_eventtag == phba->fcoe_eventtag_at_fcf_scan)) | ||
1418 | return 0; | ||
1419 | |||
1420 | spin_lock_irq(&phba->hbalock); | ||
1421 | phba->fcf.fcf_flag &= ~FCF_AVAILABLE; | ||
1422 | spin_unlock_irq(&phba->hbalock); | ||
1423 | |||
1424 | if (phba->link_state >= LPFC_LINK_UP) | ||
1425 | lpfc_sli4_read_fcf_record(phba, LPFC_FCOE_FCF_GET_FIRST); | ||
1426 | |||
1427 | if (unreg_fcf) { | ||
1428 | spin_lock_irq(&phba->hbalock); | ||
1429 | phba->fcf.fcf_flag &= ~FCF_REGISTERED; | ||
1430 | spin_unlock_irq(&phba->hbalock); | ||
1431 | mbox = mempool_alloc(phba->mbox_mem_pool, GFP_KERNEL); | ||
1432 | if (!mbox) { | ||
1433 | lpfc_printf_log(phba, KERN_ERR, | ||
1434 | LOG_DISCOVERY|LOG_MBOX, | ||
1435 | "2610 UNREG_FCFI mbox allocation failed\n"); | ||
1436 | return 1; | ||
1437 | } | ||
1438 | lpfc_unreg_fcfi(mbox, phba->fcf.fcfi); | ||
1439 | mbox->vport = phba->pport; | ||
1440 | mbox->mbox_cmpl = lpfc_unregister_fcfi_cmpl; | ||
1441 | rc = lpfc_sli_issue_mbox(phba, mbox, MBX_NOWAIT); | ||
1442 | if (rc == MBX_NOT_FINISHED) { | ||
1443 | lpfc_printf_log(phba, KERN_ERR, LOG_DISCOVERY|LOG_MBOX, | ||
1444 | "2611 UNREG_FCFI issue mbox failed\n"); | ||
1445 | mempool_free(mbox, phba->mbox_mem_pool); | ||
1446 | } | ||
1447 | } | ||
1448 | |||
1449 | return 1; | ||
1450 | } | ||
1451 | |||
1452 | /** | ||
1339 | * lpfc_mbx_cmpl_read_fcf_record - Completion handler for read_fcf mbox. | 1453 | * lpfc_mbx_cmpl_read_fcf_record - Completion handler for read_fcf mbox. |
1340 | * @phba: pointer to lpfc hba data structure. | 1454 | * @phba: pointer to lpfc hba data structure. |
1341 | * @mboxq: pointer to mailbox object. | 1455 | * @mboxq: pointer to mailbox object. |
@@ -1367,6 +1481,12 @@ lpfc_mbx_cmpl_read_fcf_record(struct lpfc_hba *phba, LPFC_MBOXQ_t *mboxq) | |||
1367 | unsigned long flags; | 1481 | unsigned long flags; |
1368 | uint16_t vlan_id; | 1482 | uint16_t vlan_id; |
1369 | 1483 | ||
1484 | /* If there is pending FCoE event restart FCF table scan */ | ||
1485 | if (lpfc_check_pending_fcoe_event(phba, 0)) { | ||
1486 | lpfc_sli4_mbox_cmd_free(phba, mboxq); | ||
1487 | return; | ||
1488 | } | ||
1489 | |||
1370 | /* Get the first SGE entry from the non-embedded DMA memory. This | 1490 | /* Get the first SGE entry from the non-embedded DMA memory. This |
1371 | * routine only uses a single SGE. | 1491 | * routine only uses a single SGE. |
1372 | */ | 1492 | */ |
@@ -1424,7 +1544,9 @@ lpfc_mbx_cmpl_read_fcf_record(struct lpfc_hba *phba, LPFC_MBOXQ_t *mboxq) | |||
1424 | spin_lock_irqsave(&phba->hbalock, flags); | 1544 | spin_lock_irqsave(&phba->hbalock, flags); |
1425 | if (phba->fcf.fcf_flag & FCF_IN_USE) { | 1545 | if (phba->fcf.fcf_flag & FCF_IN_USE) { |
1426 | if (lpfc_fab_name_match(phba->fcf.fabric_name, | 1546 | if (lpfc_fab_name_match(phba->fcf.fabric_name, |
1427 | new_fcf_record) && | 1547 | new_fcf_record) && |
1548 | lpfc_sw_name_match(phba->fcf.switch_name, | ||
1549 | new_fcf_record) && | ||
1428 | lpfc_mac_addr_match(phba, new_fcf_record)) { | 1550 | lpfc_mac_addr_match(phba, new_fcf_record)) { |
1429 | phba->fcf.fcf_flag |= FCF_AVAILABLE; | 1551 | phba->fcf.fcf_flag |= FCF_AVAILABLE; |
1430 | spin_unlock_irqrestore(&phba->hbalock, flags); | 1552 | spin_unlock_irqrestore(&phba->hbalock, flags); |
@@ -1464,9 +1586,9 @@ lpfc_mbx_cmpl_read_fcf_record(struct lpfc_hba *phba, LPFC_MBOXQ_t *mboxq) | |||
1464 | * If there is a record with lower priority value for | 1586 | * If there is a record with lower priority value for |
1465 | * the current FCF, use that record. | 1587 | * the current FCF, use that record. |
1466 | */ | 1588 | */ |
1467 | if (lpfc_fab_name_match(phba->fcf.fabric_name, new_fcf_record) | 1589 | if (lpfc_fab_name_match(phba->fcf.fabric_name, |
1468 | && (new_fcf_record->fip_priority < | 1590 | new_fcf_record) && |
1469 | phba->fcf.priority)) { | 1591 | (new_fcf_record->fip_priority < phba->fcf.priority)) { |
1470 | /* Use this FCF record */ | 1592 | /* Use this FCF record */ |
1471 | lpfc_copy_fcf_record(phba, new_fcf_record); | 1593 | lpfc_copy_fcf_record(phba, new_fcf_record); |
1472 | phba->fcf.addr_mode = addr_mode; | 1594 | phba->fcf.addr_mode = addr_mode; |
@@ -1512,6 +1634,39 @@ out: | |||
1512 | } | 1634 | } |
1513 | 1635 | ||
1514 | /** | 1636 | /** |
1637 | * lpfc_init_vpi_cmpl - Completion handler for init_vpi mbox command. | ||
1638 | * @phba: pointer to lpfc hba data structure. | ||
1639 | * @mboxq: pointer to mailbox data structure. | ||
1640 | * | ||
1641 | * This function handles completion of init vpi mailbox command. | ||
1642 | */ | ||
1643 | static void | ||
1644 | lpfc_init_vpi_cmpl(struct lpfc_hba *phba, LPFC_MBOXQ_t *mboxq) | ||
1645 | { | ||
1646 | struct lpfc_vport *vport = mboxq->vport; | ||
1647 | if (mboxq->u.mb.mbxStatus) { | ||
1648 | lpfc_printf_vlog(vport, KERN_ERR, | ||
1649 | LOG_MBOX, | ||
1650 | "2609 Init VPI mailbox failed 0x%x\n", | ||
1651 | mboxq->u.mb.mbxStatus); | ||
1652 | mempool_free(mboxq, phba->mbox_mem_pool); | ||
1653 | lpfc_vport_set_state(vport, FC_VPORT_FAILED); | ||
1654 | return; | ||
1655 | } | ||
1656 | vport->fc_flag &= ~FC_VPORT_NEEDS_INIT_VPI; | ||
1657 | |||
1658 | if (phba->link_flag & LS_NPIV_FAB_SUPPORTED) | ||
1659 | lpfc_initial_fdisc(vport); | ||
1660 | else { | ||
1661 | lpfc_vport_set_state(vport, FC_VPORT_NO_FABRIC_SUPP); | ||
1662 | lpfc_printf_vlog(vport, KERN_ERR, | ||
1663 | LOG_ELS, | ||
1664 | "2606 No NPIV Fabric support\n"); | ||
1665 | } | ||
1666 | return; | ||
1667 | } | ||
1668 | |||
1669 | /** | ||
1515 | * lpfc_start_fdiscs - send fdiscs for each vports on this port. | 1670 | * lpfc_start_fdiscs - send fdiscs for each vports on this port. |
1516 | * @phba: pointer to lpfc hba data structure. | 1671 | * @phba: pointer to lpfc hba data structure. |
1517 | * | 1672 | * |
@@ -1523,6 +1678,8 @@ lpfc_start_fdiscs(struct lpfc_hba *phba) | |||
1523 | { | 1678 | { |
1524 | struct lpfc_vport **vports; | 1679 | struct lpfc_vport **vports; |
1525 | int i; | 1680 | int i; |
1681 | LPFC_MBOXQ_t *mboxq; | ||
1682 | int rc; | ||
1526 | 1683 | ||
1527 | vports = lpfc_create_vport_work_array(phba); | 1684 | vports = lpfc_create_vport_work_array(phba); |
1528 | if (vports != NULL) { | 1685 | if (vports != NULL) { |
@@ -1540,6 +1697,29 @@ lpfc_start_fdiscs(struct lpfc_hba *phba) | |||
1540 | FC_VPORT_LINKDOWN); | 1697 | FC_VPORT_LINKDOWN); |
1541 | continue; | 1698 | continue; |
1542 | } | 1699 | } |
1700 | if (vports[i]->fc_flag & FC_VPORT_NEEDS_INIT_VPI) { | ||
1701 | mboxq = mempool_alloc(phba->mbox_mem_pool, | ||
1702 | GFP_KERNEL); | ||
1703 | if (!mboxq) { | ||
1704 | lpfc_printf_vlog(vports[i], KERN_ERR, | ||
1705 | LOG_MBOX, "2607 Failed to allocate " | ||
1706 | "init_vpi mailbox\n"); | ||
1707 | continue; | ||
1708 | } | ||
1709 | lpfc_init_vpi(phba, mboxq, vports[i]->vpi); | ||
1710 | mboxq->vport = vports[i]; | ||
1711 | mboxq->mbox_cmpl = lpfc_init_vpi_cmpl; | ||
1712 | rc = lpfc_sli_issue_mbox(phba, mboxq, | ||
1713 | MBX_NOWAIT); | ||
1714 | if (rc == MBX_NOT_FINISHED) { | ||
1715 | lpfc_printf_vlog(vports[i], KERN_ERR, | ||
1716 | LOG_MBOX, "2608 Failed to issue " | ||
1717 | "init_vpi mailbox\n"); | ||
1718 | mempool_free(mboxq, | ||
1719 | phba->mbox_mem_pool); | ||
1720 | } | ||
1721 | continue; | ||
1722 | } | ||
1543 | if (phba->link_flag & LS_NPIV_FAB_SUPPORTED) | 1723 | if (phba->link_flag & LS_NPIV_FAB_SUPPORTED) |
1544 | lpfc_initial_fdisc(vports[i]); | 1724 | lpfc_initial_fdisc(vports[i]); |
1545 | else { | 1725 | else { |
@@ -1769,6 +1949,7 @@ lpfc_mbx_process_link_up(struct lpfc_hba *phba, READ_LA_VAR *la) | |||
1769 | goto out; | 1949 | goto out; |
1770 | } | 1950 | } |
1771 | } else { | 1951 | } else { |
1952 | vport->port_state = LPFC_VPORT_UNKNOWN; | ||
1772 | /* | 1953 | /* |
1773 | * Add the driver's default FCF record at FCF index 0 now. This | 1954 | * Add the driver's default FCF record at FCF index 0 now. This |
1774 | * is phase 1 implementation that support FCF index 0 and driver | 1955 | * is phase 1 implementation that support FCF index 0 and driver |
@@ -1804,6 +1985,12 @@ lpfc_mbx_process_link_up(struct lpfc_hba *phba, READ_LA_VAR *la) | |||
1804 | * The driver is expected to do FIP/FCF. Call the port | 1985 | * The driver is expected to do FIP/FCF. Call the port |
1805 | * and get the FCF Table. | 1986 | * and get the FCF Table. |
1806 | */ | 1987 | */ |
1988 | spin_lock_irq(&phba->hbalock); | ||
1989 | if (phba->hba_flag & FCF_DISC_INPROGRESS) { | ||
1990 | spin_unlock_irq(&phba->hbalock); | ||
1991 | return; | ||
1992 | } | ||
1993 | spin_unlock_irq(&phba->hbalock); | ||
1807 | rc = lpfc_sli4_read_fcf_record(phba, | 1994 | rc = lpfc_sli4_read_fcf_record(phba, |
1808 | LPFC_FCOE_FCF_GET_FIRST); | 1995 | LPFC_FCOE_FCF_GET_FIRST); |
1809 | if (rc) | 1996 | if (rc) |
@@ -2113,13 +2300,15 @@ lpfc_create_static_vport(struct lpfc_hba *phba) | |||
2113 | LPFC_MBOXQ_t *pmb = NULL; | 2300 | LPFC_MBOXQ_t *pmb = NULL; |
2114 | MAILBOX_t *mb; | 2301 | MAILBOX_t *mb; |
2115 | struct static_vport_info *vport_info; | 2302 | struct static_vport_info *vport_info; |
2116 | int rc, i; | 2303 | int rc = 0, i; |
2117 | struct fc_vport_identifiers vport_id; | 2304 | struct fc_vport_identifiers vport_id; |
2118 | struct fc_vport *new_fc_vport; | 2305 | struct fc_vport *new_fc_vport; |
2119 | struct Scsi_Host *shost; | 2306 | struct Scsi_Host *shost; |
2120 | struct lpfc_vport *vport; | 2307 | struct lpfc_vport *vport; |
2121 | uint16_t offset = 0; | 2308 | uint16_t offset = 0; |
2122 | uint8_t *vport_buff; | 2309 | uint8_t *vport_buff; |
2310 | struct lpfc_dmabuf *mp; | ||
2311 | uint32_t byte_count = 0; | ||
2123 | 2312 | ||
2124 | pmb = mempool_alloc(phba->mbox_mem_pool, GFP_KERNEL); | 2313 | pmb = mempool_alloc(phba->mbox_mem_pool, GFP_KERNEL); |
2125 | if (!pmb) { | 2314 | if (!pmb) { |
@@ -2142,7 +2331,9 @@ lpfc_create_static_vport(struct lpfc_hba *phba) | |||
2142 | 2331 | ||
2143 | vport_buff = (uint8_t *) vport_info; | 2332 | vport_buff = (uint8_t *) vport_info; |
2144 | do { | 2333 | do { |
2145 | lpfc_dump_static_vport(phba, pmb, offset); | 2334 | if (lpfc_dump_static_vport(phba, pmb, offset)) |
2335 | goto out; | ||
2336 | |||
2146 | pmb->vport = phba->pport; | 2337 | pmb->vport = phba->pport; |
2147 | rc = lpfc_sli_issue_mbox_wait(phba, pmb, LPFC_MBOX_TMO); | 2338 | rc = lpfc_sli_issue_mbox_wait(phba, pmb, LPFC_MBOX_TMO); |
2148 | 2339 | ||
@@ -2155,17 +2346,30 @@ lpfc_create_static_vport(struct lpfc_hba *phba) | |||
2155 | goto out; | 2346 | goto out; |
2156 | } | 2347 | } |
2157 | 2348 | ||
2158 | if (mb->un.varDmp.word_cnt > | 2349 | if (phba->sli_rev == LPFC_SLI_REV4) { |
2159 | sizeof(struct static_vport_info) - offset) | 2350 | byte_count = pmb->u.mqe.un.mb_words[5]; |
2160 | mb->un.varDmp.word_cnt = | 2351 | mp = (struct lpfc_dmabuf *) pmb->context2; |
2161 | sizeof(struct static_vport_info) - offset; | 2352 | if (byte_count > sizeof(struct static_vport_info) - |
2162 | 2353 | offset) | |
2163 | lpfc_sli_pcimem_bcopy(((uint8_t *)mb) + DMP_RSP_OFFSET, | 2354 | byte_count = sizeof(struct static_vport_info) |
2164 | vport_buff + offset, | 2355 | - offset; |
2165 | mb->un.varDmp.word_cnt); | 2356 | memcpy(vport_buff + offset, mp->virt, byte_count); |
2166 | offset += mb->un.varDmp.word_cnt; | 2357 | offset += byte_count; |
2358 | } else { | ||
2359 | if (mb->un.varDmp.word_cnt > | ||
2360 | sizeof(struct static_vport_info) - offset) | ||
2361 | mb->un.varDmp.word_cnt = | ||
2362 | sizeof(struct static_vport_info) | ||
2363 | - offset; | ||
2364 | byte_count = mb->un.varDmp.word_cnt; | ||
2365 | lpfc_sli_pcimem_bcopy(((uint8_t *)mb) + DMP_RSP_OFFSET, | ||
2366 | vport_buff + offset, | ||
2367 | byte_count); | ||
2368 | |||
2369 | offset += byte_count; | ||
2370 | } | ||
2167 | 2371 | ||
2168 | } while (mb->un.varDmp.word_cnt && | 2372 | } while (byte_count && |
2169 | offset < sizeof(struct static_vport_info)); | 2373 | offset < sizeof(struct static_vport_info)); |
2170 | 2374 | ||
2171 | 2375 | ||
@@ -2198,7 +2402,7 @@ lpfc_create_static_vport(struct lpfc_hba *phba) | |||
2198 | if (!new_fc_vport) { | 2402 | if (!new_fc_vport) { |
2199 | lpfc_printf_log(phba, KERN_WARNING, LOG_INIT, | 2403 | lpfc_printf_log(phba, KERN_WARNING, LOG_INIT, |
2200 | "0546 lpfc_create_static_vport failed to" | 2404 | "0546 lpfc_create_static_vport failed to" |
2201 | " create vport \n"); | 2405 | " create vport\n"); |
2202 | continue; | 2406 | continue; |
2203 | } | 2407 | } |
2204 | 2408 | ||
@@ -2207,16 +2411,15 @@ lpfc_create_static_vport(struct lpfc_hba *phba) | |||
2207 | } | 2411 | } |
2208 | 2412 | ||
2209 | out: | 2413 | out: |
2210 | /* | ||
2211 | * If this is timed out command, setting NULL to context2 tell SLI | ||
2212 | * layer not to use this buffer. | ||
2213 | */ | ||
2214 | spin_lock_irq(&phba->hbalock); | ||
2215 | pmb->context2 = NULL; | ||
2216 | spin_unlock_irq(&phba->hbalock); | ||
2217 | kfree(vport_info); | 2414 | kfree(vport_info); |
2218 | if (rc != MBX_TIMEOUT) | 2415 | if (rc != MBX_TIMEOUT) { |
2416 | if (pmb->context2) { | ||
2417 | mp = (struct lpfc_dmabuf *) pmb->context2; | ||
2418 | lpfc_mbuf_free(phba, mp->virt, mp->phys); | ||
2419 | kfree(mp); | ||
2420 | } | ||
2219 | mempool_free(pmb, phba->mbox_mem_pool); | 2421 | mempool_free(pmb, phba->mbox_mem_pool); |
2422 | } | ||
2220 | 2423 | ||
2221 | return; | 2424 | return; |
2222 | } | 2425 | } |
@@ -4360,7 +4563,7 @@ lpfc_read_fcoe_param(struct lpfc_hba *phba, | |||
4360 | fcoe_param_hdr = (struct lpfc_fip_param_hdr *) | 4563 | fcoe_param_hdr = (struct lpfc_fip_param_hdr *) |
4361 | buff; | 4564 | buff; |
4362 | fcoe_param = (struct lpfc_fcoe_params *) | 4565 | fcoe_param = (struct lpfc_fcoe_params *) |
4363 | buff + sizeof(struct lpfc_fip_param_hdr); | 4566 | (buff + sizeof(struct lpfc_fip_param_hdr)); |
4364 | 4567 | ||
4365 | if ((fcoe_param_hdr->parm_version != FIPP_VERSION) || | 4568 | if ((fcoe_param_hdr->parm_version != FIPP_VERSION) || |
4366 | (fcoe_param_hdr->length != FCOE_PARAM_LENGTH)) | 4569 | (fcoe_param_hdr->length != FCOE_PARAM_LENGTH)) |