@@ -280,6 +280,82 @@ static void scsiback_free_translation_entry(struct kref *kref)
280280 kfree (entry );
281281}
282282
283+ static int32_t scsiback_result (int32_t result )
284+ {
285+ int32_t host_status ;
286+
287+ switch (XEN_VSCSIIF_RSLT_HOST (result )) {
288+ case DID_OK :
289+ host_status = XEN_VSCSIIF_RSLT_HOST_OK ;
290+ break ;
291+ case DID_NO_CONNECT :
292+ host_status = XEN_VSCSIIF_RSLT_HOST_NO_CONNECT ;
293+ break ;
294+ case DID_BUS_BUSY :
295+ host_status = XEN_VSCSIIF_RSLT_HOST_BUS_BUSY ;
296+ break ;
297+ case DID_TIME_OUT :
298+ host_status = XEN_VSCSIIF_RSLT_HOST_TIME_OUT ;
299+ break ;
300+ case DID_BAD_TARGET :
301+ host_status = XEN_VSCSIIF_RSLT_HOST_BAD_TARGET ;
302+ break ;
303+ case DID_ABORT :
304+ host_status = XEN_VSCSIIF_RSLT_HOST_ABORT ;
305+ break ;
306+ case DID_PARITY :
307+ host_status = XEN_VSCSIIF_RSLT_HOST_PARITY ;
308+ break ;
309+ case DID_ERROR :
310+ host_status = XEN_VSCSIIF_RSLT_HOST_ERROR ;
311+ break ;
312+ case DID_RESET :
313+ host_status = XEN_VSCSIIF_RSLT_HOST_RESET ;
314+ break ;
315+ case DID_BAD_INTR :
316+ host_status = XEN_VSCSIIF_RSLT_HOST_BAD_INTR ;
317+ break ;
318+ case DID_PASSTHROUGH :
319+ host_status = XEN_VSCSIIF_RSLT_HOST_PASSTHROUGH ;
320+ break ;
321+ case DID_SOFT_ERROR :
322+ host_status = XEN_VSCSIIF_RSLT_HOST_SOFT_ERROR ;
323+ break ;
324+ case DID_IMM_RETRY :
325+ host_status = XEN_VSCSIIF_RSLT_HOST_IMM_RETRY ;
326+ break ;
327+ case DID_REQUEUE :
328+ host_status = XEN_VSCSIIF_RSLT_HOST_REQUEUE ;
329+ break ;
330+ case DID_TRANSPORT_DISRUPTED :
331+ host_status = XEN_VSCSIIF_RSLT_HOST_TRANSPORT_DISRUPTED ;
332+ break ;
333+ case DID_TRANSPORT_FAILFAST :
334+ host_status = XEN_VSCSIIF_RSLT_HOST_TRANSPORT_FAILFAST ;
335+ break ;
336+ case DID_TARGET_FAILURE :
337+ host_status = XEN_VSCSIIF_RSLT_HOST_TARGET_FAILURE ;
338+ break ;
339+ case DID_NEXUS_FAILURE :
340+ host_status = XEN_VSCSIIF_RSLT_HOST_NEXUS_FAILURE ;
341+ break ;
342+ case DID_ALLOC_FAILURE :
343+ host_status = XEN_VSCSIIF_RSLT_HOST_ALLOC_FAILURE ;
344+ break ;
345+ case DID_MEDIUM_ERROR :
346+ host_status = XEN_VSCSIIF_RSLT_HOST_MEDIUM_ERROR ;
347+ break ;
348+ case DID_TRANSPORT_MARGINAL :
349+ host_status = XEN_VSCSIIF_RSLT_HOST_TRANSPORT_MARGINAL ;
350+ break ;
351+ default :
352+ host_status = XEN_VSCSIIF_RSLT_HOST_ERROR ;
353+ break ;
354+ }
355+
356+ return (host_status << 16 ) | (result & 0x00ffff );
357+ }
358+
283359static void scsiback_send_response (struct vscsibk_info * info ,
284360 char * sense_buffer , int32_t result , uint32_t resid ,
285361 uint16_t rqid )
@@ -295,7 +371,7 @@ static void scsiback_send_response(struct vscsibk_info *info,
295371 ring_res = RING_GET_RESPONSE (& info -> ring , info -> ring .rsp_prod_pvt );
296372 info -> ring .rsp_prod_pvt ++ ;
297373
298- ring_res -> rslt = result ;
374+ ring_res -> rslt = scsiback_result ( result ) ;
299375 ring_res -> rqid = rqid ;
300376
301377 if (sense_buffer != NULL &&
@@ -555,7 +631,7 @@ static void scsiback_device_action(struct vscsibk_pend *pending_req,
555631 struct scsiback_nexus * nexus = tpg -> tpg_nexus ;
556632 struct se_cmd * se_cmd = & pending_req -> se_cmd ;
557633 u64 unpacked_lun = pending_req -> v2p -> lun ;
558- int rc , err = FAILED ;
634+ int rc , err = XEN_VSCSIIF_RSLT_RESET_FAILED ;
559635
560636 init_completion (& pending_req -> tmr_done );
561637
@@ -569,7 +645,7 @@ static void scsiback_device_action(struct vscsibk_pend *pending_req,
569645 wait_for_completion (& pending_req -> tmr_done );
570646
571647 err = (se_cmd -> se_tmr_req -> response == TMR_FUNCTION_COMPLETE ) ?
572- SUCCESS : FAILED ;
648+ XEN_VSCSIIF_RSLT_RESET_SUCCESS : XEN_VSCSIIF_RSLT_RESET_FAILED ;
573649
574650 scsiback_do_resp_with_sense (NULL , err , 0 , pending_req );
575651 transport_generic_free_cmd (& pending_req -> se_cmd , 0 );
0 commit comments