aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/scsi/megaraid/megaraid_mbox.c
diff options
context:
space:
mode:
Diffstat (limited to 'drivers/scsi/megaraid/megaraid_mbox.c')
-rw-r--r--drivers/scsi/megaraid/megaraid_mbox.c62
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 **/
341static 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 */
717static int __init 733static int __devinit
718megaraid_init_mbox(adapter_t *adapter) 734megaraid_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: