@@ -536,8 +536,10 @@ ahd_linux_unmap_scb(struct ahd_softc *ahd, struct scb *scb)
536
536
struct scsi_cmnd * cmd ;
537
537
538
538
cmd = scb -> io_ctx ;
539
- ahd_sync_sglist (ahd , scb , BUS_DMASYNC_POSTWRITE );
540
- scsi_dma_unmap (cmd );
539
+ if (cmd ) {
540
+ ahd_sync_sglist (ahd , scb , BUS_DMASYNC_POSTWRITE );
541
+ scsi_dma_unmap (cmd );
542
+ }
541
543
}
542
544
543
545
/******************************** Macros **************************************/
@@ -814,7 +816,7 @@ ahd_linux_dev_reset(struct scsi_cmnd *cmd)
814
816
815
817
tinfo = ahd_fetch_transinfo (ahd , 'A' , ahd -> our_id ,
816
818
cmd -> device -> id , & tstate );
817
- reset_scb -> io_ctx = cmd ;
819
+ reset_scb -> io_ctx = NULL ;
818
820
reset_scb -> platform_data -> dev = dev ;
819
821
reset_scb -> sg_count = 0 ;
820
822
ahd_set_residual (reset_scb , 0 );
@@ -1769,9 +1771,16 @@ ahd_done(struct ahd_softc *ahd, struct scb *scb)
1769
1771
dev = scb -> platform_data -> dev ;
1770
1772
dev -> active -- ;
1771
1773
dev -> openings ++ ;
1772
- if ((cmd -> result & (CAM_DEV_QFRZN << 16 )) != 0 ) {
1773
- cmd -> result &= ~(CAM_DEV_QFRZN << 16 );
1774
- dev -> qfrozen -- ;
1774
+ if (cmd ) {
1775
+ if ((cmd -> result & (CAM_DEV_QFRZN << 16 )) != 0 ) {
1776
+ cmd -> result &= ~(CAM_DEV_QFRZN << 16 );
1777
+ dev -> qfrozen -- ;
1778
+ }
1779
+ } else if (scb -> flags & SCB_DEVICE_RESET ) {
1780
+ if (ahd -> platform_data -> eh_done )
1781
+ complete (ahd -> platform_data -> eh_done );
1782
+ ahd_free_scb (ahd , scb );
1783
+ return ;
1775
1784
}
1776
1785
ahd_linux_unmap_scb (ahd , scb );
1777
1786
0 commit comments