aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/scsi/bfa/bfad_bsg.c
diff options
context:
space:
mode:
Diffstat (limited to 'drivers/scsi/bfa/bfad_bsg.c')
-rw-r--r--drivers/scsi/bfa/bfad_bsg.c49
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
1069int
1070bfad_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;
1087out:
1088 return 0;
1089}
1090
1091int
1092bfad_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;
1108out:
1109 return 0;
1110}
1111
1069static int 1112static int
1070bfad_iocmd_handler(struct bfad_s *bfad, unsigned int cmd, void *iocmd, 1113bfad_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;