diff options
author | Sumant Patro <sumantp@lsil.com> | 2006-06-20 18:32:37 -0400 |
---|---|---|
committer | James Bottomley <jejb@mulgrave.il.steeleye.com> | 2006-06-26 10:29:07 -0400 |
commit | 0e98936c924e2329f876b0b7791b45249c2e2129 (patch) | |
tree | 83893e205f60aa728dc9d912981a92c856e50133 /drivers/scsi/megaraid/megaraid_sas.c | |
parent | cefbda2d6cd9bf78a93768130729a6d142588d67 (diff) |
[SCSI] megaraid_sas: zcr with fix
The patch adds support for a ZCR controller (Device ID : 0x413).
It also has a critical bug fix :
Disable controller interrupt before firing INIT cmd to FW. Interrupt
is enabled after required initialization is over. This is done to
ensure that driver is ready to handle interrupts when it is generated
by the controller.
Signed-off-by: Sumant Patro <Sumant.Patro@lsil.com>
Signed-off-by: James Bottomley <James.Bottomley@SteelEye.com>
Diffstat (limited to 'drivers/scsi/megaraid/megaraid_sas.c')
-rw-r--r-- | drivers/scsi/megaraid/megaraid_sas.c | 32 |
1 files changed, 24 insertions, 8 deletions
diff --git a/drivers/scsi/megaraid/megaraid_sas.c b/drivers/scsi/megaraid/megaraid_sas.c index 0c9516ff636f..3e6f9feaf69d 100644 --- a/drivers/scsi/megaraid/megaraid_sas.c +++ b/drivers/scsi/megaraid/megaraid_sas.c | |||
@@ -10,7 +10,7 @@ | |||
10 | * 2 of the License, or (at your option) any later version. | 10 | * 2 of the License, or (at your option) any later version. |
11 | * | 11 | * |
12 | * FILE : megaraid_sas.c | 12 | * FILE : megaraid_sas.c |
13 | * Version : v00.00.02.04 | 13 | * Version : v00.00.03.01 |
14 | * | 14 | * |
15 | * Authors: | 15 | * Authors: |
16 | * Sreenivas Bagalkote <Sreenivas.Bagalkote@lsil.com> | 16 | * Sreenivas Bagalkote <Sreenivas.Bagalkote@lsil.com> |
@@ -55,19 +55,25 @@ static struct pci_device_id megasas_pci_table[] = { | |||
55 | 55 | ||
56 | { | 56 | { |
57 | PCI_VENDOR_ID_LSI_LOGIC, | 57 | PCI_VENDOR_ID_LSI_LOGIC, |
58 | PCI_DEVICE_ID_LSI_SAS1064R, // xscale IOP | 58 | PCI_DEVICE_ID_LSI_SAS1064R, /* xscale IOP */ |
59 | PCI_ANY_ID, | 59 | PCI_ANY_ID, |
60 | PCI_ANY_ID, | 60 | PCI_ANY_ID, |
61 | }, | 61 | }, |
62 | { | 62 | { |
63 | PCI_VENDOR_ID_LSI_LOGIC, | 63 | PCI_VENDOR_ID_LSI_LOGIC, |
64 | PCI_DEVICE_ID_LSI_SAS1078R, // ppc IOP | 64 | PCI_DEVICE_ID_LSI_SAS1078R, /* ppc IOP */ |
65 | PCI_ANY_ID, | 65 | PCI_ANY_ID, |
66 | PCI_ANY_ID, | 66 | PCI_ANY_ID, |
67 | }, | 67 | }, |
68 | { | 68 | { |
69 | PCI_VENDOR_ID_LSI_LOGIC, | ||
70 | PCI_DEVICE_ID_LSI_VERDE_ZCR, /* xscale IOP, vega */ | ||
71 | PCI_ANY_ID, | ||
72 | PCI_ANY_ID, | ||
73 | }, | ||
74 | { | ||
69 | PCI_VENDOR_ID_DELL, | 75 | PCI_VENDOR_ID_DELL, |
70 | PCI_DEVICE_ID_DELL_PERC5, // xscale IOP | 76 | PCI_DEVICE_ID_DELL_PERC5, /* xscale IOP */ |
71 | PCI_ANY_ID, | 77 | PCI_ANY_ID, |
72 | PCI_ANY_ID, | 78 | PCI_ANY_ID, |
73 | }, | 79 | }, |
@@ -289,9 +295,14 @@ static struct megasas_instance_template megasas_instance_template_ppc = { | |||
289 | * @regs: MFI register set | 295 | * @regs: MFI register set |
290 | */ | 296 | */ |
291 | static inline void | 297 | static inline void |
292 | megasas_disable_intr(struct megasas_register_set __iomem * regs) | 298 | megasas_disable_intr(struct megasas_instance *instance) |
293 | { | 299 | { |
294 | u32 mask = 0x1f; | 300 | u32 mask = 0x1f; |
301 | struct megasas_register_set __iomem *regs = instance->reg_set; | ||
302 | |||
303 | if(instance->pdev->device == PCI_DEVICE_ID_LSI_SAS1078R) | ||
304 | mask = 0xffffffff; | ||
305 | |||
295 | writel(mask, ®s->outbound_intr_mask); | 306 | writel(mask, ®s->outbound_intr_mask); |
296 | 307 | ||
297 | /* Dummy readl to force pci flush */ | 308 | /* Dummy readl to force pci flush */ |
@@ -1260,7 +1271,7 @@ megasas_transition_to_ready(struct megasas_instance* instance) | |||
1260 | /* | 1271 | /* |
1261 | * Bring it to READY state; assuming max wait 2 secs | 1272 | * Bring it to READY state; assuming max wait 2 secs |
1262 | */ | 1273 | */ |
1263 | megasas_disable_intr(instance->reg_set); | 1274 | megasas_disable_intr(instance); |
1264 | writel(MFI_INIT_READY, &instance->reg_set->inbound_doorbell); | 1275 | writel(MFI_INIT_READY, &instance->reg_set->inbound_doorbell); |
1265 | 1276 | ||
1266 | max_wait = 10; | 1277 | max_wait = 10; |
@@ -1757,6 +1768,11 @@ static int megasas_init_mfi(struct megasas_instance *instance) | |||
1757 | init_frame->data_xfer_len = sizeof(struct megasas_init_queue_info); | 1768 | init_frame->data_xfer_len = sizeof(struct megasas_init_queue_info); |
1758 | 1769 | ||
1759 | /* | 1770 | /* |
1771 | * disable the intr before firing the init frame to FW | ||
1772 | */ | ||
1773 | megasas_disable_intr(instance); | ||
1774 | |||
1775 | /* | ||
1760 | * Issue the init frame in polled mode | 1776 | * Issue the init frame in polled mode |
1761 | */ | 1777 | */ |
1762 | if (megasas_issue_polled(instance, cmd)) { | 1778 | if (megasas_issue_polled(instance, cmd)) { |
@@ -2234,7 +2250,7 @@ megasas_probe_one(struct pci_dev *pdev, const struct pci_device_id *id) | |||
2234 | megasas_mgmt_info.max_index--; | 2250 | megasas_mgmt_info.max_index--; |
2235 | 2251 | ||
2236 | pci_set_drvdata(pdev, NULL); | 2252 | pci_set_drvdata(pdev, NULL); |
2237 | megasas_disable_intr(instance->reg_set); | 2253 | megasas_disable_intr(instance); |
2238 | free_irq(instance->pdev->irq, instance); | 2254 | free_irq(instance->pdev->irq, instance); |
2239 | 2255 | ||
2240 | megasas_release_mfi(instance); | 2256 | megasas_release_mfi(instance); |
@@ -2364,7 +2380,7 @@ static void megasas_detach_one(struct pci_dev *pdev) | |||
2364 | 2380 | ||
2365 | pci_set_drvdata(instance->pdev, NULL); | 2381 | pci_set_drvdata(instance->pdev, NULL); |
2366 | 2382 | ||
2367 | megasas_disable_intr(instance->reg_set); | 2383 | megasas_disable_intr(instance); |
2368 | 2384 | ||
2369 | free_irq(instance->pdev->irq, instance); | 2385 | free_irq(instance->pdev->irq, instance); |
2370 | 2386 | ||