提交 23f0bb47 编写于 作者: H HighPoint Linux Team 提交者: James Bottomley

[SCSI] hptiop: fix RR312x in hosts with >12GB

As the limitation of RR312x's dma engine, the HBA can not access host memory
over 12GB.  This fixes

https://bugzilla.kernel.org/show_bug.cgi?id=14311

[alan: resurrected bug from 2009 and pushed upstream]
Reported-by: NAlan Cox <alan@lxorguk.ukuu.org.uk>
Signed-off-by: NHighPoint Linux Team <linux@highpoint-tech.com>
Signed-off-by: NJames Bottomley <JBottomley@Parallels.com>
上级 f3d8af9e
...@@ -42,7 +42,7 @@ MODULE_DESCRIPTION("HighPoint RocketRAID 3xxx/4xxx Controller Driver"); ...@@ -42,7 +42,7 @@ MODULE_DESCRIPTION("HighPoint RocketRAID 3xxx/4xxx Controller Driver");
static char driver_name[] = "hptiop"; static char driver_name[] = "hptiop";
static const char driver_name_long[] = "RocketRAID 3xxx/4xxx Controller driver"; 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 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, static void hptiop_finish_scsi_req(struct hptiop_hba *hba, u32 tag,
...@@ -958,6 +958,7 @@ static int __devinit hptiop_probe(struct pci_dev *pcidev, ...@@ -958,6 +958,7 @@ static int __devinit hptiop_probe(struct pci_dev *pcidev,
{ {
struct Scsi_Host *host = NULL; struct Scsi_Host *host = NULL;
struct hptiop_hba *hba; struct hptiop_hba *hba;
struct hptiop_adapter_ops *iop_ops;
struct hpt_iop_request_get_config iop_config; struct hpt_iop_request_get_config iop_config;
struct hpt_iop_request_set_config set_config; struct hpt_iop_request_set_config set_config;
dma_addr_t start_phy; dma_addr_t start_phy;
...@@ -978,7 +979,8 @@ static int __devinit hptiop_probe(struct pci_dev *pcidev, ...@@ -978,7 +979,8 @@ static int __devinit hptiop_probe(struct pci_dev *pcidev,
pci_set_master(pcidev); pci_set_master(pcidev);
/* Enable 64bit DMA if possible */ /* 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))) { if (pci_set_dma_mask(pcidev, DMA_BIT_MASK(32))) {
printk(KERN_ERR "hptiop: fail to set dma_mask\n"); printk(KERN_ERR "hptiop: fail to set dma_mask\n");
goto disable_pci_device; goto disable_pci_device;
...@@ -998,7 +1000,7 @@ static int __devinit hptiop_probe(struct pci_dev *pcidev, ...@@ -998,7 +1000,7 @@ static int __devinit hptiop_probe(struct pci_dev *pcidev,
hba = (struct hptiop_hba *)host->hostdata; hba = (struct hptiop_hba *)host->hostdata;
hba->ops = (struct hptiop_adapter_ops *)id->driver_data; hba->ops = iop_ops;
hba->pcidev = pcidev; hba->pcidev = pcidev;
hba->host = host; hba->host = host;
hba->initialized = 0; hba->initialized = 0;
...@@ -1239,6 +1241,7 @@ static struct hptiop_adapter_ops hptiop_itl_ops = { ...@@ -1239,6 +1241,7 @@ static struct hptiop_adapter_ops hptiop_itl_ops = {
.iop_intr = iop_intr_itl, .iop_intr = iop_intr_itl,
.post_msg = hptiop_post_msg_itl, .post_msg = hptiop_post_msg_itl,
.post_req = hptiop_post_req_itl, .post_req = hptiop_post_req_itl,
.hw_dma_bit_mask = 64,
}; };
static struct hptiop_adapter_ops hptiop_mv_ops = { static struct hptiop_adapter_ops hptiop_mv_ops = {
...@@ -1254,6 +1257,7 @@ static struct hptiop_adapter_ops hptiop_mv_ops = { ...@@ -1254,6 +1257,7 @@ static struct hptiop_adapter_ops hptiop_mv_ops = {
.iop_intr = iop_intr_mv, .iop_intr = iop_intr_mv,
.post_msg = hptiop_post_msg_mv, .post_msg = hptiop_post_msg_mv,
.post_req = hptiop_post_req_mv, .post_req = hptiop_post_req_mv,
.hw_dma_bit_mask = 33,
}; };
static struct pci_device_id hptiop_id_table[] = { static struct pci_device_id hptiop_id_table[] = {
......
...@@ -297,6 +297,7 @@ struct hptiop_adapter_ops { ...@@ -297,6 +297,7 @@ struct hptiop_adapter_ops {
int (*iop_intr)(struct hptiop_hba *hba); int (*iop_intr)(struct hptiop_hba *hba);
void (*post_msg)(struct hptiop_hba *hba, u32 msg); void (*post_msg)(struct hptiop_hba *hba, u32 msg);
void (*post_req)(struct hptiop_hba *hba, struct hptiop_request *_req); void (*post_req)(struct hptiop_hba *hba, struct hptiop_request *_req);
int hw_dma_bit_mask;
}; };
#define HPT_IOCTL_RESULT_OK 0 #define HPT_IOCTL_RESULT_OK 0
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册