As the limitation of RR312x's dma engine, the HBA can not access host memory over 12GB. Signed-off-by: HighPoint Linux Team drivers/scsi/hptiop.c | 10 +++++++--- drivers/scsi/hptiop.h | 1 + 2 files changed, 8 insertions(+), 3 deletions(-) diff -Nur linux-2.6.33.orig/drivers/scsi/hptiop.c linux-2.6.33/drivers/scsi/hptiop.c --- linux-2.6.33.orig/drivers/scsi/hptiop.c 2009-12-19 06:27:08.000000000 +0800 +++ linux-2.6.33/drivers/scsi/hptiop.c 2009-12-25 13:45:30.000000000 +0800 @@ -41,7 +41,7 @@ static char driver_name[] = "hptiop"; static const char driver_name_long[] = "RocketRAID 3xxx/4xxx Controller driver"; -static const char driver_ver[] = "v1.6 (090910)"; +static const char driver_ver[] = "v1.6 (091225)"; static int iop_send_sync_msg(struct hptiop_hba *hba, u32 msg, u32 millisec); static void hptiop_finish_scsi_req(struct hptiop_hba *hba, u32 tag, @@ -952,6 +952,7 @@ { struct Scsi_Host *host = NULL; struct hptiop_hba *hba; + struct hptiop_adapter_ops *iop_ops; struct hpt_iop_request_get_config iop_config; struct hpt_iop_request_set_config set_config; dma_addr_t start_phy; @@ -972,7 +973,8 @@ pci_set_master(pcidev); /* Enable 64bit DMA if possible */ - if (pci_set_dma_mask(pcidev, DMA_BIT_MASK(64))) { + iop_ops = (struct hptiop_adapter_ops *)id->driver_data; + if (pci_set_dma_mask(pcidev, DMA_BIT_MASK(iop_ops->hw_dma_bit_mask))) { if (pci_set_dma_mask(pcidev, DMA_BIT_MASK(32))) { printk(KERN_ERR "hptiop: fail to set dma_mask\n"); goto disable_pci_device; @@ -992,7 +994,7 @@ hba = (struct hptiop_hba *)host->hostdata; - hba->ops = (struct hptiop_adapter_ops *)id->driver_data; + hba->ops = iop_ops; hba->pcidev = pcidev; hba->host = host; hba->initialized = 0; @@ -1233,6 +1235,7 @@ .iop_intr = iop_intr_itl, .post_msg = hptiop_post_msg_itl, .post_req = hptiop_post_req_itl, + .hw_dma_bit_mask = 64, }; static struct hptiop_adapter_ops hptiop_mv_ops = { @@ -1248,6 +1251,7 @@ .iop_intr = iop_intr_mv, .post_msg = hptiop_post_msg_mv, .post_req = hptiop_post_req_mv, + .hw_dma_bit_mask = 33, }; static struct pci_device_id hptiop_id_table[] = { diff -Nur linux-2.6.33.orig/drivers/scsi/hptiop.h linux-2.6.33/drivers/scsi/hptiop.h --- linux-2.6.33.orig/drivers/scsi/hptiop.h 2009-12-19 06:27:08.000000000 +0800 +++ linux-2.6.33/drivers/scsi/hptiop.h 2009-12-25 13:28:48.000000000 +0800 @@ -297,6 +297,7 @@ int (*iop_intr)(struct hptiop_hba *hba); void (*post_msg)(struct hptiop_hba *hba, u32 msg); void (*post_req)(struct hptiop_hba *hba, struct hptiop_request *_req); + int hw_dma_bit_mask; }; #define HPT_IOCTL_RESULT_OK 0