[PATCH 1/3] scsi : megaraid_{mm,mbox}: 64-bit DMA capability checker

From: Ju, Seokmann
Date: Tue Jul 25 2006 - 10:43:50 EST


Hi,

This patch contains
- a fix for 64-bit DMA capability check in megaraid_{mm,mbox} driver.
- includes changes (going back to 32-bit DMA mask if 64-bit DMA mask
failes) suggested by James with previous patch.
- addition of SATA 150-4/6 as commented by Vasily Averin.

With patch, the driver access PCIconfiguration space with dedicated
offset to read a signature. If the signature read, it means that the
controller has capability to handle 64-bit DMA.
Without this patch, the driver used to blindly claim 64-bit DMA
capability.
The issue has been reported by Vasily Averin [vvs@xxxxx].
Thank you Vasily for the reporting.

Thank you,

Seokmann

Signed-Off By: Seokmann Ju <seokmann.ju@xxxxxxxx>
---
diff -Naur git/Documentation/scsi/ChangeLog.megaraid
64bitdma/Documentation/scsi/ChangeLog.megaraid
--- git/Documentation/scsi/ChangeLog.megaraid 2006-07-16
16:22:29.000000000 -0400
+++ 64bitdma/Documentation/scsi/ChangeLog.megaraid 2006-07-17
18:01:21.000000000 -0400
@@ -1,3 +1,64 @@
+Release Date : Fri May 19 09:31:45 EST 2006 - Seokmann Ju
<sju@xxxxxxxx>
+Current Version : 2.20.4.9 (scsi module), 2.20.2.6 (cmm module)
+Older Version : 2.20.4.8 (scsi module), 2.20.2.6 (cmm module)
+
+1. Fixed a bug in megaraid_init_mbox().
+ Customer reported "garbage in file on x86_64 platform".
+ Root Cause: the driver registered controllers as 64-bit DMA
capable
+ for those which are not support it.
+ Fix: Made change in the function inserting identification
machanism
+ identifying 64-bit DMA capable controllers.
+
+ > -----Original Message-----
+ > From: Vasily Averin [mailto:vvs@xxxxx]
+ > Sent: Thursday, May 04, 2006 2:49 PM
+ > To: linux-scsi@xxxxxxxxxxxxxxx; Kolli, Neela; Mukker, Atul;
+ > Ju, Seokmann; Bagalkote, Sreenivas;
+ > James.Bottomley@xxxxxxxxxxxx; devel@xxxxxxxxxx
+ > Subject: megaraid_mbox: garbage in file
+ >
+ > Hello all,
+ >
+ > I've investigated customers claim on the unstable work of
+ > their node and found a
+ > strange effect: reading from some files leads to the
+ > "attempt to access beyond end of device" messages.
+ >
+ > I've checked filesystem, memory on the node, motherboard BIOS
+ > version, but it
+ > does not help and issue still has been reproduced by simple
+ > file reading.
+ >
+ > Reproducer is simple:
+ >
+ > echo 0xffffffff >/proc/sys/dev/scsi/logging_level ;
+ > cat /vz/private/101/root/etc/ld.so.cache >/tmp/ttt ;
+ > echo 0 >/proc/sys/dev/scsi/logging
+ >
+ > It leads to the following messages in dmesg
+ >
+ > sd_init_command: disk=sda, block=871769260, count=26
+ > sda : block=871769260
+ > sda : reading 26/26 512 byte blocks.
+ > scsi_add_timer: scmd: f79ed980, time: 7500, (c02b1420)
+ > sd 0:1:0:0: send 0xf79ed980 sd 0:1:0:0:
+ > command: Read (10): 28 00 33 f6 24 ac 00 00 1a 00
+ > buffer = 0xf7cfb540, bufflen = 13312, done = 0xc0366b40,
+ > queuecommand 0xc0344010
+ > leaving scsi_dispatch_cmnd()
+ > scsi_delete_timer: scmd: f79ed980, rtn: 1
+ > sd 0:1:0:0: done 0xf79ed980 SUCCESS 0 sd 0:1:0:0:
+ > command: Read (10): 28 00 33 f6 24 ac 00 00 1a 00
+ > scsi host busy 1 failed 0
+ > sd 0:1:0:0: Notifying upper driver of completion (result 0)
+ > sd_rw_intr: sda: res=0x0
+ > 26 sectors total, 13312 bytes done.
+ > use_sg is 4
+ > attempt to access beyond end of device
+ > sda6: rw=0, want=1044134458, limit=951401367
+ > Buffer I/O error on device sda6, logical block 522067228
+ > attempt to access beyond end of device
+
Release Date : Mon Apr 11 12:27:22 EST 2006 - Seokmann Ju
<sju@xxxxxxxx>
Current Version : 2.20.4.8 (scsi module), 2.20.2.6 (cmm module)
Older Version : 2.20.4.7 (scsi module), 2.20.2.6 (cmm module)
diff -Naur git/drivers/scsi/megaraid/mega_common.h
64bitdma/drivers/scsi/megaraid/mega_common.h
--- git/drivers/scsi/megaraid/mega_common.h 2006-07-16
16:22:29.000000000 -0400
+++ 64bitdma/drivers/scsi/megaraid/mega_common.h 2006-07-24
15:30:45.000000000 -0400
@@ -37,6 +37,9 @@
#define LSI_MAX_CHANNELS 16
#define LSI_MAX_LOGICAL_DRIVES_64LD (64+1)

