aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--drivers/scsi/megaraid.c120
-rw-r--r--drivers/scsi/megaraid.h3
-rw-r--r--drivers/scsi/scsi.c56
-rw-r--r--include/scsi/scsi_cmnd.h3
4 files changed, 32 insertions, 150 deletions
diff --git a/drivers/scsi/megaraid.c b/drivers/scsi/megaraid.c
index 816db12ef5d5..b7770516f4c2 100644
--- a/drivers/scsi/megaraid.c
+++ b/drivers/scsi/megaraid.c
@@ -531,13 +531,6 @@ mega_build_cmd(adapter_t *adapter, Scsi_Cmnd *cmd, int *busy)
531 int target = 0; 531 int target = 0;
532 int ldrv_num = 0; /* logical drive number */ 532 int ldrv_num = 0; /* logical drive number */
533 533
534
535 /*
536 * filter the internal and ioctl commands
537 */
538 if((cmd->cmnd[0] == MEGA_INTERNAL_CMD))
539 return (scb_t *)cmd->host_scribble;
540
541 /* 534 /*
542 * We know what channels our logical drives are on - mega_find_card() 535 * We know what channels our logical drives are on - mega_find_card()
543 */ 536 */
@@ -1439,19 +1432,22 @@ mega_cmd_done(adapter_t *adapter, u8 completed[], int nstatus, int status)
1439 1432
1440 cmdid = completed[i]; 1433 cmdid = completed[i];
1441 1434
1442 if( cmdid == CMDID_INT_CMDS ) { /* internal command */ 1435 /*
1436 * Only free SCBs for the commands coming down from the
1437 * mid-layer, not for which were issued internally
1438 *
1439 * For internal command, restore the status returned by the
1440 * firmware so that user can interpret it.
1441 */
1442 if (cmdid == CMDID_INT_CMDS) {
1443 scb = &adapter->int_scb; 1443 scb = &adapter->int_scb;
1444 cmd = scb->cmd;
1445 mbox = (mbox_t *)scb->raw_mbox;
1446 1444
1447 /* 1445 list_del_init(&scb->list);
1448 * Internal command interface do not fire the extended 1446 scb->state = SCB_FREE;
1449 * passthru or 64-bit passthru
1450 */
1451 pthru = scb->pthru;
1452 1447
1453 } 1448 adapter->int_status = status;
1454 else { 1449 complete(&adapter->int_waitq);
1450 } else {
1455 scb = &adapter->scb_list[cmdid]; 1451 scb = &adapter->scb_list[cmdid];
1456 1452
1457 /* 1453 /*
@@ -1640,25 +1636,7 @@ mega_cmd_done(adapter_t *adapter, u8 completed[], int nstatus, int status)
1640 cmd->result |= (DID_BAD_TARGET << 16)|status; 1636 cmd->result |= (DID_BAD_TARGET << 16)|status;
1641 } 1637 }
1642 1638
1643 /* 1639 mega_free_scb(adapter, scb);
1644 * Only free SCBs for the commands coming down from the
1645 * mid-layer, not for which were issued internally
1646 *
1647 * For internal command, restore the status returned by the
1648 * firmware so that user can interpret it.
1649 */
1650 if( cmdid == CMDID_INT_CMDS ) { /* internal command */
1651 cmd->result = status;
1652
1653 /*
1654 * Remove the internal command from the pending list
1655 */
1656 list_del_init(&scb->list);
1657 scb->state = SCB_FREE;
1658 }
1659 else {
1660 mega_free_scb(adapter, scb);
1661 }
1662 1640
1663 /* Add Scsi_Command to end of completed queue */ 1641 /* Add Scsi_Command to end of completed queue */
1664 list_add_tail(SCSI_LIST(cmd), &adapter->completed_list); 1642 list_add_tail(SCSI_LIST(cmd), &adapter->completed_list);
@@ -4133,23 +4111,15 @@ mega_internal_dev_inquiry(adapter_t *adapter, u8 ch, u8 tgt,
4133 * The last argument is the address of the passthru structure if the command 4111 * The last argument is the address of the passthru structure if the command
4134 * to be fired is a passthru command 4112 * to be fired is a passthru command
4135 * 4113 *
4136 * lockscope specifies whether the caller has already acquired the lock. Of
4137 * course, the caller must know which lock we are talking about.
4138 *
4139 * Note: parameter 'pthru' is null for non-passthru commands. 4114 * Note: parameter 'pthru' is null for non-passthru commands.
4140 */ 4115 */
4141static int 4116static int
4142mega_internal_command(adapter_t *adapter, megacmd_t *mc, mega_passthru *pthru) 4117mega_internal_command(adapter_t *adapter, megacmd_t *mc, mega_passthru *pthru)
4143{ 4118{
4144 Scsi_Cmnd *scmd; 4119 unsigned long flags;
4145 struct scsi_device *sdev;
4146 scb_t *scb; 4120 scb_t *scb;
4147 int rval; 4121 int rval;
4148 4122
4149 scmd = scsi_allocate_command(GFP_KERNEL);
4150 if (!scmd)
4151 return -ENOMEM;
4152
4153 /* 4123 /*
4154 * The internal commands share one command id and hence are 4124 * The internal commands share one command id and hence are
4155 * serialized. This is so because we want to reserve maximum number of 4125 * serialized. This is so because we want to reserve maximum number of
@@ -4160,73 +4130,45 @@ mega_internal_command(adapter_t *adapter, megacmd_t *mc, mega_passthru *pthru)
4160 scb = &adapter->int_scb; 4130 scb = &adapter->int_scb;
4161 memset(scb, 0, sizeof(scb_t)); 4131 memset(scb, 0, sizeof(scb_t));
4162 4132
4163 sdev = kzalloc(sizeof(struct scsi_device), GFP_KERNEL); 4133 scb->idx = CMDID_INT_CMDS;
4164 scmd->device = sdev; 4134 scb->state |= SCB_ACTIVE | SCB_PENDQ;
4165
4166 memset(adapter->int_cdb, 0, sizeof(adapter->int_cdb));
4167 scmd->cmnd = adapter->int_cdb;
4168 scmd->device->host = adapter->host;
4169 scmd->host_scribble = (void *)scb;
4170 scmd->cmnd[0] = MEGA_INTERNAL_CMD;
4171
4172 scb->state |= SCB_ACTIVE;
4173 scb->cmd = scmd;
4174 4135
4175 memcpy(scb->raw_mbox, mc, sizeof(megacmd_t)); 4136 memcpy(scb->raw_mbox, mc, sizeof(megacmd_t));
4176 4137
4177 /* 4138 /*
4178 * Is it a passthru command 4139 * Is it a passthru command
4179 */ 4140 */
4180 if( mc->cmd == MEGA_MBOXCMD_PASSTHRU ) { 4141 if (mc->cmd == MEGA_MBOXCMD_PASSTHRU)
4181
4182 scb->pthru = pthru; 4142 scb->pthru = pthru;
4183 }
4184
4185 scb->idx = CMDID_INT_CMDS;
4186 4143
4187 megaraid_queue_lck(scmd, mega_internal_done); 4144 spin_lock_irqsave(&adapter->lock, flags);
4145 list_add_tail(&scb->list, &adapter->pending_list);
4146 /*
4147 * Check if the HBA is in quiescent state, e.g., during a
4148 * delete logical drive opertion. If it is, don't run
4149 * the pending_list.
4150 */
4151 if (atomic_read(&adapter->quiescent) == 0)
4152 mega_runpendq(adapter);
4153 spin_unlock_irqrestore(&adapter->lock, flags);
4188 4154
4189 wait_for_completion(&adapter->int_waitq); 4155 wait_for_completion(&adapter->int_waitq);
4190 4156
4191 rval = scmd->result; 4157 mc->status = rval = adapter->int_status;
4192 mc->status = scmd->result;
4193 kfree(sdev);
4194 4158
4195 /* 4159 /*
4196 * Print a debug message for all failed commands. Applications can use 4160 * Print a debug message for all failed commands. Applications can use
4197 * this information. 4161 * this information.
4198 */ 4162 */
4199 if( scmd->result && trace_level ) { 4163 if (rval && trace_level) {
4200 printk("megaraid: cmd [%x, %x, %x] status:[%x]\n", 4164 printk("megaraid: cmd [%x, %x, %x] status:[%x]\n",
4201 mc->cmd, mc->opcode, mc->subopcode, scmd->result); 4165 mc->cmd, mc->opcode, mc->subopcode, rval);
4202 } 4166 }
4203 4167
4204 mutex_unlock(&adapter->int_mtx); 4168 mutex_unlock(&adapter->int_mtx);
4205
4206 scsi_free_command(GFP_KERNEL, scmd);
4207
4208 return rval; 4169 return rval;
4209} 4170}
4210 4171
4211
4212/**
4213 * mega_internal_done()
4214 * @scmd - internal scsi command
4215 *
4216 * Callback routine for internal commands.
4217 */
4218static void
4219mega_internal_done(Scsi_Cmnd *scmd)
4220{
4221 adapter_t *adapter;
4222
4223 adapter = (adapter_t *)scmd->device->host->hostdata;
4224
4225 complete(&adapter->int_waitq);
4226
4227}
4228
4229
4230static struct scsi_host_template megaraid_template = { 4172static struct scsi_host_template megaraid_template = {
4231 .module = THIS_MODULE, 4173 .module = THIS_MODULE,
4232 .name = "MegaRAID", 4174 .name = "MegaRAID",
diff --git a/drivers/scsi/megaraid.h b/drivers/scsi/megaraid.h
index 4d0ce4e78dfd..508d65e5a518 100644
--- a/drivers/scsi/megaraid.h
+++ b/drivers/scsi/megaraid.h
@@ -853,10 +853,10 @@ typedef struct {
853 853
854 u8 sglen; /* f/w supported scatter-gather list length */ 854 u8 sglen; /* f/w supported scatter-gather list length */
855 855
856 unsigned char int_cdb[MAX_COMMAND_SIZE];
857 scb_t int_scb; 856 scb_t int_scb;
858 struct mutex int_mtx; /* To synchronize the internal 857 struct mutex int_mtx; /* To synchronize the internal
859 commands */ 858 commands */
859 int int_status; /* status of internal cmd */
860 struct completion int_waitq; /* wait queue for internal 860 struct completion int_waitq; /* wait queue for internal
861 cmds */ 861 cmds */
862 862
@@ -1004,7 +1004,6 @@ static int mega_del_logdrv(adapter_t *, int);
1004static int mega_do_del_logdrv(adapter_t *, int); 1004static int mega_do_del_logdrv(adapter_t *, int);
1005static void mega_get_max_sgl(adapter_t *); 1005static void mega_get_max_sgl(adapter_t *);
1006static int mega_internal_command(adapter_t *, megacmd_t *, mega_passthru *); 1006static int mega_internal_command(adapter_t *, megacmd_t *, mega_passthru *);
1007static void mega_internal_done(Scsi_Cmnd *);
1008static int mega_support_cluster(adapter_t *); 1007static int mega_support_cluster(adapter_t *);
1009#endif 1008#endif
1010 1009
diff --git a/drivers/scsi/scsi.c b/drivers/scsi/scsi.c
index 1d98ac960887..c4dd0bfc663a 100644
--- a/drivers/scsi/scsi.c
+++ b/drivers/scsi/scsi.c
@@ -403,62 +403,6 @@ static void scsi_put_host_cmd_pool(gfp_t gfp_mask)
403} 403}
404 404
405/** 405/**
406 * scsi_allocate_command - get a fully allocated SCSI command
407 * @gfp_mask: allocation mask
408 *
409 * This function is for use outside of the normal host based pools.
410 * It allocates the relevant command and takes an additional reference
411 * on the pool it used. This function *must* be paired with
412 * scsi_free_command which also has the identical mask, otherwise the
413 * free pool counts will eventually go wrong and you'll trigger a bug.
414 *
415 * This function should *only* be used by drivers that need a static
416 * command allocation at start of day for internal functions.
417 */
418struct scsi_cmnd *scsi_allocate_command(gfp_t gfp_mask)
419{
420 struct scsi_host_cmd_pool *pool = scsi_get_host_cmd_pool(gfp_mask);
421
422 if (!pool)
423 return NULL;
424
425 return scsi_pool_alloc_command(pool, gfp_mask);
426}
427EXPORT_SYMBOL(scsi_allocate_command);
428
429/**
430 * scsi_free_command - free a command allocated by scsi_allocate_command
431 * @gfp_mask: mask used in the original allocation
432 * @cmd: command to free
433 *
434 * Note: using the original allocation mask is vital because that's
435 * what determines which command pool we use to free the command. Any
436 * mismatch will cause the system to BUG eventually.
437 */
438void scsi_free_command(gfp_t gfp_mask, struct scsi_cmnd *cmd)
439{
440 struct scsi_host_cmd_pool *pool = scsi_get_host_cmd_pool(gfp_mask);
441
442 /*
443 * this could trigger if the mask to scsi_allocate_command
444 * doesn't match this mask. Otherwise we're guaranteed that this
445 * succeeds because scsi_allocate_command must have taken a reference
446 * on the pool
447 */
448 BUG_ON(!pool);
449
450 scsi_pool_free_command(pool, cmd);
451 /*
452 * scsi_put_host_cmd_pool is called twice; once to release the
453 * reference we took above, and once to release the reference
454 * originally taken by scsi_allocate_command
455 */
456 scsi_put_host_cmd_pool(gfp_mask);
457 scsi_put_host_cmd_pool(gfp_mask);
458}
459EXPORT_SYMBOL(scsi_free_command);
460
461/**
462 * scsi_setup_command_freelist - Setup the command freelist for a scsi host. 406 * scsi_setup_command_freelist - Setup the command freelist for a scsi host.
463 * @shost: host to allocate the freelist for. 407 * @shost: host to allocate the freelist for.
464 * 408 *
diff --git a/include/scsi/scsi_cmnd.h b/include/scsi/scsi_cmnd.h
index 414edf9b1272..dd7c998221b3 100644
--- a/include/scsi/scsi_cmnd.h
+++ b/include/scsi/scsi_cmnd.h
@@ -155,9 +155,6 @@ extern void scsi_release_buffers(struct scsi_cmnd *cmd);
155extern int scsi_dma_map(struct scsi_cmnd *cmd); 155extern int scsi_dma_map(struct scsi_cmnd *cmd);
156extern void scsi_dma_unmap(struct scsi_cmnd *cmd); 156extern void scsi_dma_unmap(struct scsi_cmnd *cmd);
157 157
158struct scsi_cmnd *scsi_allocate_command(gfp_t gfp_mask);
159void scsi_free_command(gfp_t gfp_mask, struct scsi_cmnd *cmd);
160
161static inline unsigned scsi_sg_count(struct scsi_cmnd *cmd) 158static inline unsigned scsi_sg_count(struct scsi_cmnd *cmd)
162{ 159{
163 return cmd->sdb.table.nents; 160 return cmd->sdb.table.nents;