Skip to content

Commit

Permalink
---
Browse files Browse the repository at this point in the history
yaml
---
r: 147083
b: refs/heads/master
c: 72f9f13
h: refs/heads/master
i:
  147081: 2f93024
  147079: 28c46cf
v: v3
  • Loading branch information
scameron@beardog.cca.cpqcorp.net authored and Jens Axboe committed Jun 9, 2009
1 parent ef5d62c commit 0a7def4
Show file tree
Hide file tree
Showing 3 changed files with 4 additions and 105 deletions.
2 changes: 1 addition & 1 deletion [refs]
Original file line number Diff line number Diff line change
@@ -1,2 +1,2 @@
---
refs/heads/master: 85cc61ae41084cb6d8ecc6c9e01ac4563005c8ac
refs/heads/master: 72f9f1324fc4cd450c92e4600a710231b0445c75
98 changes: 3 additions & 95 deletions trunk/drivers/block/cciss.c
Original file line number Diff line number Diff line change
Expand Up @@ -2612,51 +2612,6 @@ static unsigned long pollcomplete(int ctlr)
return 1;
}

static int add_sendcmd_reject(__u8 cmd, int ctlr, unsigned long complete)
{
/* We get in here if sendcmd() is polling for completions
and gets some command back that it wasn't expecting --
something other than that which it just sent down.
Ordinarily, that shouldn't happen, but it can happen when
the scsi tape stuff gets into error handling mode, and
starts using sendcmd() to try to abort commands and
reset tape drives. In that case, sendcmd may pick up
completions of commands that were sent to logical drives
through the block i/o system, or cciss ioctls completing, etc.
In that case, we need to save those completions for later
processing by the interrupt handler.
*/

#ifdef CONFIG_CISS_SCSI_TAPE
struct sendcmd_reject_list *srl = &hba[ctlr]->scsi_rejects;

/* If it's not the scsi tape stuff doing error handling, (abort */
/* or reset) then we don't expect anything weird. */
if (cmd != CCISS_RESET_MSG && cmd != CCISS_ABORT_MSG) {
#endif
printk(KERN_WARNING "cciss cciss%d: SendCmd "
"Invalid command list address returned! (%lx)\n",
ctlr, complete);
/* not much we can do. */
#ifdef CONFIG_CISS_SCSI_TAPE
return 1;
}

/* We've sent down an abort or reset, but something else
has completed */
if (srl->ncompletions >= (hba[ctlr]->nr_cmds + 2)) {
/* Uh oh. No room to save it for later... */
printk(KERN_WARNING "cciss%d: Sendcmd: Invalid command addr, "
"reject list overflow, command lost!\n", ctlr);
return 1;
}
/* Save it for later */
srl->complete[srl->ncompletions] = complete;
srl->ncompletions++;
#endif
return 0;
}

/* Send command c to controller h and poll for it to complete.
* Turns interrupts off on the board. Used at driver init time
* and during SCSI error recovery.
Expand Down Expand Up @@ -2701,11 +2656,10 @@ static int sendcmd_core(ctlr_info_t *h, CommandList_struct *c)
break;
}

/* If it's not the cmd we're looking for, save it for later */
/* Make sure it's the command we're expecting. */
if ((complete & ~CISS_ERROR_BIT) != c->busaddr) {
if (add_sendcmd_reject(c->Request.CDB[0],
h->ctlr, complete) != 0)
BUG(); /* we are hosed if we get here. */
printk(KERN_WARNING "cciss%d: Unexpected command "
"completion.\n", h->ctlr);
continue;
}

Expand Down Expand Up @@ -2770,11 +2724,6 @@ static int sendcmd_core(ctlr_info_t *h, CommandList_struct *c)
buff_dma_handle.val32.upper = c->SG[0].Addr.upper;
pci_unmap_single(h->pdev, (dma_addr_t) buff_dma_handle.val,
c->SG[0].Len, PCI_DMA_BIDIRECTIONAL);
#ifdef CONFIG_CISS_SCSI_TAPE
/* if we saved some commands for later, process them now. */
if (h->scsi_rejects.ncompletions > 0)
do_cciss_intr(0, h);
#endif
return status;
}

