[SCSI] megaraid_{mm,mbox}: 64-bit DMA capability checker
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@sw.ru]. Thank you Vasily for the reporting. Signed-Off By: Seokmann Ju <seokmann.ju@lsil.com> Signed-off-by: James Bottomley <James.Bottomley@SteelEye.com>
This commit is contained in:
parent
f4246b33c7
commit
fbf6080225
4 changed files with 93 additions and 7 deletions
|
@ -1,3 +1,64 @@
|
||||||
|
Release Date : Fri May 19 09:31:45 EST 2006 - Seokmann Ju <sju@lsil.com>
|
||||||
|
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@sw.ru]
|
||||||
|
> Sent: Thursday, May 04, 2006 2:49 PM
|
||||||
|
> To: linux-scsi@vger.kernel.org; Kolli, Neela; Mukker, Atul;
|
||||||
|
> Ju, Seokmann; Bagalkote, Sreenivas;
|
||||||
|
> James.Bottomley@SteelEye.com; devel@openvz.org
|
||||||
|
> 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@lsil.com>
|
Release Date : Mon Apr 11 12:27:22 EST 2006 - Seokmann Ju <sju@lsil.com>
|
||||||
Current Version : 2.20.4.8 (scsi module), 2.20.2.6 (cmm module)
|
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)
|
Older Version : 2.20.4.7 (scsi module), 2.20.2.6 (cmm module)
|
||||||
|
|
|
@ -37,6 +37,9 @@
|
||||||
#define LSI_MAX_CHANNELS 16
|
#define LSI_MAX_CHANNELS 16
|
||||||
#define LSI_MAX_LOGICAL_DRIVES_64LD (64+1)
|
#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
|
* scb_t - scsi command control block
|
||||||
|
|
|
@ -10,7 +10,7 @@
|
||||||
* 2 of the License, or (at your option) any later version.
|
* 2 of the License, or (at your option) any later version.
|
||||||
*
|
*
|
||||||
* FILE : megaraid_mbox.c
|
* FILE : megaraid_mbox.c
|
||||||
* Version : v2.20.4.8 (Apr 11 2006)
|
* Version : v2.20.4.9 (Jul 16 2006)
|
||||||
*
|
*
|
||||||
* Authors:
|
* Authors:
|
||||||
* Atul Mukker <Atul.Mukker@lsil.com>
|
* Atul Mukker <Atul.Mukker@lsil.com>
|
||||||
|
@ -720,6 +720,7 @@ megaraid_init_mbox(adapter_t *adapter)
|
||||||
struct pci_dev *pdev;
|
struct pci_dev *pdev;
|
||||||
mraid_device_t *raid_dev;
|
mraid_device_t *raid_dev;
|
||||||
int i;
|
int i;
|
||||||
|
uint32_t magic64;
|
||||||
|
|
||||||
|
|
||||||
adapter->ito = MBOX_TIMEOUT;
|
adapter->ito = MBOX_TIMEOUT;
|
||||||
|
@ -863,12 +864,33 @@ megaraid_init_mbox(adapter_t *adapter)
|
||||||
|
|
||||||
// Set the DMA mask to 64-bit. All supported controllers as capable of
|
// Set the DMA mask to 64-bit. All supported controllers as capable of
|
||||||
// DMA in this range
|
// 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
|
if (((magic64 == HBA_SIGNATURE_64_BIT) &&
|
||||||
"megaraid: could not set DMA mask for 64-bit.\n"));
|
((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"));
|
||||||
|
|
||||||
goto out_free_sysfs_res;
|
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
|
// setup tasklet for DPC
|
||||||
|
|
|
@ -21,8 +21,8 @@
|
||||||
#include "megaraid_ioctl.h"
|
#include "megaraid_ioctl.h"
|
||||||
|
|
||||||
|
|
||||||
#define MEGARAID_VERSION "2.20.4.8"
|
#define MEGARAID_VERSION "2.20.4.9"
|
||||||
#define MEGARAID_EXT_VERSION "(Release Date: Mon Apr 11 12:27:22 EST 2006)"
|
#define MEGARAID_EXT_VERSION "(Release Date: Sun Jul 16 12:27:22 EST 2006)"
|
||||||
|
|
||||||
|
|
||||||
/*
|
/*
|
||||||
|
|
Loading…
Add table
Reference in a new issue