[SCSI] zfcp: Add FC pass-through support
authorSven Schuetz <sven@linux.vnet.ibm.com>
Mon, 6 Apr 2009 16:31:47 +0000 (18:31 +0200)
committerJames Bottomley <James.Bottomley@HansenPartnership.com>
Fri, 12 Jun 2009 19:20:05 +0000 (14:20 -0500)
Provide the ability to do fibre channel requests from the userspace to
our zfcp driver.  Patch builds upon extension to the fibre channel
tranport class by James Smart and Seokmann Ju.  See here
http://marc.info/?l=linux-scsi&m=123808882309133&w=2

Signed-off-by: Sven Schuetz <sven@linux.vnet.ibm.com>
Signed-off-by: Christof Schmitt <christof.schmitt@de.ibm.com>
Signed-off-by: James Bottomley <James.Bottomley@HansenPartnership.com>
drivers/s390/scsi/zfcp_aux.c
drivers/s390/scsi/zfcp_def.h
drivers/s390/scsi/zfcp_erp.c
drivers/s390/scsi/zfcp_ext.h
drivers/s390/scsi/zfcp_fc.c
drivers/s390/scsi/zfcp_scsi.c

index 3ac27ee..2ccbd18 100644 (file)
@@ -470,6 +470,12 @@ int zfcp_adapter_enqueue(struct ccw_device *ccw_device)
        if (!adapter)
                return -ENOMEM;
 
+       adapter->gs = kzalloc(sizeof(struct zfcp_wka_ports), GFP_KERNEL);
+       if (!adapter->gs) {
+               kfree(adapter);
+               return -ENOMEM;
+       }
+
        ccw_device->handler = NULL;
        adapter->ccw_device = ccw_device;
        atomic_set(&adapter->refcount, 0);
@@ -523,8 +529,7 @@ int zfcp_adapter_enqueue(struct ccw_device *ccw_device)
                goto sysfs_failed;
 
        atomic_clear_mask(ZFCP_STATUS_COMMON_REMOVE, &adapter->status);
-
-       zfcp_fc_nameserver_init(adapter);
+       zfcp_fc_wka_ports_init(adapter);
 
        if (!zfcp_adapter_scsi_register(adapter))
                return 0;
@@ -571,6 +576,7 @@ void zfcp_adapter_dequeue(struct zfcp_adapter *adapter)
        kfree(adapter->req_list);
        kfree(adapter->fc_stats);
        kfree(adapter->stats_reset_data);
+       kfree(adapter->gs);
        kfree(adapter);
 }
 
index 2074d45..49d0532 100644 (file)
@@ -22,6 +22,8 @@
 #include <linux/syscalls.h>
 #include <linux/scatterlist.h>
 #include <linux/ioctl.h>
+#include <scsi/fc/fc_fs.h>
+#include <scsi/fc/fc_gs.h>
 #include <scsi/scsi.h>
 #include <scsi/scsi_tcq.h>
 #include <scsi/scsi_cmnd.h>
@@ -29,6 +31,7 @@
 #include <scsi/scsi_host.h>
 #include <scsi/scsi_transport.h>
 #include <scsi/scsi_transport_fc.h>
+#include <scsi/scsi_bsg_fc.h>
 #include <asm/ccwdev.h>
 #include <asm/qdio.h>
 #include <asm/debug.h>
@@ -228,11 +231,6 @@ struct zfcp_ls_adisc {
 
 /* FC-PH/FC-GS well-known address identifiers for generic services */
 #define ZFCP_DID_WKA                           0xFFFFF0
-#define ZFCP_DID_MANAGEMENT_SERVICE            0xFFFFFA
-#define ZFCP_DID_TIME_SERVICE                  0xFFFFFB
-#define ZFCP_DID_DIRECTORY_SERVICE             0xFFFFFC
-#define ZFCP_DID_ALIAS_SERVICE                 0xFFFFF8
-#define ZFCP_DID_KEY_DISTRIBUTION_SERVICE      0xFFFFF7
 
 /* remote port status */
 #define ZFCP_STATUS_PORT_PHYS_OPEN             0x00000001
@@ -376,6 +374,14 @@ struct zfcp_wka_port {
        struct delayed_work     work;
 };
 
+struct zfcp_wka_ports {
+       struct zfcp_wka_port ms;        /* management service */
+       struct zfcp_wka_port ts;        /* time service */
+       struct zfcp_wka_port ds;        /* directory service */
+       struct zfcp_wka_port as;        /* alias service */
+       struct zfcp_wka_port ks;        /* key distribution service */
+};
+
 struct zfcp_qdio_queue {
        struct qdio_buffer *sbal[QDIO_MAX_BUFFERS_PER_Q];
        u8                 first;       /* index of next free bfr in queue */
@@ -461,7 +467,7 @@ struct zfcp_adapter {
                                                      actions */
        u32                     erp_low_mem_count; /* nr of erp actions waiting
                                                      for memory */
-       struct zfcp_wka_port    nsp;               /* adapter's nameserver */
+       struct zfcp_wka_ports   *gs;               /* generic services */
        debug_info_t            *rec_dbf;
        debug_info_t            *hba_dbf;
        debug_info_t            *san_dbf;          /* debug feature areas */
index e50ea46..8030e25 100644 (file)
@@ -719,7 +719,7 @@ static void zfcp_erp_adapter_strategy_close(struct zfcp_erp_action *act)
        zfcp_qdio_close(adapter);
        zfcp_fsf_req_dismiss_all(adapter);
        adapter->fsf_req_seq_no = 0;
-       zfcp_fc_wka_port_force_offline(&adapter->nsp);
+       zfcp_fc_wka_port_force_offline(&adapter->gs->ds);
        /* all ports and units are closed */
        zfcp_erp_modify_adapter_status(adapter, "erascl1", NULL,
                                       ZFCP_STATUS_COMMON_OPEN, ZFCP_CLEAR);
index 120a9a1..3044c60 100644 (file)
@@ -106,8 +106,12 @@ extern int zfcp_fc_ns_gid_pn(struct zfcp_erp_action *);
 extern void zfcp_fc_plogi_evaluate(struct zfcp_port *, struct fsf_plogi *);
 extern void zfcp_test_link(struct zfcp_port *);
 extern void zfcp_fc_link_test_work(struct work_struct *);
-extern void zfcp_fc_nameserver_init(struct zfcp_adapter *);
 extern void zfcp_fc_wka_port_force_offline(struct zfcp_wka_port *);
+extern void zfcp_fc_wka_ports_init(struct zfcp_adapter *);
+extern int zfcp_fc_execute_els_fc_job(struct fc_bsg_job *);
+extern int zfcp_fc_execute_ct_fc_job(struct fc_bsg_job *);
+extern void zfcp_fc_wka_port_force_offline(struct zfcp_wka_port *);
+
 
 /* zfcp_fsf.c */
 extern int zfcp_fsf_open_port(struct zfcp_erp_action *);
Simple merge
Simple merge