diff options
Diffstat (limited to 'drivers/scsi/lpfc/lpfc_init.c')
-rw-r--r-- | drivers/scsi/lpfc/lpfc_init.c | 60 |
1 files changed, 33 insertions, 27 deletions
diff --git a/drivers/scsi/lpfc/lpfc_init.c b/drivers/scsi/lpfc/lpfc_init.c index a3c820083c3..b9ff38fa7c2 100644 --- a/drivers/scsi/lpfc/lpfc_init.c +++ b/drivers/scsi/lpfc/lpfc_init.c | |||
@@ -1481,15 +1481,18 @@ lpfc_handle_eratt_s4(struct lpfc_hba *phba) | |||
1481 | return; | 1481 | return; |
1482 | } | 1482 | } |
1483 | if (bf_get(lpfc_sliport_status_rn, &portstat_reg)) { | 1483 | if (bf_get(lpfc_sliport_status_rn, &portstat_reg)) { |
1484 | /* | 1484 | /* need reset: attempt for port recovery */ |
1485 | * TODO: Attempt port recovery via a port reset. | ||
1486 | * When fully implemented, the driver should | ||
1487 | * attempt to recover the port here and return. | ||
1488 | * For now, log an error and take the port offline. | ||
1489 | */ | ||
1490 | lpfc_printf_log(phba, KERN_ERR, LOG_INIT, | 1485 | lpfc_printf_log(phba, KERN_ERR, LOG_INIT, |
1491 | "2887 Port Error: Attempting " | 1486 | "2887 Port Error: Attempting " |
1492 | "Port Recovery\n"); | 1487 | "Port Recovery\n"); |
1488 | lpfc_offline_prep(phba); | ||
1489 | lpfc_offline(phba); | ||
1490 | lpfc_sli_brdrestart(phba); | ||
1491 | if (lpfc_online(phba) == 0) { | ||
1492 | lpfc_unblock_mgmt_io(phba); | ||
1493 | return; | ||
1494 | } | ||
1495 | /* fall through for not able to recover */ | ||
1493 | } | 1496 | } |
1494 | lpfc_sli4_offline_eratt(phba); | 1497 | lpfc_sli4_offline_eratt(phba); |
1495 | break; | 1498 | break; |
@@ -1958,7 +1961,7 @@ lpfc_get_hba_model_desc(struct lpfc_hba *phba, uint8_t *mdp, uint8_t *descp) | |||
1958 | case PCI_DEVICE_ID_LANCER_FCOE: | 1961 | case PCI_DEVICE_ID_LANCER_FCOE: |
1959 | case PCI_DEVICE_ID_LANCER_FCOE_VF: | 1962 | case PCI_DEVICE_ID_LANCER_FCOE_VF: |
1960 | oneConnect = 1; | 1963 | oneConnect = 1; |
1961 | m = (typeof(m)){"OCe50100", "PCIe", "FCoE"}; | 1964 | m = (typeof(m)){"OCe15100", "PCIe", "FCoE"}; |
1962 | break; | 1965 | break; |
1963 | default: | 1966 | default: |
1964 | m = (typeof(m)){"Unknown", "", ""}; | 1967 | m = (typeof(m)){"Unknown", "", ""}; |
@@ -3949,7 +3952,7 @@ static int | |||
3949 | lpfc_enable_pci_dev(struct lpfc_hba *phba) | 3952 | lpfc_enable_pci_dev(struct lpfc_hba *phba) |
3950 | { | 3953 | { |
3951 | struct pci_dev *pdev; | 3954 | struct pci_dev *pdev; |
3952 | int bars; | 3955 | int bars = 0; |
3953 | 3956 | ||
3954 | /* Obtain PCI device reference */ | 3957 | /* Obtain PCI device reference */ |
3955 | if (!phba->pcidev) | 3958 | if (!phba->pcidev) |
@@ -3978,6 +3981,8 @@ lpfc_enable_pci_dev(struct lpfc_hba *phba) | |||
3978 | out_disable_device: | 3981 | out_disable_device: |
3979 | pci_disable_device(pdev); | 3982 | pci_disable_device(pdev); |
3980 | out_error: | 3983 | out_error: |
3984 | lpfc_printf_log(phba, KERN_ERR, LOG_INIT, | ||
3985 | "1401 Failed to enable pci device, bars:x%x\n", bars); | ||
3981 | return -ENODEV; | 3986 | return -ENODEV; |
3982 | } | 3987 | } |
3983 | 3988 | ||
@@ -8271,11 +8276,8 @@ lpfc_pci_probe_one_s3(struct pci_dev *pdev, const struct pci_device_id *pid) | |||
8271 | 8276 | ||
8272 | /* Perform generic PCI device enabling operation */ | 8277 | /* Perform generic PCI device enabling operation */ |
8273 | error = lpfc_enable_pci_dev(phba); | 8278 | error = lpfc_enable_pci_dev(phba); |
8274 | if (error) { | 8279 | if (error) |
8275 | lpfc_printf_log(phba, KERN_ERR, LOG_INIT, | ||
8276 | "1401 Failed to enable pci device.\n"); | ||
8277 | goto out_free_phba; | 8280 | goto out_free_phba; |
8278 | } | ||
8279 | 8281 | ||
8280 | /* Set up SLI API function jump table for PCI-device group-0 HBAs */ | 8282 | /* Set up SLI API function jump table for PCI-device group-0 HBAs */ |
8281 | error = lpfc_api_table_setup(phba, LPFC_PCI_DEV_LP); | 8283 | error = lpfc_api_table_setup(phba, LPFC_PCI_DEV_LP); |
@@ -8322,6 +8324,9 @@ lpfc_pci_probe_one_s3(struct pci_dev *pdev, const struct pci_device_id *pid) | |||
8322 | goto out_free_iocb_list; | 8324 | goto out_free_iocb_list; |
8323 | } | 8325 | } |
8324 | 8326 | ||
8327 | /* Get the default values for Model Name and Description */ | ||
8328 | lpfc_get_hba_model_desc(phba, phba->ModelName, phba->ModelDesc); | ||
8329 | |||
8325 | /* Create SCSI host to the physical port */ | 8330 | /* Create SCSI host to the physical port */ |
8326 | error = lpfc_create_shost(phba); | 8331 | error = lpfc_create_shost(phba); |
8327 | if (error) { | 8332 | if (error) { |
@@ -8885,16 +8890,17 @@ lpfc_write_firmware(struct lpfc_hba *phba, const struct firmware *fw) | |||
8885 | uint32_t offset = 0, temp_offset = 0; | 8890 | uint32_t offset = 0, temp_offset = 0; |
8886 | 8891 | ||
8887 | INIT_LIST_HEAD(&dma_buffer_list); | 8892 | INIT_LIST_HEAD(&dma_buffer_list); |
8888 | if ((image->magic_number != LPFC_GROUP_OJECT_MAGIC_NUM) || | 8893 | if ((be32_to_cpu(image->magic_number) != LPFC_GROUP_OJECT_MAGIC_NUM) || |
8889 | (bf_get(lpfc_grp_hdr_file_type, image) != LPFC_FILE_TYPE_GROUP) || | 8894 | (bf_get_be32(lpfc_grp_hdr_file_type, image) != |
8890 | (bf_get(lpfc_grp_hdr_id, image) != LPFC_FILE_ID_GROUP) || | 8895 | LPFC_FILE_TYPE_GROUP) || |
8891 | (image->size != fw->size)) { | 8896 | (bf_get_be32(lpfc_grp_hdr_id, image) != LPFC_FILE_ID_GROUP) || |
8897 | (be32_to_cpu(image->size) != fw->size)) { | ||
8892 | lpfc_printf_log(phba, KERN_ERR, LOG_INIT, | 8898 | lpfc_printf_log(phba, KERN_ERR, LOG_INIT, |
8893 | "3022 Invalid FW image found. " | 8899 | "3022 Invalid FW image found. " |
8894 | "Magic:%d Type:%x ID:%x\n", | 8900 | "Magic:%x Type:%x ID:%x\n", |
8895 | image->magic_number, | 8901 | be32_to_cpu(image->magic_number), |
8896 | bf_get(lpfc_grp_hdr_file_type, image), | 8902 | bf_get_be32(lpfc_grp_hdr_file_type, image), |
8897 | bf_get(lpfc_grp_hdr_id, image)); | 8903 | bf_get_be32(lpfc_grp_hdr_id, image)); |
8898 | return -EINVAL; | 8904 | return -EINVAL; |
8899 | } | 8905 | } |
8900 | lpfc_decode_firmware_rev(phba, fwrev, 1); | 8906 | lpfc_decode_firmware_rev(phba, fwrev, 1); |
@@ -8924,11 +8930,11 @@ lpfc_write_firmware(struct lpfc_hba *phba, const struct firmware *fw) | |||
8924 | while (offset < fw->size) { | 8930 | while (offset < fw->size) { |
8925 | temp_offset = offset; | 8931 | temp_offset = offset; |
8926 | list_for_each_entry(dmabuf, &dma_buffer_list, list) { | 8932 | list_for_each_entry(dmabuf, &dma_buffer_list, list) { |
8927 | if (offset + SLI4_PAGE_SIZE > fw->size) { | 8933 | if (temp_offset + SLI4_PAGE_SIZE > fw->size) { |
8928 | temp_offset += fw->size - offset; | ||
8929 | memcpy(dmabuf->virt, | 8934 | memcpy(dmabuf->virt, |
8930 | fw->data + temp_offset, | 8935 | fw->data + temp_offset, |
8931 | fw->size - offset); | 8936 | fw->size - temp_offset); |
8937 | temp_offset = fw->size; | ||
8932 | break; | 8938 | break; |
8933 | } | 8939 | } |
8934 | memcpy(dmabuf->virt, fw->data + temp_offset, | 8940 | memcpy(dmabuf->virt, fw->data + temp_offset, |
@@ -8995,11 +9001,8 @@ lpfc_pci_probe_one_s4(struct pci_dev *pdev, const struct pci_device_id *pid) | |||
8995 | 9001 | ||
8996 | /* Perform generic PCI device enabling operation */ | 9002 | /* Perform generic PCI device enabling operation */ |
8997 | error = lpfc_enable_pci_dev(phba); | 9003 | error = lpfc_enable_pci_dev(phba); |
8998 | if (error) { | 9004 | if (error) |
8999 | lpfc_printf_log(phba, KERN_ERR, LOG_INIT, | ||
9000 | "1409 Failed to enable pci device.\n"); | ||
9001 | goto out_free_phba; | 9005 | goto out_free_phba; |
9002 | } | ||
9003 | 9006 | ||
9004 | /* Set up SLI API function jump table for PCI-device group-1 HBAs */ | 9007 | /* Set up SLI API function jump table for PCI-device group-1 HBAs */ |
9005 | error = lpfc_api_table_setup(phba, LPFC_PCI_DEV_OC); | 9008 | error = lpfc_api_table_setup(phba, LPFC_PCI_DEV_OC); |
@@ -9054,6 +9057,9 @@ lpfc_pci_probe_one_s4(struct pci_dev *pdev, const struct pci_device_id *pid) | |||
9054 | goto out_free_iocb_list; | 9057 | goto out_free_iocb_list; |
9055 | } | 9058 | } |
9056 | 9059 | ||
9060 | /* Get the default values for Model Name and Description */ | ||
9061 | lpfc_get_hba_model_desc(phba, phba->ModelName, phba->ModelDesc); | ||
9062 | |||
9057 | /* Create SCSI host to the physical port */ | 9063 | /* Create SCSI host to the physical port */ |
9058 | error = lpfc_create_shost(phba); | 9064 | error = lpfc_create_shost(phba); |
9059 | if (error) { | 9065 | if (error) { |