1
2
3
4
5
6
7
8
9
10
11
12
13#ifndef SCSI_TRANSPORT_FC_H
14#define SCSI_TRANSPORT_FC_H
15
16#include <linux/sched.h>
17#include <linux/bsg-lib.h>
18#include <asm/unaligned.h>
19#include <scsi/scsi.h>
20#include <scsi/scsi_netlink.h>
21#include <scsi/scsi_host.h>
22
23struct scsi_transport_template;
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45enum fc_port_type {
46 FC_PORTTYPE_UNKNOWN,
47 FC_PORTTYPE_OTHER,
48 FC_PORTTYPE_NOTPRESENT,
49 FC_PORTTYPE_NPORT,
50 FC_PORTTYPE_NLPORT,
51 FC_PORTTYPE_LPORT,
52 FC_PORTTYPE_PTP,
53 FC_PORTTYPE_NPIV,
54};
55
56
57
58
59
60
61enum fc_port_state {
62 FC_PORTSTATE_UNKNOWN,
63 FC_PORTSTATE_NOTPRESENT,
64 FC_PORTSTATE_ONLINE,
65 FC_PORTSTATE_OFFLINE,
66 FC_PORTSTATE_BLOCKED,
67 FC_PORTSTATE_BYPASSED,
68 FC_PORTSTATE_DIAGNOSTICS,
69 FC_PORTSTATE_LINKDOWN,
70 FC_PORTSTATE_ERROR,
71 FC_PORTSTATE_LOOPBACK,
72 FC_PORTSTATE_DELETED,
73};
74
75
76
77
78
79
80enum fc_vport_state {
81 FC_VPORT_UNKNOWN,
82 FC_VPORT_ACTIVE,
83 FC_VPORT_DISABLED,
84 FC_VPORT_LINKDOWN,
85 FC_VPORT_INITIALIZING,
86 FC_VPORT_NO_FABRIC_SUPP,
87 FC_VPORT_NO_FABRIC_RSCS,
88 FC_VPORT_FABRIC_LOGOUT,
89 FC_VPORT_FABRIC_REJ_WWN,
90 FC_VPORT_FAILED,
91};
92
93
94
95
96
97
98
99
100
101#define FC_COS_UNSPECIFIED 0
102#define FC_COS_CLASS1 2
103#define FC_COS_CLASS2 4
104#define FC_COS_CLASS3 8
105#define FC_COS_CLASS4 0x10
106#define FC_COS_CLASS6 0x40
107
108
109
110
111
112
113
114#define FC_PORTSPEED_UNKNOWN 0
115
116#define FC_PORTSPEED_1GBIT 1
117#define FC_PORTSPEED_2GBIT 2
118#define FC_PORTSPEED_10GBIT 4
119#define FC_PORTSPEED_4GBIT 8
120#define FC_PORTSPEED_8GBIT 0x10
121#define FC_PORTSPEED_16GBIT 0x20
122#define FC_PORTSPEED_32GBIT 0x40
123#define FC_PORTSPEED_20GBIT 0x80
124#define FC_PORTSPEED_40GBIT 0x100
125#define FC_PORTSPEED_50GBIT 0x200
126#define FC_PORTSPEED_100GBIT 0x400
127#define FC_PORTSPEED_25GBIT 0x800
128#define FC_PORTSPEED_64GBIT 0x1000
129#define FC_PORTSPEED_128GBIT 0x2000
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#define FC_RPORT_ATTR(_name,_mode,_show,_store) \
293struct device_attribute dev_attr_rport_##_name = \
294 __ATTR(_name,_mode,_show,_store)
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324struct fc_rport {
325
326 u32 maxframe_size;
327 u32 supported_classes;
328
329
330 u32 dev_loss_tmo;
331
332
333 u64 node_name;
334 u64 port_name;
335 u32 port_id;
336 u32 roles;
337 enum fc_port_state port_state;
338 u32 scsi_target_id;
339 u32 fast_io_fail_tmo;
340
341
342 void *dd_data;
343
344
345 unsigned int channel;
346 u32 number;
347 u8 flags;
348 struct list_head peers;
349 struct device dev;
350 struct delayed_work dev_loss_work;
351 struct work_struct scan_work;
352 struct delayed_work fail_io_work;
353 struct work_struct stgt_delete_work;
354 struct work_struct rport_delete_work;
355 struct request_queue *rqst_q;
356} __attribute__((aligned(sizeof(unsigned long))));
357
358
359#define FC_RPORT_DEVLOSS_PENDING 0x01
360#define FC_RPORT_SCAN_PENDING 0x02
361#define FC_RPORT_FAST_FAIL_TIMEDOUT 0x04
362#define FC_RPORT_DEVLOSS_CALLBK_DONE 0x08
363
364#define dev_to_rport(d) \
365 container_of(d, struct fc_rport, dev)
366#define transport_class_to_rport(dev) \
367 dev_to_rport(dev->parent)
368#define rport_to_shost(r) \
369 dev_to_shost(r->dev.parent)
370
371
372
373
374
375
376
377
378
379
380
381
382
383struct fc_starget_attrs {
384
385 u64 node_name;
386 u64 port_name;
387 u32 port_id;
388};
389
390#define fc_starget_node_name(x) \
391 (((struct fc_starget_attrs *)&(x)->starget_data)->node_name)
392#define fc_starget_port_name(x) \
393 (((struct fc_starget_attrs *)&(x)->starget_data)->port_name)
394#define fc_starget_port_id(x) \
395 (((struct fc_starget_attrs *)&(x)->starget_data)->port_id)
396
397#define starget_to_rport(s) \
398 scsi_is_fc_rport(s->dev.parent) ? dev_to_rport(s->dev.parent) : NULL
399
400
401
402
403
404
405
406struct fc_host_statistics {
407
408 u64 seconds_since_last_reset;
409 u64 tx_frames;
410 u64 tx_words;
411 u64 rx_frames;
412 u64 rx_words;
413 u64 lip_count;
414 u64 nos_count;
415 u64 error_frames;
416 u64 dumped_frames;
417 u64 link_failure_count;
418 u64 loss_of_sync_count;
419 u64 loss_of_signal_count;
420 u64 prim_seq_protocol_err_count;
421 u64 invalid_tx_word_count;
422 u64 invalid_crc_count;
423
424
425 u64 fcp_input_requests;
426 u64 fcp_output_requests;
427 u64 fcp_control_requests;
428 u64 fcp_input_megabytes;
429 u64 fcp_output_megabytes;
430 u64 fcp_packet_alloc_failures;
431 u64 fcp_packet_aborts;
432 u64 fcp_frame_alloc_failures;
433
434
435 u64 fc_no_free_exch;
436 u64 fc_no_free_exch_xid;
437 u64 fc_xid_not_found;
438 u64 fc_xid_busy;
439 u64 fc_seq_not_found;
440 u64 fc_non_bls_resp;
441
442};
443
444
445
446
447
448
449
450
451
452
453enum fc_host_event_code {
454 FCH_EVT_LIP = 0x1,
455 FCH_EVT_LINKUP = 0x2,
456 FCH_EVT_LINKDOWN = 0x3,
457 FCH_EVT_LIPRESET = 0x4,
458 FCH_EVT_RSCN = 0x5,
459 FCH_EVT_ADAPTER_CHANGE = 0x103,
460 FCH_EVT_PORT_UNKNOWN = 0x200,
461 FCH_EVT_PORT_OFFLINE = 0x201,
462 FCH_EVT_PORT_ONLINE = 0x202,
463 FCH_EVT_PORT_FABRIC = 0x204,
464 FCH_EVT_LINK_UNKNOWN = 0x500,
465 FCH_EVT_LINK_FPIN = 0x501,
466 FCH_EVT_VENDOR_UNIQUE = 0xffff,
467};
468
469
470
471
472
473
474
475
476
477
478
479
480
481
482
483
484
485
486
487#define FC_FC4_LIST_SIZE 32
488#define FC_SYMBOLIC_NAME_SIZE 256
489#define FC_VERSION_STRING_SIZE 64
490#define FC_SERIAL_NUMBER_SIZE 80
491
492struct fc_host_attrs {
493
494 u64 node_name;
495 u64 port_name;
496 u64 permanent_port_name;
497 u32 supported_classes;
498 u8 supported_fc4s[FC_FC4_LIST_SIZE];
499 u32 supported_speeds;
500 u32 maxframe_size;
501 u16 max_npiv_vports;
502 char serial_number[FC_SERIAL_NUMBER_SIZE];
503 char manufacturer[FC_SERIAL_NUMBER_SIZE];
504 char model[FC_SYMBOLIC_NAME_SIZE];
505 char model_description[FC_SYMBOLIC_NAME_SIZE];
506 char hardware_version[FC_VERSION_STRING_SIZE];
507 char driver_version[FC_VERSION_STRING_SIZE];
508 char firmware_version[FC_VERSION_STRING_SIZE];
509 char optionrom_version[FC_VERSION_STRING_SIZE];
510
511
512 u32 port_id;
513 enum fc_port_type port_type;
514 enum fc_port_state port_state;
515 u8 active_fc4s[FC_FC4_LIST_SIZE];
516 u32 speed;
517 u64 fabric_name;
518 char symbolic_name[FC_SYMBOLIC_NAME_SIZE];
519 char system_hostname[FC_SYMBOLIC_NAME_SIZE];
520 u32 dev_loss_tmo;
521
522
523 enum fc_tgtid_binding_type tgtid_bind_type;
524
525
526 struct list_head rports;
527 struct list_head rport_bindings;
528 struct list_head vports;
529 u32 next_rport_number;
530 u32 next_target_id;
531 u32 next_vport_number;
532 u16 npiv_vports_inuse;
533
534
535 char work_q_name[20];
536 struct workqueue_struct *work_q;
537 char devloss_work_q_name[20];
538 struct workqueue_struct *devloss_work_q;
539
540
541 struct request_queue *rqst_q;
542};
543
544#define shost_to_fc_host(x) \
545 ((struct fc_host_attrs *)(x)->shost_data)
546
547#define fc_host_node_name(x) \
548 (((struct fc_host_attrs *)(x)->shost_data)->node_name)
549#define fc_host_port_name(x) \
550 (((struct fc_host_attrs *)(x)->shost_data)->port_name)
551#define fc_host_permanent_port_name(x) \
552 (((struct fc_host_attrs *)(x)->shost_data)->permanent_port_name)
553#define fc_host_supported_classes(x) \
554 (((struct fc_host_attrs *)(x)->shost_data)->supported_classes)
555#define fc_host_supported_fc4s(x) \
556 (((struct fc_host_attrs *)(x)->shost_data)->supported_fc4s)
557#define fc_host_supported_speeds(x) \
558 (((struct fc_host_attrs *)(x)->shost_data)->supported_speeds)
559#define fc_host_maxframe_size(x) \
560 (((struct fc_host_attrs *)(x)->shost_data)->maxframe_size)
561#define fc_host_max_npiv_vports(x) \
562 (((struct fc_host_attrs *)(x)->shost_data)->max_npiv_vports)
563#define fc_host_serial_number(x) \
564 (((struct fc_host_attrs *)(x)->shost_data)->serial_number)
565#define fc_host_manufacturer(x) \
566 (((struct fc_host_attrs *)(x)->shost_data)->manufacturer)
567#define fc_host_model(x) \
568 (((struct fc_host_attrs *)(x)->shost_data)->model)
569#define fc_host_model_description(x) \
570 (((struct fc_host_attrs *)(x)->shost_data)->model_description)
571#define fc_host_hardware_version(x) \
572 (((struct fc_host_attrs *)(x)->shost_data)->hardware_version)
573#define fc_host_driver_version(x) \
574 (((struct fc_host_attrs *)(x)->shost_data)->driver_version)
575#define fc_host_firmware_version(x) \
576 (((struct fc_host_attrs *)(x)->shost_data)->firmware_version)
577#define fc_host_optionrom_version(x) \
578 (((struct fc_host_attrs *)(x)->shost_data)->optionrom_version)
579#define fc_host_port_id(x) \
580 (((struct fc_host_attrs *)(x)->shost_data)->port_id)
581#define fc_host_port_type(x) \
582 (((struct fc_host_attrs *)(x)->shost_data)->port_type)
583#define fc_host_port_state(x) \
584 (((struct fc_host_attrs *)(x)->shost_data)->port_state)
585#define fc_host_active_fc4s(x) \
586 (((struct fc_host_attrs *)(x)->shost_data)->active_fc4s)
587#define fc_host_speed(x) \
588 (((struct fc_host_attrs *)(x)->shost_data)->speed)
589#define fc_host_fabric_name(x) \
590 (((struct fc_host_attrs *)(x)->shost_data)->fabric_name)
591#define fc_host_symbolic_name(x) \
592 (((struct fc_host_attrs *)(x)->shost_data)->symbolic_name)
593#define fc_host_system_hostname(x) \
594 (((struct fc_host_attrs *)(x)->shost_data)->system_hostname)
595#define fc_host_tgtid_bind_type(x) \
596 (((struct fc_host_attrs *)(x)->shost_data)->tgtid_bind_type)
597#define fc_host_rports(x) \
598 (((struct fc_host_attrs *)(x)->shost_data)->rports)
599#define fc_host_rport_bindings(x) \
600 (((struct fc_host_attrs *)(x)->shost_data)->rport_bindings)
601#define fc_host_vports(x) \
602 (((struct fc_host_attrs *)(x)->shost_data)->vports)
603#define fc_host_next_rport_number(x) \
604 (((struct fc_host_attrs *)(x)->shost_data)->next_rport_number)
605#define fc_host_next_target_id(x) \
606 (((struct fc_host_attrs *)(x)->shost_data)->next_target_id)
607#define fc_host_next_vport_number(x) \
608 (((struct fc_host_attrs *)(x)->shost_data)->next_vport_number)
609#define fc_host_npiv_vports_inuse(x) \
610 (((struct fc_host_attrs *)(x)->shost_data)->npiv_vports_inuse)
611#define fc_host_work_q_name(x) \
612 (((struct fc_host_attrs *)(x)->shost_data)->work_q_name)
613#define fc_host_work_q(x) \
614 (((struct fc_host_attrs *)(x)->shost_data)->work_q)
615#define fc_host_devloss_work_q_name(x) \
616 (((struct fc_host_attrs *)(x)->shost_data)->devloss_work_q_name)
617#define fc_host_devloss_work_q(x) \
618 (((struct fc_host_attrs *)(x)->shost_data)->devloss_work_q)
619#define fc_host_dev_loss_tmo(x) \
620 (((struct fc_host_attrs *)(x)->shost_data)->dev_loss_tmo)
621
622
623struct fc_function_template {
624 void (*get_rport_dev_loss_tmo)(struct fc_rport *);
625 void (*set_rport_dev_loss_tmo)(struct fc_rport *, u32);
626
627 void (*get_starget_node_name)(struct scsi_target *);
628 void (*get_starget_port_name)(struct scsi_target *);
629 void (*get_starget_port_id)(struct scsi_target *);
630
631 void (*get_host_port_id)(struct Scsi_Host *);
632 void (*get_host_port_type)(struct Scsi_Host *);
633 void (*get_host_port_state)(struct Scsi_Host *);
634 void (*get_host_active_fc4s)(struct Scsi_Host *);
635 void (*get_host_speed)(struct Scsi_Host *);
636 void (*get_host_fabric_name)(struct Scsi_Host *);
637 void (*get_host_symbolic_name)(struct Scsi_Host *);
638 void (*set_host_system_hostname)(struct Scsi_Host *);
639
640 struct fc_host_statistics * (*get_fc_host_stats)(struct Scsi_Host *);
641 void (*reset_fc_host_stats)(struct Scsi_Host *);
642
643 int (*issue_fc_host_lip)(struct Scsi_Host *);
644
645 void (*dev_loss_tmo_callbk)(struct fc_rport *);
646 void (*terminate_rport_io)(struct fc_rport *);
647
648 void (*set_vport_symbolic_name)(struct fc_vport *);
649 int (*vport_create)(struct fc_vport *, bool);
650 int (*vport_disable)(struct fc_vport *, bool);
651 int (*vport_delete)(struct fc_vport *);
652
653
654 int (*bsg_request)(struct bsg_job *);
655 int (*bsg_timeout)(struct bsg_job *);
656
657
658 u32 dd_fcrport_size;
659 u32 dd_fcvport_size;
660 u32 dd_bsg_size;
661
662
663
664
665
666
667
668
669
670 unsigned long show_rport_maxframe_size:1;
671 unsigned long show_rport_supported_classes:1;
672 unsigned long show_rport_dev_loss_tmo:1;
673
674
675
676
677
678
679 unsigned long show_starget_node_name:1;
680 unsigned long show_starget_port_name:1;
681 unsigned long show_starget_port_id:1;
682
683
684 unsigned long show_host_node_name:1;
685 unsigned long show_host_port_name:1;
686 unsigned long show_host_permanent_port_name:1;
687 unsigned long show_host_supported_classes:1;
688 unsigned long show_host_supported_fc4s:1;
689 unsigned long show_host_supported_speeds:1;
690 unsigned long show_host_maxframe_size:1;
691 unsigned long show_host_serial_number:1;
692 unsigned long show_host_manufacturer:1;
693 unsigned long show_host_model:1;
694 unsigned long show_host_model_description:1;
695 unsigned long show_host_hardware_version:1;
696 unsigned long show_host_driver_version:1;
697 unsigned long show_host_firmware_version:1;
698 unsigned long show_host_optionrom_version:1;
699
700 unsigned long show_host_port_id:1;
701 unsigned long show_host_port_type:1;
702 unsigned long show_host_port_state:1;
703 unsigned long show_host_active_fc4s:1;
704 unsigned long show_host_speed:1;
705 unsigned long show_host_fabric_name:1;
706 unsigned long show_host_symbolic_name:1;
707 unsigned long show_host_system_hostname:1;
708
709 unsigned long disable_target_scan:1;
710};
711
712
713
714
715
716
717
718
719
720
721static inline int
722fc_remote_port_chkready(struct fc_rport *rport)
723{
724 int result;
725
726 switch (rport->port_state) {
727 case FC_PORTSTATE_ONLINE:
728 if (rport->roles & FC_PORT_ROLE_FCP_TARGET)
729 result = 0;
730 else if (rport->flags & FC_RPORT_DEVLOSS_PENDING)
731 result = DID_IMM_RETRY << 16;
732 else
733 result = DID_NO_CONNECT << 16;
734 break;
735 case FC_PORTSTATE_BLOCKED:
736 if (rport->flags & FC_RPORT_FAST_FAIL_TIMEDOUT)
737 result = DID_TRANSPORT_FAILFAST << 16;
738 else
739 result = DID_IMM_RETRY << 16;
740 break;
741 default:
742 result = DID_NO_CONNECT << 16;
743 break;
744 }
745 return result;
746}
747
748static inline u64 wwn_to_u64(const u8 *wwn)
749{
750 return get_unaligned_be64(wwn);
751}
752
753static inline void u64_to_wwn(u64 inm, u8 *wwn)
754{
755 put_unaligned_be64(inm, wwn);
756}
757
758
759
760
761
762
763
764
765
766
767
768
769static inline void
770fc_vport_set_state(struct fc_vport *vport, enum fc_vport_state new_state)
771{
772 if ((new_state != FC_VPORT_UNKNOWN) &&
773 (new_state != FC_VPORT_INITIALIZING))
774 vport->vport_last_state = vport->vport_state;
775 vport->vport_state = new_state;
776}
777
778struct scsi_transport_template *fc_attach_transport(
779 struct fc_function_template *);
780void fc_release_transport(struct scsi_transport_template *);
781void fc_remove_host(struct Scsi_Host *);
782struct fc_rport *fc_remote_port_add(struct Scsi_Host *shost,
783 int channel, struct fc_rport_identifiers *ids);
784void fc_remote_port_delete(struct fc_rport *rport);
785void fc_remote_port_rolechg(struct fc_rport *rport, u32 roles);
786int scsi_is_fc_rport(const struct device *);
787u32 fc_get_event_number(void);
788void fc_host_post_event(struct Scsi_Host *shost, u32 event_number,
789 enum fc_host_event_code event_code, u32 event_data);
790void fc_host_post_vendor_event(struct Scsi_Host *shost, u32 event_number,
791 u32 data_len, char *data_buf, u64 vendor_id);
792void fc_host_post_fc_event(struct Scsi_Host *shost, u32 event_number,
793 enum fc_host_event_code event_code,
794 u32 data_len, char *data_buf, u64 vendor_id);
795
796
797
798
799
800
801void fc_host_fpin_rcv(struct Scsi_Host *shost, u32 fpin_len, char *fpin_buf);
802struct fc_vport *fc_vport_create(struct Scsi_Host *shost, int channel,
803 struct fc_vport_identifiers *);
804int fc_vport_terminate(struct fc_vport *vport);
805int fc_block_rport(struct fc_rport *rport);
806int fc_block_scsi_eh(struct scsi_cmnd *cmnd);
807enum blk_eh_timer_return fc_eh_timed_out(struct scsi_cmnd *scmd);
808
809static inline struct Scsi_Host *fc_bsg_to_shost(struct bsg_job *job)
810{
811 if (scsi_is_host_device(job->dev))
812 return dev_to_shost(job->dev);
813 return rport_to_shost(dev_to_rport(job->dev));
814}
815
816static inline struct fc_rport *fc_bsg_to_rport(struct bsg_job *job)
817{
818 if (scsi_is_fc_rport(job->dev))
819 return dev_to_rport(job->dev);
820 return NULL;
821}
822
823#endif
824