]> Pileus Git - ~andy/linux/blobdiff - include/scsi/libfc.h
Merge branch 'core-fixes-for-linus' of git://git.kernel.org/pub/scm/linux/kernel...
[~andy/linux] / include / scsi / libfc.h
index df57cb762dc20dd4e73b653e2ed34617b017503a..65dc9aacbf703b79874e32f8f61484a3e58856e9 100644 (file)
@@ -76,11 +76,7 @@ do {                                                         \
                                (port_id), ##args))
 
 #define FC_RPORT_DBG(rdata, fmt, args...)                              \
-do {                                                                   \
-       struct fc_lport *lport = rdata->local_port;                     \
-       struct fc_rport *rport = PRIV_TO_RPORT(rdata);                  \
-       FC_RPORT_ID_DBG(lport, rport->port_id, fmt, ##args);            \
-} while (0)
+       FC_RPORT_ID_DBG((rdata)->local_port, (rdata)->ids.port_id, fmt, ##args)
 
 #define FC_FCP_DBG(pkt, fmt, args...)                                  \
        FC_CHECK_LOGGING(FC_FCP_LOGGING,                                \
@@ -147,44 +143,32 @@ enum fc_rport_state {
        RPORT_ST_RTV,           /* waiting for RTV completion */
        RPORT_ST_READY,         /* ready for use */
        RPORT_ST_LOGO,          /* port logout sent */
+       RPORT_ST_ADISC,         /* Discover Address sent */
        RPORT_ST_DELETE,        /* port being deleted */
 };
 
-enum fc_rport_trans_state {
-       FC_PORTSTATE_ROGUE,
-       FC_PORTSTATE_REAL,
-};
-
 /**
  * struct fc_disc_port - temporary discovery port to hold rport identifiers
- * @lp: Fibre Channel host port instance
- * @peers: node for list management during discovery and RSCN processing
- * @ids: identifiers structure to pass to fc_remote_port_add()
- * @rport_work: work struct for starting the rport state machine
+ * @lp:         Fibre Channel host port instance
+ * @peers:      Node for list management during discovery and RSCN processing
+ * @rport_work: Work struct for starting the rport state machine
+ * @port_id:    Port ID of the discovered port
  */
 struct fc_disc_port {
        struct fc_lport             *lp;
        struct list_head            peers;
-       struct fc_rport_identifiers ids;
        struct work_struct          rport_work;
+       u32                         port_id;
 };
 
 enum fc_rport_event {
        RPORT_EV_NONE = 0,
-       RPORT_EV_CREATED,
+       RPORT_EV_READY,
        RPORT_EV_FAILED,
        RPORT_EV_STOP,
        RPORT_EV_LOGO
 };
 
-/*
- * Temporary definition to prepare for split off from fc_rport_libfc_priv
- * of a separately-allocated structure called fc_rport_priv.  This will
- * be the primary object for the discovery and rport state machines.
- * This definition is just to make this patch series easier to review.
- */
-#define fc_rport_priv fc_rport_libfc_priv
-
 struct fc_rport_priv;
 
 struct fc_rport_operations {
@@ -195,9 +179,32 @@ struct fc_rport_operations {
 /**
  * struct fc_rport_libfc_priv - libfc internal information about a remote port
  * @local_port: Fibre Channel host port instance
+ * @rp_state: indicates READY for I/O or DELETE when blocked.
+ * @flags: REC and RETRY supported flags
+ * @e_d_tov: error detect timeout value (in msec)
+ * @r_a_tov: resource allocation timeout value (in msec)
+ */
+struct fc_rport_libfc_priv {
+       struct fc_lport            *local_port;
+       enum fc_rport_state        rp_state;
+       u16                        flags;
+       #define FC_RP_FLAGS_REC_SUPPORTED       (1 << 0)
+       #define FC_RP_FLAGS_RETRY               (1 << 1)
+       unsigned int               e_d_tov;
+       unsigned int               r_a_tov;
+};
+
+/**
+ * struct fc_rport_priv - libfc rport and discovery info about a remote port
+ * @local_port: Fibre Channel host port instance
+ * @rport: transport remote port
+ * @kref: reference counter
  * @rp_state: state tracks progress of PLOGI, PRLI, and RTV exchanges
+ * @ids: remote port identifiers and roles
  * @flags: REC and RETRY supported flags
  * @max_seq: maximum number of concurrent sequences
+ * @disc_id: discovery identifier
+ * @maxframe_size: maximum frame size
  * @retries: retry count in current state
  * @e_d_tov: error detect timeout value (in msec)
  * @r_a_tov: resource allocation timeout value (in msec)
@@ -205,36 +212,28 @@ struct fc_rport_operations {
  * @retry_work:
  * @event_callback: Callback for rport READY, FAILED or LOGO
  */
-struct fc_rport_libfc_priv {
+struct fc_rport_priv {
        struct fc_lport            *local_port;
+       struct fc_rport            *rport;
+       struct kref                kref;
        enum fc_rport_state        rp_state;
+       struct fc_rport_identifiers ids;
        u16                        flags;
-       #define FC_RP_FLAGS_REC_SUPPORTED       (1 << 0)
-       #define FC_RP_FLAGS_RETRY               (1 << 1)
        u16                        max_seq;
+       u16                        disc_id;
+       u16                        maxframe_size;
        unsigned int               retries;
        unsigned int               e_d_tov;
        unsigned int               r_a_tov;
-       enum fc_rport_trans_state  trans_state;
        struct mutex               rp_mutex;
        struct delayed_work        retry_work;
        enum fc_rport_event        event;
        struct fc_rport_operations *ops;
        struct list_head           peers;
        struct work_struct         event_work;
+       u32                        supported_classes;
 };
 
-#define PRIV_TO_RPORT(x)                                               \
-       ((struct fc_rport *)((void *)(x) - sizeof(struct fc_rport)))
-#define RPORT_TO_PRIV(x)                                               \
-       ((struct fc_rport_libfc_priv *)((void *)(x) + sizeof(struct fc_rport)))
-
-static inline void fc_rport_set_name(struct fc_rport *rport, u64 wwpn, u64 wwnn)
-{
-       rport->node_name = wwnn;
-       rport->port_name = wwpn;
-}
-
 /*
  * fcoe stats structure
  */
@@ -424,7 +423,7 @@ struct libfc_function_template {
         * STATUS: OPTIONAL
         */
        struct fc_seq *(*elsct_send)(struct fc_lport *lport,
-                                    struct fc_rport_priv *,
+                                    u32 did,
                                     struct fc_frame *fp,
                                     unsigned int op,
                                     void (*resp)(struct fc_seq *,
@@ -567,10 +566,11 @@ struct libfc_function_template {
        int (*lport_reset)(struct fc_lport *);
 
        /*
-        * Create a remote port
+        * Create a remote port with a given port ID
+        *
+        * STATUS: OPTIONAL
         */
-       struct fc_rport_priv *(*rport_create)(struct fc_lport *,
-                                             struct fc_rport_identifiers *);
+       struct fc_rport_priv *(*rport_create)(struct fc_lport *, u32);
 
        /*
         * Initiates the RP state machine. It is called from the LP module.
@@ -599,7 +599,7 @@ struct libfc_function_template {
         * STATUS: OPTIONAL
         */
        void (*rport_recv_req)(struct fc_seq *, struct fc_frame *,
-                              struct fc_rport_priv *);
+                              struct fc_lport *);
 
        /*
         * lookup an rport by it's port ID.
@@ -608,6 +608,12 @@ struct libfc_function_template {
         */
        struct fc_rport_priv *(*rport_lookup)(const struct fc_lport *, u32);
 
+       /*
+        * Destroy an rport after final kref_put().
+        * The argument is a pointer to the kref inside the fc_rport_priv.
+        */
+       void (*rport_destroy)(struct kref *);
+
        /*
         * Send a fcp cmd from fsp pkt.
         * Called with the SCSI host lock unlocked and irqs disabled.
@@ -672,18 +678,16 @@ struct libfc_function_template {
 /* information used by the discovery layer */
 struct fc_disc {
        unsigned char           retry_count;
-       unsigned char           delay;
        unsigned char           pending;
        unsigned char           requested;
        unsigned short          seq_count;
        unsigned char           buf_len;
-       enum fc_disc_event      event;
+       u16                     disc_id;
 
        void (*disc_callback)(struct fc_lport *,
                              enum fc_disc_event);
 
        struct list_head         rports;
-       struct list_head         rogue_rports;
        struct fc_lport         *lport;
        struct mutex            disc_mutex;
        struct fc_gpn_ft_resp   partial_buf;    /* partial name buffer */
@@ -1081,4 +1085,9 @@ void fc_destroy_exch_mgr(void);
 int fc_setup_rport(void);
 void fc_destroy_rport(void);
 
+/*
+ * Internal libfc functions.
+ */
+const char *fc_els_resp_type(struct fc_frame *);
+
 #endif /* _LIBFC_H_ */