Re: How to add/drop SCSI drives from within the driver?

From: Brian King
Date: Fri Dec 03 2004 - 10:13:01 EST


This looks to be adding an LLD specific interface to userspace to
add/delete disks. Why can't the existing sysfs interfaces be used
to to this? (scan attribute on host and delete attribute on device).

-Brian

Bagalkote, Sreenivas wrote:
Hello All,

I am trying to implement a feature in my SCSI driver, where it can
trigger the SCSI mid-layer to scan or remove a particular drive. I appreciate any help in nudging me in the right direction.

The exported functions -

scsi_add_device( host, channel, target, lun )
scsi_remove_device( struct scsi_device* )

seem to work well in my limited testing. Are there any caveats in this
method? Does this method work well without exceptions? I am inlining
the full patch for megaraid SCSI driver taken against 2.6.10-rc2. I am
also attaching it to this mail.

Thank you,
Sreenivas


----
diff -Naur old-rc3/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 <Atul.Mukker@xxxxxxxx>
@@ -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
----


--
Brian King
eServer Storage I/O
IBM Linux Technology Center

-
To unsubscribe from this list: send the line "unsubscribe linux-kernel" in
the body of a message to majordomo@xxxxxxxxxxxxxxx
More majordomo info at http://vger.kernel.org/majordomo-info.html
Please read the FAQ at http://www.tux.org/lkml/