Re: [PATCH] Stop using num_physpages in aacraid

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



On Fri, May 02, 2008 at 03:06:42PM -0400, Mark Salyzyn wrote:
> The num_physpages variable works as needed for the PERC controllers  
> that are installed in vanilla x86 machines is it not? The PERC card  
> would not be installed in any other arch.
> 
> AAC_QUIRK_SCSI_32 means the card can not send 64bit format commands to  
> the SCSI devices (non DASD) but can send 64bit format commands to the  
> logical (Array) devices. This is for a select set of old PERC cards.
> 
> AAC_OPT_SGMAP_HOST64 means this card 'can' do DAC (send 64 bit format  
> commands to both SCSI and to Array devices), but sadly some that  
> report this are borken (hence the Quirk AAC_QUIRK_SCSI_32).
> 
> Dropping the cards is not an option, that is the whole reason this  
> workaround was put in place.

Thanks for the explanation of the quirks and options.  I don't want to
drop support for any cards, I just want to make aacraid not rely on
the meaning of num_physpages.

The question aacraid wants to ask is "Does this device have to
do DAC to access memory?"  The answer can be affected by an IOMMU or
by memory layout.  It's far from clear what question num_physpages is
intended to answer; there are different bits of the kernel using it in
interesting ways.  But we do have a function designed to answer the
question you want to ask: dma_get_required_mask().  This may be an
expensive question to ask, so in the below patch I cache the answer in
the aac_dev.

Signed-off-by: Matthew Wilcox <willy@xxxxxxxxxxxxxxx>

diff --git a/drivers/scsi/aacraid/aachba.c b/drivers/scsi/aacraid/aachba.c
index 460d402..cd0865d 100644
--- a/drivers/scsi/aacraid/aachba.c
+++ b/drivers/scsi/aacraid/aachba.c
@@ -1201,9 +1201,8 @@ static int aac_scsi_32(struct fib * fib, struct scsi_cmnd * cmd)
 
 static int aac_scsi_32_64(struct fib * fib, struct scsi_cmnd * cmd)
 {
-	if ((sizeof(dma_addr_t) > 4) &&
-	 (num_physpages > (0xFFFFFFFFULL >> PAGE_SHIFT)) &&
-	 (fib->dev->adapter_info.options & AAC_OPT_SGMAP_HOST64))
+	if ((sizeof(dma_addr_t) > 4) && fib->dev->needs_dac &&
+	    (fib->dev->adapter_info.options & AAC_OPT_SGMAP_HOST64))
 		return FAILED;
 	return aac_scsi_32(fib, cmd);
 }
@@ -1394,6 +1393,9 @@ int aac_get_adapter_info(struct aac_dev* dev)
 			rcode = -ENOMEM;
 		}
 	}
+	if (dma_get_required_mask(&dev->pdev->dev) > DMA_32BIT_MASK)
+		dev->needs_dac = 1;
+
 	/*
 	 * Deal with configuring for the individualized limits of each packet
 	 * interface.
diff --git a/drivers/scsi/aacraid/aacraid.h b/drivers/scsi/aacraid/aacraid.h
index 113ca9c..a06c817 100644
--- a/drivers/scsi/aacraid/aacraid.h
+++ b/drivers/scsi/aacraid/aacraid.h
@@ -1016,6 +1016,7 @@ struct aac_dev
 	u8			jbod;
 	u8			cache_protected;
 	u8			dac_support;
+	u8			needs_dac;
 	u8			raid_scsi_mode;
 	u8			comm_interface;
 #	define AAC_COMM_PRODUCER 0

-- 
Intel are signing my paycheques ... these opinions are still mine
"Bill, look, we understand that you're interested in selling us this
operating system, but compare it to ours.  We can't possibly take such
a retrograde step."
--
To unsubscribe from this list: send the line "unsubscribe linux-scsi" in
the body of a message to majordomo@xxxxxxxxxxxxxxx
More majordomo info at  http://vger.kernel.org/majordomo-info.html

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
[Index of Archives]     [SCSI Target Devel]     [Linux SCSI Target Infrastructure]     [Kernel Newbies]     [IDE]     [Security]     [Git]     [Netfilter]     [Bugtraq]     [Yosemite News]     [MIPS Linux]     [ARM Linux]     [Linux Security]     [Linux RAID]     [Linux ATA RAID]     [Linux IIO]     [Samba]     [Device Mapper]
  Powered by Linux