Skip to content

Commit

Permalink
[SCSI] megaraid_sas: zcr with fix
Browse files Browse the repository at this point in the history
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>
  • Loading branch information
Sumant Patro authored and James Bottomley committed Jun 26, 2006
1 parent cefbda2 commit 0e98936
Show file tree
Hide file tree
Showing 3 changed files with 56 additions and 13 deletions.
16 changes: 16 additions & 0 deletions Documentation/scsi/ChangeLog.megaraid_sas
Original file line number Diff line number Diff line change
@@ -1,4 +1,20 @@

1 Release Date : Sun May 14 22:49:52 PDT 2006 - Sumant Patro <Sumant.Patro@lsil.com>
2 Current Version : 00.00.03.01
3 Older Version : 00.00.02.04

i. Added support for ZCR controller.

New device id 0x413 added.

ii. 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.

-Sumant Patro <Sumant.Patro@lsil.com>

1 Release Date : Wed Feb 03 14:31:44 PST 2006 - Sumant Patro <Sumant.Patro@lsil.com>
2 Current Version : 00.00.02.04
3 Older Version : 00.00.02.04
Expand Down
32 changes: 24 additions & 8 deletions drivers/scsi/megaraid/megaraid_sas.c
Original file line number Diff line number Diff line change
Expand Up @@ -10,7 +10,7 @@
* 2 of the License, or (at your option) any later version.
*
* FILE : megaraid_sas.c
* Version : v00.00.02.04
* Version : v00.00.03.01
*
* Authors:
* Sreenivas Bagalkote <Sreenivas.Bagalkote@lsil.com>
Expand Down Expand Up @@ -55,19 +55,25 @@ static struct pci_device_id megasas_pci_table[] = {

{
PCI_VENDOR_ID_LSI_LOGIC,
PCI_DEVICE_ID_LSI_SAS1064R, // xscale IOP
PCI_DEVICE_ID_LSI_SAS1064R, /* xscale IOP */
PCI_ANY_ID,
PCI_ANY_ID,
},
{
PCI_VENDOR_ID_LSI_LOGIC,
PCI_DEVICE_ID_LSI_SAS1078R, // ppc IOP
PCI_DEVICE_ID_LSI_SAS1078R, /* ppc IOP */
PCI_ANY_ID,
PCI_ANY_ID,
},
{
PCI_VENDOR_ID_LSI_LOGIC,
PCI_DEVICE_ID_LSI_VERDE_ZCR, /* xscale IOP, vega */
PCI_ANY_ID,
PCI_ANY_ID,
},
{
PCI_VENDOR_ID_DELL,
PCI_DEVICE_ID_DELL_PERC5, // xscale IOP
PCI_DEVICE_ID_DELL_PERC5, /* xscale IOP */
PCI_ANY_ID,
PCI_ANY_ID,
},
Expand Down Expand Up @@ -289,9 +295,14 @@ static struct megasas_instance_template megasas_instance_template_ppc = {
* @regs: MFI register set
*/
static inline void
megasas_disable_intr(struct megasas_register_set __iomem * regs)
megasas_disable_intr(struct megasas_instance *instance)
{
u32 mask = 0x1f;
struct megasas_register_set __iomem *regs = instance->reg_set;

if(instance->pdev->device == PCI_DEVICE_ID_LSI_SAS1078R)
mask = 0xffffffff;

writel(mask, &regs->outbound_intr_mask);

/* Dummy readl to force pci flush */
Expand Down Expand Up @@ -1260,7 +1271,7 @@ megasas_transition_to_ready(struct megasas_instance* instance)
/*
* Bring it to READY state; assuming max wait 2 secs
*/
megasas_disable_intr(instance->reg_set);
megasas_disable_intr(instance);
writel(MFI_INIT_READY, &instance->reg_set->inbound_doorbell);

max_wait = 10;
Expand Down Expand Up @@ -1756,6 +1767,11 @@ static int megasas_init_mfi(struct megasas_instance *instance)

init_frame->data_xfer_len = sizeof(struct megasas_init_queue_info);

/*
* disable the intr before firing the init frame to FW
*/
megasas_disable_intr(instance);

/*
* Issue the init frame in polled mode
*/
Expand Down Expand Up @@ -2234,7 +2250,7 @@ megasas_probe_one(struct pci_dev *pdev, const struct pci_device_id *id)
megasas_mgmt_info.max_index--;

pci_set_drvdata(pdev, NULL);
megasas_disable_intr(instance->reg_set);
megasas_disable_intr(instance);
free_irq(instance->pdev->irq, instance);

megasas_release_mfi(instance);
Expand Down Expand Up @@ -2364,7 +2380,7 @@ static void megasas_detach_one(struct pci_dev *pdev)

pci_set_drvdata(instance->pdev, NULL);

megasas_disable_intr(instance->reg_set);
megasas_disable_intr(instance);

free_irq(instance->pdev->irq, instance);

Expand Down
21 changes: 16 additions & 5 deletions drivers/scsi/megaraid/megaraid_sas.h
Original file line number Diff line number Diff line change
Expand Up @@ -18,9 +18,16 @@
/**
* MegaRAID SAS Driver meta data
*/
#define MEGASAS_VERSION "00.00.02.04"
#define MEGASAS_RELDATE "Feb 03, 2006"
#define MEGASAS_EXT_VERSION "Fri Feb 03 14:31:44 PST 2006"
#define MEGASAS_VERSION "00.00.03.01"
#define MEGASAS_RELDATE "May 14, 2006"
#define MEGASAS_EXT_VERSION "Sun May 14 22:49:52 PDT 2006"

/*
* Device IDs
*/
#define PCI_DEVICE_ID_LSI_SAS1078R 0x0060
#define PCI_DEVICE_ID_LSI_VERDE_ZCR 0x0413

/*
* =====================================
* MegaRAID SAS MFI firmware definitions
Expand Down Expand Up @@ -554,7 +561,11 @@ struct megasas_ctrl_info {
#define MFI_POLL_TIMEOUT_SECS 10

#define MFI_REPLY_1078_MESSAGE_INTERRUPT 0x80000000
#define PCI_DEVICE_ID_LSI_SAS1078R 0x00000060

/*
* register set for both 1068 and 1078 controllers
* structure extended for 1078 registers
*/

struct megasas_register_set {
u32 reserved_0[4]; /*0000h*/
Expand Down Expand Up @@ -1150,10 +1161,10 @@ struct compat_megasas_iocpacket {
struct compat_iovec sgl[MAX_IOCTL_SGE];
} __attribute__ ((packed));

#define MEGASAS_IOC_FIRMWARE32 _IOWR('M', 1, struct compat_megasas_iocpacket)
#endif

#define MEGASAS_IOC_FIRMWARE _IOWR('M', 1, struct megasas_iocpacket)
#define MEGASAS_IOC_FIRMWARE32 _IOWR('M', 1, struct compat_megasas_iocpacket)
#define MEGASAS_IOC_GET_AEN _IOW('M', 3, struct megasas_aen)

struct megasas_mgmt_info {
Expand Down

0 comments on commit 0e98936

Please sign in to comment.