diff options
Diffstat (limited to 'drivers/scsi/ipr.c')
| -rw-r--r-- | drivers/scsi/ipr.c | 49 |
1 files changed, 5 insertions, 44 deletions
diff --git a/drivers/scsi/ipr.c b/drivers/scsi/ipr.c index 27acf78cf8d8..2bba5e55d7bc 100644 --- a/drivers/scsi/ipr.c +++ b/drivers/scsi/ipr.c | |||
| @@ -4236,35 +4236,6 @@ static void ipr_scsi_done(struct ipr_cmnd *ipr_cmd) | |||
| 4236 | } | 4236 | } |
| 4237 | 4237 | ||
| 4238 | /** | 4238 | /** |
| 4239 | * ipr_save_ioafp_mode_select - Save adapters mode select data | ||
| 4240 | * @ioa_cfg: ioa config struct | ||
| 4241 | * @scsi_cmd: scsi command struct | ||
| 4242 | * | ||
| 4243 | * This function saves mode select data for the adapter to | ||
| 4244 | * use following an adapter reset. | ||
| 4245 | * | ||
| 4246 | * Return value: | ||
| 4247 | * 0 on success / SCSI_MLQUEUE_HOST_BUSY on failure | ||
| 4248 | **/ | ||
| 4249 | static int ipr_save_ioafp_mode_select(struct ipr_ioa_cfg *ioa_cfg, | ||
| 4250 | struct scsi_cmnd *scsi_cmd) | ||
| 4251 | { | ||
| 4252 | if (!ioa_cfg->saved_mode_pages) { | ||
| 4253 | ioa_cfg->saved_mode_pages = kmalloc(sizeof(struct ipr_mode_pages), | ||
| 4254 | GFP_ATOMIC); | ||
| 4255 | if (!ioa_cfg->saved_mode_pages) { | ||
| 4256 | dev_err(&ioa_cfg->pdev->dev, | ||
| 4257 | "IOA mode select buffer allocation failed\n"); | ||
| 4258 | return SCSI_MLQUEUE_HOST_BUSY; | ||
| 4259 | } | ||
| 4260 | } | ||
| 4261 | |||
| 4262 | memcpy(ioa_cfg->saved_mode_pages, scsi_cmd->buffer, scsi_cmd->cmnd[4]); | ||
| 4263 | ioa_cfg->saved_mode_page_len = scsi_cmd->cmnd[4]; | ||
| 4264 | return 0; | ||
| 4265 | } | ||
| 4266 | |||
| 4267 | /** | ||
| 4268 | * ipr_queuecommand - Queue a mid-layer request | 4239 | * ipr_queuecommand - Queue a mid-layer request |
| 4269 | * @scsi_cmd: scsi command struct | 4240 | * @scsi_cmd: scsi command struct |
| 4270 | * @done: done function | 4241 | * @done: done function |
| @@ -4338,9 +4309,6 @@ static int ipr_queuecommand(struct scsi_cmnd *scsi_cmd, | |||
| 4338 | (!ipr_is_gscsi(res) || scsi_cmd->cmnd[0] == IPR_QUERY_RSRC_STATE)) | 4309 | (!ipr_is_gscsi(res) || scsi_cmd->cmnd[0] == IPR_QUERY_RSRC_STATE)) |
| 4339 | ioarcb->cmd_pkt.request_type = IPR_RQTYPE_IOACMD; | 4310 | ioarcb->cmd_pkt.request_type = IPR_RQTYPE_IOACMD; |
| 4340 | 4311 | ||
| 4341 | if (ipr_is_ioa_resource(res) && scsi_cmd->cmnd[0] == MODE_SELECT) | ||
| 4342 | rc = ipr_save_ioafp_mode_select(ioa_cfg, scsi_cmd); | ||
| 4343 | |||
| 4344 | if (likely(rc == 0)) | 4312 | if (likely(rc == 0)) |
| 4345 | rc = ipr_build_ioadl(ioa_cfg, ipr_cmd); | 4313 | rc = ipr_build_ioadl(ioa_cfg, ipr_cmd); |
| 4346 | 4314 | ||
| @@ -4829,17 +4797,11 @@ static int ipr_ioafp_mode_select_page28(struct ipr_cmnd *ipr_cmd) | |||
| 4829 | int length; | 4797 | int length; |
| 4830 | 4798 | ||
| 4831 | ENTER; | 4799 | ENTER; |
| 4832 | if (ioa_cfg->saved_mode_pages) { | 4800 | ipr_scsi_bus_speed_limit(ioa_cfg); |
| 4833 | memcpy(mode_pages, ioa_cfg->saved_mode_pages, | 4801 | ipr_check_term_power(ioa_cfg, mode_pages); |
| 4834 | ioa_cfg->saved_mode_page_len); | 4802 | ipr_modify_ioafp_mode_page_28(ioa_cfg, mode_pages); |
| 4835 | length = ioa_cfg->saved_mode_page_len; | 4803 | length = mode_pages->hdr.length + 1; |
| 4836 | } else { | 4804 | mode_pages->hdr.length = 0; |
| 4837 | ipr_scsi_bus_speed_limit(ioa_cfg); | ||
| 4838 | ipr_check_term_power(ioa_cfg, mode_pages); | ||
| 4839 | ipr_modify_ioafp_mode_page_28(ioa_cfg, mode_pages); | ||
| 4840 | length = mode_pages->hdr.length + 1; | ||
| 4841 | mode_pages->hdr.length = 0; | ||
| 4842 | } | ||
| 4843 | 4805 | ||
| 4844 | ipr_build_mode_select(ipr_cmd, cpu_to_be32(IPR_IOA_RES_HANDLE), 0x11, | 4806 | ipr_build_mode_select(ipr_cmd, cpu_to_be32(IPR_IOA_RES_HANDLE), 0x11, |
| 4845 | ioa_cfg->vpd_cbs_dma + offsetof(struct ipr_misc_cbs, mode_pages), | 4807 | ioa_cfg->vpd_cbs_dma + offsetof(struct ipr_misc_cbs, mode_pages), |
| @@ -5969,7 +5931,6 @@ static void ipr_free_mem(struct ipr_ioa_cfg *ioa_cfg) | |||
| 5969 | } | 5931 | } |
| 5970 | 5932 | ||
| 5971 | ipr_free_dump(ioa_cfg); | 5933 | ipr_free_dump(ioa_cfg); |
| 5972 | kfree(ioa_cfg->saved_mode_pages); | ||
| 5973 | kfree(ioa_cfg->trace); | 5934 | kfree(ioa_cfg->trace); |
| 5974 | } | 5935 | } |
| 5975 | 5936 | ||
