diff options
Diffstat (limited to 'drivers/scsi/bfa/bfad_bsg.c')
-rw-r--r-- | drivers/scsi/bfa/bfad_bsg.c | 49 |
1 files changed, 49 insertions, 0 deletions
diff --git a/drivers/scsi/bfa/bfad_bsg.c b/drivers/scsi/bfa/bfad_bsg.c index fcfe0ae7fd3..e4409e57e3a 100644 --- a/drivers/scsi/bfa/bfad_bsg.c +++ b/drivers/scsi/bfa/bfad_bsg.c | |||
@@ -1066,6 +1066,49 @@ bfad_iocmd_cee_reset_stats(struct bfad_s *bfad, void *cmd) | |||
1066 | return 0; | 1066 | return 0; |
1067 | } | 1067 | } |
1068 | 1068 | ||
1069 | int | ||
1070 | bfad_iocmd_sfp_media(struct bfad_s *bfad, void *cmd) | ||
1071 | { | ||
1072 | struct bfa_bsg_sfp_media_s *iocmd = (struct bfa_bsg_sfp_media_s *)cmd; | ||
1073 | struct bfad_hal_comp fcomp; | ||
1074 | unsigned long flags; | ||
1075 | |||
1076 | init_completion(&fcomp.comp); | ||
1077 | spin_lock_irqsave(&bfad->bfad_lock, flags); | ||
1078 | iocmd->status = bfa_sfp_media(BFA_SFP_MOD(&bfad->bfa), &iocmd->media, | ||
1079 | bfad_hcb_comp, &fcomp); | ||
1080 | spin_unlock_irqrestore(&bfad->bfad_lock, flags); | ||
1081 | bfa_trc(bfad, iocmd->status); | ||
1082 | if (iocmd->status != BFA_STATUS_SFP_NOT_READY) | ||
1083 | goto out; | ||
1084 | |||
1085 | wait_for_completion(&fcomp.comp); | ||
1086 | iocmd->status = fcomp.status; | ||
1087 | out: | ||
1088 | return 0; | ||
1089 | } | ||
1090 | |||
1091 | int | ||
1092 | bfad_iocmd_sfp_speed(struct bfad_s *bfad, void *cmd) | ||
1093 | { | ||
1094 | struct bfa_bsg_sfp_speed_s *iocmd = (struct bfa_bsg_sfp_speed_s *)cmd; | ||
1095 | struct bfad_hal_comp fcomp; | ||
1096 | unsigned long flags; | ||
1097 | |||
1098 | init_completion(&fcomp.comp); | ||
1099 | spin_lock_irqsave(&bfad->bfad_lock, flags); | ||
1100 | iocmd->status = bfa_sfp_speed(BFA_SFP_MOD(&bfad->bfa), iocmd->speed, | ||
1101 | bfad_hcb_comp, &fcomp); | ||
1102 | spin_unlock_irqrestore(&bfad->bfad_lock, flags); | ||
1103 | bfa_trc(bfad, iocmd->status); | ||
1104 | if (iocmd->status != BFA_STATUS_SFP_NOT_READY) | ||
1105 | goto out; | ||
1106 | wait_for_completion(&fcomp.comp); | ||
1107 | iocmd->status = fcomp.status; | ||
1108 | out: | ||
1109 | return 0; | ||
1110 | } | ||
1111 | |||
1069 | static int | 1112 | static int |
1070 | bfad_iocmd_handler(struct bfad_s *bfad, unsigned int cmd, void *iocmd, | 1113 | bfad_iocmd_handler(struct bfad_s *bfad, unsigned int cmd, void *iocmd, |
1071 | unsigned int payload_len) | 1114 | unsigned int payload_len) |
@@ -1194,6 +1237,12 @@ bfad_iocmd_handler(struct bfad_s *bfad, unsigned int cmd, void *iocmd, | |||
1194 | case IOCMD_CEE_RESET_STATS: | 1237 | case IOCMD_CEE_RESET_STATS: |
1195 | rc = bfad_iocmd_cee_reset_stats(bfad, iocmd); | 1238 | rc = bfad_iocmd_cee_reset_stats(bfad, iocmd); |
1196 | break; | 1239 | break; |
1240 | case IOCMD_SFP_MEDIA: | ||
1241 | rc = bfad_iocmd_sfp_media(bfad, iocmd); | ||
1242 | break; | ||
1243 | case IOCMD_SFP_SPEED: | ||
1244 | rc = bfad_iocmd_sfp_speed(bfad, iocmd); | ||
1245 | break; | ||
1197 | default: | 1246 | default: |
1198 | rc = EINVAL; | 1247 | rc = EINVAL; |
1199 | break; | 1248 | break; |