diff options
Diffstat (limited to 'drivers/scsi/megaraid/megaraid_mbox.c')
-rw-r--r-- | drivers/scsi/megaraid/megaraid_mbox.c | 62 |
1 files changed, 54 insertions, 8 deletions
diff --git a/drivers/scsi/megaraid/megaraid_mbox.c b/drivers/scsi/megaraid/megaraid_mbox.c index bec1424eda85..266b3910846b 100644 --- a/drivers/scsi/megaraid/megaraid_mbox.c +++ b/drivers/scsi/megaraid/megaraid_mbox.c | |||
@@ -10,7 +10,7 @@ | |||
10 | * 2 of the License, or (at your option) any later version. | 10 | * 2 of the License, or (at your option) any later version. |
11 | * | 11 | * |
12 | * FILE : megaraid_mbox.c | 12 | * FILE : megaraid_mbox.c |
13 | * Version : v2.20.4.8 (Apr 11 2006) | 13 | * Version : v2.20.4.9 (Jul 16 2006) |
14 | * | 14 | * |
15 | * Authors: | 15 | * Authors: |
16 | * Atul Mukker <Atul.Mukker@lsil.com> | 16 | * Atul Mukker <Atul.Mukker@lsil.com> |
@@ -330,6 +330,21 @@ static struct device_attribute *megaraid_sdev_attrs[] = { | |||
330 | NULL, | 330 | NULL, |
331 | }; | 331 | }; |
332 | 332 | ||
333 | /** | ||
334 | * megaraid_change_queue_depth - Change the device's queue depth | ||
335 | * @sdev: scsi device struct | ||
336 | * @qdepth: depth to set | ||
337 | * | ||
338 | * Return value: | ||
339 | * actual depth set | ||
340 | **/ | ||
341 | static int megaraid_change_queue_depth(struct scsi_device *sdev, int qdepth) | ||
342 | { | ||
343 | if (qdepth > MBOX_MAX_SCSI_CMDS) | ||
344 | qdepth = MBOX_MAX_SCSI_CMDS; | ||
345 | scsi_adjust_queue_depth(sdev, 0, qdepth); | ||
346 | return sdev->queue_depth; | ||
347 | } | ||
333 | 348 | ||
334 | /* | 349 | /* |
335 | * Scsi host template for megaraid unified driver | 350 | * Scsi host template for megaraid unified driver |
@@ -343,6 +358,7 @@ static struct scsi_host_template megaraid_template_g = { | |||
343 | .eh_device_reset_handler = megaraid_reset_handler, | 358 | .eh_device_reset_handler = megaraid_reset_handler, |
344 | .eh_bus_reset_handler = megaraid_reset_handler, | 359 | .eh_bus_reset_handler = megaraid_reset_handler, |
345 | .eh_host_reset_handler = megaraid_reset_handler, | 360 | .eh_host_reset_handler = megaraid_reset_handler, |
361 | .change_queue_depth = megaraid_change_queue_depth, | ||
346 | .use_clustering = ENABLE_CLUSTERING, | 362 | .use_clustering = ENABLE_CLUSTERING, |
347 | .sdev_attrs = megaraid_sdev_attrs, | 363 | .sdev_attrs = megaraid_sdev_attrs, |
348 | .shost_attrs = megaraid_shost_attrs, | 364 | .shost_attrs = megaraid_shost_attrs, |
@@ -714,12 +730,13 @@ megaraid_io_detach(adapter_t *adapter) | |||
714 | * . Allocate memory required for all the commands | 730 | * . Allocate memory required for all the commands |
715 | * . Use internal library of FW routines, build up complete soft state | 731 | * . Use internal library of FW routines, build up complete soft state |
716 | */ | 732 | */ |
717 | static int __init | 733 | static int __devinit |
718 | megaraid_init_mbox(adapter_t *adapter) | 734 | megaraid_init_mbox(adapter_t *adapter) |
719 | { | 735 | { |
720 | struct pci_dev *pdev; | 736 | struct pci_dev *pdev; |
721 | mraid_device_t *raid_dev; | 737 | mraid_device_t *raid_dev; |
722 | int i; | 738 | int i; |
739 | uint32_t magic64; | ||
723 | 740 | ||
724 | 741 | ||
725 | adapter->ito = MBOX_TIMEOUT; | 742 | adapter->ito = MBOX_TIMEOUT; |
@@ -767,7 +784,7 @@ megaraid_init_mbox(adapter_t *adapter) | |||
767 | // | 784 | // |
768 | 785 | ||
769 | // request IRQ and register the interrupt service routine | 786 | // request IRQ and register the interrupt service routine |
770 | if (request_irq(adapter->irq, megaraid_isr, SA_SHIRQ, "megaraid", | 787 | if (request_irq(adapter->irq, megaraid_isr, IRQF_SHARED, "megaraid", |
771 | adapter)) { | 788 | adapter)) { |
772 | 789 | ||
773 | con_log(CL_ANN, (KERN_WARNING | 790 | con_log(CL_ANN, (KERN_WARNING |
@@ -863,12 +880,33 @@ megaraid_init_mbox(adapter_t *adapter) | |||
863 | 880 | ||
864 | // Set the DMA mask to 64-bit. All supported controllers as capable of | 881 | // Set the DMA mask to 64-bit. All supported controllers as capable of |
865 | // DMA in this range | 882 | // DMA in this range |
866 | if (pci_set_dma_mask(adapter->pdev, DMA_64BIT_MASK) != 0) { | 883 | pci_read_config_dword(adapter->pdev, PCI_CONF_AMISIG64, &magic64); |
867 | 884 | ||
868 | con_log(CL_ANN, (KERN_WARNING | 885 | if (((magic64 == HBA_SIGNATURE_64_BIT) && |
869 | "megaraid: could not set DMA mask for 64-bit.\n")); | 886 | ((adapter->pdev->subsystem_device != |
887 | PCI_SUBSYS_ID_MEGARAID_SATA_150_6) || | ||
888 | (adapter->pdev->subsystem_device != | ||
889 | PCI_SUBSYS_ID_MEGARAID_SATA_150_4))) || | ||
890 | (adapter->pdev->vendor == PCI_VENDOR_ID_LSI_LOGIC && | ||
891 | adapter->pdev->device == PCI_DEVICE_ID_VERDE) || | ||
892 | (adapter->pdev->vendor == PCI_VENDOR_ID_LSI_LOGIC && | ||
893 | adapter->pdev->device == PCI_DEVICE_ID_DOBSON) || | ||
894 | (adapter->pdev->vendor == PCI_VENDOR_ID_LSI_LOGIC && | ||
895 | adapter->pdev->device == PCI_DEVICE_ID_LINDSAY) || | ||
896 | (adapter->pdev->vendor == PCI_VENDOR_ID_DELL && | ||
897 | adapter->pdev->device == PCI_DEVICE_ID_PERC4_DI_EVERGLADES) || | ||
898 | (adapter->pdev->vendor == PCI_VENDOR_ID_DELL && | ||
899 | adapter->pdev->device == PCI_DEVICE_ID_PERC4E_DI_KOBUK)) { | ||
900 | if (pci_set_dma_mask(adapter->pdev, DMA_64BIT_MASK)) { | ||
901 | con_log(CL_ANN, (KERN_WARNING | ||
902 | "megaraid: DMA mask for 64-bit failed\n")); | ||
870 | 903 | ||
871 | goto out_free_sysfs_res; | 904 | if (pci_set_dma_mask (adapter->pdev, DMA_32BIT_MASK)) { |
905 | con_log(CL_ANN, (KERN_WARNING | ||
906 | "megaraid: 32-bit DMA mask failed\n")); | ||
907 | goto out_free_sysfs_res; | ||
908 | } | ||
909 | } | ||
872 | } | 910 | } |
873 | 911 | ||
874 | // setup tasklet for DPC | 912 | // setup tasklet for DPC |
@@ -1622,6 +1660,14 @@ megaraid_mbox_build_cmd(adapter_t *adapter, struct scsi_cmnd *scp, int *busy) | |||
1622 | rdev->last_disp |= (1L << SCP2CHANNEL(scp)); | 1660 | rdev->last_disp |= (1L << SCP2CHANNEL(scp)); |
1623 | } | 1661 | } |
1624 | 1662 | ||
1663 | if (scp->cmnd[1] & MEGA_SCSI_INQ_EVPD) { | ||
1664 | scp->sense_buffer[0] = 0x70; | ||
1665 | scp->sense_buffer[2] = ILLEGAL_REQUEST; | ||
1666 | scp->sense_buffer[12] = MEGA_INVALID_FIELD_IN_CDB; | ||
1667 | scp->result = CHECK_CONDITION << 1; | ||
1668 | return NULL; | ||
1669 | } | ||
1670 | |||
1625 | /* Fall through */ | 1671 | /* Fall through */ |
1626 | 1672 | ||
1627 | case READ_CAPACITY: | 1673 | case READ_CAPACITY: |