diff options
Diffstat (limited to 'drivers/scsi/aacraid/commsup.c')
-rw-r--r-- | drivers/scsi/aacraid/commsup.c | 40 |
1 files changed, 6 insertions, 34 deletions
diff --git a/drivers/scsi/aacraid/commsup.c b/drivers/scsi/aacraid/commsup.c index 4893a6d06a33..1b97f60652ba 100644 --- a/drivers/scsi/aacraid/commsup.c +++ b/drivers/scsi/aacraid/commsup.c | |||
@@ -317,7 +317,7 @@ static int aac_get_entry (struct aac_dev * dev, u32 qid, struct aac_entry **entr | |||
317 | * success. | 317 | * success. |
318 | */ | 318 | */ |
319 | 319 | ||
320 | static int aac_queue_get(struct aac_dev * dev, u32 * index, u32 qid, struct hw_fib * hw_fib, int wait, struct fib * fibptr, unsigned long *nonotify) | 320 | int aac_queue_get(struct aac_dev * dev, u32 * index, u32 qid, struct hw_fib * hw_fib, int wait, struct fib * fibptr, unsigned long *nonotify) |
321 | { | 321 | { |
322 | struct aac_entry * entry = NULL; | 322 | struct aac_entry * entry = NULL; |
323 | int map = 0; | 323 | int map = 0; |
@@ -387,7 +387,6 @@ int aac_fib_send(u16 command, struct fib *fibptr, unsigned long size, | |||
387 | { | 387 | { |
388 | struct aac_dev * dev = fibptr->dev; | 388 | struct aac_dev * dev = fibptr->dev; |
389 | struct hw_fib * hw_fib = fibptr->hw_fib; | 389 | struct hw_fib * hw_fib = fibptr->hw_fib; |
390 | struct aac_queue * q; | ||
391 | unsigned long flags = 0; | 390 | unsigned long flags = 0; |
392 | unsigned long qflags; | 391 | unsigned long qflags; |
393 | 392 | ||
@@ -469,38 +468,10 @@ int aac_fib_send(u16 command, struct fib *fibptr, unsigned long size, | |||
469 | 468 | ||
470 | if (!dev->queues) | 469 | if (!dev->queues) |
471 | return -EBUSY; | 470 | return -EBUSY; |
472 | q = &dev->queues->queue[AdapNormCmdQueue]; | ||
473 | 471 | ||
474 | if(wait) | 472 | if(wait) |
475 | spin_lock_irqsave(&fibptr->event_lock, flags); | 473 | spin_lock_irqsave(&fibptr->event_lock, flags); |
476 | spin_lock_irqsave(q->lock, qflags); | 474 | aac_adapter_deliver(fibptr); |
477 | if (dev->new_comm_interface) { | ||
478 | unsigned long count = 10000000L; /* 50 seconds */ | ||
479 | q->numpending++; | ||
480 | spin_unlock_irqrestore(q->lock, qflags); | ||
481 | while (aac_adapter_send(fibptr) != 0) { | ||
482 | if (--count == 0) { | ||
483 | if (wait) | ||
484 | spin_unlock_irqrestore(&fibptr->event_lock, flags); | ||
485 | spin_lock_irqsave(q->lock, qflags); | ||
486 | q->numpending--; | ||
487 | spin_unlock_irqrestore(q->lock, qflags); | ||
488 | return -ETIMEDOUT; | ||
489 | } | ||
490 | udelay(5); | ||
491 | } | ||
492 | } else { | ||
493 | u32 index; | ||
494 | unsigned long nointr = 0; | ||
495 | aac_queue_get( dev, &index, AdapNormCmdQueue, hw_fib, 1, fibptr, &nointr); | ||
496 | |||
497 | q->numpending++; | ||
498 | *(q->headers.producer) = cpu_to_le32(index + 1); | ||
499 | spin_unlock_irqrestore(q->lock, qflags); | ||
500 | dprintk((KERN_DEBUG "aac_fib_send: inserting a queue entry at index %d.\n",index)); | ||
501 | if (!(nointr & aac_config.irq_mod)) | ||
502 | aac_adapter_notify(dev, AdapNormCmdQueue); | ||
503 | } | ||
504 | 475 | ||
505 | /* | 476 | /* |
506 | * If the caller wanted us to wait for response wait now. | 477 | * If the caller wanted us to wait for response wait now. |
@@ -520,6 +491,7 @@ int aac_fib_send(u16 command, struct fib *fibptr, unsigned long size, | |||
520 | while (down_trylock(&fibptr->event_wait)) { | 491 | while (down_trylock(&fibptr->event_wait)) { |
521 | int blink; | 492 | int blink; |
522 | if (--count == 0) { | 493 | if (--count == 0) { |
494 | struct aac_queue * q = &dev->queues->queue[AdapNormCmdQueue]; | ||
523 | spin_lock_irqsave(q->lock, qflags); | 495 | spin_lock_irqsave(q->lock, qflags); |
524 | q->numpending--; | 496 | q->numpending--; |
525 | spin_unlock_irqrestore(q->lock, qflags); | 497 | spin_unlock_irqrestore(q->lock, qflags); |
@@ -659,7 +631,7 @@ int aac_fib_adapter_complete(struct fib *fibptr, unsigned short size) | |||
659 | unsigned long qflags; | 631 | unsigned long qflags; |
660 | 632 | ||
661 | if (hw_fib->header.XferState == 0) { | 633 | if (hw_fib->header.XferState == 0) { |
662 | if (dev->new_comm_interface) | 634 | if (dev->comm_interface == AAC_COMM_MESSAGE) |
663 | kfree (hw_fib); | 635 | kfree (hw_fib); |
664 | return 0; | 636 | return 0; |
665 | } | 637 | } |
@@ -667,7 +639,7 @@ int aac_fib_adapter_complete(struct fib *fibptr, unsigned short size) | |||
667 | * If we plan to do anything check the structure type first. | 639 | * If we plan to do anything check the structure type first. |
668 | */ | 640 | */ |
669 | if ( hw_fib->header.StructType != FIB_MAGIC ) { | 641 | if ( hw_fib->header.StructType != FIB_MAGIC ) { |
670 | if (dev->new_comm_interface) | 642 | if (dev->comm_interface == AAC_COMM_MESSAGE) |
671 | kfree (hw_fib); | 643 | kfree (hw_fib); |
672 | return -EINVAL; | 644 | return -EINVAL; |
673 | } | 645 | } |
@@ -679,7 +651,7 @@ int aac_fib_adapter_complete(struct fib *fibptr, unsigned short size) | |||
679 | * send the completed cdb to the adapter. | 651 | * send the completed cdb to the adapter. |
680 | */ | 652 | */ |
681 | if (hw_fib->header.XferState & cpu_to_le32(SentFromAdapter)) { | 653 | if (hw_fib->header.XferState & cpu_to_le32(SentFromAdapter)) { |
682 | if (dev->new_comm_interface) { | 654 | if (dev->comm_interface == AAC_COMM_MESSAGE) { |
683 | kfree (hw_fib); | 655 | kfree (hw_fib); |
684 | } else { | 656 | } else { |
685 | u32 index; | 657 | u32 index; |