diff options
Diffstat (limited to 'drivers/scsi/aic94xx/aic94xx_init.c')
-rw-r--r-- | drivers/scsi/aic94xx/aic94xx_init.c | 9 |
1 files changed, 9 insertions, 0 deletions
diff --git a/drivers/scsi/aic94xx/aic94xx_init.c b/drivers/scsi/aic94xx/aic94xx_init.c index 57c5ba4043f2..42302ef05ee5 100644 --- a/drivers/scsi/aic94xx/aic94xx_init.c +++ b/drivers/scsi/aic94xx/aic94xx_init.c | |||
@@ -724,6 +724,15 @@ static void asd_free_queues(struct asd_ha_struct *asd_ha) | |||
724 | 724 | ||
725 | list_for_each_safe(pos, n, &pending) { | 725 | list_for_each_safe(pos, n, &pending) { |
726 | struct asd_ascb *ascb = list_entry(pos, struct asd_ascb, list); | 726 | struct asd_ascb *ascb = list_entry(pos, struct asd_ascb, list); |
727 | /* | ||
728 | * Delete unexpired ascb timers. This may happen if we issue | ||
729 | * a CONTROL PHY scb to an adapter and rmmod before the scb | ||
730 | * times out. Apparently we don't wait for the CONTROL PHY | ||
731 | * to complete, so it doesn't matter if we kill the timer. | ||
732 | */ | ||
733 | del_timer_sync(&ascb->timer); | ||
734 | WARN_ON(ascb->scb->header.opcode != CONTROL_PHY); | ||
735 | |||
727 | list_del_init(pos); | 736 | list_del_init(pos); |
728 | ASD_DPRINTK("freeing from pending\n"); | 737 | ASD_DPRINTK("freeing from pending\n"); |
729 | asd_ascb_free(ascb); | 738 | asd_ascb_free(ascb); |