bk://linux-scsi.bkbits.net/scsi-rc-fixes-2.6 jejb@mulgrave.(none)|ChangeSet|20050204032147|32729 jejb # This is a BitKeeper generated diff -Nru style patch. # # ChangeSet # 2005/02/04 11:38:56-08:00 akpm@bix.(none) # Merge bk://linux-scsi.bkbits.net/scsi-rc-fixes-2.6 # into bix.(none):/usr/src/bk-scsi-rc-fixes # # drivers/scsi/megaraid/megaraid_mbox.c # 2005/02/04 11:38:52-08:00 akpm@bix.(none) +0 -0 # Auto merged # # ChangeSet # 2005/02/03 21:21:47-06:00 jejb@mulgrave.(none) # megaraid_mbox 2.20.4.3 patch # # From: Ju, Seokmann # # - sysfs support for drive addition/removal # - Tape drive timeout issue # - Made some code static # # Signed-off-by: James Bottomley # # drivers/scsi/megaraid/megaraid_mm.h # 2005/02/03 21:19:13-06:00 jejb@mulgrave.(none) +3 -2 # megaraid_mbox 2.20.4.3 patch # # drivers/scsi/megaraid/megaraid_mm.c # 2005/02/03 21:19:13-06:00 jejb@mulgrave.(none) +37 -2 # megaraid_mbox 2.20.4.3 patch # # drivers/scsi/megaraid/megaraid_mbox.h # 2005/02/03 21:19:13-06:00 jejb@mulgrave.(none) +22 -2 # megaraid_mbox 2.20.4.3 patch # # drivers/scsi/megaraid/megaraid_mbox.c # 2005/02/03 21:19:13-06:00 jejb@mulgrave.(none) +391 -12 # megaraid_mbox 2.20.4.3 patch # # drivers/scsi/megaraid/megaraid_ioctl.h # 2005/02/03 21:19:13-06:00 jejb@mulgrave.(none) +1 -0 # megaraid_mbox 2.20.4.3 patch # # drivers/scsi/megaraid/mega_common.h # 2005/02/03 21:19:13-06:00 jejb@mulgrave.(none) +3 -0 # megaraid_mbox 2.20.4.3 patch # # drivers/scsi/megaraid/Kconfig.megaraid # 2005/02/03 21:19:13-06:00 jejb@mulgrave.(none) +1 -0 # megaraid_mbox 2.20.4.3 patch # # Documentation/scsi/ChangeLog.megaraid # 2005/02/03 21:19:13-06:00 jejb@mulgrave.(none) +103 -1 # megaraid_mbox 2.20.4.3 patch # # ChangeSet # 2005/02/02 21:09:11-08:00 akpm@bix.(none) # Merge bix.(none):/usr/src/bk25 into bix.(none):/usr/src/bk-scsi-rc-fixes # # drivers/scsi/sr.c # 2005/02/02 21:09:04-08:00 akpm@bix.(none) +0 -0 # Auto merged # # ChangeSet # 2005/02/02 16:56:42-06:00 heiko.carstens@de.ibm.com # [PATCH] zfcp: bugfixes (without kfree) for -bk # # From: Andreas Herrmann # From: Maxim Shchetynin # # zfcp changes: # - don't call del_timer_sync() in interrupt context # - correct residual count handling for data underruns # - mark LUN as ACCESS_DENIED on status LUN_SHARING_VIOLATION # # Signed-off-by: Heiko Carstens # Signed-off-by: James Bottomley # # drivers/s390/scsi/zfcp_fsf.c # 2005/01/31 04:00:18-06:00 heiko.carstens@de.ibm.com +18 -19 # zfcp: bugfixes (without kfree) for -bk # # drivers/s390/scsi/zfcp_erp.c # 2005/01/31 03:44:30-06:00 heiko.carstens@de.ibm.com +3 -3 # zfcp: bugfixes (without kfree) for -bk # # ChangeSet # 2005/02/01 14:56:54-06:00 jejb@mulgrave.(none) # SCSI: fix HBA removal problem with transport classes # # James Smart pointed out that if you insert and remove a HBA driver a few # times, eventually the system oopses. # # The reason is that the transport classes all kfree their attribute # containers, but don't actually unregister them first (so we have freed # memory on the container list). The attached should fix this. # # Signed-off-by: James Bottomley # # drivers/scsi/scsi_transport_spi.c # 2005/02/01 14:54:44-06:00 jejb@mulgrave.(none) +3 -0 # SCSI: fix HBA removal problem with transport classes # # drivers/scsi/scsi_transport_iscsi.c # 2005/02/01 14:54:44-06:00 jejb@mulgrave.(none) +4 -0 # SCSI: fix HBA removal problem with transport classes # # drivers/scsi/scsi_transport_fc.c # 2005/02/01 14:54:44-06:00 jejb@mulgrave.(none) +3 -0 # SCSI: fix HBA removal problem with transport classes # # ChangeSet # 2005/01/28 14:38:23-08:00 akpm@bix.(none) # Merge bix.(none):/usr/src/bk25 into bix.(none):/usr/src/bk-scsi-rc-fixes # # drivers/scsi/sr.c # 2005/01/28 14:38:18-08:00 akpm@bix.(none) +0 -0 # Auto merged # # drivers/scsi/sg.c # 2005/01/28 14:38:18-08:00 akpm@bix.(none) +0 -0 # Auto merged # # drivers/scsi/sd.c # 2005/01/28 14:38:18-08:00 akpm@bix.(none) +0 -0 # Auto merged # # drivers/scsi/scsi_debug.c # 2005/01/28 14:38:18-08:00 akpm@bix.(none) +0 -0 # Auto merged # # drivers/scsi/osst.c # 2005/01/28 14:38:18-08:00 akpm@bix.(none) +0 -0 # Auto merged # # drivers/scsi/dpt_i2o.c # 2005/01/28 14:38:18-08:00 akpm@bix.(none) +0 -0 # Auto merged # # drivers/scsi/Kconfig # 2005/01/28 14:38:18-08:00 akpm@bix.(none) +0 -0 # Auto merged # # ChangeSet # 2005/01/26 18:44:38-08:00 akpm@bix.(none) # Merge bk://linux-scsi.bkbits.net/scsi-rc-fixes-2.6 # into bix.(none):/usr/src/bk-scsi-rc-fixes # # drivers/scsi/osst.c # 2005/01/26 18:44:34-08:00 akpm@bix.(none) +0 -0 # Auto merged # # ChangeSet # 2005/01/23 22:27:17-08:00 akpm@bix.(none) # Merge bk://linux-scsi.bkbits.net/scsi-rc-fixes-2.6 # into bix.(none):/usr/src/bk-scsi-rc-fixes # # drivers/scsi/sr.c # 2005/01/23 22:27:12-08:00 akpm@bix.(none) +0 -0 # Auto merged # # drivers/scsi/sg.c # 2005/01/23 22:27:12-08:00 akpm@bix.(none) +0 -0 # Auto merged # # drivers/scsi/sd.c # 2005/01/23 22:27:12-08:00 akpm@bix.(none) +0 -1 # Auto merged # # drivers/scsi/scsi_debug.c # 2005/01/23 22:27:12-08:00 akpm@bix.(none) +0 -0 # Auto merged # # drivers/scsi/dpt_i2o.c # 2005/01/23 22:27:12-08:00 akpm@bix.(none) +0 -0 # Auto merged # # drivers/scsi/Kconfig # 2005/01/23 22:27:12-08:00 akpm@bix.(none) +0 -0 # Auto merged # diff -Nru a/Documentation/scsi/ChangeLog.megaraid b/Documentation/scsi/ChangeLog.megaraid --- a/Documentation/scsi/ChangeLog.megaraid 2005-02-09 18:47:48 -08:00 +++ b/Documentation/scsi/ChangeLog.megaraid 2005-02-09 18:47:48 -08:00 @@ -1,3 +1,105 @@ +Release Date : Thu Feb 03 12:27:22 EST 2005 - Seokmann Ju +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 +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 +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 + + "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 , 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 , 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 , 01.06.2005 + linux-scsi mailing list + +2. Add AMI megaraid support - Brian King + 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 + 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 + +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 + +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 Current Version : 2.20.4.1 (scsi module), 2.20.2.3 (cmm module) @@ -13,7 +115,7 @@ i. Handle IOCTL cmd timeouts more properly. ii. pci_dma_sync_{sg,single}_for_cpu was introduced into megaraid_mbox - incorrectly (instead of _for_device). Changed to appropriate + incorrectly (instead of _for_device). Changed to appropriate pci_dma_sync_{sg,single}_for_device. Release Date : Wed Oct 06 11:15:29 EDT 2004 - Sreenivas Bagalkote diff -Nru a/drivers/s390/scsi/zfcp_erp.c b/drivers/s390/scsi/zfcp_erp.c --- a/drivers/s390/scsi/zfcp_erp.c 2005-02-09 18:47:48 -08:00 +++ b/drivers/s390/scsi/zfcp_erp.c 2005-02-09 18:47:48 -08:00 @@ -31,7 +31,7 @@ #define ZFCP_LOG_AREA ZFCP_LOG_AREA_ERP -#define ZFCP_ERP_REVISION "$Revision: 1.85 $" +#define ZFCP_ERP_REVISION "$Revision: 1.86 $" #include "zfcp_ext.h" @@ -369,7 +369,7 @@ ZFCP_LOG_NORMAL("error: initiation of Send ELS failed for port " "0x%08x on adapter %s\n", d_id, zfcp_get_busid_by_adapter(adapter)); - del_timer_sync(send_els->timer); + del_timer(send_els->timer); goto freemem; } @@ -969,7 +969,7 @@ debug_event(adapter->erp_dbf, 2, &erp_action->action, sizeof (int)); if (!(set_mask & ZFCP_STATUS_ERP_TIMEDOUT)) - del_timer_sync(&erp_action->timer); + del_timer(&erp_action->timer); erp_action->status |= set_mask; zfcp_erp_action_ready(erp_action); retval = 0; diff -Nru a/drivers/s390/scsi/zfcp_fsf.c b/drivers/s390/scsi/zfcp_fsf.c --- a/drivers/s390/scsi/zfcp_fsf.c 2005-02-09 18:47:48 -08:00 +++ b/drivers/s390/scsi/zfcp_fsf.c 2005-02-09 18:47:48 -08:00 @@ -30,7 +30,7 @@ * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. */ -#define ZFCP_FSF_C_REVISION "$Revision: 1.88 $" +#define ZFCP_FSF_C_REVISION "$Revision: 1.92 $" #include "zfcp_ext.h" @@ -3203,7 +3203,9 @@ sizeof (union fsf_status_qual)); debug_text_event(adapter->erp_dbf, 2, "fsf_s_l_sh_vio"); - zfcp_erp_unit_failed(unit); + zfcp_erp_unit_access_denied(unit); + atomic_clear_mask(ZFCP_STATUS_UNIT_SHARED, &unit->status); + atomic_clear_mask(ZFCP_STATUS_UNIT_READONLY, &unit->status); fsf_req->status |= ZFCP_STATUS_FSFREQ_ERROR; break; @@ -4320,22 +4322,19 @@ /* check for underrun */ if (unlikely(fcp_rsp_iu->validity.bits.fcp_resid_under)) { - ZFCP_LOG_DEBUG("A data underrun was detected for a command. " - "unit 0x%016Lx, port 0x%016Lx, adapter %s. " - "The response data length is " - "%d, the original length was %d.\n", - unit->fcp_lun, - unit->port->wwpn, - zfcp_get_busid_by_unit(unit), - fcp_rsp_iu->fcp_resid, - (int) zfcp_get_fcp_dl(fcp_cmnd_iu)); - /* - * It may not have been possible to send all data and the - * underrun on send may already be in scpnt->resid, so it's add - * not equals in the below statement. - */ - scpnt->resid += fcp_rsp_iu->fcp_resid; - ZFCP_LOG_TRACE("scpnt->resid=0x%x\n", scpnt->resid); + ZFCP_LOG_INFO("A data underrun was detected for a command. " + "unit 0x%016Lx, port 0x%016Lx, adapter %s. " + "The response data length is " + "%d, the original length was %d.\n", + unit->fcp_lun, + unit->port->wwpn, + zfcp_get_busid_by_unit(unit), + fcp_rsp_iu->fcp_resid, + (int) zfcp_get_fcp_dl(fcp_cmnd_iu)); + + scpnt->resid = fcp_rsp_iu->fcp_resid; + if (scpnt->request_bufflen - scpnt->resid < scpnt->underflow) + scpnt->result |= DID_ERROR << 16; } skip_fsfstatus: @@ -5023,7 +5022,7 @@ * timer might be expired (absolutely unlikely) */ if (timer) - del_timer_sync(timer); + del_timer(timer); write_lock_irqsave(&adapter->fsf_req_list_lock, flags); list_del(&fsf_req->list); write_unlock_irqrestore(&adapter->fsf_req_list_lock, flags); diff -Nru a/drivers/scsi/megaraid/Kconfig.megaraid b/drivers/scsi/megaraid/Kconfig.megaraid --- a/drivers/scsi/megaraid/Kconfig.megaraid 2005-02-09 18:47:48 -08:00 +++ b/drivers/scsi/megaraid/Kconfig.megaraid 2005-02-09 18:47:48 -08:00 @@ -59,6 +59,7 @@ INTEL RAID Controller SRCU51L 1000:1960:8086:0520 FSC MegaRAID PCI Express ROMB 1000:0408:1734:1065 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 module will be called megaraid_mbox diff -Nru a/drivers/scsi/megaraid/mega_common.h b/drivers/scsi/megaraid/mega_common.h --- a/drivers/scsi/megaraid/mega_common.h 2005-02-09 18:47:48 -08:00 +++ b/drivers/scsi/megaraid/mega_common.h 2005-02-09 18:47:48 -08:00 @@ -221,6 +221,9 @@ #define MRAID_IS_LOGICAL(adp, scp) \ (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) \ /* \ * Is the request coming for the virtual channel \ diff -Nru a/drivers/scsi/megaraid/megaraid_ioctl.h b/drivers/scsi/megaraid/megaraid_ioctl.h --- a/drivers/scsi/megaraid/megaraid_ioctl.h 2005-02-09 18:47:48 -08:00 +++ b/drivers/scsi/megaraid/megaraid_ioctl.h 2005-02-09 18:47:48 -08:00 @@ -291,5 +291,6 @@ int mraid_mm_register_adp(mraid_mmadp_t *); int mraid_mm_unregister_adp(uint32_t); +uint32_t mraid_mm_adapter_app_handle(uint32_t); #endif /* _MEGARAID_IOCTL_H_ */ diff -Nru a/drivers/scsi/megaraid/megaraid_mbox.c b/drivers/scsi/megaraid/megaraid_mbox.c --- a/drivers/scsi/megaraid/megaraid_mbox.c 2005-02-09 18:47:48 -08:00 +++ b/drivers/scsi/megaraid/megaraid_mbox.c 2005-02-09 18:47:48 -08:00 @@ -10,7 +10,7 @@ * 2 of the License, or (at your option) any later version. * * FILE : megaraid_mbox.c - * Version : v2.20.4.1 (Nov 04 2004) + * Version : v2.20.4.5 (Feb 03 2005) * * Authors: * Atul Mukker @@ -60,12 +60,11 @@ * INTEL RAID Controller SROMBU42E 1000 0408 8086 3499 * INTEL RAID Controller SRCU51L 1000 1960 8086 0520 * - * * FSC MegaRAID PCI Express ROMB 1000 0408 1734 1065 * - * * 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 */ @@ -91,6 +90,9 @@ static int megaraid_mbox_setup_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_reset_handler(struct scsi_cmnd *); @@ -121,6 +123,9 @@ 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_unregister(adapter_t *); static int megaraid_mbox_mm_handler(unsigned long, uioc_t *, uint32_t); @@ -197,7 +202,7 @@ * ### global data ### */ static uint8_t megaraid_mbox_version[8] = - { 0x02, 0x20, 0x04, 0x00, 9, 27, 20, 4 }; + { 0x02, 0x20, 0x04, 0x05, 2, 3, 20, 5 }; /* @@ -301,6 +306,12 @@ 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_DEVICE_ID_MEGARAID_SCSI_320_0, PCI_VENDOR_ID_LSI_LOGIC, @@ -438,6 +449,12 @@ PCI_VENDOR_ID_AI, 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 */ }; MODULE_DEVICE_TABLE(pci, pci_id_table_g); @@ -454,6 +471,29 @@ }; + +// 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 */ @@ -467,6 +507,8 @@ .eh_bus_reset_handler = megaraid_reset_handler, .eh_host_reset_handler = megaraid_reset_handler, .use_clustering = ENABLE_CLUSTERING, + .sdev_attrs = megaraid_sdev_attrs, + .shost_attrs = megaraid_shost_attrs, }; @@ -953,6 +995,8 @@ } adapter->device_ids[adapter->max_channel][adapter->init_id] = 0xFF; + + raid_dev->random_del_supported = 1; } /* @@ -977,6 +1021,14 @@ */ 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 // DMA in this range if (pci_set_dma_mask(adapter->pdev, 0xFFFFFFFFFFFFFFFFULL) != 0) { @@ -984,7 +1036,7 @@ con_log(CL_ANN, (KERN_WARNING "megaraid: could not set DMA mask for 64-bit.\n")); - goto out_alloc_cmds; + goto out_free_sysfs_res; } // setup tasklet for DPC @@ -996,6 +1048,8 @@ return 0; +out_free_sysfs_res: + megaraid_sysfs_free_resources(adapter); out_alloc_cmds: megaraid_free_cmd_packets(adapter); out_free_irq: @@ -1025,6 +1079,8 @@ tasklet_kill(&adapter->dpc_h); + megaraid_sysfs_free_resources(adapter); + megaraid_free_cmd_packets(adapter); free_irq(adapter->irq, adapter); @@ -1559,12 +1615,14 @@ if (scb->dma_direction == PCI_DMA_TODEVICE) { 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, PCI_DMA_TODEVICE); } 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); } } @@ -2107,7 +2165,8 @@ channel = scb->dev_channel; 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->islogical = 0; pthru->channel = 0; @@ -2155,7 +2214,8 @@ channel = scb->dev_channel; 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->islogical = 0; epthru->channel = 0; @@ -3306,7 +3366,7 @@ memset((caddr_t)raw_mbox, 0, sizeof(mbox_t)); raw_mbox[0] = FC_DEL_LOGDRV; - raw_mbox[0] = OP_SUP_DEL_LOGDRV; + raw_mbox[2] = OP_SUP_DEL_LOGDRV; // Issue the command rval = 0; @@ -3719,8 +3779,9 @@ spin_unlock_irqrestore(USER_FREE_LIST_LOCK(adapter), flags); - scb->state = SCB_ACTIVE; - scb->dma_type = MRAID_DMA_NONE; + scb->state = SCB_ACTIVE; + scb->dma_type = MRAID_DMA_NONE; + scb->dma_direction = PCI_DMA_NONE; ccb = (mbox_ccb_t *)scb->ccb; mbox64 = (mbox64_t *)(unsigned long)kioc->cmdbuf; @@ -3886,6 +3947,324 @@ /* * END: Interface for the common management module */ + + + +/** + * 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 + * + * + * + * + * @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); +} /* diff -Nru a/drivers/scsi/megaraid/megaraid_mbox.h b/drivers/scsi/megaraid/megaraid_mbox.h --- a/drivers/scsi/megaraid/megaraid_mbox.h 2005-02-09 18:47:48 -08:00 +++ b/drivers/scsi/megaraid/megaraid_mbox.h 2005-02-09 18:47:48 -08:00 @@ -21,8 +21,8 @@ #include "megaraid_ioctl.h" -#define MEGARAID_VERSION "2.20.4.1" -#define MEGARAID_EXT_VERSION "(Release Date: Thu Nov 4 17:44:59 EST 2004)" +#define MEGARAID_VERSION "2.20.4.5" +#define MEGARAID_EXT_VERSION "(Release Date: Thu Feb 03 12:27:22 EST 2005)" /* @@ -137,6 +137,9 @@ #define PCI_SUBSYS_ID_PERC3_DC 0x0493 #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 #define PCI_SUBSYS_ID_FSC 0x1734 #endif @@ -216,6 +219,14 @@ * @param hw_error : set if FW not responding * @param fast_load : If set, skip physical device scanning * @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 * All the fields in this structure are LLD specific and may be discovered at @@ -223,6 +234,7 @@ * * NOTE: The fields of this structures are placed to minimize cache misses */ +#define MAX_LD_EXTENDED64 64 typedef struct { mbox64_t *una_mbox64; dma_addr_t una_mbox64_dma; @@ -247,6 +259,14 @@ int hw_error; int fast_load; 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; // route to raid device from adapter diff -Nru a/drivers/scsi/megaraid/megaraid_mm.c b/drivers/scsi/megaraid/megaraid_mm.c --- a/drivers/scsi/megaraid/megaraid_mm.c 2005-02-09 18:47:48 -08:00 +++ b/drivers/scsi/megaraid/megaraid_mm.c 2005-02-09 18:47:48 -08:00 @@ -10,7 +10,7 @@ * 2 of the License, or (at your option) any later version. * * FILE : megaraid_mm.c - * Version : v2.20.2.3 (Dec 09 2004) + * Version : v2.20.2.5 (Jan 21 2005) * * Common management module */ @@ -58,6 +58,7 @@ EXPORT_SYMBOL(mraid_mm_register_adp); EXPORT_SYMBOL(mraid_mm_unregister_adp); +EXPORT_SYMBOL(mraid_mm_adapter_app_handle); static int majorno; static uint32_t drvr_ver = 0x02200201; @@ -65,7 +66,7 @@ static int adapters_count_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 = { .open = mraid_mm_open, @@ -1006,6 +1007,40 @@ 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 diff -Nru a/drivers/scsi/megaraid/megaraid_mm.h b/drivers/scsi/megaraid/megaraid_mm.h --- a/drivers/scsi/megaraid/megaraid_mm.h 2005-02-09 18:47:48 -08:00 +++ b/drivers/scsi/megaraid/megaraid_mm.h 2005-02-09 18:47:48 -08:00 @@ -29,9 +29,10 @@ #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 \ - "(Release Date: Thu Dec 9 19:02:14 EST 2004)" + "(Release Date: Fri Jan 21 00:01:03 EST 2005)" + #define LSI_DBGLVL dbglevel diff -Nru a/drivers/scsi/scsi_transport_fc.c b/drivers/scsi/scsi_transport_fc.c --- a/drivers/scsi/scsi_transport_fc.c 2005-02-09 18:47:48 -08:00 +++ b/drivers/scsi/scsi_transport_fc.c 2005-02-09 18:47:48 -08:00 @@ -847,6 +847,9 @@ { struct fc_internal *i = to_fc_internal(t); + attribute_container_unregister(&i->t.target_attrs); + attribute_container_unregister(&i->t.host_attrs); + kfree(i); } EXPORT_SYMBOL(fc_release_transport); diff -Nru a/drivers/scsi/scsi_transport_iscsi.c b/drivers/scsi/scsi_transport_iscsi.c --- a/drivers/scsi/scsi_transport_iscsi.c 2005-02-09 18:47:48 -08:00 +++ b/drivers/scsi/scsi_transport_iscsi.c 2005-02-09 18:47:48 -08:00 @@ -356,6 +356,10 @@ void iscsi_release_transport(struct scsi_transport_template *t) { struct iscsi_internal *i = to_iscsi_internal(t); + + attribute_container_unregister(&i->t.target_attrs); + attribute_container_unregister(&i->t.host_attrs); + kfree(i); } diff -Nru a/drivers/scsi/scsi_transport_spi.c b/drivers/scsi/scsi_transport_spi.c --- a/drivers/scsi/scsi_transport_spi.c 2005-02-09 18:47:48 -08:00 +++ b/drivers/scsi/scsi_transport_spi.c 2005-02-09 18:47:48 -08:00 @@ -921,6 +921,9 @@ { struct spi_internal *i = to_spi_internal(t); + attribute_container_unregister(&i->t.target_attrs); + attribute_container_unregister(&i->t.host_attrs); + kfree(i); } EXPORT_SYMBOL(spi_release_transport);