Source
228
228
req->cmd[4] = cmd_len;
229
229
if (drive->media == ide_tape)
230
230
req->cmd[13] = REQ_IDETAPE_PC1;
231
231
232
232
drive->sense_rq_armed = true;
233
233
}
234
234
EXPORT_SYMBOL_GPL(ide_prep_sense);
235
235
236
236
int ide_queue_sense_rq(ide_drive_t *drive, void *special)
237
237
{
238
-
struct request *sense_rq = drive->sense_rq;
238
+
ide_hwif_t *hwif = drive->hwif;
239
+
struct request *sense_rq;
240
+
unsigned long flags;
241
+
242
+
spin_lock_irqsave(&hwif->lock, flags);
239
243
240
244
/* deferred failure from ide_prep_sense() */
241
245
if (!drive->sense_rq_armed) {
242
246
printk(KERN_WARNING PFX "%s: error queuing a sense request\n",
243
247
drive->name);
248
+
spin_unlock_irqrestore(&hwif->lock, flags);
244
249
return -ENOMEM;
245
250
}
246
251
252
+
sense_rq = drive->sense_rq;
247
253
ide_req(sense_rq)->special = special;
248
254
drive->sense_rq_armed = false;
249
255
250
256
drive->hwif->rq = NULL;
251
257
252
258
ide_insert_request_head(drive, sense_rq);
259
+
spin_unlock_irqrestore(&hwif->lock, flags);
253
260
return 0;
254
261
}
255
262
EXPORT_SYMBOL_GPL(ide_queue_sense_rq);
256
263
257
264
/*
258
265
* Called when an error was detected during the last packet command.
259
266
* We queue a request sense packet command at the head of the request
260
267
* queue.
261
268
*/
262
269
void ide_retry_pc(ide_drive_t *drive)