Commit f5d76f2d authored by James Bottomley's avatar James Bottomley

megaraid_mbox 2.20.4.3 patch

From: 	Ju, Seokmann <sju@lsil.com>

- sysfs support for drive addition/removal
- Tape drive timeout issue
- Made some code static
Signed-off-by: default avatarJames Bottomley <James.Bottomley@SteelEye.com>
parent 8daeca52
Release Date : Thu Feb 03 12:27:22 EST 2005 - Seokmann Ju <sju@lsil.com>
Current Version : 2.20.4.5 (scsi module), 2.20.2.5 (cmm module)
Older Version : 2.20.4.4 (scsi module), 2.20.2.4 (cmm module)
1. Modified name of two attributes in scsi_host_template.
On Wed, 2005-02-02 at 10:56 -0500, Ju, Seokmann wrote:
> + .sdev_attrs = megaraid_device_attrs,
> + .shost_attrs = megaraid_class_device_attrs,
These are, perhaps, slightly confusing names.
The terms device and class_device have well defined meanings in the
generic device model, neither of which is what you mean here.
Why not simply megaraid_sdev_attrs and megaraid_shost_attrs?
Other than this, it looks fine to me too.
Release Date : Thu Jan 27 00:01:03 EST 2005 - Atul Mukker <atulm@lsil.com>
Current Version : 2.20.4.4 (scsi module), 2.20.2.5 (cmm module)
Older Version : 2.20.4.3 (scsi module), 2.20.2.4 (cmm module)
1. Bump up the version of scsi module due to its conflict.
Release Date : Thu Jan 21 00:01:03 EST 2005 - Atul Mukker <atulm@lsil.com>
Current Version : 2.20.4.3 (scsi module), 2.20.2.5 (cmm module)
Older Version : 2.20.4.2 (scsi module), 2.20.2.4 (cmm module)
1. Remove driver ioctl for logical drive to scsi address translation and
replace with the sysfs attribute. To remove drives and change
capacity, application shall now use the device attribute to get the
logical drive number for a scsi device. For adding newly created
logical drives, class device attribute would be required to uniquely
identify each controller.
- Atul Mukker <atulm@lsil.com>
"James, I've been thinking about this a little more, and you may be on
to something here. Let each driver add files as such:"
- Matt Domsch <Matt_Domsch@dell.com>, 12.15.2004
linux-scsi mailing list
"Then, if you simply publish your LD number as an extra parameter of
the device, you can look through /sys to find it."
- James Bottomley <James.Bottomley@SteelEye.com>, 01.03.2005
linux-scsi mailing list
"I don't see why not ... it's your driver, you can publish whatever
extra information you need as scsi_device attributes; that was one of
the designs of the extensible attribute system."
- James Bottomley <James.Bottomley@SteelEye.com>, 01.06.2005
linux-scsi mailing list
2. Add AMI megaraid support - Brian King <brking@charter.net>
PCI_VENDOR_ID_AMI, PCI_DEVICE_ID_AMI_MEGARAID3,
PCI_VENDOR_ID_AMI, PCI_SUBSYS_ID_PERC3_DC,
3. Make some code static - Adrian Bunk <bunk@stusta.de>
Date: Mon, 15 Nov 2004 03:14:57 +0100
The patch below makes some needlessly global code static.
-wait_queue_head_t wait_q;
+static wait_queue_head_t wait_q;
Signed-off-by: Adrian Bunk <bunk@stusta.de>
4. Added NEC ROMB support - NEC MegaRAID PCI Express ROMB controller
PCI_VENDOR_ID_LSI_LOGIC, PCI_DEVICE_ID_MEGARAID_NEC_ROMB_2E,
PCI_SUBSYS_ID_NEC, PCI_SUBSYS_ID_MEGARAID_NEC_ROMB_2E,
5. Fixed Tape drive issue : For any Direct CDB command to physical device
including tape, timeout value set by driver was 10 minutes. With this
value, most of command will return within timeout. However, for those
command like ERASE or FORMAT, it takes more than an hour depends on
capacity of the device and the command could be terminated before it
completes.
To address this issue, the 'timeout' field in the DCDB command will
have NO TIMEOUT (i.e., 4) value as its timeout on DCDB command.
Release Date : Thu Dec 9 19:10:23 EST 2004
- Sreenivas Bagalkote <sreenib@lsil.com>
Current Version : 2.20.4.2 (scsi module), 2.20.2.4 (cmm module)
Older Version : 2.20.4.1 (scsi module), 2.20.2.3 (cmm module)
i. Introduced driver ioctl that returns scsi address for a given ld.
"Why can't the existing sysfs interfaces be used to do this?"
- Brian King (brking@us.ibm.com)
"I've looked into solving this another way, but I cannot see how
to get this driver-private mapping of logical drive number-> HCTL
without putting code something like this into the driver."
"...and by providing a mapping a function to userspace, the driver
is free to change its mapping algorithm in the future if necessary .."
- Matt Domsch (Matt_Domsch@dell.com)
Release Date : Thu Dec 9 19:02:14 EST 2004 - Sreenivas Bagalkote <sreenib@lsil.com> Release Date : Thu Dec 9 19:02:14 EST 2004 - Sreenivas Bagalkote <sreenib@lsil.com>
Current Version : 2.20.4.1 (scsi module), 2.20.2.3 (cmm module) Current Version : 2.20.4.1 (scsi module), 2.20.2.3 (cmm module)
......
...@@ -59,6 +59,7 @@ config MEGARAID_MAILBOX ...@@ -59,6 +59,7 @@ config MEGARAID_MAILBOX
INTEL RAID Controller SRCU51L 1000:1960:8086:0520 INTEL RAID Controller SRCU51L 1000:1960:8086:0520
FSC MegaRAID PCI Express ROMB 1000:0408:1734:1065 FSC MegaRAID PCI Express ROMB 1000:0408:1734:1065
ACER MegaRAID ROMB-2E 1000:0408:1025:004D ACER MegaRAID ROMB-2E 1000:0408:1025:004D
NEC MegaRAID PCI Express ROMB 1000:0408:1033:8287
To compile this driver as a module, choose M here: the To compile this driver as a module, choose M here: the
module will be called megaraid_mbox module will be called megaraid_mbox
......
...@@ -221,6 +221,9 @@ typedef struct { ...@@ -221,6 +221,9 @@ typedef struct {
#define MRAID_IS_LOGICAL(adp, scp) \ #define MRAID_IS_LOGICAL(adp, scp) \
(SCP2CHANNEL(scp) == (adp)->max_channel) ? 1 : 0 (SCP2CHANNEL(scp) == (adp)->max_channel) ? 1 : 0
#define MRAID_IS_LOGICAL_SDEV(adp, sdev) \
(sdev->channel == (adp)->max_channel) ? 1 : 0
#define MRAID_GET_DEVICE_MAP(adp, scp, p_chan, target, islogical) \ #define MRAID_GET_DEVICE_MAP(adp, scp, p_chan, target, islogical) \
/* \ /* \
* Is the request coming for the virtual channel \ * Is the request coming for the virtual channel \
......
...@@ -291,5 +291,6 @@ typedef struct mraid_mmadp { ...@@ -291,5 +291,6 @@ typedef struct mraid_mmadp {
int mraid_mm_register_adp(mraid_mmadp_t *); int mraid_mm_register_adp(mraid_mmadp_t *);
int mraid_mm_unregister_adp(uint32_t); int mraid_mm_unregister_adp(uint32_t);
uint32_t mraid_mm_adapter_app_handle(uint32_t);
#endif /* _MEGARAID_IOCTL_H_ */ #endif /* _MEGARAID_IOCTL_H_ */
...@@ -10,7 +10,7 @@ ...@@ -10,7 +10,7 @@
* 2 of the License, or (at your option) any later version. * 2 of the License, or (at your option) any later version.
* *
* FILE : megaraid_mbox.c * FILE : megaraid_mbox.c
* Version : v2.20.4.1 (Nov 04 2004) * Version : v2.20.4.5 (Feb 03 2005)
* *
* Authors: * Authors:
* Atul Mukker <Atul.Mukker@lsil.com> * Atul Mukker <Atul.Mukker@lsil.com>
...@@ -60,12 +60,11 @@ ...@@ -60,12 +60,11 @@
* INTEL RAID Controller SROMBU42E 1000 0408 8086 3499 * INTEL RAID Controller SROMBU42E 1000 0408 8086 3499
* INTEL RAID Controller SRCU51L 1000 1960 8086 0520 * INTEL RAID Controller SRCU51L 1000 1960 8086 0520
* *
*
* FSC MegaRAID PCI Express ROMB 1000 0408 1734 1065 * FSC MegaRAID PCI Express ROMB 1000 0408 1734 1065
* *
*
* ACER MegaRAID ROMB-2E 1000 0408 1025 004D * ACER MegaRAID ROMB-2E 1000 0408 1025 004D
* *
* NEC MegaRAID PCI Express ROMB 1000 0408 1033 8287
* *
* For history of changes, see Documentation/ChangeLog.megaraid * For history of changes, see Documentation/ChangeLog.megaraid
*/ */
...@@ -91,6 +90,9 @@ static void megaraid_free_cmd_packets(adapter_t *); ...@@ -91,6 +90,9 @@ static void megaraid_free_cmd_packets(adapter_t *);
static int megaraid_mbox_setup_dma_pools(adapter_t *); static int megaraid_mbox_setup_dma_pools(adapter_t *);
static void megaraid_mbox_teardown_dma_pools(adapter_t *); static void megaraid_mbox_teardown_dma_pools(adapter_t *);
static int megaraid_sysfs_alloc_resources(adapter_t *);
static void megaraid_sysfs_free_resources(adapter_t *);
static int megaraid_abort_handler(struct scsi_cmnd *); static int megaraid_abort_handler(struct scsi_cmnd *);
static int megaraid_reset_handler(struct scsi_cmnd *); static int megaraid_reset_handler(struct scsi_cmnd *);
...@@ -121,6 +123,9 @@ static irqreturn_t megaraid_isr(int, void *, struct pt_regs *); ...@@ -121,6 +123,9 @@ static irqreturn_t megaraid_isr(int, void *, struct pt_regs *);
static void megaraid_mbox_dpc(unsigned long); static void megaraid_mbox_dpc(unsigned long);
static ssize_t megaraid_sysfs_show_app_hndl(struct class_device *, char *);
static ssize_t megaraid_sysfs_show_ldnum(struct device *, char *);
static int megaraid_cmm_register(adapter_t *); static int megaraid_cmm_register(adapter_t *);
static int megaraid_cmm_unregister(adapter_t *); static int megaraid_cmm_unregister(adapter_t *);
static int megaraid_mbox_mm_handler(unsigned long, uioc_t *, uint32_t); static int megaraid_mbox_mm_handler(unsigned long, uioc_t *, uint32_t);
...@@ -197,7 +202,7 @@ MODULE_PARM_DESC(debug_level, "Debug level for driver (default=0)"); ...@@ -197,7 +202,7 @@ MODULE_PARM_DESC(debug_level, "Debug level for driver (default=0)");
* ### global data ### * ### global data ###
*/ */
static uint8_t megaraid_mbox_version[8] = static uint8_t megaraid_mbox_version[8] =
{ 0x02, 0x20, 0x04, 0x00, 9, 27, 20, 4 }; { 0x02, 0x20, 0x04, 0x05, 2, 3, 20, 5 };
/* /*
...@@ -300,6 +305,12 @@ static struct pci_device_id pci_id_table_g[] = { ...@@ -300,6 +305,12 @@ static struct pci_device_id pci_id_table_g[] = {
PCI_VENDOR_ID_AMI, PCI_VENDOR_ID_AMI,
PCI_SUBSYS_ID_PERC3_SC, PCI_SUBSYS_ID_PERC3_SC,
}, },
{
PCI_VENDOR_ID_AMI,
PCI_DEVICE_ID_AMI_MEGARAID3,
PCI_VENDOR_ID_AMI,
PCI_SUBSYS_ID_PERC3_DC,
},
{ {
PCI_VENDOR_ID_LSI_LOGIC, PCI_VENDOR_ID_LSI_LOGIC,
PCI_DEVICE_ID_MEGARAID_SCSI_320_0, PCI_DEVICE_ID_MEGARAID_SCSI_320_0,
...@@ -438,6 +449,12 @@ static struct pci_device_id pci_id_table_g[] = { ...@@ -438,6 +449,12 @@ static struct pci_device_id pci_id_table_g[] = {
PCI_VENDOR_ID_AI, PCI_VENDOR_ID_AI,
PCI_SUBSYS_ID_MEGARAID_ACER_ROMB_2E, PCI_SUBSYS_ID_MEGARAID_ACER_ROMB_2E,
}, },
{
PCI_VENDOR_ID_LSI_LOGIC,
PCI_DEVICE_ID_MEGARAID_NEC_ROMB_2E,
PCI_VENDOR_ID_NEC,
PCI_SUBSYS_ID_MEGARAID_NEC_ROMB_2E,
},
{0} /* Terminating entry */ {0} /* Terminating entry */
}; };
MODULE_DEVICE_TABLE(pci, pci_id_table_g); MODULE_DEVICE_TABLE(pci, pci_id_table_g);
...@@ -454,6 +471,29 @@ static struct pci_driver megaraid_pci_driver_g = { ...@@ -454,6 +471,29 @@ static struct pci_driver megaraid_pci_driver_g = {
}; };
// definitions for the device attributes for exporting logical drive number
// for a scsi address (Host, Channel, Id, Lun)
CLASS_DEVICE_ATTR(megaraid_mbox_app_hndl, S_IRUSR, megaraid_sysfs_show_app_hndl,
NULL);
// Host template initializer for megaraid mbox sysfs device attributes
static struct class_device_attribute *megaraid_shost_attrs[] = {
&class_device_attr_megaraid_mbox_app_hndl,
NULL,
};
DEVICE_ATTR(megaraid_mbox_ld, S_IRUSR, megaraid_sysfs_show_ldnum, NULL);
// Host template initializer for megaraid mbox sysfs device attributes
static struct device_attribute *megaraid_sdev_attrs[] = {
&dev_attr_megaraid_mbox_ld,
NULL,
};
/* /*
* Scsi host template for megaraid unified driver * Scsi host template for megaraid unified driver
*/ */
...@@ -467,6 +507,8 @@ static struct scsi_host_template megaraid_template_g = { ...@@ -467,6 +507,8 @@ static struct scsi_host_template megaraid_template_g = {
.eh_bus_reset_handler = megaraid_reset_handler, .eh_bus_reset_handler = megaraid_reset_handler,
.eh_host_reset_handler = megaraid_reset_handler, .eh_host_reset_handler = megaraid_reset_handler,
.use_clustering = ENABLE_CLUSTERING, .use_clustering = ENABLE_CLUSTERING,
.sdev_attrs = megaraid_sdev_attrs,
.shost_attrs = megaraid_shost_attrs,
}; };
...@@ -953,6 +995,8 @@ megaraid_init_mbox(adapter_t *adapter) ...@@ -953,6 +995,8 @@ megaraid_init_mbox(adapter_t *adapter)
} }
adapter->device_ids[adapter->max_channel][adapter->init_id] = adapter->device_ids[adapter->max_channel][adapter->init_id] =
0xFF; 0xFF;
raid_dev->random_del_supported = 1;
} }
/* /*
...@@ -977,6 +1021,14 @@ megaraid_init_mbox(adapter_t *adapter) ...@@ -977,6 +1021,14 @@ megaraid_init_mbox(adapter_t *adapter)
*/ */
adapter->cmd_per_lun = megaraid_cmd_per_lun; adapter->cmd_per_lun = megaraid_cmd_per_lun;
/*
* Allocate resources required to issue FW calls, when sysfs is
* accessed
*/
if (megaraid_sysfs_alloc_resources(adapter) != 0) {
goto out_alloc_cmds;
}
// Set the DMA mask to 64-bit. All supported controllers as capable of // Set the DMA mask to 64-bit. All supported controllers as capable of
// DMA in this range // DMA in this range
if (pci_set_dma_mask(adapter->pdev, 0xFFFFFFFFFFFFFFFFULL) != 0) { if (pci_set_dma_mask(adapter->pdev, 0xFFFFFFFFFFFFFFFFULL) != 0) {
...@@ -984,7 +1036,7 @@ megaraid_init_mbox(adapter_t *adapter) ...@@ -984,7 +1036,7 @@ megaraid_init_mbox(adapter_t *adapter)
con_log(CL_ANN, (KERN_WARNING con_log(CL_ANN, (KERN_WARNING
"megaraid: could not set DMA mask for 64-bit.\n")); "megaraid: could not set DMA mask for 64-bit.\n"));
goto out_alloc_cmds; goto out_free_sysfs_res;
} }
// setup tasklet for DPC // setup tasklet for DPC
...@@ -996,6 +1048,8 @@ megaraid_init_mbox(adapter_t *adapter) ...@@ -996,6 +1048,8 @@ megaraid_init_mbox(adapter_t *adapter)
return 0; return 0;
out_free_sysfs_res:
megaraid_sysfs_free_resources(adapter);
out_alloc_cmds: out_alloc_cmds:
megaraid_free_cmd_packets(adapter); megaraid_free_cmd_packets(adapter);
out_free_irq: out_free_irq:
...@@ -1025,6 +1079,8 @@ megaraid_fini_mbox(adapter_t *adapter) ...@@ -1025,6 +1079,8 @@ megaraid_fini_mbox(adapter_t *adapter)
tasklet_kill(&adapter->dpc_h); tasklet_kill(&adapter->dpc_h);
megaraid_sysfs_free_resources(adapter);
megaraid_free_cmd_packets(adapter); megaraid_free_cmd_packets(adapter);
free_irq(adapter->irq, adapter); free_irq(adapter->irq, adapter);
...@@ -1559,12 +1615,14 @@ mbox_post_cmd(adapter_t *adapter, scb_t *scb) ...@@ -1559,12 +1615,14 @@ mbox_post_cmd(adapter_t *adapter, scb_t *scb)
if (scb->dma_direction == PCI_DMA_TODEVICE) { if (scb->dma_direction == PCI_DMA_TODEVICE) {
if (!scb->scp->use_sg) { // sg list not used if (!scb->scp->use_sg) { // sg list not used
pci_dma_sync_single_for_device(adapter->pdev, ccb->buf_dma_h, pci_dma_sync_single_for_device(adapter->pdev,
ccb->buf_dma_h,
scb->scp->request_bufflen, scb->scp->request_bufflen,
PCI_DMA_TODEVICE); PCI_DMA_TODEVICE);
} }
else { else {
pci_dma_sync_sg_for_device(adapter->pdev, scb->scp->request_buffer, pci_dma_sync_sg_for_device(adapter->pdev,
scb->scp->request_buffer,
scb->scp->use_sg, PCI_DMA_TODEVICE); scb->scp->use_sg, PCI_DMA_TODEVICE);
} }
} }
...@@ -2107,7 +2165,8 @@ megaraid_mbox_prepare_pthru(adapter_t *adapter, scb_t *scb, ...@@ -2107,7 +2165,8 @@ megaraid_mbox_prepare_pthru(adapter_t *adapter, scb_t *scb,
channel = scb->dev_channel; channel = scb->dev_channel;
target = scb->dev_target; target = scb->dev_target;
pthru->timeout = 1; // 0=6sec, 1=60sec, 2=10min, 3=3hrs // 0=6sec, 1=60sec, 2=10min, 3=3hrs, 4=NO timeout
pthru->timeout = 4;
pthru->ars = 1; pthru->ars = 1;
pthru->islogical = 0; pthru->islogical = 0;
pthru->channel = 0; pthru->channel = 0;
...@@ -2155,7 +2214,8 @@ megaraid_mbox_prepare_epthru(adapter_t *adapter, scb_t *scb, ...@@ -2155,7 +2214,8 @@ megaraid_mbox_prepare_epthru(adapter_t *adapter, scb_t *scb,
channel = scb->dev_channel; channel = scb->dev_channel;
target = scb->dev_target; target = scb->dev_target;
epthru->timeout = 1; // 0=6sec, 1=60sec, 2=10min, 3=3hrs // 0=6sec, 1=60sec, 2=10min, 3=3hrs, 4=NO timeout
epthru->timeout = 4;
epthru->ars = 1; epthru->ars = 1;
epthru->islogical = 0; epthru->islogical = 0;
epthru->channel = 0; epthru->channel = 0;
...@@ -3306,7 +3366,7 @@ megaraid_mbox_support_random_del(adapter_t *adapter) ...@@ -3306,7 +3366,7 @@ megaraid_mbox_support_random_del(adapter_t *adapter)
memset((caddr_t)raw_mbox, 0, sizeof(mbox_t)); memset((caddr_t)raw_mbox, 0, sizeof(mbox_t));
raw_mbox[0] = FC_DEL_LOGDRV; raw_mbox[0] = FC_DEL_LOGDRV;
raw_mbox[0] = OP_SUP_DEL_LOGDRV; raw_mbox[2] = OP_SUP_DEL_LOGDRV;
// Issue the command // Issue the command
rval = 0; rval = 0;
...@@ -3721,6 +3781,7 @@ megaraid_mbox_mm_command(adapter_t *adapter, uioc_t *kioc) ...@@ -3721,6 +3781,7 @@ megaraid_mbox_mm_command(adapter_t *adapter, uioc_t *kioc)
scb->state = SCB_ACTIVE; scb->state = SCB_ACTIVE;
scb->dma_type = MRAID_DMA_NONE; scb->dma_type = MRAID_DMA_NONE;
scb->dma_direction = PCI_DMA_NONE;
ccb = (mbox_ccb_t *)scb->ccb; ccb = (mbox_ccb_t *)scb->ccb;
mbox64 = (mbox64_t *)(unsigned long)kioc->cmdbuf; mbox64 = (mbox64_t *)(unsigned long)kioc->cmdbuf;
...@@ -3888,6 +3949,324 @@ gather_hbainfo(adapter_t *adapter, mraid_hba_info_t *hinfo) ...@@ -3888,6 +3949,324 @@ gather_hbainfo(adapter_t *adapter, mraid_hba_info_t *hinfo)
*/ */
/**
* megaraid_sysfs_alloc_resources - allocate sysfs related resources
*
* Allocate packets required to issue FW calls whenever the sysfs attributes
* are read. These attributes would require up-to-date information from the
* FW. Also set up resources for mutual exclusion to share these resources and
* the wait queue.
*
* @param adapter : controller's soft state
*
* @return 0 on success
* @return -ERROR_CODE on failure
*/
static int
megaraid_sysfs_alloc_resources(adapter_t *adapter)
{
mraid_device_t *raid_dev = ADAP2RAIDDEV(adapter);
int rval = 0;
raid_dev->sysfs_uioc = kmalloc(sizeof(uioc_t), GFP_KERNEL);
raid_dev->sysfs_mbox64 = kmalloc(sizeof(mbox64_t), GFP_KERNEL);
raid_dev->sysfs_buffer = pci_alloc_consistent(adapter->pdev,
PAGE_SIZE, &raid_dev->sysfs_buffer_dma);
if (!raid_dev->sysfs_uioc || !raid_dev->sysfs_mbox64 ||
!raid_dev->sysfs_buffer) {
con_log(CL_ANN, (KERN_WARNING
"megaraid: out of memory, %s %d\n", __FUNCTION__,
__LINE__));
rval = -ENOMEM;
megaraid_sysfs_free_resources(adapter);
}
sema_init(&raid_dev->sysfs_sem, 1);
init_waitqueue_head(&raid_dev->sysfs_wait_q);
return rval;
}
/**
* megaraid_sysfs_free_resources - free sysfs related resources
*
* Free packets allocated for sysfs FW commands
*
* @param adapter : controller's soft state
*/
static void
megaraid_sysfs_free_resources(adapter_t *adapter)
{
mraid_device_t *raid_dev = ADAP2RAIDDEV(adapter);
if (raid_dev->sysfs_uioc) kfree(raid_dev->sysfs_uioc);
if (raid_dev->sysfs_mbox64) kfree(raid_dev->sysfs_mbox64);
if (raid_dev->sysfs_buffer) {
pci_free_consistent(adapter->pdev, PAGE_SIZE,
raid_dev->sysfs_buffer, raid_dev->sysfs_buffer_dma);
}
}
/**
* megaraid_sysfs_get_ldmap_done - callback for get ldmap
*
* Callback routine called in the ISR/tasklet context for get ldmap call
*
* @param uioc : completed packet
*/
static void
megaraid_sysfs_get_ldmap_done(uioc_t *uioc)
{
adapter_t *adapter = (adapter_t *)uioc->buf_vaddr;
mraid_device_t *raid_dev = ADAP2RAIDDEV(adapter);
uioc->status = 0;
wake_up(&raid_dev->sysfs_wait_q);
}
/**
* megaraid_sysfs_get_ldmap_timeout - timeout handling for get ldmap
*
* Timeout routine to recover and return to application, in case the adapter
* has stopped responding. A timeout of 60 seconds for this command seem like
* a good value
*
* @param uioc : timed out packet
*/
static void
megaraid_sysfs_get_ldmap_timeout(unsigned long data)
{
uioc_t *uioc = (uioc_t *)data;
adapter_t *adapter = (adapter_t *)uioc->buf_vaddr;
mraid_device_t *raid_dev = ADAP2RAIDDEV(adapter);
uioc->status = -ETIME;
wake_up(&raid_dev->sysfs_wait_q);
}
/**
* megaraid_sysfs_get_ldmap - get update logical drive map
*
* This routine will be called whenever user reads the logical drive
* attributes, go get the current logical drive mapping table from the
* firmware. We use the managment API's to issue commands to the controller.
*
* NOTE: The commands issuance functionality is not generalized and
* implemented in context of "get ld map" command only. If required, the
* command issuance logical can be trivially pulled out and implemented as a
* standalone libary. For now, this should suffice since there is no other
* user of this interface.
*
* @param adapter : controller's soft state
*
* @return 0 on success
* @return -1 on failure
*/
static int
megaraid_sysfs_get_ldmap(adapter_t *adapter)
{
mraid_device_t *raid_dev = ADAP2RAIDDEV(adapter);
uioc_t *uioc;
mbox64_t *mbox64;
mbox_t *mbox;
char *raw_mbox;
struct timer_list sysfs_timer;
struct timer_list *timerp;
caddr_t ldmap;
int rval = 0;
/*
* Allow only one read at a time to go through the sysfs attributes
*/
down(&raid_dev->sysfs_sem);
uioc = raid_dev->sysfs_uioc;
mbox64 = raid_dev->sysfs_mbox64;
ldmap = raid_dev->sysfs_buffer;
memset(uioc, sizeof(uioc_t), 0);
memset(mbox64, sizeof(mbox64_t), 0);
memset(ldmap, sizeof(raid_dev->curr_ldmap), 0);
mbox = &mbox64->mbox32;
raw_mbox = (char *)mbox;
uioc->cmdbuf = (uint64_t)(unsigned long)mbox64;
uioc->buf_vaddr = (caddr_t)adapter;
uioc->status = -ENODATA;
uioc->done = megaraid_sysfs_get_ldmap_done;
/*
* Prepare the mailbox packet to get the current logical drive mapping
* table
*/
mbox->xferaddr = (uint32_t)raid_dev->sysfs_buffer_dma;
raw_mbox[0] = FC_DEL_LOGDRV;
raw_mbox[2] = OP_GET_LDID_MAP;
/*
* Setup a timer to recover from a non-responding controller
*/
timerp = &sysfs_timer;
init_timer(timerp);
timerp->function = megaraid_sysfs_get_ldmap_timeout;
timerp->data = (unsigned long)uioc;
timerp->expires = jiffies + 60 * HZ;
add_timer(timerp);
/*
* Send the command to the firmware
*/
rval = megaraid_mbox_mm_command(adapter, uioc);
if (rval == 0) { // command successfully issued
wait_event(raid_dev->sysfs_wait_q, (uioc->status != -ENODATA));
/*
* Check if the command timed out
*/
if (uioc->status == -ETIME) {
con_log(CL_ANN, (KERN_NOTICE
"megaraid: sysfs get ld map timed out\n"));
rval = -ETIME;
}
else {
rval = mbox->status;
}
if (rval == 0) {
memcpy(raid_dev->curr_ldmap, ldmap,
sizeof(raid_dev->curr_ldmap));
}
else {
con_log(CL_ANN, (KERN_NOTICE
"megaraid: get ld map failed with %x\n", rval));
}
}
else {
con_log(CL_ANN, (KERN_NOTICE
"megaraid: could not issue ldmap command:%x\n", rval));
}
del_timer_sync(timerp);
up(&raid_dev->sysfs_sem);
return rval;
}
/**
* megaraid_sysfs_show_app_hndl - display application handle for this adapter
*
* Display the handle used by the applications while executing management
* tasks on the adapter. We invoke a management module API to get the adapter
* handle, since we do not interface with applications directly.
*
* @param cdev : class device object representation for the host
* @param buf : buffer to send data to
*/
static ssize_t
megaraid_sysfs_show_app_hndl(struct class_device *cdev, char *buf)
{
struct Scsi_Host *shost = class_to_shost(cdev);
adapter_t *adapter = (adapter_t *)SCSIHOST2ADAP(shost);
uint32_t app_hndl;
app_hndl = mraid_mm_adapter_app_handle(adapter->unique_id);
return snprintf(buf, 8, "%u\n", app_hndl);
}
/**
* megaraid_sysfs_show_ldnum - display the logical drive number for this device
*
* Display the logical drive number for the device in question, if it a valid
* logical drive. For physical devices, "-1" is returned
* The logical drive number is displayed in following format
*
* <SCSI ID> <LD NUM> <LD STICKY ID> <APP ADAPTER HANDLE>
* <int> <int> <int> <int>
*
* @param dev : device object representation for the scsi device
* @param buf : buffer to send data to
*/
static ssize_t
megaraid_sysfs_show_ldnum(struct device *dev, char *buf)
{
struct scsi_device *sdev = to_scsi_device(dev);
adapter_t *adapter = (adapter_t *)SCSIHOST2ADAP(sdev->host);
mraid_device_t *raid_dev = ADAP2RAIDDEV(adapter);
int scsi_id = -1;
int logical_drv = -1;
int ldid_map = -1;
uint32_t app_hndl = 0;
int mapped_sdev_id;
int rval;
int i;
if (raid_dev->random_del_supported &&
MRAID_IS_LOGICAL_SDEV(adapter, sdev)) {
rval = megaraid_sysfs_get_ldmap(adapter);
if (rval == 0) {
for (i = 0; i < MAX_LOGICAL_DRIVES_40LD; i++) {
mapped_sdev_id = sdev->id;
if (sdev->id > adapter->init_id) {
mapped_sdev_id -= 1;
}
if (raid_dev->curr_ldmap[i] == mapped_sdev_id) {
scsi_id = sdev->id;
logical_drv = i;
ldid_map = raid_dev->curr_ldmap[i];
app_hndl = mraid_mm_adapter_app_handle(
adapter->unique_id);
break;
}
}
}
else {
con_log(CL_ANN, (KERN_NOTICE
"megaraid: sysfs get ld map failed: %x\n",
rval));
}
}
return snprintf(buf, 36, "%d %d %d %d\n", scsi_id, logical_drv,
ldid_map, app_hndl);
}
/* /*
* END: Mailbox Low Level Driver * END: Mailbox Low Level Driver
*/ */
......
...@@ -21,8 +21,8 @@ ...@@ -21,8 +21,8 @@
#include "megaraid_ioctl.h" #include "megaraid_ioctl.h"
#define MEGARAID_VERSION "2.20.4.1" #define MEGARAID_VERSION "2.20.4.5"
#define MEGARAID_EXT_VERSION "(Release Date: Thu Nov 4 17:44:59 EST 2004)" #define MEGARAID_EXT_VERSION "(Release Date: Thu Feb 03 12:27:22 EST 2005)"
/* /*
...@@ -137,6 +137,9 @@ ...@@ -137,6 +137,9 @@
#define PCI_SUBSYS_ID_PERC3_DC 0x0493 #define PCI_SUBSYS_ID_PERC3_DC 0x0493
#define PCI_SUBSYS_ID_PERC3_SC 0x0475 #define PCI_SUBSYS_ID_PERC3_SC 0x0475
#define PCI_DEVICE_ID_MEGARAID_NEC_ROMB_2E 0x0408
#define PCI_SUBSYS_ID_MEGARAID_NEC_ROMB_2E 0x8287
#ifndef PCI_SUBSYS_ID_FSC #ifndef PCI_SUBSYS_ID_FSC
#define PCI_SUBSYS_ID_FSC 0x1734 #define PCI_SUBSYS_ID_FSC 0x1734
#endif #endif
...@@ -216,6 +219,14 @@ typedef struct { ...@@ -216,6 +219,14 @@ typedef struct {
* @param hw_error : set if FW not responding * @param hw_error : set if FW not responding
* @param fast_load : If set, skip physical device scanning * @param fast_load : If set, skip physical device scanning
* @channel_class : channel class, RAID or SCSI * @channel_class : channel class, RAID or SCSI
* @sysfs_sem : semaphore to serialize access to sysfs res.
* @sysfs_uioc : management packet to issue FW calls from sysfs
* @sysfs_mbox64 : mailbox packet to issue FW calls from sysfs
* @sysfs_buffer : data buffer for FW commands issued from sysfs
* @sysfs_buffer_dma : DMA buffer for FW commands issued from sysfs
* @sysfs_wait_q : wait queue for sysfs operations
* @random_del_supported : set if the random deletion is supported
* @curr_ldmap : current LDID map
* *
* Initialization structure for mailbox controllers: memory based and IO based * Initialization structure for mailbox controllers: memory based and IO based
* All the fields in this structure are LLD specific and may be discovered at * All the fields in this structure are LLD specific and may be discovered at
...@@ -223,6 +234,7 @@ typedef struct { ...@@ -223,6 +234,7 @@ typedef struct {
* *
* NOTE: The fields of this structures are placed to minimize cache misses * NOTE: The fields of this structures are placed to minimize cache misses
*/ */
#define MAX_LD_EXTENDED64 64
typedef struct { typedef struct {
mbox64_t *una_mbox64; mbox64_t *una_mbox64;
dma_addr_t una_mbox64_dma; dma_addr_t una_mbox64_dma;
...@@ -247,6 +259,14 @@ typedef struct { ...@@ -247,6 +259,14 @@ typedef struct {
int hw_error; int hw_error;
int fast_load; int fast_load;
uint8_t channel_class; uint8_t channel_class;
struct semaphore sysfs_sem;
uioc_t *sysfs_uioc;
mbox64_t *sysfs_mbox64;
caddr_t sysfs_buffer;
dma_addr_t sysfs_buffer_dma;
wait_queue_head_t sysfs_wait_q;
int random_del_supported;
uint16_t curr_ldmap[MAX_LD_EXTENDED64];
} mraid_device_t; } mraid_device_t;
// route to raid device from adapter // route to raid device from adapter
......
...@@ -10,7 +10,7 @@ ...@@ -10,7 +10,7 @@
* 2 of the License, or (at your option) any later version. * 2 of the License, or (at your option) any later version.
* *
* FILE : megaraid_mm.c * FILE : megaraid_mm.c
* Version : v2.20.2.3 (Dec 09 2004) * Version : v2.20.2.5 (Jan 21 2005)
* *
* Common management module * Common management module
*/ */
...@@ -58,6 +58,7 @@ MODULE_PARM_DESC(dlevel, "Debug level (default=0)"); ...@@ -58,6 +58,7 @@ MODULE_PARM_DESC(dlevel, "Debug level (default=0)");
EXPORT_SYMBOL(mraid_mm_register_adp); EXPORT_SYMBOL(mraid_mm_register_adp);
EXPORT_SYMBOL(mraid_mm_unregister_adp); EXPORT_SYMBOL(mraid_mm_unregister_adp);
EXPORT_SYMBOL(mraid_mm_adapter_app_handle);
static int majorno; static int majorno;
static uint32_t drvr_ver = 0x02200201; static uint32_t drvr_ver = 0x02200201;
...@@ -65,7 +66,7 @@ static uint32_t drvr_ver = 0x02200201; ...@@ -65,7 +66,7 @@ static uint32_t drvr_ver = 0x02200201;
static int adapters_count_g; static int adapters_count_g;
static struct list_head adapters_list_g; static struct list_head adapters_list_g;
wait_queue_head_t wait_q; static wait_queue_head_t wait_q;
static struct file_operations lsi_fops = { static struct file_operations lsi_fops = {
.open = mraid_mm_open, .open = mraid_mm_open,
...@@ -1007,6 +1008,40 @@ mraid_mm_register_adp(mraid_mmadp_t *lld_adp) ...@@ -1007,6 +1008,40 @@ mraid_mm_register_adp(mraid_mmadp_t *lld_adp)
return rval; return rval;
} }
/**
* mraid_mm_adapter_app_handle - return the application handle for this adapter
*
* For the given driver data, locate the adadpter in our global list and
* return the corresponding handle, which is also used by applications to
* uniquely identify an adapter.
*
* @param unique_id : adapter unique identifier
*
* @return adapter handle if found in the list
* @return 0 if adapter could not be located, should never happen though
*/
uint32_t
mraid_mm_adapter_app_handle(uint32_t unique_id)
{
mraid_mmadp_t *adapter;
mraid_mmadp_t *tmp;
int index = 0;
list_for_each_entry_safe(adapter, tmp, &adapters_list_g, list) {
if (adapter->unique_id == unique_id) {
return MKADAP(index);
}
index++;
}
return 0;
}
/** /**
* mraid_mm_setup_dma_pools - Set up dma buffer pools per adapter * mraid_mm_setup_dma_pools - Set up dma buffer pools per adapter
* *
......
...@@ -29,9 +29,10 @@ ...@@ -29,9 +29,10 @@
#include "megaraid_ioctl.h" #include "megaraid_ioctl.h"
#define LSI_COMMON_MOD_VERSION "2.20.2.3" #define LSI_COMMON_MOD_VERSION "2.20.2.5"
#define LSI_COMMON_MOD_EXT_VERSION \ #define LSI_COMMON_MOD_EXT_VERSION \
"(Release Date: Thu Dec 9 19:02:14 EST 2004)" "(Release Date: Fri Jan 21 00:01:03 EST 2005)"
#define LSI_DBGLVL dbglevel #define LSI_DBGLVL dbglevel
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment