diff options
author | Mark Haverkamp <markh@osdl.org> | 2005-05-16 21:28:42 -0400 |
---|---|---|
committer | James Bottomley <jejb@mulgrave.(none)> | 2005-05-20 16:48:00 -0400 |
commit | 7c00ffa314bf0fb0e23858bbebad33b48b6abbb9 (patch) | |
tree | 4d6b65bb5a2c8fecf48a8c6402c2cc867aa2fe6c /drivers/scsi/aacraid/linit.c | |
parent | 672b2d38da4fff4c4452685a25fb88b65243d1a6 (diff) |
[SCSI] 2.6 aacraid: Variable FIB size (updated patch)
New code from the Adaptec driver. Performance enhancement for newer
adapters. I hope that this isn't too big for a single patch. I believe
that other than the few small cleanups mentioned, that the changes are
all related.
- Added Variable FIB size negotiation for new adapters.
- Added support to maximize scatter gather tables and thus permit
requests larger than 64KB/each.
- Limit Scatter Gather to 34 elements for ROMB platforms.
- aac_printf is only enabled with AAC_QUIRK_34SG
- Large FIB ioctl support
- some minor cleanup
Passes sparse check.
I have tested it on x86 and ppc64 machines.
Signed-off-by: James Bottomley <James.Bottomley@SteelEye.com>
Diffstat (limited to 'drivers/scsi/aacraid/linit.c')
-rw-r--r-- | drivers/scsi/aacraid/linit.c | 33 |
1 files changed, 29 insertions, 4 deletions
diff --git a/drivers/scsi/aacraid/linit.c b/drivers/scsi/aacraid/linit.c index 5fd8f3ee9804..6f05d86c7bb3 100644 --- a/drivers/scsi/aacraid/linit.c +++ b/drivers/scsi/aacraid/linit.c | |||
@@ -347,10 +347,16 @@ static int aac_biosparm(struct scsi_device *sdev, struct block_device *bdev, | |||
347 | 347 | ||
348 | static int aac_slave_configure(struct scsi_device *sdev) | 348 | static int aac_slave_configure(struct scsi_device *sdev) |
349 | { | 349 | { |
350 | struct Scsi_Host *host = sdev->host; | ||
351 | |||
350 | if (sdev->tagged_supported) | 352 | if (sdev->tagged_supported) |
351 | scsi_adjust_queue_depth(sdev, MSG_ORDERED_TAG, 128); | 353 | scsi_adjust_queue_depth(sdev, MSG_ORDERED_TAG, 128); |
352 | else | 354 | else |
353 | scsi_adjust_queue_depth(sdev, 0, 1); | 355 | scsi_adjust_queue_depth(sdev, 0, 1); |
356 | |||
357 | if (host->max_sectors < AAC_MAX_32BIT_SGBCOUNT) | ||
358 | blk_queue_max_segment_size(sdev->request_queue, 65536); | ||
359 | |||
354 | return 0; | 360 | return 0; |
355 | } | 361 | } |
356 | 362 | ||
@@ -439,11 +445,11 @@ static int aac_eh_reset(struct scsi_cmnd* cmd) | |||
439 | static int aac_cfg_open(struct inode *inode, struct file *file) | 445 | static int aac_cfg_open(struct inode *inode, struct file *file) |
440 | { | 446 | { |
441 | struct aac_dev *aac; | 447 | struct aac_dev *aac; |
442 | unsigned minor = iminor(inode); | 448 | unsigned minor_number = iminor(inode); |
443 | int err = -ENODEV; | 449 | int err = -ENODEV; |
444 | 450 | ||
445 | list_for_each_entry(aac, &aac_devices, entry) { | 451 | list_for_each_entry(aac, &aac_devices, entry) { |
446 | if (aac->id == minor) { | 452 | if (aac->id == minor_number) { |
447 | file->private_data = aac; | 453 | file->private_data = aac; |
448 | err = 0; | 454 | err = 0; |
449 | break; | 455 | break; |
@@ -489,6 +495,7 @@ static long aac_compat_do_ioctl(struct aac_dev *dev, unsigned cmd, unsigned long | |||
489 | case FSACTL_DELETE_DISK: | 495 | case FSACTL_DELETE_DISK: |
490 | case FSACTL_FORCE_DELETE_DISK: | 496 | case FSACTL_FORCE_DELETE_DISK: |
491 | case FSACTL_GET_CONTAINERS: | 497 | case FSACTL_GET_CONTAINERS: |
498 | case FSACTL_SEND_LARGE_FIB: | ||
492 | ret = aac_do_ioctl(dev, cmd, (void __user *)arg); | 499 | ret = aac_do_ioctl(dev, cmd, (void __user *)arg); |
493 | break; | 500 | break; |
494 | 501 | ||
@@ -538,7 +545,7 @@ static struct file_operations aac_cfg_fops = { | |||
538 | static struct scsi_host_template aac_driver_template = { | 545 | static struct scsi_host_template aac_driver_template = { |
539 | .module = THIS_MODULE, | 546 | .module = THIS_MODULE, |
540 | .name = "AAC", | 547 | .name = "AAC", |
541 | .proc_name = "aacraid", | 548 | .proc_name = AAC_DRIVERNAME, |
542 | .info = aac_info, | 549 | .info = aac_info, |
543 | .ioctl = aac_ioctl, | 550 | .ioctl = aac_ioctl, |
544 | #ifdef CONFIG_COMPAT | 551 | #ifdef CONFIG_COMPAT |
@@ -612,7 +619,7 @@ static int __devinit aac_probe_one(struct pci_dev *pdev, | |||
612 | aac->cardtype = index; | 619 | aac->cardtype = index; |
613 | INIT_LIST_HEAD(&aac->entry); | 620 | INIT_LIST_HEAD(&aac->entry); |
614 | 621 | ||
615 | aac->fibs = kmalloc(sizeof(struct fib) * AAC_NUM_FIB, GFP_KERNEL); | 622 | aac->fibs = kmalloc(sizeof(struct fib) * (shost->can_queue + AAC_NUM_MGT_FIB), GFP_KERNEL); |
616 | if (!aac->fibs) | 623 | if (!aac->fibs) |
617 | goto out_free_host; | 624 | goto out_free_host; |
618 | spin_lock_init(&aac->fib_lock); | 625 | spin_lock_init(&aac->fib_lock); |
@@ -632,6 +639,24 @@ static int __devinit aac_probe_one(struct pci_dev *pdev, | |||
632 | aac_get_adapter_info(aac); | 639 | aac_get_adapter_info(aac); |
633 | 640 | ||
634 | /* | 641 | /* |
642 | * Lets override negotiations and drop the maximum SG limit to 34 | ||
643 | */ | ||
644 | if ((aac_drivers[index].quirks & AAC_QUIRK_34SG) && | ||
645 | (aac->scsi_host_ptr->sg_tablesize > 34)) { | ||
646 | aac->scsi_host_ptr->sg_tablesize = 34; | ||
647 | aac->scsi_host_ptr->max_sectors | ||
648 | = (aac->scsi_host_ptr->sg_tablesize * 8) + 112; | ||
649 | } | ||
650 | |||
651 | /* | ||
652 | * Firware printf works only with older firmware. | ||
653 | */ | ||
654 | if (aac_drivers[index].quirks & AAC_QUIRK_34SG) | ||
655 | aac->printf_enabled = 1; | ||
656 | else | ||
657 | aac->printf_enabled = 0; | ||
658 | |||
659 | /* | ||
635 | * max channel will be the physical channels plus 1 virtual channel | 660 | * max channel will be the physical channels plus 1 virtual channel |
636 | * all containers are on the virtual channel 0 | 661 | * all containers are on the virtual channel 0 |
637 | * physical channels are address by their actual physical number+1 | 662 | * physical channels are address by their actual physical number+1 |