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