1
2
3
4
5
6
7
8
9
10#ifndef SCSI_TRANSPORT_FC_H
11#define SCSI_TRANSPORT_FC_H
12
13#include <linux/sched.h>
14#include <linux/bsg-lib.h>
15#include <asm/unaligned.h>
16#include <scsi/scsi.h>
17#include <scsi/scsi_netlink.h>
18#include <scsi/scsi_host.h>
19
20struct scsi_transport_template;
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42enum fc_port_type {
43 FC_PORTTYPE_UNKNOWN,
44 FC_PORTTYPE_OTHER,
45 FC_PORTTYPE_NOTPRESENT,
46 FC_PORTTYPE_NPORT,
47 FC_PORTTYPE_NLPORT,
48 FC_PORTTYPE_LPORT,
49 FC_PORTTYPE_PTP,
50 FC_PORTTYPE_NPIV,
51};
52
53
54
55
56
57
58enum fc_port_state {
59 FC_PORTSTATE_UNKNOWN,
60 FC_PORTSTATE_NOTPRESENT,
61 FC_PORTSTATE_ONLINE,
62 FC_PORTSTATE_OFFLINE,
63 FC_PORTSTATE_BLOCKED,
64 FC_PORTSTATE_BYPASSED,
65 FC_PORTSTATE_DIAGNOSTICS,
66 FC_PORTSTATE_LINKDOWN,
67 FC_PORTSTATE_ERROR,
68 FC_PORTSTATE_LOOPBACK,
69 FC_PORTSTATE_DELETED,
70 FC_PORTSTATE_MARGINAL,
71};
72
73
74
75
76
77
78enum fc_vport_state {
79 FC_VPORT_UNKNOWN,
80 FC_VPORT_ACTIVE,
81 FC_VPORT_DISABLED,
82 FC_VPORT_LINKDOWN,
83 FC_VPORT_INITIALIZING,
84 FC_VPORT_NO_FABRIC_SUPP,
85 FC_VPORT_NO_FABRIC_RSCS,
86 FC_VPORT_FABRIC_LOGOUT,
87 FC_VPORT_FABRIC_REJ_WWN,
88 FC_VPORT_FAILED,
89};
90
91
92
93
94
95
96
97
98
99#define FC_COS_UNSPECIFIED 0
100#define FC_COS_CLASS1 2
101#define FC_COS_CLASS2 4
102#define FC_COS_CLASS3 8
103#define FC_COS_CLASS4 0x10
104#define FC_COS_CLASS6 0x40
105
106
107
108
109
110
111
112#define FC_PORTSPEED_UNKNOWN 0
113
114#define FC_PORTSPEED_1GBIT 1
115#define FC_PORTSPEED_2GBIT 2
116#define FC_PORTSPEED_10GBIT 4
117#define FC_PORTSPEED_4GBIT 8
118#define FC_PORTSPEED_8GBIT 0x10
119#define FC_PORTSPEED_16GBIT 0x20
120#define FC_PORTSPEED_32GBIT 0x40
121#define FC_PORTSPEED_20GBIT 0x80
122#define FC_PORTSPEED_40GBIT 0x100
123#define FC_PORTSPEED_50GBIT 0x200
124#define FC_PORTSPEED_100GBIT 0x400
125#define FC_PORTSPEED_25GBIT 0x800
126#define FC_PORTSPEED_64GBIT 0x1000
127#define FC_PORTSPEED_128GBIT 0x2000
128#define FC_PORTSPEED_256GBIT 0x4000
129#define FC_PORTSPEED_NOT_NEGOTIATED (1 << 15)
130
131
132
133
134
135enum fc_tgtid_binding_type {
136 FC_TGTID_BIND_NONE,
137 FC_TGTID_BIND_BY_WWPN,
138 FC_TGTID_BIND_BY_WWNN,
139 FC_TGTID_BIND_BY_ID,
140};
141
142
143
144
145
146
147
148#define FC_PORT_ROLE_UNKNOWN 0x00
149#define FC_PORT_ROLE_FCP_TARGET 0x01
150#define FC_PORT_ROLE_FCP_INITIATOR 0x02
151#define FC_PORT_ROLE_IP_PORT 0x04
152#define FC_PORT_ROLE_FCP_DUMMY_INITIATOR 0x08
153#define FC_PORT_ROLE_NVME_INITIATOR 0x10
154#define FC_PORT_ROLE_NVME_TARGET 0x20
155#define FC_PORT_ROLE_NVME_DISCOVERY 0x40
156
157
158#define FC_RPORT_ROLE_UNKNOWN FC_PORT_ROLE_UNKNOWN
159#define FC_RPORT_ROLE_FCP_TARGET FC_PORT_ROLE_FCP_TARGET
160#define FC_RPORT_ROLE_FCP_INITIATOR FC_PORT_ROLE_FCP_INITIATOR
161#define FC_RPORT_ROLE_IP_PORT FC_PORT_ROLE_IP_PORT
162
163
164
165#define FC_VPORT_ATTR(_name,_mode,_show,_store) \
166struct device_attribute dev_attr_vport_##_name = \
167 __ATTR(_name,_mode,_show,_store)
168
169
170
171
172
173
174
175
176
177
178
179
180#define FC_VPORT_SYMBOLIC_NAMELEN 64
181struct fc_vport_identifiers {
182 u64 node_name;
183 u64 port_name;
184 u32 roles;
185 bool disable;
186 enum fc_port_type vport_type;
187 char symbolic_name[FC_VPORT_SYMBOLIC_NAMELEN];
188};
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219struct fc_vport {
220
221
222
223
224
225 enum fc_vport_state vport_state;
226 enum fc_vport_state vport_last_state;
227 u64 node_name;
228 u64 port_name;
229 u32 roles;
230 u32 vport_id;
231 enum fc_port_type vport_type;
232 char symbolic_name[FC_VPORT_SYMBOLIC_NAMELEN];
233
234
235 void *dd_data;
236
237
238 struct Scsi_Host *shost;
239 unsigned int channel;
240 u32 number;
241 u8 flags;
242 struct list_head peers;
243 struct device dev;
244 struct work_struct vport_delete_work;
245} __attribute__((aligned(sizeof(unsigned long))));
246
247
248#define FC_VPORT_CREATING 0x01
249#define FC_VPORT_DELETING 0x02
250#define FC_VPORT_DELETED 0x04
251#define FC_VPORT_DEL 0x06
252
253#define dev_to_vport(d) \
254 container_of(d, struct fc_vport, dev)
255#define transport_class_to_vport(dev) \
256 dev_to_vport(dev->parent)
257#define vport_to_shost(v) \
258 (v->shost)
259#define vport_to_shost_channel(v) \
260 (v->channel)
261#define vport_to_parent(v) \
262 (v->dev.parent)
263
264
265
266#define VPCERR_UNSUPPORTED -ENOSYS
267
268#define VPCERR_BAD_WWN -ENOTUNIQ
269
270#define VPCERR_NO_FABRIC_SUPP -EOPNOTSUPP
271
272
273
274
275
276
277
278
279
280
281
282struct fc_rport_identifiers {
283 u64 node_name;
284 u64 port_name;
285 u32 port_id;
286 u32 roles;
287};
288
289
290
291
292struct fc_fpin_stats {
293
294 u64 dn;
295 u64 dn_unknown;
296 u64 dn_timeout;
297 u64 dn_unable_to_route;
298 u64 dn_device_specific;
299
300
301 u64 li;
302 u64 li_failure_unknown;
303 u64 li_link_failure_count;
304 u64 li_loss_of_sync_count;
305 u64 li_loss_of_signals_count;
306 u64 li_prim_seq_err_count;
307 u64 li_invalid_tx_word_count;
308 u64 li_invalid_crc_count;
309 u64 li_device_specific;
310
311
312 u64 cn;
313 u64 cn_clear;
314 u64 cn_lost_credit;
315 u64 cn_credit_stall;
316 u64 cn_oversubscription;
317 u64 cn_device_specific;
318};
319
320
321#define FC_RPORT_ATTR(_name,_mode,_show,_store) \
322struct device_attribute dev_attr_rport_##_name = \
323 __ATTR(_name,_mode,_show,_store)
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353struct fc_rport {
354
355 u32 maxframe_size;
356 u32 supported_classes;
357
358
359 u32 dev_loss_tmo;
360 struct fc_fpin_stats fpin_stats;
361
362
363 u64 node_name;
364 u64 port_name;
365 u32 port_id;
366 u32 roles;
367 enum fc_port_state port_state;
368 u32 scsi_target_id;
369 u32 fast_io_fail_tmo;
370
371
372 void *dd_data;
373
374
375 unsigned int channel;
376 u32 number;
377 u8 flags;
378 struct list_head peers;
379 struct device dev;
380 struct delayed_work dev_loss_work;
381 struct work_struct scan_work;
382 struct delayed_work fail_io_work;
383 struct work_struct stgt_delete_work;
384 struct work_struct rport_delete_work;
385 struct request_queue *rqst_q;
386} __attribute__((aligned(sizeof(unsigned long))));
387
388
389#define FC_RPORT_DEVLOSS_PENDING 0x01
390#define FC_RPORT_SCAN_PENDING 0x02
391#define FC_RPORT_FAST_FAIL_TIMEDOUT 0x04
392#define FC_RPORT_DEVLOSS_CALLBK_DONE 0x08
393
394#define dev_to_rport(d) \
395 container_of(d, struct fc_rport, dev)
396#define transport_class_to_rport(dev) \
397 dev_to_rport(dev->parent)
398#define rport_to_shost(r) \
399 dev_to_shost(r->dev.parent)
400
401
402
403
404
405
406
407
408
409
410
411
412
413struct fc_starget_attrs {
414
415 u64 node_name;
416 u64 port_name;
417 u32 port_id;
418};
419
420#define fc_starget_node_name(x) \
421 (((struct fc_starget_attrs *)&(x)->starget_data)->node_name)
422#define fc_starget_port_name(x) \
423 (((struct fc_starget_attrs *)&(x)->starget_data)->port_name)
424#define fc_starget_port_id(x) \
425 (((struct fc_starget_attrs *)&(x)->starget_data)->port_id)
426
427#define starget_to_rport(s) \
428 scsi_is_fc_rport(s->dev.parent) ? dev_to_rport(s->dev.parent) : NULL
429
430
431
432
433
434
435
436struct fc_host_statistics {
437
438 u64 seconds_since_last_reset;
439 u64 tx_frames;
440 u64 tx_words;
441 u64 rx_frames;
442 u64 rx_words;
443 u64 lip_count;
444 u64 nos_count;
445 u64 error_frames;
446 u64 dumped_frames;
447 u64 link_failure_count;
448 u64 loss_of_sync_count;
449 u64 loss_of_signal_count;
450 u64 prim_seq_protocol_err_count;
451 u64 invalid_tx_word_count;
452 u64 invalid_crc_count;
453
454
455 u64 fcp_input_requests;
456 u64 fcp_output_requests;
457 u64 fcp_control_requests;
458 u64 fcp_input_megabytes;
459 u64 fcp_output_megabytes;
460 u64 fcp_packet_alloc_failures;
461 u64 fcp_packet_aborts;
462 u64 fcp_frame_alloc_failures;
463
464
465 u64 fc_no_free_exch;
466 u64 fc_no_free_exch_xid;
467 u64 fc_xid_not_found;
468 u64 fc_xid_busy;
469 u64 fc_seq_not_found;
470 u64 fc_non_bls_resp;
471
472
473 u64 cn_sig_warn;
474 u64 cn_sig_alarm;
475};
476
477
478
479
480
481
482
483
484
485
486enum fc_host_event_code {
487 FCH_EVT_LIP = 0x1,
488 FCH_EVT_LINKUP = 0x2,
489 FCH_EVT_LINKDOWN = 0x3,
490 FCH_EVT_LIPRESET = 0x4,
491 FCH_EVT_RSCN = 0x5,
492 FCH_EVT_ADAPTER_CHANGE = 0x103,
493 FCH_EVT_PORT_UNKNOWN = 0x200,
494 FCH_EVT_PORT_OFFLINE = 0x201,
495 FCH_EVT_PORT_ONLINE = 0x202,
496 FCH_EVT_PORT_FABRIC = 0x204,
497 FCH_EVT_LINK_UNKNOWN = 0x500,
498 FCH_EVT_LINK_FPIN = 0x501,
499 FCH_EVT_VENDOR_UNIQUE = 0xffff,
500};
501
502
503
504
505
506
507
508
509
510
511
512
513
514
515
516
517
518
519
520#define FC_VENDOR_IDENTIFIER 8
521#define FC_FC4_LIST_SIZE 32
522#define FC_SYMBOLIC_NAME_SIZE 256
523#define FC_VERSION_STRING_SIZE 64
524#define FC_SERIAL_NUMBER_SIZE 64
525
526struct fc_host_attrs {
527
528 u64 node_name;
529 u64 port_name;
530 u64 permanent_port_name;
531 u32 supported_classes;
532 u8 supported_fc4s[FC_FC4_LIST_SIZE];
533 u32 supported_speeds;
534 u32 maxframe_size;
535 u16 max_npiv_vports;
536 u32 max_ct_payload;
537 u32 num_ports;
538 u32 num_discovered_ports;
539 u32 bootbios_state;
540 char serial_number[FC_SERIAL_NUMBER_SIZE];
541 char manufacturer[FC_SERIAL_NUMBER_SIZE];
542 char model[FC_SYMBOLIC_NAME_SIZE];
543 char model_description[FC_SYMBOLIC_NAME_SIZE];
544 char hardware_version[FC_VERSION_STRING_SIZE];
545 char driver_version[FC_VERSION_STRING_SIZE];
546 char firmware_version[FC_VERSION_STRING_SIZE];
547 char optionrom_version[FC_VERSION_STRING_SIZE];
548 char vendor_identifier[FC_VENDOR_IDENTIFIER];
549 char bootbios_version[FC_SYMBOLIC_NAME_SIZE];
550
551
552
553 u32 port_id;
554 enum fc_port_type port_type;
555 enum fc_port_state port_state;
556 u8 active_fc4s[FC_FC4_LIST_SIZE];
557 u32 speed;
558 u64 fabric_name;
559 char symbolic_name[FC_SYMBOLIC_NAME_SIZE];
560 char system_hostname[FC_SYMBOLIC_NAME_SIZE];
561 u32 dev_loss_tmo;
562 struct fc_fpin_stats fpin_stats;
563
564
565 enum fc_tgtid_binding_type tgtid_bind_type;
566
567
568 struct list_head rports;
569 struct list_head rport_bindings;
570 struct list_head vports;
571 u32 next_rport_number;
572 u32 next_target_id;
573 u32 next_vport_number;
574 u16 npiv_vports_inuse;
575
576
577 char work_q_name[20];
578 struct workqueue_struct *work_q;
579 char devloss_work_q_name[20];
580 struct workqueue_struct *devloss_work_q;
581
582
583 struct request_queue *rqst_q;
584
585
586 u8 fdmi_version;
587};
588
589#define shost_to_fc_host(x) \
590 ((struct fc_host_attrs *)(x)->shost_data)
591
592#define fc_host_node_name(x) \
593 (((struct fc_host_attrs *)(x)->shost_data)->node_name)
594#define fc_host_port_name(x) \
595 (((struct fc_host_attrs *)(x)->shost_data)->port_name)
596#define fc_host_permanent_port_name(x) \
597 (((struct fc_host_attrs *)(x)->shost_data)->permanent_port_name)
598#define fc_host_supported_classes(x) \
599 (((struct fc_host_attrs *)(x)->shost_data)->supported_classes)
600#define fc_host_supported_fc4s(x) \
601 (((struct fc_host_attrs *)(x)->shost_data)->supported_fc4s)
602#define fc_host_supported_speeds(x) \
603 (((struct fc_host_attrs *)(x)->shost_data)->supported_speeds)
604#define fc_host_maxframe_size(x) \
605 (((struct fc_host_attrs *)(x)->shost_data)->maxframe_size)
606#define fc_host_max_npiv_vports(x) \
607 (((struct fc_host_attrs *)(x)->shost_data)->max_npiv_vports)
608#define fc_host_serial_number(x) \
609 (((struct fc_host_attrs *)(x)->shost_data)->serial_number)
610#define fc_host_manufacturer(x) \
611 (((struct fc_host_attrs *)(x)->shost_data)->manufacturer)
612#define fc_host_model(x) \
613 (((struct fc_host_attrs *)(x)->shost_data)->model)
614#define fc_host_model_description(x) \
615 (((struct fc_host_attrs *)(x)->shost_data)->model_description)
616#define fc_host_hardware_version(x) \
617 (((struct fc_host_attrs *)(x)->shost_data)->hardware_version)
618#define fc_host_driver_version(x) \
619 (((struct fc_host_attrs *)(x)->shost_data)->driver_version)
620#define fc_host_firmware_version(x) \
621 (((struct fc_host_attrs *)(x)->shost_data)->firmware_version)
622#define fc_host_optionrom_version(x) \
623 (((struct fc_host_attrs *)(x)->shost_data)->optionrom_version)
624#define fc_host_port_id(x) \
625 (((struct fc_host_attrs *)(x)->shost_data)->port_id)
626#define fc_host_port_type(x) \
627 (((struct fc_host_attrs *)(x)->shost_data)->port_type)
628#define fc_host_port_state(x) \
629 (((struct fc_host_attrs *)(x)->shost_data)->port_state)
630#define fc_host_active_fc4s(x) \
631 (((struct fc_host_attrs *)(x)->shost_data)->active_fc4s)
632#define fc_host_speed(x) \
633 (((struct fc_host_attrs *)(x)->shost_data)->speed)
634#define fc_host_fabric_name(x) \
635 (((struct fc_host_attrs *)(x)->shost_data)->fabric_name)
636#define fc_host_symbolic_name(x) \
637 (((struct fc_host_attrs *)(x)->shost_data)->symbolic_name)
638#define fc_host_system_hostname(x) \
639 (((struct fc_host_attrs *)(x)->shost_data)->system_hostname)
640#define fc_host_tgtid_bind_type(x) \
641 (((struct fc_host_attrs *)(x)->shost_data)->tgtid_bind_type)
642#define fc_host_rports(x) \
643 (((struct fc_host_attrs *)(x)->shost_data)->rports)
644#define fc_host_rport_bindings(x) \
645 (((struct fc_host_attrs *)(x)->shost_data)->rport_bindings)
646#define fc_host_vports(x) \
647 (((struct fc_host_attrs *)(x)->shost_data)->vports)
648#define fc_host_next_rport_number(x) \
649 (((struct fc_host_attrs *)(x)->shost_data)->next_rport_number)
650#define fc_host_next_target_id(x) \
651 (((struct fc_host_attrs *)(x)->shost_data)->next_target_id)
652#define fc_host_next_vport_number(x) \
653 (((struct fc_host_attrs *)(x)->shost_data)->next_vport_number)
654#define fc_host_npiv_vports_inuse(x) \
655 (((struct fc_host_attrs *)(x)->shost_data)->npiv_vports_inuse)
656#define fc_host_work_q_name(x) \
657 (((struct fc_host_attrs *)(x)->shost_data)->work_q_name)
658#define fc_host_work_q(x) \
659 (((struct fc_host_attrs *)(x)->shost_data)->work_q)
660#define fc_host_devloss_work_q_name(x) \
661 (((struct fc_host_attrs *)(x)->shost_data)->devloss_work_q_name)
662#define fc_host_devloss_work_q(x) \
663 (((struct fc_host_attrs *)(x)->shost_data)->devloss_work_q)
664#define fc_host_dev_loss_tmo(x) \
665 (((struct fc_host_attrs *)(x)->shost_data)->dev_loss_tmo)
666#define fc_host_max_ct_payload(x) \
667 (((struct fc_host_attrs *)(x)->shost_data)->max_ct_payload)
668#define fc_host_vendor_identifier(x) \
669 (((struct fc_host_attrs *)(x)->shost_data)->vendor_identifier)
670#define fc_host_num_discovered_ports(x) \
671 (((struct fc_host_attrs *)(x)->shost_data)->num_discovered_ports)
672#define fc_host_num_ports(x) \
673 (((struct fc_host_attrs *)(x)->shost_data)->num_ports)
674#define fc_host_bootbios_version(x) \
675 (((struct fc_host_attrs *)(x)->shost_data)->bootbios_version)
676#define fc_host_bootbios_state(x) \
677 (((struct fc_host_attrs *)(x)->shost_data)->bootbios_state)
678
679
680struct fc_function_template {
681 void (*get_rport_dev_loss_tmo)(struct fc_rport *);
682 void (*set_rport_dev_loss_tmo)(struct fc_rport *, u32);
683
684 void (*get_starget_node_name)(struct scsi_target *);
685 void (*get_starget_port_name)(struct scsi_target *);
686 void (*get_starget_port_id)(struct scsi_target *);
687
688 void (*get_host_port_id)(struct Scsi_Host *);
689 void (*get_host_port_type)(struct Scsi_Host *);
690 void (*get_host_port_state)(struct Scsi_Host *);
691 void (*get_host_active_fc4s)(struct Scsi_Host *);
692 void (*get_host_speed)(struct Scsi_Host *);
693 void (*get_host_fabric_name)(struct Scsi_Host *);
694 void (*get_host_symbolic_name)(struct Scsi_Host *);
695 void (*set_host_system_hostname)(struct Scsi_Host *);
696
697 struct fc_host_statistics * (*get_fc_host_stats)(struct Scsi_Host *);
698 void (*reset_fc_host_stats)(struct Scsi_Host *);
699
700 int (*issue_fc_host_lip)(struct Scsi_Host *);
701
702 void (*dev_loss_tmo_callbk)(struct fc_rport *);
703 void (*terminate_rport_io)(struct fc_rport *);
704
705 void (*set_vport_symbolic_name)(struct fc_vport *);
706 int (*vport_create)(struct fc_vport *, bool);
707 int (*vport_disable)(struct fc_vport *, bool);
708 int (*vport_delete)(struct fc_vport *);
709
710
711 int (*bsg_request)(struct bsg_job *);
712 int (*bsg_timeout)(struct bsg_job *);
713
714
715 u32 dd_fcrport_size;
716 u32 dd_fcvport_size;
717 u32 dd_bsg_size;
718
719
720
721
722
723
724
725
726
727 unsigned long show_rport_maxframe_size:1;
728 unsigned long show_rport_supported_classes:1;
729 unsigned long show_rport_dev_loss_tmo:1;
730
731
732
733
734
735
736 unsigned long show_starget_node_name:1;
737 unsigned long show_starget_port_name:1;
738 unsigned long show_starget_port_id:1;
739
740
741 unsigned long show_host_node_name:1;
742 unsigned long show_host_port_name:1;
743 unsigned long show_host_permanent_port_name:1;
744 unsigned long show_host_supported_classes:1;
745 unsigned long show_host_supported_fc4s:1;
746 unsigned long show_host_supported_speeds:1;
747 unsigned long show_host_maxframe_size:1;
748 unsigned long show_host_serial_number:1;
749 unsigned long show_host_manufacturer:1;
750 unsigned long show_host_model:1;
751 unsigned long show_host_model_description:1;
752 unsigned long show_host_hardware_version:1;
753 unsigned long show_host_driver_version:1;
754 unsigned long show_host_firmware_version:1;
755 unsigned long show_host_optionrom_version:1;
756
757 unsigned long show_host_port_id:1;
758 unsigned long show_host_port_type:1;
759 unsigned long show_host_port_state:1;
760 unsigned long show_host_active_fc4s:1;
761 unsigned long show_host_speed:1;
762 unsigned long show_host_fabric_name:1;
763 unsigned long show_host_symbolic_name:1;
764 unsigned long show_host_system_hostname:1;
765
766 unsigned long disable_target_scan:1;
767};
768
769
770
771
772
773
774
775
776
777static inline int
778fc_remote_port_chkready(struct fc_rport *rport)
779{
780 int result;
781
782 switch (rport->port_state) {
783 case FC_PORTSTATE_ONLINE:
784 case FC_PORTSTATE_MARGINAL:
785 if (rport->roles & FC_PORT_ROLE_FCP_TARGET)
786 result = 0;
787 else if (rport->flags & FC_RPORT_DEVLOSS_PENDING)
788 result = DID_IMM_RETRY << 16;
789 else
790 result = DID_NO_CONNECT << 16;
791 break;
792 case FC_PORTSTATE_BLOCKED:
793 if (rport->flags & FC_RPORT_FAST_FAIL_TIMEDOUT)
794 result = DID_TRANSPORT_FAILFAST << 16;
795 else
796 result = DID_IMM_RETRY << 16;
797 break;
798 default:
799 result = DID_NO_CONNECT << 16;
800 break;
801 }
802 return result;
803}
804
805static inline u64 wwn_to_u64(const u8 *wwn)
806{
807 return get_unaligned_be64(wwn);
808}
809
810static inline void u64_to_wwn(u64 inm, u8 *wwn)
811{
812 put_unaligned_be64(inm, wwn);
813}
814
815
816
817
818
819
820
821
822
823
824
825
826static inline void
827fc_vport_set_state(struct fc_vport *vport, enum fc_vport_state new_state)
828{
829 if ((new_state != FC_VPORT_UNKNOWN) &&
830 (new_state != FC_VPORT_INITIALIZING))
831 vport->vport_last_state = vport->vport_state;
832 vport->vport_state = new_state;
833}
834
835struct scsi_transport_template *fc_attach_transport(
836 struct fc_function_template *);
837void fc_release_transport(struct scsi_transport_template *);
838void fc_remove_host(struct Scsi_Host *);
839struct fc_rport *fc_remote_port_add(struct Scsi_Host *shost,
840 int channel, struct fc_rport_identifiers *ids);
841void fc_remote_port_delete(struct fc_rport *rport);
842void fc_remote_port_rolechg(struct fc_rport *rport, u32 roles);
843int scsi_is_fc_rport(const struct device *);
844u32 fc_get_event_number(void);
845void fc_host_post_event(struct Scsi_Host *shost, u32 event_number,
846 enum fc_host_event_code event_code, u32 event_data);
847void fc_host_post_vendor_event(struct Scsi_Host *shost, u32 event_number,
848 u32 data_len, char *data_buf, u64 vendor_id);
849struct fc_rport *fc_find_rport_by_wwpn(struct Scsi_Host *shost, u64 wwpn);
850void fc_host_post_fc_event(struct Scsi_Host *shost, u32 event_number,
851 enum fc_host_event_code event_code,
852 u32 data_len, char *data_buf, u64 vendor_id);
853
854
855
856
857
858
859void fc_host_fpin_rcv(struct Scsi_Host *shost, u32 fpin_len, char *fpin_buf);
860struct fc_vport *fc_vport_create(struct Scsi_Host *shost, int channel,
861 struct fc_vport_identifiers *);
862int fc_vport_terminate(struct fc_vport *vport);
863int fc_block_rport(struct fc_rport *rport);
864int fc_block_scsi_eh(struct scsi_cmnd *cmnd);
865enum blk_eh_timer_return fc_eh_timed_out(struct scsi_cmnd *scmd);
866bool fc_eh_should_retry_cmd(struct scsi_cmnd *scmd);
867
868static inline struct Scsi_Host *fc_bsg_to_shost(struct bsg_job *job)
869{
870 if (scsi_is_host_device(job->dev))
871 return dev_to_shost(job->dev);
872 return rport_to_shost(dev_to_rport(job->dev));
873}
874
875static inline struct fc_rport *fc_bsg_to_rport(struct bsg_job *job)
876{
877 if (scsi_is_fc_rport(job->dev))
878 return dev_to_rport(job->dev);
879 return NULL;
880}
881
882#endif
883