aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/scsi/aacraid/linit.c
diff options
context:
space:
mode:
authorMark Haverkamp <markh@osdl.org>2005-05-16 21:28:42 -0400
committerJames Bottomley <jejb@mulgrave.(none)>2005-05-20 16:48:00 -0400
commit7c00ffa314bf0fb0e23858bbebad33b48b6abbb9 (patch)
tree4d6b65bb5a2c8fecf48a8c6402c2cc867aa2fe6c /drivers/scsi/aacraid/linit.c
parent672b2d38da4fff4c4452685a25fb88b65243d1a6 (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.c33
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
348static int aac_slave_configure(struct scsi_device *sdev) 348static 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)
439static int aac_cfg_open(struct inode *inode, struct file *file) 445static 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 = {
538static struct scsi_host_template aac_driver_template = { 545static 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