File tree Expand file tree Collapse file tree 6 files changed +15
-28
lines changed Expand file tree Collapse file tree 6 files changed +15
-28
lines changed Original file line number Diff line number Diff line change @@ -127,8 +127,11 @@ bebob_card_free(struct snd_card *card)
127
127
{
128
128
struct snd_bebob * bebob = card -> private_data ;
129
129
130
+ snd_bebob_stream_destroy_duplex (bebob );
130
131
fw_unit_put (bebob -> unit );
131
132
133
+ kfree (bebob -> maudio_special_quirk );
134
+
132
135
if (bebob -> card_index >= 0 ) {
133
136
mutex_lock (& devices_mutex );
134
137
clear_bit (bebob -> card_index , devices_used );
@@ -314,10 +317,9 @@ static void bebob_remove(struct fw_unit *unit)
314
317
if (bebob == NULL )
315
318
return ;
316
319
317
- kfree (bebob -> maudio_special_quirk );
318
-
319
- snd_bebob_stream_destroy_duplex (bebob );
320
- snd_card_disconnect (bebob -> card );
320
+ /* Awake bus-reset waiters. */
321
+ if (!completion_done (& bebob -> bus_reset ))
322
+ complete_all (& bebob -> bus_reset );
321
323
322
324
/* No need to wait for releasing card object in this context. */
323
325
snd_card_free_when_closed (bebob -> card );
Original file line number Diff line number Diff line change @@ -716,14 +716,10 @@ void snd_bebob_stream_update_duplex(struct snd_bebob *bebob)
716
716
*/
717
717
void snd_bebob_stream_destroy_duplex (struct snd_bebob * bebob )
718
718
{
719
- mutex_lock (& bebob -> mutex );
720
-
721
719
amdtp_stream_destroy (& bebob -> rx_stream );
722
720
amdtp_stream_destroy (& bebob -> tx_stream );
723
721
724
722
destroy_both_connections (bebob );
725
-
726
- mutex_unlock (& bebob -> mutex );
727
723
}
728
724
729
725
/*
Original file line number Diff line number Diff line change @@ -236,6 +236,7 @@ static void dice_card_free(struct snd_card *card)
236
236
{
237
237
struct snd_dice * dice = card -> private_data ;
238
238
239
+ snd_dice_stream_destroy_duplex (dice );
239
240
snd_dice_transaction_destroy (dice );
240
241
fw_unit_put (dice -> unit );
241
242
@@ -313,10 +314,6 @@ static void dice_remove(struct fw_unit *unit)
313
314
{
314
315
struct snd_dice * dice = dev_get_drvdata (& unit -> device );
315
316
316
- snd_card_disconnect (dice -> card );
317
-
318
- snd_dice_stream_destroy_duplex (dice );
319
-
320
317
/* No need to wait for releasing card object in this context. */
321
318
snd_card_free_when_closed (dice -> card );
322
319
}
Original file line number Diff line number Diff line change @@ -184,16 +184,19 @@ efw_card_free(struct snd_card *card)
184
184
{
185
185
struct snd_efw * efw = card -> private_data ;
186
186
187
+ snd_efw_stream_destroy_duplex (efw );
188
+ snd_efw_transaction_remove_instance (efw );
187
189
fw_unit_put (efw -> unit );
188
190
191
+ kfree (efw -> resp_buf );
192
+
189
193
if (efw -> card_index >= 0 ) {
190
194
mutex_lock (& devices_mutex );
191
195
clear_bit (efw -> card_index , devices_used );
192
196
mutex_unlock (& devices_mutex );
193
197
}
194
198
195
199
mutex_destroy (& efw -> mutex );
196
- kfree (efw -> resp_buf );
197
200
}
198
201
199
202
static int
@@ -297,11 +300,6 @@ static void efw_remove(struct fw_unit *unit)
297
300
{
298
301
struct snd_efw * efw = dev_get_drvdata (& unit -> device );
299
302
300
- snd_efw_stream_destroy_duplex (efw );
301
- snd_efw_transaction_remove_instance (efw );
302
-
303
- snd_card_disconnect (efw -> card );
304
-
305
303
/* No need to wait for releasing card object in this context. */
306
304
snd_card_free_when_closed (efw -> card );
307
305
}
Original file line number Diff line number Diff line change @@ -324,12 +324,8 @@ void snd_efw_stream_update_duplex(struct snd_efw *efw)
324
324
325
325
void snd_efw_stream_destroy_duplex (struct snd_efw * efw )
326
326
{
327
- mutex_lock (& efw -> mutex );
328
-
329
327
destroy_stream (efw , & efw -> rx_stream );
330
328
destroy_stream (efw , & efw -> tx_stream );
331
-
332
- mutex_unlock (& efw -> mutex );
333
329
}
334
330
335
331
void snd_efw_stream_lock_changed (struct snd_efw * efw )
Original file line number Diff line number Diff line change @@ -115,6 +115,10 @@ static void oxfw_card_free(struct snd_card *card)
115
115
struct snd_oxfw * oxfw = card -> private_data ;
116
116
unsigned int i ;
117
117
118
+ snd_oxfw_stream_destroy_simplex (oxfw , & oxfw -> rx_stream );
119
+ if (oxfw -> has_output )
120
+ snd_oxfw_stream_destroy_simplex (oxfw , & oxfw -> tx_stream );
121
+
118
122
fw_unit_put (oxfw -> unit );
119
123
120
124
for (i = 0 ; i < SND_OXFW_STREAM_FORMAT_ENTRIES ; i ++ ) {
@@ -220,12 +224,6 @@ static void oxfw_remove(struct fw_unit *unit)
220
224
{
221
225
struct snd_oxfw * oxfw = dev_get_drvdata (& unit -> device );
222
226
223
- snd_card_disconnect (oxfw -> card );
224
-
225
- snd_oxfw_stream_destroy_simplex (oxfw , & oxfw -> rx_stream );
226
- if (oxfw -> has_output )
227
- snd_oxfw_stream_destroy_simplex (oxfw , & oxfw -> tx_stream );
228
-
229
227
/* No need to wait for releasing card object in this context. */
230
228
snd_card_free_when_closed (oxfw -> card );
231
229
}
You can’t perform that action at this time.
0 commit comments