|
@@ -362,6 +362,7 @@ megaraid_queue(Scsi_Cmnd *scmd, void (*done)(Scsi_Cmnd *))
|
|
|
adapter_t *adapter;
|
|
|
scb_t *scb;
|
|
|
int busy=0;
|
|
|
+ unsigned long flags;
|
|
|
|
|
|
adapter = (adapter_t *)scmd->device->host->hostdata;
|
|
|
|
|
@@ -377,6 +378,7 @@ megaraid_queue(Scsi_Cmnd *scmd, void (*done)(Scsi_Cmnd *))
|
|
|
* return 0 in that case.
|
|
|
*/
|
|
|
|
|
|
+ spin_lock_irqsave(&adapter->lock, flags);
|
|
|
scb = mega_build_cmd(adapter, scmd, &busy);
|
|
|
|
|
|
if(scb) {
|
|
@@ -393,6 +395,7 @@ megaraid_queue(Scsi_Cmnd *scmd, void (*done)(Scsi_Cmnd *))
|
|
|
}
|
|
|
return 0;
|
|
|
}
|
|
|
+ spin_unlock_irqrestore(&adapter->lock, flags);
|
|
|
|
|
|
return busy;
|
|
|
}
|
|
@@ -1981,7 +1984,7 @@ megaraid_reset(struct scsi_cmnd *cmd)
|
|
|
mc.cmd = MEGA_CLUSTER_CMD;
|
|
|
mc.opcode = MEGA_RESET_RESERVATIONS;
|
|
|
|
|
|
- if( mega_internal_command(adapter, LOCK_INT, &mc, NULL) != 0 ) {
|
|
|
+ if( mega_internal_command(adapter, &mc, NULL) != 0 ) {
|
|
|
printk(KERN_WARNING
|
|
|
"megaraid: reservation reset failed.\n");
|
|
|
}
|
|
@@ -3011,7 +3014,7 @@ proc_rdrv(adapter_t *adapter, char *page, int start, int end )
|
|
|
mc.cmd = FC_NEW_CONFIG;
|
|
|
mc.opcode = OP_DCMD_READ_CONFIG;
|
|
|
|
|
|
- if( mega_internal_command(adapter, LOCK_INT, &mc, NULL) ) {
|
|
|
+ if( mega_internal_command(adapter, &mc, NULL) ) {
|
|
|
|
|
|
len = sprintf(page, "40LD read config failed.\n");
|
|
|
|
|
@@ -3029,11 +3032,11 @@ proc_rdrv(adapter_t *adapter, char *page, int start, int end )
|
|
|
else {
|
|
|
mc.cmd = NEW_READ_CONFIG_8LD;
|
|
|
|
|
|
- if( mega_internal_command(adapter, LOCK_INT, &mc, NULL) ) {
|
|
|
+ if( mega_internal_command(adapter, &mc, NULL) ) {
|
|
|
|
|
|
mc.cmd = READ_CONFIG_8LD;
|
|
|
|
|
|
- if( mega_internal_command(adapter, LOCK_INT, &mc,
|
|
|
+ if( mega_internal_command(adapter, &mc,
|
|
|
NULL) ){
|
|
|
|
|
|
len = sprintf(page,
|
|
@@ -3632,7 +3635,7 @@ megadev_ioctl(struct inode *inode, struct file *filep, unsigned int cmd,
|
|
|
/*
|
|
|
* Issue the command
|
|
|
*/
|
|
|
- mega_internal_command(adapter, LOCK_INT, &mc, pthru);
|
|
|
+ mega_internal_command(adapter, &mc, pthru);
|
|
|
|
|
|
rval = mega_n_to_m((void __user *)arg, &mc);
|
|
|
|
|
@@ -3715,7 +3718,7 @@ freemem_and_return:
|
|
|
/*
|
|
|
* Issue the command
|
|
|
*/
|
|
|
- mega_internal_command(adapter, LOCK_INT, &mc, NULL);
|
|
|
+ mega_internal_command(adapter, &mc, NULL);
|
|
|
|
|
|
rval = mega_n_to_m((void __user *)arg, &mc);
|
|
|
|
|
@@ -4234,7 +4237,7 @@ mega_do_del_logdrv(adapter_t *adapter, int logdrv)
|
|
|
mc.opcode = OP_DEL_LOGDRV;
|
|
|
mc.subopcode = logdrv;
|
|
|
|
|
|
- rval = mega_internal_command(adapter, LOCK_INT, &mc, NULL);
|
|
|
+ rval = mega_internal_command(adapter, &mc, NULL);
|
|
|
|
|
|
/* log this event */
|
|
|
if(rval) {
|
|
@@ -4367,7 +4370,7 @@ mega_adapinq(adapter_t *adapter, dma_addr_t dma_handle)
|
|
|
|
|
|
mc.xferaddr = (u32)dma_handle;
|
|
|
|
|
|
- if ( mega_internal_command(adapter, LOCK_INT, &mc, NULL) != 0 ) {
|
|
|
+ if ( mega_internal_command(adapter, &mc, NULL) != 0 ) {
|
|
|
return -1;
|
|
|
}
|
|
|
|
|
@@ -4435,7 +4438,7 @@ mega_internal_dev_inquiry(adapter_t *adapter, u8 ch, u8 tgt,
|
|
|
mc.cmd = MEGA_MBOXCMD_PASSTHRU;
|
|
|
mc.xferaddr = (u32)pthru_dma_handle;
|
|
|
|
|
|
- rval = mega_internal_command(adapter, LOCK_INT, &mc, pthru);
|
|
|
+ rval = mega_internal_command(adapter, &mc, pthru);
|
|
|
|
|
|
pci_free_consistent(pdev, sizeof(mega_passthru), pthru,
|
|
|
pthru_dma_handle);
|
|
@@ -4449,7 +4452,6 @@ mega_internal_dev_inquiry(adapter_t *adapter, u8 ch, u8 tgt,
|
|
|
/**
|
|
|
* mega_internal_command()
|
|
|
* @adapter - pointer to our soft state
|
|
|
- * @ls - the scope of the exclusion lock.
|
|
|
* @mc - the mailbox command
|
|
|
* @pthru - Passthru structure for DCDB commands
|
|
|
*
|
|
@@ -4463,8 +4465,7 @@ mega_internal_dev_inquiry(adapter_t *adapter, u8 ch, u8 tgt,
|
|
|
* Note: parameter 'pthru' is null for non-passthru commands.
|
|
|
*/
|
|
|
static int
|
|
|
-mega_internal_command(adapter_t *adapter, lockscope_t ls, megacmd_t *mc,
|
|
|
- mega_passthru *pthru )
|
|
|
+mega_internal_command(adapter_t *adapter, megacmd_t *mc, mega_passthru *pthru)
|
|
|
{
|
|
|
Scsi_Cmnd *scmd;
|
|
|
struct scsi_device *sdev;
|
|
@@ -4508,15 +4509,8 @@ mega_internal_command(adapter_t *adapter, lockscope_t ls, megacmd_t *mc,
|
|
|
|
|
|
scb->idx = CMDID_INT_CMDS;
|
|
|
|
|
|
- /*
|
|
|
- * Get the lock only if the caller has not acquired it already
|
|
|
- */
|
|
|
- if( ls == LOCK_INT ) spin_lock_irqsave(&adapter->lock, flags);
|
|
|
-
|
|
|
megaraid_queue(scmd, mega_internal_done);
|
|
|
|
|
|
- if( ls == LOCK_INT ) spin_unlock_irqrestore(&adapter->lock, flags);
|
|
|
-
|
|
|
wait_for_completion(&adapter->int_waitq);
|
|
|
|
|
|
rval = scmd->result;
|