1b2441318SGreg Kroah-Hartman /* SPDX-License-Identifier: GPL-2.0 */
21da177e4SLinus Torvalds #ifndef _SCSI_PRIV_H
31da177e4SLinus Torvalds #define _SCSI_PRIV_H
41da177e4SLinus Torvalds
51da177e4SLinus Torvalds #include <linux/device.h>
65d9fb5ccSMike Christie #include <scsi/scsi_device.h>
7020b0f0aSMing Lei #include <linux/sbitmap.h>
81da177e4SLinus Torvalds
9ead09dd3SChristoph Hellwig struct bsg_device;
101da177e4SLinus Torvalds struct request_queue;
11242f9dcbSJens Axboe struct request;
121da177e4SLinus Torvalds struct scsi_cmnd;
131da177e4SLinus Torvalds struct scsi_device;
14bc4f2401SAlan Stern struct scsi_target;
151da177e4SLinus Torvalds struct scsi_host_template;
161da177e4SLinus Torvalds struct Scsi_Host;
1784314fd4SJames Smart struct scsi_nl_hdr;
181da177e4SLinus Torvalds
192a242d59SMike Christie #define SCSI_CMD_RETRIES_NO_LIMIT -1
201da177e4SLinus Torvalds
211da177e4SLinus Torvalds /*
2236ebf1e2SMike Christie * Error codes used by scsi-ml internally. These must not be used by drivers.
2336ebf1e2SMike Christie */
2436ebf1e2SMike Christie enum scsi_ml_status {
2536ebf1e2SMike Christie SCSIML_STAT_OK = 0x00,
2636ebf1e2SMike Christie SCSIML_STAT_RESV_CONFLICT = 0x01, /* Reservation conflict */
2736ebf1e2SMike Christie SCSIML_STAT_NOSPC = 0x02, /* Space allocation on the dev failed */
2836ebf1e2SMike Christie SCSIML_STAT_MED_ERROR = 0x03, /* Medium error */
2936ebf1e2SMike Christie SCSIML_STAT_TGT_FAILURE = 0x04, /* Permanent target failure */
30390e2d1aSNiklas Cassel SCSIML_STAT_DL_TIMEOUT = 0x05, /* Command Duration Limit timeout */
3136ebf1e2SMike Christie };
3236ebf1e2SMike Christie
scsi_ml_byte(int result)3373432693SNiklas Cassel static inline u8 scsi_ml_byte(int result)
3473432693SNiklas Cassel {
3573432693SNiklas Cassel return (result >> 8) & 0xff;
3673432693SNiklas Cassel }
3773432693SNiklas Cassel
3836ebf1e2SMike Christie /*
391da177e4SLinus Torvalds * Scsi Error Handler Flags
401da177e4SLinus Torvalds */
41e494f6a7SHannes Reinecke #define SCSI_EH_ABORT_SCHEDULED 0x0002 /* Abort has been scheduled */
421da177e4SLinus Torvalds
431da177e4SLinus Torvalds #define SCSI_SENSE_VALID(scmd) \
441da177e4SLinus Torvalds (((scmd)->sense_buffer[0] & 0x70) == 0x70)
451da177e4SLinus Torvalds
461da177e4SLinus Torvalds /* hosts.c */
471da177e4SLinus Torvalds extern int scsi_init_hosts(void);
481da177e4SLinus Torvalds extern void scsi_exit_hosts(void);
491da177e4SLinus Torvalds
501da177e4SLinus Torvalds /* scsi.c */
510a6ac4eeSChristoph Hellwig int scsi_init_sense_cache(struct Scsi_Host *shost);
52e9c787e6SChristoph Hellwig void scsi_init_command(struct scsi_device *dev, struct scsi_cmnd *cmd);
531da177e4SLinus Torvalds #ifdef CONFIG_SCSI_LOGGING
541da177e4SLinus Torvalds void scsi_log_send(struct scsi_cmnd *cmd);
551da177e4SLinus Torvalds void scsi_log_completion(struct scsi_cmnd *cmd, int disposition);
561da177e4SLinus Torvalds #else
scsi_log_send(struct scsi_cmnd * cmd)571da177e4SLinus Torvalds static inline void scsi_log_send(struct scsi_cmnd *cmd)
581da177e4SLinus Torvalds { };
scsi_log_completion(struct scsi_cmnd * cmd,int disposition)591da177e4SLinus Torvalds static inline void scsi_log_completion(struct scsi_cmnd *cmd, int disposition)
601da177e4SLinus Torvalds { };
611da177e4SLinus Torvalds #endif
621da177e4SLinus Torvalds
631da177e4SLinus Torvalds /* scsi_devinfo.c */
64598fa4b7SJames Bottomley
65598fa4b7SJames Bottomley /* list of keys for the lists */
664b1d8e78SBart Van Assche enum scsi_devinfo_key {
67598fa4b7SJames Bottomley SCSI_DEVINFO_GLOBAL = 0,
68a9e0edb6SJames Bottomley SCSI_DEVINFO_SPI,
69598fa4b7SJames Bottomley };
70598fa4b7SJames Bottomley
715ebde469SHannes Reinecke extern blist_flags_t scsi_get_device_flags(struct scsi_device *sdev,
727f23e146SJames Bottomley const unsigned char *vendor,
737f23e146SJames Bottomley const unsigned char *model);
745ebde469SHannes Reinecke extern blist_flags_t scsi_get_device_flags_keyed(struct scsi_device *sdev,
75598fa4b7SJames Bottomley const unsigned char *vendor,
765ebde469SHannes Reinecke const unsigned char *model,
774b1d8e78SBart Van Assche enum scsi_devinfo_key key);
78598fa4b7SJames Bottomley extern int scsi_dev_info_list_add_keyed(int compatible, char *vendor,
79598fa4b7SJames Bottomley char *model, char *strflags,
804b1d8e78SBart Van Assche blist_flags_t flags,
814b1d8e78SBart Van Assche enum scsi_devinfo_key key);
824b1d8e78SBart Van Assche extern int scsi_dev_info_list_del_keyed(char *vendor, char *model,
834b1d8e78SBart Van Assche enum scsi_devinfo_key key);
844b1d8e78SBart Van Assche extern int scsi_dev_info_add_list(enum scsi_devinfo_key key, const char *name);
854b1d8e78SBart Van Assche extern int scsi_dev_info_remove_list(enum scsi_devinfo_key key);
86598fa4b7SJames Bottomley
871da177e4SLinus Torvalds extern int __init scsi_init_devinfo(void);
881da177e4SLinus Torvalds extern void scsi_exit_devinfo(void);
891da177e4SLinus Torvalds
901da177e4SLinus Torvalds /* scsi_error.c */
91e494f6a7SHannes Reinecke extern void scmd_eh_abort_handler(struct work_struct *work);
929bdb4833SJohn Garry extern enum blk_eh_timer_return scsi_timeout(struct request *req);
931da177e4SLinus Torvalds extern int scsi_error_handler(void *host);
94b8e162f9SBart Van Assche extern enum scsi_disposition scsi_decide_disposition(struct scsi_cmnd *cmd);
95*65ead846SMing Lei extern void scsi_eh_wakeup(struct Scsi_Host *shost, unsigned int busy);
96a0658632SHannes Reinecke extern void scsi_eh_scmd_add(struct scsi_cmnd *);
97dca84e46SDarrick J. Wong void scsi_eh_ready_devs(struct Scsi_Host *shost,
98dca84e46SDarrick J. Wong struct list_head *work_q,
99dca84e46SDarrick J. Wong struct list_head *done_q);
100dca84e46SDarrick J. Wong int scsi_eh_get_sense(struct list_head *work_q,
101dca84e46SDarrick J. Wong struct list_head *done_q);
10288b32c3cSBart Van Assche bool scsi_noretry_cmd(struct scsi_cmnd *scmd);
103bf23e619SBart Van Assche void scsi_eh_done(struct scsi_cmnd *scmd);
1041da177e4SLinus Torvalds
1051da177e4SLinus Torvalds /* scsi_lib.c */
1066eb045e0SMing Lei extern void scsi_device_unbusy(struct scsi_device *sdev, struct scsi_cmnd *cmd);
10784feb166SBart Van Assche extern void scsi_queue_insert(struct scsi_cmnd *cmd, int reason);
1087b3d9545SLinus Torvalds extern void scsi_io_completion(struct scsi_cmnd *, unsigned int);
1091da177e4SLinus Torvalds extern void scsi_run_host_queues(struct Scsi_Host *shost);
110d67e8b38SBaoyou Xie extern void scsi_requeue_run_queue(struct work_struct *work);
11166483a4aSBart Van Assche extern void scsi_start_queue(struct scsi_device *sdev);
112d285203cSChristoph Hellwig extern int scsi_mq_setup_tags(struct Scsi_Host *shost);
1138fe4ce58SBart Van Assche extern void scsi_mq_free_tags(struct kref *kref);
1141da177e4SLinus Torvalds extern void scsi_exit_queue(void);
115d67e8b38SBaoyou Xie extern void scsi_evt_thread(struct work_struct *work);
1161da177e4SLinus Torvalds
1171da177e4SLinus Torvalds /* scsi_proc.c */
1181da177e4SLinus Torvalds #ifdef CONFIG_SCSI_PROC_FS
119036abd61SBart Van Assche extern int scsi_proc_hostdir_add(const struct scsi_host_template *);
120036abd61SBart Van Assche extern void scsi_proc_hostdir_rm(const struct scsi_host_template *);
1211da177e4SLinus Torvalds extern void scsi_proc_host_add(struct Scsi_Host *);
1221da177e4SLinus Torvalds extern void scsi_proc_host_rm(struct Scsi_Host *);
1231da177e4SLinus Torvalds extern int scsi_init_procfs(void);
1241da177e4SLinus Torvalds extern void scsi_exit_procfs(void);
1251da177e4SLinus Torvalds #else
126ecca3f9bSBart Van Assche # define scsi_proc_hostdir_add(sht) 0
1271da177e4SLinus Torvalds # define scsi_proc_hostdir_rm(sht) do { } while (0)
1281da177e4SLinus Torvalds # define scsi_proc_host_add(shost) do { } while (0)
1291da177e4SLinus Torvalds # define scsi_proc_host_rm(shost) do { } while (0)
1301da177e4SLinus Torvalds # define scsi_init_procfs() (0)
1311da177e4SLinus Torvalds # define scsi_exit_procfs() do { } while (0)
1321da177e4SLinus Torvalds #endif /* CONFIG_PROC_FS */
1331da177e4SLinus Torvalds
1341da177e4SLinus Torvalds /* scsi_scan.c */
135a19a93e4SBart Van Assche void scsi_enable_async_suspend(struct device *dev);
136fea6d607SAlan Stern extern int scsi_complete_async_scans(void);
1371da177e4SLinus Torvalds extern int scsi_scan_host_selected(struct Scsi_Host *, unsigned int,
1381d645088SHannes Reinecke unsigned int, u64, enum scsi_scan_mode);
1391da177e4SLinus Torvalds extern void scsi_forget_host(struct Scsi_Host *);
1401da177e4SLinus Torvalds
1411da177e4SLinus Torvalds /* scsi_sysctl.c */
1421da177e4SLinus Torvalds #ifdef CONFIG_SYSCTL
1431da177e4SLinus Torvalds extern int scsi_init_sysctl(void);
1441da177e4SLinus Torvalds extern void scsi_exit_sysctl(void);
1451da177e4SLinus Torvalds #else
1461da177e4SLinus Torvalds # define scsi_init_sysctl() (0)
1471da177e4SLinus Torvalds # define scsi_exit_sysctl() do { } while (0)
1481da177e4SLinus Torvalds #endif /* CONFIG_SYSCTL */
1491da177e4SLinus Torvalds
1501da177e4SLinus Torvalds /* scsi_sysfs.c */
1511da177e4SLinus Torvalds extern int scsi_sysfs_add_sdev(struct scsi_device *);
1521da177e4SLinus Torvalds extern int scsi_sysfs_add_host(struct Scsi_Host *);
1531da177e4SLinus Torvalds extern int scsi_sysfs_register(void);
1541da177e4SLinus Torvalds extern void scsi_sysfs_unregister(void);
1551da177e4SLinus Torvalds extern void scsi_sysfs_device_initialize(struct scsi_device *);
1561da177e4SLinus Torvalds extern struct scsi_transport_template blank_transport_template;
157903f4fedSAlan Stern extern void __scsi_remove_device(struct scsi_device *);
1581da177e4SLinus Torvalds
1591da177e4SLinus Torvalds extern struct bus_type scsi_bus_type;
1600a84486dSBart Van Assche extern const struct attribute_group *scsi_shost_groups[];
1611da177e4SLinus Torvalds
16284314fd4SJames Smart /* scsi_netlink.c */
16384314fd4SJames Smart #ifdef CONFIG_SCSI_NETLINK
16484314fd4SJames Smart extern void scsi_netlink_init(void);
16584314fd4SJames Smart extern void scsi_netlink_exit(void);
16684314fd4SJames Smart extern struct sock *scsi_nl_sock;
16784314fd4SJames Smart #else
scsi_netlink_init(void)16884314fd4SJames Smart static inline void scsi_netlink_init(void) {}
scsi_netlink_exit(void)16984314fd4SJames Smart static inline void scsi_netlink_exit(void) {}
17084314fd4SJames Smart #endif
17184314fd4SJames Smart
172db5bd1e0SAlan Stern /* scsi_pm.c */
173aa338601SRafael J. Wysocki #ifdef CONFIG_PM
174db5bd1e0SAlan Stern extern const struct dev_pm_ops scsi_bus_pm_ops;
1754f7ad521SRafael J. Wysocki
176bc4f2401SAlan Stern extern void scsi_autopm_get_target(struct scsi_target *);
177bc4f2401SAlan Stern extern void scsi_autopm_put_target(struct scsi_target *);
178bc4f2401SAlan Stern extern int scsi_autopm_get_host(struct Scsi_Host *);
179bc4f2401SAlan Stern extern void scsi_autopm_put_host(struct Scsi_Host *);
180bc4f2401SAlan Stern #else
scsi_autopm_get_target(struct scsi_target * t)181bc4f2401SAlan Stern static inline void scsi_autopm_get_target(struct scsi_target *t) {}
scsi_autopm_put_target(struct scsi_target * t)182bc4f2401SAlan Stern static inline void scsi_autopm_put_target(struct scsi_target *t) {}
scsi_autopm_get_host(struct Scsi_Host * h)183bc4f2401SAlan Stern static inline int scsi_autopm_get_host(struct Scsi_Host *h) { return 0; }
scsi_autopm_put_host(struct Scsi_Host * h)184bc4f2401SAlan Stern static inline void scsi_autopm_put_host(struct Scsi_Host *h) {}
1854f7ad521SRafael J. Wysocki #endif /* CONFIG_PM */
186db5bd1e0SAlan Stern
187086b91d0SChristoph Hellwig /* scsi_dh.c */
188086b91d0SChristoph Hellwig #ifdef CONFIG_SCSI_DH
1892930f817SHannes Reinecke void scsi_dh_add_device(struct scsi_device *sdev);
19023695e41SJunichi Nomura void scsi_dh_release_device(struct scsi_device *sdev);
191086b91d0SChristoph Hellwig #else
scsi_dh_add_device(struct scsi_device * sdev)1922930f817SHannes Reinecke static inline void scsi_dh_add_device(struct scsi_device *sdev) { }
scsi_dh_release_device(struct scsi_device * sdev)19323695e41SJunichi Nomura static inline void scsi_dh_release_device(struct scsi_device *sdev) { }
194086b91d0SChristoph Hellwig #endif
195086b91d0SChristoph Hellwig
196ead09dd3SChristoph Hellwig struct bsg_device *scsi_bsg_register_queue(struct scsi_device *sdev);
19778011042SChristoph Hellwig
198020b0f0aSMing Lei extern int scsi_device_max_queue_depth(struct scsi_device *sdev);
199020b0f0aSMing Lei
2001da177e4SLinus Torvalds /*
2011da177e4SLinus Torvalds * internal scsi timeout functions: for use by mid-layer and transport
2021da177e4SLinus Torvalds * classes.
2031da177e4SLinus Torvalds */
2041da177e4SLinus Torvalds
2051c9e16e4SJames Smart #define SCSI_DEVICE_BLOCK_MAX_TIMEOUT 600 /* units in seconds */
2061da177e4SLinus Torvalds
2071da177e4SLinus Torvalds #endif /* _SCSI_PRIV_H */
208