diff -Naur old-rc2/drivers/scsi/megaraid/mega_common.h new-rc2/drivers/scsi/megaraid/mega_common.h --- old-rc2/drivers/scsi/megaraid/mega_common.h 2004-10-18 17:54:31.000000000 -0400 +++ new-rc2/drivers/scsi/megaraid/mega_common.h 2004-12-02 20:23:35.000000000 -0500 @@ -242,6 +242,15 @@ [SCP2TARGET(scp)] & 0xFF); \ } +/** + * MRAID_LD_TARGET + * @param adp - Adapter's soft state + * @param ld - Logical drive number + * + * Macro to retrieve the SCSI target id of a logical drive + */ +#define MRAID_LD_TARGET(adp, ld) (((ld) < (adp)->init_id) ? (ld) : (ld)+1) + /* * ### Helper routines ### */ diff -Naur old-rc2/drivers/scsi/megaraid/megaraid_ioctl.h new-rc2/drivers/scsi/megaraid/megaraid_ioctl.h --- old-rc2/drivers/scsi/megaraid/megaraid_ioctl.h 2004-12-02 20:20:16.000000000 -0500 +++ new-rc2/drivers/scsi/megaraid/megaraid_ioctl.h 2004-12-02 20:23:25.000000000 -0500 @@ -51,8 +51,11 @@ #define MEGAIOC_QNADAP 'm' /* Query # of adapters */ #define MEGAIOC_QDRVRVER 'e' /* Query driver version */ #define MEGAIOC_QADAPINFO 'g' /* Query adapter information */ +#define MEGAIOC_ADD_LD 'a' +#define MEGAIOC_DEL_LD 'r' #define USCSICMD 0x80 +#define UIOC_NONE 0x00000 #define UIOC_RD 0x00001 #define UIOC_WR 0x00002 @@ -62,6 +65,8 @@ #define GET_ADAP_INFO 0x30000 #define GET_CAP 0x40000 #define GET_STATS 0x50000 +#define ADD_LD 0x60000 +#define DEL_LD 0x70000 #define GET_IOCTL_VERSION 0x01 #define EXT_IOCTL_SIGN_SZ 16 diff -Naur old-rc2/drivers/scsi/megaraid/megaraid_mbox.c new-rc2/drivers/scsi/megaraid/megaraid_mbox.c --- old-rc2/drivers/scsi/megaraid/megaraid_mbox.c 2004-12-02 20:20:16.000000000 -0500 +++ new-rc2/drivers/scsi/megaraid/megaraid_mbox.c 2004-12-02 20:32:33.408278216 -0500 @@ -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.1+ TEST VERSION * * Authors: * Atul Mukker @@ -3642,6 +3642,10 @@ megaraid_mbox_mm_handler(unsigned long drvr_data, uioc_t *kioc, uint32_t action) { adapter_t *adapter; + uint32_t ld; + struct scsi_device* sdev; + int ch; + int tg; if (action != IOCTL_ISSUE) { con_log(CL_ANN, (KERN_WARNING @@ -3670,6 +3674,31 @@ return kioc->status; + case ADD_LD: + ld = *(uint32_t*) kioc->buf_vaddr; + ch = adapter->max_channel; + tg = MRAID_LD_TARGET( adapter, ld ); + scsi_add_device(adapter->host, ch, tg, 0); + + kioc->status = 0; + kioc->done(kioc); + return kioc->status; + + case DEL_LD: + ld = *(uint32_t*) kioc->buf_vaddr; + ch = adapter->max_channel; + tg = MRAID_LD_TARGET( adapter, ld ); + sdev = scsi_device_lookup( adapter->host, ch, tg, 0); + + if( sdev ) { + scsi_remove_device( sdev ); + scsi_device_put( sdev ); + } + + kioc->status = 0; + kioc->done(kioc); + return kioc->status; + case MBOX_CMD: return megaraid_mbox_mm_command(adapter, kioc); diff -Naur old-rc2/drivers/scsi/megaraid/megaraid_mbox.h new-rc2/drivers/scsi/megaraid/megaraid_mbox.h --- old-rc2/drivers/scsi/megaraid/megaraid_mbox.h 2004-12-02 20:20:16.000000000 -0500 +++ new-rc2/drivers/scsi/megaraid/megaraid_mbox.h 2004-12-02 20:32:09.737876664 -0500 @@ -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.1+ TEST VERSION" +#define MEGARAID_EXT_VERSION "(Release Date: TEST VERSION)" /* diff -Naur old-rc2/drivers/scsi/megaraid/megaraid_mm.c new-rc2/drivers/scsi/megaraid/megaraid_mm.c --- old-rc2/drivers/scsi/megaraid/megaraid_mm.c 2004-12-02 20:20:16.000000000 -0500 +++ new-rc2/drivers/scsi/megaraid/megaraid_mm.c 2004-12-02 20:22:57.000000000 -0500 @@ -373,6 +373,34 @@ if (mraid_mm_attach_buf(adp, kioc, kioc->xferlen)) return (-ENOMEM); } + else if (subopcode == MEGAIOC_ADD_LD) { + + kioc->opcode = ADD_LD; + kioc->data_dir = UIOC_NONE; + kioc->xferlen = sizeof(uint32_t); + + if (mraid_mm_attach_buf(adp, kioc, kioc->xferlen)) + return -(ENOMEM); + + if (copy_from_user(kioc->buf_vaddr, mimd.data, + kioc->xferlen)) { + return (-EFAULT); + } + } + else if (subopcode == MEGAIOC_DEL_LD) { + + kioc->opcode = DEL_LD; + kioc->data_dir = UIOC_NONE; + kioc->xferlen = sizeof(uint32_t); + + if (mraid_mm_attach_buf(adp, kioc, kioc->xferlen)) + return -(ENOMEM); + + if (copy_from_user(kioc->buf_vaddr, mimd.data, + kioc->xferlen)) { + return (-EFAULT); + } + } else { con_log(CL_ANN, (KERN_WARNING "megaraid cmm: Invalid subop\n")); @@ -809,6 +837,9 @@ return 0; + case MEGAIOC_ADD_LD: + case MEGAIOC_DEL_LD: + return 0; default: return (-EINVAL); } diff -Naur old-rc2/drivers/scsi/megaraid/megaraid_mm.h new-rc2/drivers/scsi/megaraid/megaraid_mm.h --- old-rc2/drivers/scsi/megaraid/megaraid_mm.h 2004-12-02 20:20:16.000000000 -0500 +++ new-rc2/drivers/scsi/megaraid/megaraid_mm.h 2004-12-02 20:33:00.709127856 -0500 @@ -29,9 +29,9 @@ #include "megaraid_ioctl.h" -#define LSI_COMMON_MOD_VERSION "2.20.2.2" +#define LSI_COMMON_MOD_VERSION "2.20.2.2+ TEST VERSION" #define LSI_COMMON_MOD_EXT_VERSION \ - "(Release Date: Thu Nov 4 17:46:29 EST 2004)" + "(Release Date: TEST VERSION)" #define LSI_DBGLVL dbglevel