Expand Down Expand Up @@ -3195,44 +3144,18 @@ static void do_cciss_request(struct request_queue *q)

static inline unsigned long get_next_completion(ctlr_info_t *h)
{
#ifdef CONFIG_CISS_SCSI_TAPE
/* Any rejects from sendcmd() lying around? Process them first */
if (h->scsi_rejects.ncompletions == 0)
return h->access.command_completed(h);
else {
struct sendcmd_reject_list *srl;
int n;
srl = &h->scsi_rejects;
n = --srl->ncompletions;
/* printk("cciss%d: processing saved reject\n", h->ctlr); */
printk("p");
return srl->complete[n];
}
#else
return h->access.command_completed(h);
#endif
}

static inline int interrupt_pending(ctlr_info_t *h)
{
#ifdef CONFIG_CISS_SCSI_TAPE
return (h->access.intr_pending(h)
|| (h->scsi_rejects.ncompletions > 0));
#else
return h->access.intr_pending(h);
#endif
}

static inline long interrupt_not_for_us(ctlr_info_t *h)
{
#ifdef CONFIG_CISS_SCSI_TAPE
return (((h->access.intr_pending(h) == 0) ||
(h->interrupts_enabled == 0))
&& (h->scsi_rejects.ncompletions == 0));
#else
return (((h->access.intr_pending(h) == 0) ||
(h->interrupts_enabled == 0)));
#endif
}

static irqreturn_t do_cciss_intr(int irq, void *dev_id)
Expand Down Expand Up @@ -4054,15 +3977,6 @@ static int __devinit cciss_init_one(struct pci_dev *pdev,
printk(KERN_ERR "cciss: out of memory");
goto clean4;
}
#ifdef CONFIG_CISS_SCSI_TAPE
hba[i]->scsi_rejects.complete =
kmalloc(sizeof(hba[i]->scsi_rejects.complete[0]) *
(hba[i]->nr_cmds + 5), GFP_KERNEL);
if (hba[i]->scsi_rejects.complete == NULL) {
printk(KERN_ERR "cciss: out of memory");
goto clean4;
}
#endif
spin_lock_init(&hba[i]->lock);

/* Initialize the pdev driver private data.
Expand Down Expand Up @@ -4122,9 +4036,6 @@ static int __devinit cciss_init_one(struct pci_dev *pdev,

clean4:
kfree(inq_buff);
#ifdef CONFIG_CISS_SCSI_TAPE
kfree(hba[i]->scsi_rejects.complete);
#endif
kfree(hba[i]->cmd_pool_bits);
if (hba[i]->cmd_pool)
pci_free_consistent(hba[i]->pdev,
Expand Down Expand Up @@ -4242,9 +4153,6 @@ static void __devexit cciss_remove_one(struct pci_dev *pdev)
pci_free_consistent(hba[i]->pdev, hba[i]->nr_cmds * sizeof(ErrorInfo_struct),
hba[i]->errinfo_pool, hba[i]->errinfo_pool_dhandle);
kfree(hba[i]->cmd_pool_bits);
#ifdef CONFIG_CISS_SCSI_TAPE
kfree(hba[i]->scsi_rejects.complete);
#endif
/*
* Deliberately omit pci_disable_device(): it does something nasty to
* Smart Array controllers that pci_enable_device does not undo
Expand Down
9 changes: 0 additions & 9 deletions trunk/drivers/block/cciss.h
Original file line number Diff line number Diff line change
Expand Up @@ -53,14 +53,6 @@ typedef struct _drive_info_struct
char rev[REV_LEN + 1]; /* SCSI revision string */
} drive_info_struct;

#ifdef CONFIG_CISS_SCSI_TAPE

struct sendcmd_reject_list {
int ncompletions;
unsigned long *complete; /* array of NR_CMDS tags */
};

#endif
struct ctlr_info
{
int ctlr;
Expand Down Expand Up @@ -128,7 +120,6 @@ struct ctlr_info
void *scsi_ctlr; /* ptr to structure containing scsi related stuff */
/* list of block side commands the scsi error handling sucked up */
/* and saved for later processing */
struct sendcmd_reject_list scsi_rejects;
#endif
unsigned char alive;
struct completion *rescan_wait;
Expand Down

0 comments on commit 0a7def4

Please sign in to comment.