+#define HBA_SIGNATURE_64_BIT 0x299
+#define PCI_CONF_AMISIG64 0xa4
+

/**
* scb_t - scsi command control block
diff -Naur git/drivers/scsi/megaraid/megaraid_mbox.c
64bitdma/drivers/scsi/megaraid/megaraid_mbox.c
--- git/drivers/scsi/megaraid/megaraid_mbox.c 2006-07-16
16:22:29.000000000 -0400
+++ 64bitdma/drivers/scsi/megaraid/megaraid_mbox.c 2006-07-25
09:50:26.000000000 -0400
@@ -10,7 +10,7 @@
* 2 of the License, or (at your option) any later version.
*
* FILE : megaraid_mbox.c
- * Version : v2.20.4.8 (Apr 11 2006)
+ * Version : v2.20.4.9 (Jul 16 2006)
*
* Authors:
* Atul Mukker <Atul.Mukker@xxxxxxxx>
@@ -720,6 +720,7 @@
struct pci_dev *pdev;
mraid_device_t *raid_dev;
int i;
+ uint32_t magic64;


adapter->ito = MBOX_TIMEOUT;
@@ -863,12 +864,33 @@

// Set the DMA mask to 64-bit. All supported controllers as
capable of
// DMA in this range
- if (pci_set_dma_mask(adapter->pdev, DMA_64BIT_MASK) != 0) {
+ pci_read_config_dword(adapter->pdev, PCI_CONF_AMISIG64,
&magic64);

- con_log(CL_ANN, (KERN_WARNING
- "megaraid: could not set DMA mask for
64-bit.\n"));
-
- goto out_free_sysfs_res;
+ if (((magic64 == HBA_SIGNATURE_64_BIT) &&
+ ((adapter->pdev->subsystem_device !=
+ PCI_SUBSYS_ID_MEGARAID_SATA_150_6) ||
+ (adapter->pdev->subsystem_device !=
+ PCI_SUBSYS_ID_MEGARAID_SATA_150_4))) ||
+ (adapter->pdev->vendor == PCI_VENDOR_ID_LSI_LOGIC &&
+ adapter->pdev->device == PCI_DEVICE_ID_VERDE) ||
+ (adapter->pdev->vendor == PCI_VENDOR_ID_LSI_LOGIC &&
+ adapter->pdev->device == PCI_DEVICE_ID_DOBSON) ||
+ (adapter->pdev->vendor == PCI_VENDOR_ID_LSI_LOGIC &&
+ adapter->pdev->device == PCI_DEVICE_ID_LINDSAY) ||
+ (adapter->pdev->vendor == PCI_VENDOR_ID_DELL &&
+ adapter->pdev->device ==
PCI_DEVICE_ID_PERC4_DI_EVERGLADES) ||
+ (adapter->pdev->vendor == PCI_VENDOR_ID_DELL &&
+ adapter->pdev->device == PCI_DEVICE_ID_PERC4E_DI_KOBUK))
{
+ if (pci_set_dma_mask(adapter->pdev, DMA_64BIT_MASK)) {
+ con_log(CL_ANN, (KERN_WARNING
+ "megaraid: DMA mask for 64-bit
failed\n"));
+
+ if (pci_set_dma_mask (adapter->pdev,
DMA_32BIT_MASK)) {
+ con_log(CL_ANN, (KERN_WARNING
+ "megaraid: 32-bit DMA mask
failed\n"));
+ goto out_free_sysfs_res;
+ }
+ }
}

// setup tasklet for DPC
diff -Naur git/drivers/scsi/megaraid/megaraid_mbox.h
64bitdma/drivers/scsi/megaraid/megaraid_mbox.h
--- git/drivers/scsi/megaraid/megaraid_mbox.h 2006-07-16
16:22:29.000000000 -0400
+++ 64bitdma/drivers/scsi/megaraid/megaraid_mbox.h 2006-07-24
15:30:23.000000000 -0400
@@ -21,8 +21,8 @@
#include "megaraid_ioctl.h"


-#define MEGARAID_VERSION "2.20.4.8"
-#define MEGARAID_EXT_VERSION "(Release Date: Mon Apr 11 12:27:22 EST
2006)"
+#define MEGARAID_VERSION "2.20.4.9"
+#define MEGARAID_EXT_VERSION "(Release Date: Sun Jul 16 12:27:22 EST
2006)"


/*
---

Attachment: megaraid_64bitdmacheck.patch
Description: megaraid_64bitdmacheck.patch