@@ -243,14 +243,63 @@ static void scsifront_gnttab_done(struct vscsifrnt_info *info,
243243 kfree (shadow -> sg );
244244}
245245
246+ static unsigned int scsifront_host_byte (int32_t rslt )
247+ {
248+ switch (XEN_VSCSIIF_RSLT_HOST (rslt )) {
249+ case XEN_VSCSIIF_RSLT_HOST_OK :
250+ return DID_OK ;
251+ case XEN_VSCSIIF_RSLT_HOST_NO_CONNECT :
252+ return DID_NO_CONNECT ;
253+ case XEN_VSCSIIF_RSLT_HOST_BUS_BUSY :
254+ return DID_BUS_BUSY ;
255+ case XEN_VSCSIIF_RSLT_HOST_TIME_OUT :
256+ return DID_TIME_OUT ;
257+ case XEN_VSCSIIF_RSLT_HOST_BAD_TARGET :
258+ return DID_BAD_TARGET ;
259+ case XEN_VSCSIIF_RSLT_HOST_ABORT :
260+ return DID_ABORT ;
261+ case XEN_VSCSIIF_RSLT_HOST_PARITY :
262+ return DID_PARITY ;
263+ case XEN_VSCSIIF_RSLT_HOST_ERROR :
264+ return DID_ERROR ;
265+ case XEN_VSCSIIF_RSLT_HOST_RESET :
266+ return DID_RESET ;
267+ case XEN_VSCSIIF_RSLT_HOST_BAD_INTR :
268+ return DID_BAD_INTR ;
269+ case XEN_VSCSIIF_RSLT_HOST_PASSTHROUGH :
270+ return DID_PASSTHROUGH ;
271+ case XEN_VSCSIIF_RSLT_HOST_SOFT_ERROR :
272+ return DID_SOFT_ERROR ;
273+ case XEN_VSCSIIF_RSLT_HOST_IMM_RETRY :
274+ return DID_IMM_RETRY ;
275+ case XEN_VSCSIIF_RSLT_HOST_REQUEUE :
276+ return DID_REQUEUE ;
277+ case XEN_VSCSIIF_RSLT_HOST_TRANSPORT_DISRUPTED :
278+ return DID_TRANSPORT_DISRUPTED ;
279+ case XEN_VSCSIIF_RSLT_HOST_TRANSPORT_FAILFAST :
280+ return DID_TRANSPORT_FAILFAST ;
281+ case XEN_VSCSIIF_RSLT_HOST_TARGET_FAILURE :
282+ return DID_TARGET_FAILURE ;
283+ case XEN_VSCSIIF_RSLT_HOST_NEXUS_FAILURE :
284+ return DID_NEXUS_FAILURE ;
285+ case XEN_VSCSIIF_RSLT_HOST_ALLOC_FAILURE :
286+ return DID_ALLOC_FAILURE ;
287+ case XEN_VSCSIIF_RSLT_HOST_MEDIUM_ERROR :
288+ return DID_MEDIUM_ERROR ;
289+ case XEN_VSCSIIF_RSLT_HOST_TRANSPORT_MARGINAL :
290+ return DID_TRANSPORT_MARGINAL ;
291+ default :
292+ return DID_ERROR ;
293+ }
294+ }
295+
246296static void scsifront_cdb_cmd_done (struct vscsifrnt_info * info ,
247297 struct vscsiif_response * ring_rsp )
248298{
249299 struct vscsifrnt_shadow * shadow ;
250300 struct scsi_cmnd * sc ;
251301 uint32_t id ;
252302 uint8_t sense_len ;
253- int result ;
254303
255304 id = ring_rsp -> rqid ;
256305 shadow = info -> shadow [id ];
@@ -261,12 +310,8 @@ static void scsifront_cdb_cmd_done(struct vscsifrnt_info *info,
261310 scsifront_gnttab_done (info , shadow );
262311 scsifront_put_rqid (info , id );
263312
264- result = ring_rsp -> rslt ;
265- if (result >> 24 )
266- set_host_byte (sc , DID_ERROR );
267- else
268- set_host_byte (sc , host_byte (result ));
269- set_status_byte (sc , result & 0xff );
313+ set_host_byte (sc , scsifront_host_byte (ring_rsp -> rslt ));
314+ set_status_byte (sc , XEN_VSCSIIF_RSLT_STATUS (ring_rsp -> rslt ));
270315 scsi_set_resid (sc , ring_rsp -> residual_len );
271316
272317 sense_len = min_t (uint8_t , VSCSIIF_SENSE_BUFFERSIZE ,
@@ -290,7 +335,10 @@ static void scsifront_sync_cmd_done(struct vscsifrnt_info *info,
290335 shadow -> wait_reset = 1 ;
291336 switch (shadow -> rslt_reset ) {
292337 case RSLT_RESET_WAITING :
293- shadow -> rslt_reset = ring_rsp -> rslt ;
338+ if (ring_rsp -> rslt == XEN_VSCSIIF_RSLT_RESET_SUCCESS )
339+ shadow -> rslt_reset = SUCCESS ;
340+ else
341+ shadow -> rslt_reset = FAILED ;
294342 break ;
295343 case RSLT_RESET_ERR :
296344 kick = _scsifront_put_rqid (info , id );
0 commit comments