Linux Kernel  3.7.1
 All Data Structures Namespaces Files Functions Variables Typedefs Enumerations Enumerator Macros Groups Pages
libfc.h
Go to the documentation of this file.
1 /*
2  * Copyright(c) 2007 Intel Corporation. All rights reserved.
3  *
4  * This program is free software; you can redistribute it and/or modify it
5  * under the terms and conditions of the GNU General Public License,
6  * version 2, as published by the Free Software Foundation.
7  *
8  * This program is distributed in the hope it will be useful, but WITHOUT
9  * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
10  * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for
11  * more details.
12  *
13  * You should have received a copy of the GNU General Public License along with
14  * this program; if not, write to the Free Software Foundation, Inc.,
15  * 51 Franklin St - Fifth Floor, Boston, MA 02110-1301 USA.
16  *
17  * Maintained at www.Open-FCoE.org
18  */
19 
20 #ifndef _LIBFC_H_
21 #define _LIBFC_H_
22 
23 #include <linux/timer.h>
24 #include <linux/if.h>
25 #include <linux/percpu.h>
26 
27 #include <scsi/scsi_transport.h>
28 #include <scsi/scsi_transport_fc.h>
29 #include <scsi/scsi_bsg_fc.h>
30 
31 #include <scsi/fc/fc_fcp.h>
32 #include <scsi/fc/fc_ns.h>
33 #include <scsi/fc/fc_ms.h>
34 #include <scsi/fc/fc_els.h>
35 #include <scsi/fc/fc_gs.h>
36 
37 #include <scsi/fc_frame.h>
38 
39 #define FC_FC4_PROV_SIZE (FC_TYPE_FCP + 1) /* size of tables */
40 
41 /*
42  * libfc error codes
43  */
44 #define FC_NO_ERR 0 /* no error */
45 #define FC_EX_TIMEOUT 1 /* Exchange timeout */
46 #define FC_EX_CLOSED 2 /* Exchange closed */
47 
81 };
82 
87 };
88 
111 };
112 
120 struct fc_disc_port {
121  struct fc_lport *lp;
122  struct list_head peers;
125 };
126 
141 };
142 
143 struct fc_rport_priv;
144 
150  void (*event_callback)(struct fc_lport *, struct fc_rport_priv *,
151  enum fc_rport_event);
152 };
153 
166  #define FC_RP_FLAGS_REC_SUPPORTED (1 << 0)
167  #define FC_RP_FLAGS_RETRY (1 << 1)
168  #define FC_RP_STARTED (1 << 2)
169  #define FC_RP_FLAGS_CONF_REQ (1 << 3)
170  unsigned int e_d_tov;
171  unsigned int r_a_tov;
172 };
173 
198  struct fc_rport *rport;
199  struct kref kref;
206  unsigned int retries;
207  unsigned int major_retries;
208  unsigned int e_d_tov;
209  unsigned int r_a_tov;
210  struct mutex rp_mutex;
214  struct list_head peers;
218  struct rcu_head rcu;
222  struct fc_rport_priv *,
223  enum fc_rport_event);
224 };
225 
250 struct fc_stats {
272 };
273 
284 };
285 
317 struct fc_fcp_pkt {
320 
321  /* SCSI command and data transfer information */
323 
324  /* SCSI I/O related information */
325  struct scsi_cmnd *cmd;
326  struct list_head list;
327 
328  /* Housekeeping information */
329  struct fc_lport *lp;
331 
332  /* SCSI/FCP return status */
339 
340  /* Transport related veriables */
341  size_t xfer_len;
346 
347  /* Associated structures */
348  struct fc_rport *rport;
349  struct fc_seq *seq_ptr;
350 
351  /* Timeout/error related information */
355  struct fc_seq *recov_seq;
358 
359 /*
360  * Structure and function definitions for managing Fibre Channel Exchanges
361  * and Sequences
362  *
363  * fc_exch holds state for one exchange and links to its active sequence.
364  *
365  * fc_seq holds the state for an individual sequence.
366  */
367 
368 struct fc_exch_mgr;
369 struct fc_exch_mgr_anchor;
370 extern u16 fc_cpu_mask; /* cpu mask for possible cpus */
371 
379 struct fc_seq {
384 };
385 
386 #define FC_EX_DONE (1 << 0) /* ep is completed */
387 #define FC_EX_RST_CLEANUP (1 << 1) /* reset is forcing completion */
388 
422 struct fc_exch {
425  enum fc_class class;
426  struct fc_exch_mgr *em;
429  struct fc_lport *lp;
443  struct fc_seq seq;
444  void (*resp)(struct fc_seq *, struct fc_frame *, void *);
445  void *arg;
446  void (*destructor)(struct fc_seq *, void *);
449 #define fc_seq_exch(sp) container_of(sp, struct fc_exch, seq)
450 
451 
453  /*
454  * Interface to send a FC frame
455  *
456  * STATUS: REQUIRED
457  */
458  int (*frame_send)(struct fc_lport *, struct fc_frame *);
459 
460  /*
461  * Interface to send ELS/CT frames
462  *
463  * STATUS: OPTIONAL
464  */
465  struct fc_seq *(*elsct_send)(struct fc_lport *, u32 did,
466  struct fc_frame *, unsigned int op,
467  void (*resp)(struct fc_seq *,
468  struct fc_frame *, void *arg),
469  void *arg, u32 timer_msec);
470 
471  /*
472  * Send the FC frame payload using a new exchange and sequence.
473  *
474  * The exchange response handler is set in this routine to resp()
475  * function pointer. It can be called in two scenarios: if a timeout
476  * occurs or if a response frame is received for the exchange. The
477  * fc_frame pointer in response handler will also indicate timeout
478  * as error using IS_ERR related macros.
479  *
480  * The exchange destructor handler is also set in this routine.
481  * The destructor handler is invoked by EM layer when exchange
482  * is about to free, this can be used by caller to free its
483  * resources along with exchange free.
484  *
485  * The arg is passed back to resp and destructor handler.
486  *
487  * The timeout value (in msec) for an exchange is set if non zero
488  * timer_msec argument is specified. The timer is canceled when
489  * it fires or when the exchange is done. The exchange timeout handler
490  * is registered by EM layer.
491  *
492  * STATUS: OPTIONAL
493  */
494  struct fc_seq *(*exch_seq_send)(struct fc_lport *, struct fc_frame *,
495  void (*resp)(struct fc_seq *,
496  struct fc_frame *,
497  void *),
498  void (*destructor)(struct fc_seq *,
499  void *),
500  void *, unsigned int timer_msec);
501 
502  /*
503  * Sets up the DDP context for a given exchange id on the given
504  * scatterlist if LLD supports DDP for large receive.
505  *
506  * STATUS: OPTIONAL
507  */
508  int (*ddp_setup)(struct fc_lport *, u16, struct scatterlist *,
509  unsigned int);
510  /*
511  * Completes the DDP transfer and returns the length of data DDPed
512  * for the given exchange id.
513  *
514  * STATUS: OPTIONAL
515  */
516  int (*ddp_done)(struct fc_lport *, u16);
517  /*
518  * Sets up the DDP context for a given exchange id on the given
519  * scatterlist if LLD supports DDP for target.
520  *
521  * STATUS: OPTIONAL
522  */
523  int (*ddp_target)(struct fc_lport *, u16, struct scatterlist *,
524  unsigned int);
525  /*
526  * Allow LLD to fill its own Link Error Status Block
527  *
528  * STATUS: OPTIONAL
529  */
530  void (*get_lesb)(struct fc_lport *, struct fc_els_lesb *lesb);
531  /*
532  * Send a frame using an existing sequence and exchange.
533  *
534  * STATUS: OPTIONAL
535  */
536  int (*seq_send)(struct fc_lport *, struct fc_seq *,
537  struct fc_frame *);
538 
539  /*
540  * Send an ELS response using information from the received frame.
541  *
542  * STATUS: OPTIONAL
543  */
545  struct fc_seq_els_data *);
546 
547  /*
548  * Abort an exchange and sequence. Generally called because of a
549  * exchange timeout or an abort from the upper layer.
550  *
551  * A timer_msec can be specified for abort timeout, if non-zero
552  * timer_msec value is specified then exchange resp handler
553  * will be called with timeout error if no response to abort.
554  *
555  * STATUS: OPTIONAL
556  */
557  int (*seq_exch_abort)(const struct fc_seq *,
558  unsigned int timer_msec);
559 
560  /*
561  * Indicate that an exchange/sequence tuple is complete and the memory
562  * allocated for the related objects may be freed.
563  *
564  * STATUS: OPTIONAL
565  */
566  void (*exch_done)(struct fc_seq *);
567 
568  /*
569  * Start a new sequence on the same exchange/sequence tuple.
570  *
571  * STATUS: OPTIONAL
572  */
573  struct fc_seq *(*seq_start_next)(struct fc_seq *);
574 
575  /*
576  * Set a response handler for the exchange of the sequence.
577  *
578  * STATUS: OPTIONAL
579  */
581  void (*resp)(struct fc_seq *, struct fc_frame *,
582  void *),
583  void *arg);
584 
585  /*
586  * Assign a sequence for an incoming request frame.
587  *
588  * STATUS: OPTIONAL
589  */
590  struct fc_seq *(*seq_assign)(struct fc_lport *, struct fc_frame *);
591 
592  /*
593  * Release the reference on the sequence returned by seq_assign().
594  *
595  * STATUS: OPTIONAL
596  */
597  void (*seq_release)(struct fc_seq *);
598 
599  /*
600  * Reset an exchange manager, completing all sequences and exchanges.
601  * If s_id is non-zero, reset only exchanges originating from that FID.
602  * If d_id is non-zero, reset only exchanges sending to that FID.
603  *
604  * STATUS: OPTIONAL
605  */
607 
608  /*
609  * Flush the rport work queue. Generally used before shutdown.
610  *
611  * STATUS: OPTIONAL
612  */
614 
615  /*
616  * Receive a frame for a local port.
617  *
618  * STATUS: OPTIONAL
619  */
620  void (*lport_recv)(struct fc_lport *, struct fc_frame *);
621 
622  /*
623  * Reset the local port.
624  *
625  * STATUS: OPTIONAL
626  */
627  int (*lport_reset)(struct fc_lport *);
628 
629  /*
630  * Set the local port FC_ID.
631  *
632  * This may be provided by the LLD to allow it to be
633  * notified when the local port is assigned a FC-ID.
634  *
635  * The frame, if non-NULL, is the incoming frame with the
636  * FLOGI LS_ACC or FLOGI, and may contain the granted MAC
637  * address for the LLD. The frame pointer may be NULL if
638  * no MAC is associated with this assignment (LOGO or PLOGI).
639  *
640  * If FC_ID is non-zero, r_a_tov and e_d_tov must be valid.
641  *
642  * Note: this is called with the local port mutex held.
643  *
644  * STATUS: OPTIONAL
645  */
647  struct fc_frame *);
648 
649  /*
650  * Create a remote port with a given port ID
651  *
652  * STATUS: OPTIONAL
653  */
654  struct fc_rport_priv *(*rport_create)(struct fc_lport *, u32);
655 
656  /*
657  * Initiates the RP state machine. It is called from the LP module.
658  * This function will issue the following commands to the N_Port
659  * identified by the FC ID provided.
660  *
661  * - PLOGI
662  * - PRLI
663  * - RTV
664  *
665  * STATUS: OPTIONAL
666  */
668 
669  /*
670  * Logoff, and remove the rport from the transport if
671  * it had been added. This will send a LOGO to the target.
672  *
673  * STATUS: OPTIONAL
674  */
676 
677  /*
678  * Receive a request from a remote port.
679  *
680  * STATUS: OPTIONAL
681  */
682  void (*rport_recv_req)(struct fc_lport *, struct fc_frame *);
683 
684  /*
685  * lookup an rport by it's port ID.
686  *
687  * STATUS: OPTIONAL
688  */
689  struct fc_rport_priv *(*rport_lookup)(const struct fc_lport *, u32);
690 
691  /*
692  * Destroy an rport after final kref_put().
693  * The argument is a pointer to the kref inside the fc_rport_priv.
694  */
695  void (*rport_destroy)(struct kref *);
696 
697  /*
698  * Callback routine after the remote port is logged in
699  *
700  * STATUS: OPTIONAL
701  */
703  struct fc_rport_priv *,
704  enum fc_rport_event);
705 
706  /*
707  * Send a fcp cmd from fsp pkt.
708  * Called with the SCSI host lock unlocked and irqs disabled.
709  *
710  * The resp handler is called when FCP_RSP received.
711  *
712  * STATUS: OPTIONAL
713  */
714  int (*fcp_cmd_send)(struct fc_lport *, struct fc_fcp_pkt *,
715  void (*resp)(struct fc_seq *, struct fc_frame *,
716  void *));
717 
718  /*
719  * Cleanup the FCP layer, used during link down and reset
720  *
721  * STATUS: OPTIONAL
722  */
723  void (*fcp_cleanup)(struct fc_lport *);
724 
725  /*
726  * Abort all I/O on a local port
727  *
728  * STATUS: OPTIONAL
729  */
730  void (*fcp_abort_io)(struct fc_lport *);
731 
732  /*
733  * Receive a request for the discovery layer.
734  *
735  * STATUS: OPTIONAL
736  */
737  void (*disc_recv_req)(struct fc_lport *, struct fc_frame *);
738 
739  /*
740  * Start discovery for a local port.
741  *
742  * STATUS: OPTIONAL
743  */
744  void (*disc_start)(void (*disc_callback)(struct fc_lport *,
745  enum fc_disc_event),
746  struct fc_lport *);
747 
748  /*
749  * Stop discovery for a given lport. This will remove
750  * all discovered rports
751  *
752  * STATUS: OPTIONAL
753  */
754  void (*disc_stop) (struct fc_lport *);
755 
756  /*
757  * Stop discovery for a given lport. This will block
758  * until all discovered rports are deleted from the
759  * FC transport class
760  *
761  * STATUS: OPTIONAL
762  */
764 };
765 
782 struct fc_disc {
783  unsigned char retry_count;
784  unsigned char pending;
785  unsigned char requested;
786  unsigned short seq_count;
787  unsigned char buf_len;
789 
791  void *priv;
795 
797  enum fc_disc_event);
798 };
799 
800 /*
801  * Local port notifier and events.
802  */
807 };
808 
854 struct fc_lport {
855  /* Associations */
856  struct Scsi_Host *host;
861  void *scsi_priv;
862  struct fc_disc disc;
863 
864  /* Virtual port information */
866  struct fc_vport *vport;
867 
868  /* Operational Information */
873  unsigned long boot_time;
877 
878  /* Fabric information */
882  unsigned int service_params;
883  unsigned int e_d_tov;
884  unsigned int r_a_tov;
886 
887  /* Capabilities */
903  unsigned int lso_max;
904  struct fc_ns_fts fcts;
905 
906  /* Miscellaneous */
907  struct mutex lp_mutex;
908  struct list_head list;
912 };
913 
921 struct fc4_prov {
922  int (*prli)(struct fc_rport_priv *, u32 spp_len,
923  const struct fc_els_spp *spp_in,
924  struct fc_els_spp *spp_out);
925  void (*prlo)(struct fc_rport_priv *);
926  void (*recv)(struct fc_lport *, struct fc_frame *);
927  struct module *module;
928 };
929 
930 /*
931  * Register FC-4 provider with libfc.
932  */
935 
936 /*
937  * FC_LPORT HELPER FUNCTIONS
938  *****************************/
939 
944 static inline int fc_lport_test_ready(struct fc_lport *lport)
945 {
946  return lport->state == LPORT_ST_READY;
947 }
948 
954 static inline void fc_set_wwnn(struct fc_lport *lport, u64 wwnn)
955 {
956  lport->wwnn = wwnn;
957 }
958 
964 static inline void fc_set_wwpn(struct fc_lport *lport, u64 wwnn)
965 {
966  lport->wwpn = wwnn;
967 }
968 
974 static inline void fc_lport_state_enter(struct fc_lport *lport,
975  enum fc_lport_state state)
976 {
977  if (state != lport->state)
978  lport->retry_count = 0;
979  lport->state = state;
980 }
981 
986 static inline int fc_lport_init_stats(struct fc_lport *lport)
987 {
988  lport->stats = alloc_percpu(struct fc_stats);
989  if (!lport->stats)
990  return -ENOMEM;
991  return 0;
992 }
993 
998 static inline void fc_lport_free_stats(struct fc_lport *lport)
999 {
1000  free_percpu(lport->stats);
1001 }
1002 
1007 static inline void *lport_priv(const struct fc_lport *lport)
1008 {
1009  return (void *)(lport + 1);
1010 }
1011 
1020 static inline struct fc_lport *
1021 libfc_host_alloc(struct scsi_host_template *sht, int priv_size)
1022 {
1023  struct fc_lport *lport;
1024  struct Scsi_Host *shost;
1025 
1026  shost = scsi_host_alloc(sht, sizeof(*lport) + priv_size);
1027  if (!shost)
1028  return NULL;
1029  lport = shost_priv(shost);
1030  lport->host = shost;
1031  INIT_LIST_HEAD(&lport->ema_list);
1032  INIT_LIST_HEAD(&lport->vports);
1033  return lport;
1034 }
1035 
1036 /*
1037  * FC_FCP HELPER FUNCTIONS
1038  *****************************/
1039 static inline bool fc_fcp_is_read(const struct fc_fcp_pkt *fsp)
1040 {
1041  if (fsp && fsp->cmd)
1042  return fsp->cmd->sc_data_direction == DMA_FROM_DEVICE;
1043  return false;
1044 }
1045 
1046 /*
1047  * LOCAL PORT LAYER
1048  *****************************/
1049 int fc_lport_init(struct fc_lport *);
1050 int fc_lport_destroy(struct fc_lport *);
1051 int fc_fabric_logoff(struct fc_lport *);
1052 int fc_fabric_login(struct fc_lport *);
1053 void __fc_linkup(struct fc_lport *);
1054 void fc_linkup(struct fc_lport *);
1055 void __fc_linkdown(struct fc_lport *);
1056 void fc_linkdown(struct fc_lport *);
1057 void fc_vport_setlink(struct fc_lport *);
1058 void fc_vports_linkchange(struct fc_lport *);
1059 int fc_lport_config(struct fc_lport *);
1060 int fc_lport_reset(struct fc_lport *);
1061 int fc_set_mfs(struct fc_lport *, u32 mfs);
1062 struct fc_lport *libfc_vport_create(struct fc_vport *, int privsize);
1063 struct fc_lport *fc_vport_id_lookup(struct fc_lport *, u32 port_id);
1064 int fc_lport_bsg_request(struct fc_bsg_job *);
1065 void fc_lport_set_local_id(struct fc_lport *, u32 port_id);
1066 void fc_lport_iterate(void (*func)(struct fc_lport *, void *), void *);
1067 
1068 /*
1069  * REMOTE PORT LAYER
1070  *****************************/
1071 int fc_rport_init(struct fc_lport *);
1072 void fc_rport_terminate_io(struct fc_rport *);
1073 
1074 /*
1075  * DISCOVERY LAYER
1076  *****************************/
1077 int fc_disc_init(struct fc_lport *);
1078 
1079 static inline struct fc_lport *fc_disc_lport(struct fc_disc *disc)
1080 {
1081  return container_of(disc, struct fc_lport, disc);
1082 }
1083 
1084 /*
1085  * FCP LAYER
1086  *****************************/
1087 int fc_fcp_init(struct fc_lport *);
1088 void fc_fcp_destroy(struct fc_lport *);
1089 
1090 /*
1091  * SCSI INTERACTION LAYER
1092  *****************************/
1093 int fc_queuecommand(struct Scsi_Host *, struct scsi_cmnd *);
1094 int fc_eh_abort(struct scsi_cmnd *);
1095 int fc_eh_device_reset(struct scsi_cmnd *);
1096 int fc_eh_host_reset(struct scsi_cmnd *);
1097 int fc_slave_alloc(struct scsi_device *);
1098 int fc_change_queue_depth(struct scsi_device *, int qdepth, int reason);
1099 int fc_change_queue_type(struct scsi_device *, int tag_type);
1100 
1101 /*
1102  * ELS/CT interface
1103  *****************************/
1104 int fc_elsct_init(struct fc_lport *);
1105 struct fc_seq *fc_elsct_send(struct fc_lport *, u32 did,
1106  struct fc_frame *,
1107  unsigned int op,
1108  void (*resp)(struct fc_seq *,
1109  struct fc_frame *,
1110  void *arg),
1111  void *arg, u32 timer_msec);
1112 void fc_lport_flogi_resp(struct fc_seq *, struct fc_frame *, void *);
1113 void fc_lport_logo_resp(struct fc_seq *, struct fc_frame *, void *);
1114 void fc_fill_reply_hdr(struct fc_frame *, const struct fc_frame *,
1115  enum fc_rctl, u32 parm_offset);
1116 void fc_fill_hdr(struct fc_frame *, const struct fc_frame *,
1117  enum fc_rctl, u32 f_ctl, u16 seq_cnt, u32 parm_offset);
1118 
1119 
1120 /*
1121  * EXCHANGE MANAGER LAYER
1122  *****************************/
1123 int fc_exch_init(struct fc_lport *);
1124 void fc_exch_update_stats(struct fc_lport *lport);
1126  struct fc_exch_mgr *,
1127  bool (*match)(struct fc_frame *));
1128 void fc_exch_mgr_del(struct fc_exch_mgr_anchor *);
1129 int fc_exch_mgr_list_clone(struct fc_lport *src, struct fc_lport *dst);
1130 struct fc_exch_mgr *fc_exch_mgr_alloc(struct fc_lport *, enum fc_class class,
1132  bool (*match)(struct fc_frame *));
1133 void fc_exch_mgr_free(struct fc_lport *);
1134 void fc_exch_recv(struct fc_lport *, struct fc_frame *);
1135 void fc_exch_mgr_reset(struct fc_lport *, u32 s_id, u32 d_id);
1136 
1137 /*
1138  * Functions for fc_functions_template
1139  */
1140 void fc_get_host_speed(struct Scsi_Host *);
1141 void fc_get_host_port_state(struct Scsi_Host *);
1142 void fc_set_rport_loss_tmo(struct fc_rport *, u32 timeout);
1144 
1145 #endif /* _LIBFC_H_ */