Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit fbf60802 authored by Ju, Seokmann's avatar Ju, Seokmann Committed by James Bottomley
Browse files

[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: default avatarJames Bottomley <James.Bottomley@SteelEye.com>
parent f4246b33
Loading
Loading
Loading
Loading
+61 −0
Original line number Diff line number Diff line
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>
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)
+3 −0
Original line number Diff line number Diff line
@@ -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
+28 −6
Original line number Diff line number Diff line
@@ -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@lsil.com>
@@ -720,6 +720,7 @@ megaraid_init_mbox(adapter_t *adapter)
	struct pci_dev		*pdev;
	mraid_device_t		*raid_dev;
	int			i;
	uint32_t		magic64;


	adapter->ito	= MBOX_TIMEOUT;
@@ -863,13 +864,34 @@ megaraid_init_mbox(adapter_t *adapter)

	// 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);

	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: could not set DMA mask for 64-bit.\n"));
				"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
	tasklet_init(&adapter->dpc_h, megaraid_mbox_dpc,
+2 −2
Original line number Diff line number Diff line
@@ -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)"


/*