diff options
| -rw-r--r-- | drivers/scsi/lpfc/lpfc.h | 3 | ||||
| -rw-r--r-- | drivers/scsi/lpfc/lpfc_attr.c | 46 | ||||
| -rw-r--r-- | drivers/scsi/lpfc/lpfc_bsg.c | 9 | ||||
| -rw-r--r-- | drivers/scsi/lpfc/lpfc_compat.h | 3 | ||||
| -rw-r--r-- | drivers/scsi/lpfc/lpfc_hbadisc.c | 2 | ||||
| -rw-r--r-- | drivers/scsi/lpfc/lpfc_hw.h | 26 | ||||
| -rw-r--r-- | drivers/scsi/lpfc/lpfc_init.c | 53 | ||||
| -rw-r--r-- | drivers/scsi/lpfc/lpfc_scsi.c | 8 | ||||
| -rw-r--r-- | drivers/scsi/lpfc/lpfc_sli.c | 29 |
9 files changed, 128 insertions, 51 deletions
diff --git a/drivers/scsi/lpfc/lpfc.h b/drivers/scsi/lpfc/lpfc.h index 3482d5a5aed2..a50aa03b8ac1 100644 --- a/drivers/scsi/lpfc/lpfc.h +++ b/drivers/scsi/lpfc/lpfc.h | |||
| @@ -775,6 +775,7 @@ struct lpfc_hba { | |||
| 775 | uint8_t temp_sensor_support; | 775 | uint8_t temp_sensor_support; |
| 776 | /* Fields used for heart beat. */ | 776 | /* Fields used for heart beat. */ |
| 777 | unsigned long last_completion_time; | 777 | unsigned long last_completion_time; |
| 778 | unsigned long skipped_hb; | ||
| 778 | struct timer_list hb_tmofunc; | 779 | struct timer_list hb_tmofunc; |
| 779 | uint8_t hb_outstanding; | 780 | uint8_t hb_outstanding; |
| 780 | enum hba_temp_state over_temp_state; | 781 | enum hba_temp_state over_temp_state; |
| @@ -817,6 +818,8 @@ struct lpfc_hba { | |||
| 817 | uint32_t iocb_cnt; | 818 | uint32_t iocb_cnt; |
| 818 | uint32_t iocb_max; | 819 | uint32_t iocb_max; |
| 819 | atomic_t sdev_cnt; | 820 | atomic_t sdev_cnt; |
| 821 | uint8_t fips_spec_rev; | ||
| 822 | uint8_t fips_level; | ||
| 820 | }; | 823 | }; |
| 821 | 824 | ||
| 822 | static inline struct Scsi_Host * | 825 | static inline struct Scsi_Host * |
diff --git a/drivers/scsi/lpfc/lpfc_attr.c b/drivers/scsi/lpfc/lpfc_attr.c index 868874c28f99..fac26e4445f9 100644 --- a/drivers/scsi/lpfc/lpfc_attr.c +++ b/drivers/scsi/lpfc/lpfc_attr.c | |||
| @@ -1239,6 +1239,44 @@ lpfc_poll_store(struct device *dev, struct device_attribute *attr, | |||
| 1239 | } | 1239 | } |
| 1240 | 1240 | ||
| 1241 | /** | 1241 | /** |
| 1242 | * lpfc_fips_level_show - Return the current FIPS level for the HBA | ||
| 1243 | * @dev: class unused variable. | ||
| 1244 | * @attr: device attribute, not used. | ||
| 1245 | * @buf: on return contains the module description text. | ||
| 1246 | * | ||
| 1247 | * Returns: size of formatted string. | ||
| 1248 | **/ | ||
| 1249 | static ssize_t | ||
| 1250 | lpfc_fips_level_show(struct device *dev, struct device_attribute *attr, | ||
| 1251 | char *buf) | ||
| 1252 | { | ||
| 1253 | struct Scsi_Host *shost = class_to_shost(dev); | ||
| 1254 | struct lpfc_vport *vport = (struct lpfc_vport *) shost->hostdata; | ||
| 1255 | struct lpfc_hba *phba = vport->phba; | ||
| 1256 | |||
| 1257 | return snprintf(buf, PAGE_SIZE, "%d\n", phba->fips_level); | ||
| 1258 | } | ||
| 1259 | |||
| 1260 | /** | ||
| 1261 | * lpfc_fips_rev_show - Return the FIPS Spec revision for the HBA | ||
| 1262 | * @dev: class unused variable. | ||
| 1263 | * @attr: device attribute, not used. | ||
| 1264 | * @buf: on return contains the module description text. | ||
| 1265 | * | ||
| 1266 | * Returns: size of formatted string. | ||
| 1267 | **/ | ||
| 1268 | static ssize_t | ||
| 1269 | lpfc_fips_rev_show(struct device *dev, struct device_attribute *attr, | ||
| 1270 | char *buf) | ||
| 1271 | { | ||
| 1272 | struct Scsi_Host *shost = class_to_shost(dev); | ||
| 1273 | struct lpfc_vport *vport = (struct lpfc_vport *) shost->hostdata; | ||
| 1274 | struct lpfc_hba *phba = vport->phba; | ||
| 1275 | |||
| 1276 | return snprintf(buf, PAGE_SIZE, "%d\n", phba->fips_spec_rev); | ||
| 1277 | } | ||
| 1278 | |||
| 1279 | /** | ||
| 1242 | * lpfc_param_show - Return a cfg attribute value in decimal | 1280 | * lpfc_param_show - Return a cfg attribute value in decimal |
| 1243 | * | 1281 | * |
| 1244 | * Description: | 1282 | * Description: |
| @@ -1676,6 +1714,8 @@ static DEVICE_ATTR(max_xri, S_IRUGO, lpfc_max_xri_show, NULL); | |||
| 1676 | static DEVICE_ATTR(used_xri, S_IRUGO, lpfc_used_xri_show, NULL); | 1714 | static DEVICE_ATTR(used_xri, S_IRUGO, lpfc_used_xri_show, NULL); |
| 1677 | static DEVICE_ATTR(npiv_info, S_IRUGO, lpfc_npiv_info_show, NULL); | 1715 | static DEVICE_ATTR(npiv_info, S_IRUGO, lpfc_npiv_info_show, NULL); |
| 1678 | static DEVICE_ATTR(lpfc_temp_sensor, S_IRUGO, lpfc_temp_sensor_show, NULL); | 1716 | static DEVICE_ATTR(lpfc_temp_sensor, S_IRUGO, lpfc_temp_sensor_show, NULL); |
| 1717 | static DEVICE_ATTR(lpfc_fips_level, S_IRUGO, lpfc_fips_level_show, NULL); | ||
| 1718 | static DEVICE_ATTR(lpfc_fips_rev, S_IRUGO, lpfc_fips_rev_show, NULL); | ||
| 1679 | 1719 | ||
| 1680 | 1720 | ||
| 1681 | static char *lpfc_soft_wwn_key = "C99G71SL8032A"; | 1721 | static char *lpfc_soft_wwn_key = "C99G71SL8032A"; |
| @@ -3280,7 +3320,7 @@ LPFC_ATTR_R(enable_bg, 0, 0, 1, "Enable BlockGuard Support"); | |||
| 3280 | # - Default will result in registering capabilities for all profiles. | 3320 | # - Default will result in registering capabilities for all profiles. |
| 3281 | # | 3321 | # |
| 3282 | */ | 3322 | */ |
| 3283 | unsigned int lpfc_prot_mask = SHOST_DIX_TYPE0_PROTECTION; | 3323 | unsigned int lpfc_prot_mask = SHOST_DIF_TYPE1_PROTECTION; |
| 3284 | 3324 | ||
| 3285 | module_param(lpfc_prot_mask, uint, 0); | 3325 | module_param(lpfc_prot_mask, uint, 0); |
| 3286 | MODULE_PARM_DESC(lpfc_prot_mask, "host protection mask"); | 3326 | MODULE_PARM_DESC(lpfc_prot_mask, "host protection mask"); |
| @@ -3385,6 +3425,8 @@ struct device_attribute *lpfc_hba_attrs[] = { | |||
| 3385 | &dev_attr_iocb_hw, | 3425 | &dev_attr_iocb_hw, |
| 3386 | &dev_attr_txq_hw, | 3426 | &dev_attr_txq_hw, |
| 3387 | &dev_attr_txcmplq_hw, | 3427 | &dev_attr_txcmplq_hw, |
| 3428 | &dev_attr_lpfc_fips_level, | ||
| 3429 | &dev_attr_lpfc_fips_rev, | ||
| 3388 | NULL, | 3430 | NULL, |
| 3389 | }; | 3431 | }; |
| 3390 | 3432 | ||
| @@ -3411,6 +3453,8 @@ struct device_attribute *lpfc_vport_attrs[] = { | |||
| 3411 | &dev_attr_lpfc_max_scsicmpl_time, | 3453 | &dev_attr_lpfc_max_scsicmpl_time, |
| 3412 | &dev_attr_lpfc_stat_data_ctrl, | 3454 | &dev_attr_lpfc_stat_data_ctrl, |
| 3413 | &dev_attr_lpfc_static_vport, | 3455 | &dev_attr_lpfc_static_vport, |
| 3456 | &dev_attr_lpfc_fips_level, | ||
| 3457 | &dev_attr_lpfc_fips_rev, | ||
| 3414 | NULL, | 3458 | NULL, |
| 3415 | }; | 3459 | }; |
| 3416 | 3460 | ||
diff --git a/drivers/scsi/lpfc/lpfc_bsg.c b/drivers/scsi/lpfc/lpfc_bsg.c index d521569e6620..49d0cf99c24c 100644 --- a/drivers/scsi/lpfc/lpfc_bsg.c +++ b/drivers/scsi/lpfc/lpfc_bsg.c | |||
| @@ -2724,15 +2724,6 @@ lpfc_bsg_issue_mbox(struct lpfc_hba *phba, struct fc_bsg_job *job, | |||
| 2724 | 2724 | ||
| 2725 | pmboxq->context2 = ext; | 2725 | pmboxq->context2 = ext; |
| 2726 | pmboxq->in_ext_byte_len = | 2726 | pmboxq->in_ext_byte_len = |
| 2727 | mbox_req->inExtWLen * | ||
| 2728 | sizeof(uint32_t); | ||
| 2729 | pmboxq->out_ext_byte_len = | ||
| 2730 | mbox_req->outExtWLen * | ||
| 2731 | sizeof(uint32_t); | ||
| 2732 | pmboxq->mbox_offset_word = | ||
| 2733 | mbox_req->mbOffset; | ||
| 2734 | pmboxq->context2 = ext; | ||
| 2735 | pmboxq->in_ext_byte_len = | ||
| 2736 | mbox_req->inExtWLen * sizeof(uint32_t); | 2727 | mbox_req->inExtWLen * sizeof(uint32_t); |
| 2737 | pmboxq->out_ext_byte_len = | 2728 | pmboxq->out_ext_byte_len = |
| 2738 | mbox_req->outExtWLen * sizeof(uint32_t); | 2729 | mbox_req->outExtWLen * sizeof(uint32_t); |
diff --git a/drivers/scsi/lpfc/lpfc_compat.h b/drivers/scsi/lpfc/lpfc_compat.h index a11f1ae7b98e..75e2e569dede 100644 --- a/drivers/scsi/lpfc/lpfc_compat.h +++ b/drivers/scsi/lpfc/lpfc_compat.h | |||
| @@ -82,8 +82,7 @@ lpfc_memcpy_from_slim( void *dest, void __iomem *src, unsigned int bytes) | |||
| 82 | static inline void | 82 | static inline void |
| 83 | lpfc_memcpy_to_slim( void __iomem *dest, void *src, unsigned int bytes) | 83 | lpfc_memcpy_to_slim( void __iomem *dest, void *src, unsigned int bytes) |
| 84 | { | 84 | { |
| 85 | /* actually returns 1 byte past dest */ | 85 | __iowrite32_copy(dest, src, bytes); |
| 86 | memcpy_toio( dest, src, bytes); | ||
| 87 | } | 86 | } |
| 88 | 87 | ||
| 89 | static inline void | 88 | static inline void |
diff --git a/drivers/scsi/lpfc/lpfc_hbadisc.c b/drivers/scsi/lpfc/lpfc_hbadisc.c index 0639c994349c..efba65b368a8 100644 --- a/drivers/scsi/lpfc/lpfc_hbadisc.c +++ b/drivers/scsi/lpfc/lpfc_hbadisc.c | |||
| @@ -588,7 +588,7 @@ lpfc_work_done(struct lpfc_hba *phba) | |||
| 588 | (status & | 588 | (status & |
| 589 | HA_RXMASK)); | 589 | HA_RXMASK)); |
| 590 | } | 590 | } |
| 591 | if (pring->txq_cnt) | 591 | if ((phba->sli_rev == LPFC_SLI_REV4) && pring->txq_cnt) |
| 592 | lpfc_drain_txq(phba); | 592 | lpfc_drain_txq(phba); |
| 593 | /* | 593 | /* |
| 594 | * Turn on Ring interrupts | 594 | * Turn on Ring interrupts |
diff --git a/drivers/scsi/lpfc/lpfc_hw.h b/drivers/scsi/lpfc/lpfc_hw.h index f5dbf2be3eab..897caa05e94d 100644 --- a/drivers/scsi/lpfc/lpfc_hw.h +++ b/drivers/scsi/lpfc/lpfc_hw.h | |||
| @@ -2806,11 +2806,15 @@ typedef struct { | |||
| 2806 | uint32_t rsvd6; /* Reserved */ | 2806 | uint32_t rsvd6; /* Reserved */ |
| 2807 | 2807 | ||
| 2808 | #ifdef __BIG_ENDIAN_BITFIELD | 2808 | #ifdef __BIG_ENDIAN_BITFIELD |
| 2809 | uint32_t rsvd7 : 16; /* Reserved */ | 2809 | uint32_t fips_rev : 3; /* FIPS Spec Revision */ |
| 2810 | uint32_t fips_level : 4; /* FIPS Level */ | ||
| 2811 | uint32_t sec_err : 9; /* security crypto error */ | ||
| 2810 | uint32_t max_vpi : 16; /* Max number of virt N-Ports */ | 2812 | uint32_t max_vpi : 16; /* Max number of virt N-Ports */ |
| 2811 | #else /* __LITTLE_ENDIAN */ | 2813 | #else /* __LITTLE_ENDIAN */ |
| 2812 | uint32_t max_vpi : 16; /* Max number of virt N-Ports */ | 2814 | uint32_t max_vpi : 16; /* Max number of virt N-Ports */ |
| 2813 | uint32_t rsvd7 : 16; /* Reserved */ | 2815 | uint32_t sec_err : 9; /* security crypto error */ |
| 2816 | uint32_t fips_level : 4; /* FIPS Level */ | ||
| 2817 | uint32_t fips_rev : 3; /* FIPS Spec Revision */ | ||
| 2814 | #endif | 2818 | #endif |
| 2815 | 2819 | ||
| 2816 | } CONFIG_PORT_VAR; | 2820 | } CONFIG_PORT_VAR; |
| @@ -3441,63 +3445,63 @@ struct sli3_bg_fields { | |||
| 3441 | static inline uint32_t | 3445 | static inline uint32_t |
| 3442 | lpfc_bgs_get_bidir_bg_prof(uint32_t bgstat) | 3446 | lpfc_bgs_get_bidir_bg_prof(uint32_t bgstat) |
| 3443 | { | 3447 | { |
| 3444 | return (le32_to_cpu(bgstat) & BGS_BIDIR_BG_PROF_MASK) >> | 3448 | return (bgstat & BGS_BIDIR_BG_PROF_MASK) >> |
| 3445 | BGS_BIDIR_BG_PROF_SHIFT; | 3449 | BGS_BIDIR_BG_PROF_SHIFT; |
| 3446 | } | 3450 | } |
| 3447 | 3451 | ||
| 3448 | static inline uint32_t | 3452 | static inline uint32_t |
| 3449 | lpfc_bgs_get_bidir_err_cond(uint32_t bgstat) | 3453 | lpfc_bgs_get_bidir_err_cond(uint32_t bgstat) |
| 3450 | { | 3454 | { |
| 3451 | return (le32_to_cpu(bgstat) & BGS_BIDIR_ERR_COND_FLAGS_MASK) >> | 3455 | return (bgstat & BGS_BIDIR_ERR_COND_FLAGS_MASK) >> |
| 3452 | BGS_BIDIR_ERR_COND_SHIFT; | 3456 | BGS_BIDIR_ERR_COND_SHIFT; |
| 3453 | } | 3457 | } |
| 3454 | 3458 | ||
| 3455 | static inline uint32_t | 3459 | static inline uint32_t |
| 3456 | lpfc_bgs_get_bg_prof(uint32_t bgstat) | 3460 | lpfc_bgs_get_bg_prof(uint32_t bgstat) |
| 3457 | { | 3461 | { |
| 3458 | return (le32_to_cpu(bgstat) & BGS_BG_PROFILE_MASK) >> | 3462 | return (bgstat & BGS_BG_PROFILE_MASK) >> |
| 3459 | BGS_BG_PROFILE_SHIFT; | 3463 | BGS_BG_PROFILE_SHIFT; |
| 3460 | } | 3464 | } |
| 3461 | 3465 | ||
| 3462 | static inline uint32_t | 3466 | static inline uint32_t |
| 3463 | lpfc_bgs_get_invalid_prof(uint32_t bgstat) | 3467 | lpfc_bgs_get_invalid_prof(uint32_t bgstat) |
| 3464 | { | 3468 | { |
| 3465 | return (le32_to_cpu(bgstat) & BGS_INVALID_PROF_MASK) >> | 3469 | return (bgstat & BGS_INVALID_PROF_MASK) >> |
| 3466 | BGS_INVALID_PROF_SHIFT; | 3470 | BGS_INVALID_PROF_SHIFT; |
| 3467 | } | 3471 | } |
| 3468 | 3472 | ||
| 3469 | static inline uint32_t | 3473 | static inline uint32_t |
| 3470 | lpfc_bgs_get_uninit_dif_block(uint32_t bgstat) | 3474 | lpfc_bgs_get_uninit_dif_block(uint32_t bgstat) |
| 3471 | { | 3475 | { |
| 3472 | return (le32_to_cpu(bgstat) & BGS_UNINIT_DIF_BLOCK_MASK) >> | 3476 | return (bgstat & BGS_UNINIT_DIF_BLOCK_MASK) >> |
| 3473 | BGS_UNINIT_DIF_BLOCK_SHIFT; | 3477 | BGS_UNINIT_DIF_BLOCK_SHIFT; |
| 3474 | } | 3478 | } |
| 3475 | 3479 | ||
| 3476 | static inline uint32_t | 3480 | static inline uint32_t |
| 3477 | lpfc_bgs_get_hi_water_mark_present(uint32_t bgstat) | 3481 | lpfc_bgs_get_hi_water_mark_present(uint32_t bgstat) |
| 3478 | { | 3482 | { |
| 3479 | return (le32_to_cpu(bgstat) & BGS_HI_WATER_MARK_PRESENT_MASK) >> | 3483 | return (bgstat & BGS_HI_WATER_MARK_PRESENT_MASK) >> |
| 3480 | BGS_HI_WATER_MARK_PRESENT_SHIFT; | 3484 | BGS_HI_WATER_MARK_PRESENT_SHIFT; |
| 3481 | } | 3485 | } |
| 3482 | 3486 | ||
| 3483 | static inline uint32_t | 3487 | static inline uint32_t |
| 3484 | lpfc_bgs_get_reftag_err(uint32_t bgstat) | 3488 | lpfc_bgs_get_reftag_err(uint32_t bgstat) |
| 3485 | { | 3489 | { |
| 3486 | return (le32_to_cpu(bgstat) & BGS_REFTAG_ERR_MASK) >> | 3490 | return (bgstat & BGS_REFTAG_ERR_MASK) >> |
| 3487 | BGS_REFTAG_ERR_SHIFT; | 3491 | BGS_REFTAG_ERR_SHIFT; |
| 3488 | } | 3492 | } |
| 3489 | 3493 | ||
| 3490 | static inline uint32_t | 3494 | static inline uint32_t |
| 3491 | lpfc_bgs_get_apptag_err(uint32_t bgstat) | 3495 | lpfc_bgs_get_apptag_err(uint32_t bgstat) |
| 3492 | { | 3496 | { |
| 3493 | return (le32_to_cpu(bgstat) & BGS_APPTAG_ERR_MASK) >> | 3497 | return (bgstat & BGS_APPTAG_ERR_MASK) >> |
| 3494 | BGS_APPTAG_ERR_SHIFT; | 3498 | BGS_APPTAG_ERR_SHIFT; |
| 3495 | } | 3499 | } |
| 3496 | 3500 | ||
| 3497 | static inline uint32_t | 3501 | static inline uint32_t |
| 3498 | lpfc_bgs_get_guard_err(uint32_t bgstat) | 3502 | lpfc_bgs_get_guard_err(uint32_t bgstat) |
| 3499 | { | 3503 | { |
| 3500 | return (le32_to_cpu(bgstat) & BGS_GUARD_ERR_MASK) >> | 3504 | return (bgstat & BGS_GUARD_ERR_MASK) >> |
| 3501 | BGS_GUARD_ERR_SHIFT; | 3505 | BGS_GUARD_ERR_SHIFT; |
| 3502 | } | 3506 | } |
| 3503 | 3507 | ||
diff --git a/drivers/scsi/lpfc/lpfc_init.c b/drivers/scsi/lpfc/lpfc_init.c index 2786ee3b605d..9244aa64b3be 100644 --- a/drivers/scsi/lpfc/lpfc_init.c +++ b/drivers/scsi/lpfc/lpfc_init.c | |||
| @@ -1032,27 +1032,46 @@ lpfc_hb_timeout_handler(struct lpfc_hba *phba) | |||
| 1032 | /* If there is no heart beat outstanding, issue a heartbeat command */ | 1032 | /* If there is no heart beat outstanding, issue a heartbeat command */ |
| 1033 | if (phba->cfg_enable_hba_heartbeat) { | 1033 | if (phba->cfg_enable_hba_heartbeat) { |
| 1034 | if (!phba->hb_outstanding) { | 1034 | if (!phba->hb_outstanding) { |
| 1035 | pmboxq = mempool_alloc(phba->mbox_mem_pool,GFP_KERNEL); | 1035 | if ((!(psli->sli_flag & LPFC_SLI_MBOX_ACTIVE)) && |
| 1036 | if (!pmboxq) { | 1036 | (list_empty(&psli->mboxq))) { |
| 1037 | mod_timer(&phba->hb_tmofunc, | 1037 | pmboxq = mempool_alloc(phba->mbox_mem_pool, |
| 1038 | jiffies + HZ * LPFC_HB_MBOX_INTERVAL); | 1038 | GFP_KERNEL); |
| 1039 | return; | 1039 | if (!pmboxq) { |
| 1040 | } | 1040 | mod_timer(&phba->hb_tmofunc, |
| 1041 | jiffies + | ||
| 1042 | HZ * LPFC_HB_MBOX_INTERVAL); | ||
| 1043 | return; | ||
| 1044 | } | ||
| 1041 | 1045 | ||
| 1042 | lpfc_heart_beat(phba, pmboxq); | 1046 | lpfc_heart_beat(phba, pmboxq); |
| 1043 | pmboxq->mbox_cmpl = lpfc_hb_mbox_cmpl; | 1047 | pmboxq->mbox_cmpl = lpfc_hb_mbox_cmpl; |
| 1044 | pmboxq->vport = phba->pport; | 1048 | pmboxq->vport = phba->pport; |
| 1045 | retval = lpfc_sli_issue_mbox(phba, pmboxq, MBX_NOWAIT); | 1049 | retval = lpfc_sli_issue_mbox(phba, pmboxq, |
| 1050 | MBX_NOWAIT); | ||
| 1051 | |||
| 1052 | if (retval != MBX_BUSY && | ||
| 1053 | retval != MBX_SUCCESS) { | ||
| 1054 | mempool_free(pmboxq, | ||
| 1055 | phba->mbox_mem_pool); | ||
| 1056 | mod_timer(&phba->hb_tmofunc, | ||
| 1057 | jiffies + | ||
| 1058 | HZ * LPFC_HB_MBOX_INTERVAL); | ||
| 1059 | return; | ||
| 1060 | } | ||
| 1061 | phba->skipped_hb = 0; | ||
| 1062 | phba->hb_outstanding = 1; | ||
| 1063 | } else if (time_before_eq(phba->last_completion_time, | ||
| 1064 | phba->skipped_hb)) { | ||
| 1065 | lpfc_printf_log(phba, KERN_INFO, LOG_INIT, | ||
| 1066 | "2857 Last completion time not " | ||
| 1067 | " updated in %d ms\n", | ||
| 1068 | jiffies_to_msecs(jiffies | ||
| 1069 | - phba->last_completion_time)); | ||
| 1070 | } else | ||
| 1071 | phba->skipped_hb = jiffies; | ||
| 1046 | 1072 | ||
| 1047 | if (retval != MBX_BUSY && retval != MBX_SUCCESS) { | ||
| 1048 | mempool_free(pmboxq, phba->mbox_mem_pool); | ||
| 1049 | mod_timer(&phba->hb_tmofunc, | ||
| 1050 | jiffies + HZ * LPFC_HB_MBOX_INTERVAL); | ||
| 1051 | return; | ||
| 1052 | } | ||
| 1053 | mod_timer(&phba->hb_tmofunc, | 1073 | mod_timer(&phba->hb_tmofunc, |
| 1054 | jiffies + HZ * LPFC_HB_MBOX_TIMEOUT); | 1074 | jiffies + HZ * LPFC_HB_MBOX_TIMEOUT); |
| 1055 | phba->hb_outstanding = 1; | ||
| 1056 | return; | 1075 | return; |
| 1057 | } else { | 1076 | } else { |
| 1058 | /* | 1077 | /* |
diff --git a/drivers/scsi/lpfc/lpfc_scsi.c b/drivers/scsi/lpfc/lpfc_scsi.c index c818a7255962..2e51aa6b45b3 100644 --- a/drivers/scsi/lpfc/lpfc_scsi.c +++ b/drivers/scsi/lpfc/lpfc_scsi.c | |||
| @@ -1325,7 +1325,7 @@ lpfc_bg_setup_bpl(struct lpfc_hba *phba, struct scsi_cmnd *sc, | |||
| 1325 | bf_set(pde5_type, pde5, LPFC_PDE5_DESCRIPTOR); | 1325 | bf_set(pde5_type, pde5, LPFC_PDE5_DESCRIPTOR); |
| 1326 | pde5->reftag = reftag; | 1326 | pde5->reftag = reftag; |
| 1327 | 1327 | ||
| 1328 | /* Endian convertion if necessary for PDE5 */ | 1328 | /* Endianness conversion if necessary for PDE5 */ |
| 1329 | pde5->word0 = cpu_to_le32(pde5->word0); | 1329 | pde5->word0 = cpu_to_le32(pde5->word0); |
| 1330 | pde5->reftag = cpu_to_le32(pde5->reftag); | 1330 | pde5->reftag = cpu_to_le32(pde5->reftag); |
| 1331 | 1331 | ||
| @@ -1347,7 +1347,7 @@ lpfc_bg_setup_bpl(struct lpfc_hba *phba, struct scsi_cmnd *sc, | |||
| 1347 | bf_set(pde6_ai, pde6, 1); | 1347 | bf_set(pde6_ai, pde6, 1); |
| 1348 | bf_set(pde6_apptagval, pde6, apptagval); | 1348 | bf_set(pde6_apptagval, pde6, apptagval); |
| 1349 | 1349 | ||
| 1350 | /* Endian convertion if necessary for PDE6 */ | 1350 | /* Endianness conversion if necessary for PDE6 */ |
| 1351 | pde6->word0 = cpu_to_le32(pde6->word0); | 1351 | pde6->word0 = cpu_to_le32(pde6->word0); |
| 1352 | pde6->word1 = cpu_to_le32(pde6->word1); | 1352 | pde6->word1 = cpu_to_le32(pde6->word1); |
| 1353 | pde6->word2 = cpu_to_le32(pde6->word2); | 1353 | pde6->word2 = cpu_to_le32(pde6->word2); |
| @@ -1459,7 +1459,7 @@ lpfc_bg_setup_bpl_prot(struct lpfc_hba *phba, struct scsi_cmnd *sc, | |||
| 1459 | bf_set(pde5_type, pde5, LPFC_PDE5_DESCRIPTOR); | 1459 | bf_set(pde5_type, pde5, LPFC_PDE5_DESCRIPTOR); |
| 1460 | pde5->reftag = reftag; | 1460 | pde5->reftag = reftag; |
| 1461 | 1461 | ||
| 1462 | /* Endian convertion if necessary for PDE5 */ | 1462 | /* Endianness conversion if necessary for PDE5 */ |
| 1463 | pde5->word0 = cpu_to_le32(pde5->word0); | 1463 | pde5->word0 = cpu_to_le32(pde5->word0); |
| 1464 | pde5->reftag = cpu_to_le32(pde5->reftag); | 1464 | pde5->reftag = cpu_to_le32(pde5->reftag); |
| 1465 | 1465 | ||
| @@ -1479,7 +1479,7 @@ lpfc_bg_setup_bpl_prot(struct lpfc_hba *phba, struct scsi_cmnd *sc, | |||
| 1479 | bf_set(pde6_ai, pde6, 1); | 1479 | bf_set(pde6_ai, pde6, 1); |
| 1480 | bf_set(pde6_apptagval, pde6, apptagval); | 1480 | bf_set(pde6_apptagval, pde6, apptagval); |
| 1481 | 1481 | ||
| 1482 | /* Endian convertion if necessary for PDE6 */ | 1482 | /* Endianness conversion if necessary for PDE6 */ |
| 1483 | pde6->word0 = cpu_to_le32(pde6->word0); | 1483 | pde6->word0 = cpu_to_le32(pde6->word0); |
| 1484 | pde6->word1 = cpu_to_le32(pde6->word1); | 1484 | pde6->word1 = cpu_to_le32(pde6->word1); |
| 1485 | pde6->word2 = cpu_to_le32(pde6->word2); | 1485 | pde6->word2 = cpu_to_le32(pde6->word2); |
diff --git a/drivers/scsi/lpfc/lpfc_sli.c b/drivers/scsi/lpfc/lpfc_sli.c index e758eae0d0fd..0ce9eb7ca4ee 100644 --- a/drivers/scsi/lpfc/lpfc_sli.c +++ b/drivers/scsi/lpfc/lpfc_sli.c | |||
| @@ -1046,7 +1046,7 @@ lpfc_sli_next_iotag(struct lpfc_hba *phba, struct lpfc_iocbq *iocbq) | |||
| 1046 | } else | 1046 | } else |
| 1047 | spin_unlock_irq(&phba->hbalock); | 1047 | spin_unlock_irq(&phba->hbalock); |
| 1048 | 1048 | ||
| 1049 | lpfc_printf_log(phba, KERN_ERR,LOG_SLI, | 1049 | lpfc_printf_log(phba, KERN_WARNING, LOG_SLI, |
| 1050 | "0318 Failed to allocate IOTAG.last IOTAG is %d\n", | 1050 | "0318 Failed to allocate IOTAG.last IOTAG is %d\n", |
| 1051 | psli->last_iotag); | 1051 | psli->last_iotag); |
| 1052 | 1052 | ||
| @@ -3914,7 +3914,8 @@ lpfc_sli_config_port(struct lpfc_hba *phba, int sli_mode) | |||
| 3914 | phba->sli3_options &= ~(LPFC_SLI3_NPIV_ENABLED | | 3914 | phba->sli3_options &= ~(LPFC_SLI3_NPIV_ENABLED | |
| 3915 | LPFC_SLI3_HBQ_ENABLED | | 3915 | LPFC_SLI3_HBQ_ENABLED | |
| 3916 | LPFC_SLI3_CRP_ENABLED | | 3916 | LPFC_SLI3_CRP_ENABLED | |
| 3917 | LPFC_SLI3_BG_ENABLED); | 3917 | LPFC_SLI3_BG_ENABLED | |
| 3918 | LPFC_SLI3_DSS_ENABLED); | ||
| 3918 | if (rc != MBX_SUCCESS) { | 3919 | if (rc != MBX_SUCCESS) { |
| 3919 | lpfc_printf_log(phba, KERN_ERR, LOG_INIT, | 3920 | lpfc_printf_log(phba, KERN_ERR, LOG_INIT, |
| 3920 | "0442 Adapter failed to init, mbxCmd x%x " | 3921 | "0442 Adapter failed to init, mbxCmd x%x " |
| @@ -3949,8 +3950,23 @@ lpfc_sli_config_port(struct lpfc_hba *phba, int sli_mode) | |||
| 3949 | 3950 | ||
| 3950 | } else | 3951 | } else |
| 3951 | phba->max_vpi = 0; | 3952 | phba->max_vpi = 0; |
| 3952 | if (pmb->u.mb.un.varCfgPort.gdss) | 3953 | phba->fips_level = 0; |
| 3954 | phba->fips_spec_rev = 0; | ||
| 3955 | if (pmb->u.mb.un.varCfgPort.gdss) { | ||
| 3953 | phba->sli3_options |= LPFC_SLI3_DSS_ENABLED; | 3956 | phba->sli3_options |= LPFC_SLI3_DSS_ENABLED; |
| 3957 | phba->fips_level = pmb->u.mb.un.varCfgPort.fips_level; | ||
| 3958 | phba->fips_spec_rev = pmb->u.mb.un.varCfgPort.fips_rev; | ||
| 3959 | lpfc_printf_log(phba, KERN_INFO, LOG_INIT, | ||
| 3960 | "2850 Security Crypto Active. FIPS x%d " | ||
| 3961 | "(Spec Rev: x%d)", | ||
| 3962 | phba->fips_level, phba->fips_spec_rev); | ||
| 3963 | } | ||
| 3964 | if (pmb->u.mb.un.varCfgPort.sec_err) { | ||
| 3965 | lpfc_printf_log(phba, KERN_ERR, LOG_INIT, | ||
| 3966 | "2856 Config Port Security Crypto " | ||
| 3967 | "Error: x%x ", | ||
| 3968 | pmb->u.mb.un.varCfgPort.sec_err); | ||
| 3969 | } | ||
| 3954 | if (pmb->u.mb.un.varCfgPort.gerbm) | 3970 | if (pmb->u.mb.un.varCfgPort.gerbm) |
| 3955 | phba->sli3_options |= LPFC_SLI3_HBQ_ENABLED; | 3971 | phba->sli3_options |= LPFC_SLI3_HBQ_ENABLED; |
| 3956 | if (pmb->u.mb.un.varCfgPort.gcrp) | 3972 | if (pmb->u.mb.un.varCfgPort.gcrp) |
| @@ -9040,6 +9056,7 @@ lpfc_sli4_sp_handle_cqe(struct lpfc_hba *phba, struct lpfc_queue *cq, | |||
| 9040 | switch (bf_get(lpfc_cqe_code, &cqevt)) { | 9056 | switch (bf_get(lpfc_cqe_code, &cqevt)) { |
| 9041 | case CQE_CODE_COMPL_WQE: | 9057 | case CQE_CODE_COMPL_WQE: |
| 9042 | /* Process the WQ/RQ complete event */ | 9058 | /* Process the WQ/RQ complete event */ |
| 9059 | phba->last_completion_time = jiffies; | ||
| 9043 | workposted = lpfc_sli4_sp_handle_els_wcqe(phba, | 9060 | workposted = lpfc_sli4_sp_handle_els_wcqe(phba, |
| 9044 | (struct lpfc_wcqe_complete *)&cqevt); | 9061 | (struct lpfc_wcqe_complete *)&cqevt); |
| 9045 | break; | 9062 | break; |
| @@ -9050,11 +9067,13 @@ lpfc_sli4_sp_handle_cqe(struct lpfc_hba *phba, struct lpfc_queue *cq, | |||
| 9050 | break; | 9067 | break; |
| 9051 | case CQE_CODE_XRI_ABORTED: | 9068 | case CQE_CODE_XRI_ABORTED: |
| 9052 | /* Process the WQ XRI abort event */ | 9069 | /* Process the WQ XRI abort event */ |
| 9070 | phba->last_completion_time = jiffies; | ||
| 9053 | workposted = lpfc_sli4_sp_handle_abort_xri_wcqe(phba, cq, | 9071 | workposted = lpfc_sli4_sp_handle_abort_xri_wcqe(phba, cq, |
| 9054 | (struct sli4_wcqe_xri_aborted *)&cqevt); | 9072 | (struct sli4_wcqe_xri_aborted *)&cqevt); |
| 9055 | break; | 9073 | break; |
| 9056 | case CQE_CODE_RECEIVE: | 9074 | case CQE_CODE_RECEIVE: |
| 9057 | /* Process the RQ event */ | 9075 | /* Process the RQ event */ |
| 9076 | phba->last_completion_time = jiffies; | ||
| 9058 | workposted = lpfc_sli4_sp_handle_rcqe(phba, | 9077 | workposted = lpfc_sli4_sp_handle_rcqe(phba, |
| 9059 | (struct lpfc_rcqe *)&cqevt); | 9078 | (struct lpfc_rcqe *)&cqevt); |
| 9060 | break; | 9079 | break; |
| @@ -9276,7 +9295,6 @@ lpfc_sli4_fp_handle_wcqe(struct lpfc_hba *phba, struct lpfc_queue *cq, | |||
| 9276 | { | 9295 | { |
| 9277 | struct lpfc_wcqe_release wcqe; | 9296 | struct lpfc_wcqe_release wcqe; |
| 9278 | bool workposted = false; | 9297 | bool workposted = false; |
| 9279 | unsigned long iflag; | ||
| 9280 | 9298 | ||
| 9281 | /* Copy the work queue CQE and convert endian order if needed */ | 9299 | /* Copy the work queue CQE and convert endian order if needed */ |
| 9282 | lpfc_sli_pcimem_bcopy(cqe, &wcqe, sizeof(struct lpfc_cqe)); | 9300 | lpfc_sli_pcimem_bcopy(cqe, &wcqe, sizeof(struct lpfc_cqe)); |
| @@ -9285,9 +9303,7 @@ lpfc_sli4_fp_handle_wcqe(struct lpfc_hba *phba, struct lpfc_queue *cq, | |||
| 9285 | switch (bf_get(lpfc_wcqe_c_code, &wcqe)) { | 9303 | switch (bf_get(lpfc_wcqe_c_code, &wcqe)) { |
| 9286 | case CQE_CODE_COMPL_WQE: | 9304 | case CQE_CODE_COMPL_WQE: |
| 9287 | /* Process the WQ complete event */ | 9305 | /* Process the WQ complete event */ |
| 9288 | spin_lock_irqsave(&phba->hbalock, iflag); | ||
| 9289 | phba->last_completion_time = jiffies; | 9306 | phba->last_completion_time = jiffies; |
| 9290 | spin_unlock_irqrestore(&phba->hbalock, iflag); | ||
| 9291 | lpfc_sli4_fp_handle_fcp_wcqe(phba, | 9307 | lpfc_sli4_fp_handle_fcp_wcqe(phba, |
| 9292 | (struct lpfc_wcqe_complete *)&wcqe); | 9308 | (struct lpfc_wcqe_complete *)&wcqe); |
| 9293 | break; | 9309 | break; |
| @@ -9298,6 +9314,7 @@ lpfc_sli4_fp_handle_wcqe(struct lpfc_hba *phba, struct lpfc_queue *cq, | |||
| 9298 | break; | 9314 | break; |
| 9299 | case CQE_CODE_XRI_ABORTED: | 9315 | case CQE_CODE_XRI_ABORTED: |
| 9300 | /* Process the WQ XRI abort event */ | 9316 | /* Process the WQ XRI abort event */ |
| 9317 | phba->last_completion_time = jiffies; | ||
| 9301 | workposted = lpfc_sli4_sp_handle_abort_xri_wcqe(phba, cq, | 9318 | workposted = lpfc_sli4_sp_handle_abort_xri_wcqe(phba, cq, |
| 9302 | (struct sli4_wcqe_xri_aborted *)&wcqe); | 9319 | (struct sli4_wcqe_xri_aborted *)&wcqe); |
| 9303 | break; | 9320 | break; |
