|
@@ -724,6 +724,15 @@ static void asd_free_queues(struct asd_ha_struct *asd_ha)
|
|
|
|
|
|
list_for_each_safe(pos, n, &pending) {
|
|
|
struct asd_ascb *ascb = list_entry(pos, struct asd_ascb, list);
|
|
|
+ /*
|
|
|
+ * Delete unexpired ascb timers. This may happen if we issue
|
|
|
+ * a CONTROL PHY scb to an adapter and rmmod before the scb
|
|
|
+ * times out. Apparently we don't wait for the CONTROL PHY
|
|
|
+ * to complete, so it doesn't matter if we kill the timer.
|
|
|
+ */
|
|
|
+ del_timer_sync(&ascb->timer);
|
|
|
+ WARN_ON(ascb->scb->header.opcode != CONTROL_PHY);
|
|
|
+
|
|
|
list_del_init(pos);
|
|
|
ASD_DPRINTK("freeing from pending\n");
|
|
|
asd_ascb_free(ascb);
|