27e286f3db
-----BEGIN PGP SIGNATURE----- iQIzBAABCAAdFiEEZH8oZUiU471FcZm+ONu9yGCSaT4FAmNZGCIACgkQONu9yGCS aT5dEQ//Q2YBvqn1WGhMJRRtIYeczfwvLh3b5duyt1nbf7KOA7yrjpmaQvszunLj FanBKsf9QrekTxMUJ9++RlFQy/pxkexy39P3ddlE+QQnKeY+lBr5fc/XSBOmmvm+ f1CInT4C6nRRn/r/vCumGfuhZ6o+BLwPPgkTCOs9ima6iaq7nLqgFquznVQ2XFJG SCtS+OPjnoH7HMOw9vXefd53KJJj5kpE+2fMnEBjdW7x4mPM6nwY3ZxB8sIUdLXe dtfDku6W1I8qnGSnI0B+I8/4psNYr/7j4UVTgEKSGmlKKzc78qypdX8YiOGExa84 MWQrEcIGBOzOaMt5F5RWbGbQmwDtlZC2yuTc5YeJ1eSZ6WfZ42rRu+SkMgloRpjO bCzKI8bZ6jmRFNeAPSuR9sF/fRrXlgPsszWYALwy9TTPMvG33jrJaiGwYCOuRxP/ Fn9C1AshGI+Yy7pX5PR+yOWeII4fgwFBo3Oxritm0RG31KZoXKsrVdyb5CwAD0Sf VMb4SNapWwjWKOqi39jAzxgmvkFAwv99HC77dLZhTzwsW+c0+8CH0ccpX/V9997v i2IfCLEoOODlpjjoEgeoZ1lwOSX4/cSrlO4L7qcw+vkmXplEkOnD5Lj5Sdw+m9Hp 1uwQGVZyngK/eMxInDLlrOFY9SOASCIs+XjJpzqimXp1cTLLEHM= =2I2l -----END PGP SIGNATURE----- Merge 4.19.262 into android-4.19-stable Changes in 4.19.262 Makefile.extrawarn: Move -Wcast-function-type-strict to W=1 docs: update mediator information in CoC docs ARM: fix function graph tracer and unwinder dependencies fs: fix UAF/GPF bug in nilfs_mdt_destroy firmware: arm_scmi: Add SCMI PM driver remove routine dmaengine: xilinx_dma: cleanup for fetching xlnx,num-fstores property dmaengine: xilinx_dma: Report error in case of dma_set_mask_and_coherent API failure ARM: dts: fix Moxa SDIO 'compatible', remove 'sdhci' misnomer scsi: qedf: Fix a UAF bug in __qedf_probe() net/ieee802154: fix uninit value bug in dgram_sendmsg um: Cleanup syscall_handler_t cast in syscalls_32.h um: Cleanup compiler warning in arch/x86/um/tls_32.c usb: mon: make mmapped memory read only USB: serial: ftdi_sio: fix 300 bps rate for SIO mmc: core: Replace with already defined values for readability mmc: core: Terminate infinite loop in SD-UHS voltage switch rpmsg: qcom: glink: replace strncpy() with strscpy_pad() nilfs2: fix NULL pointer dereference at nilfs_bmap_lookup_at_level() nilfs2: fix leak of nilfs_root in case of writer thread creation failure nilfs2: replace WARN_ONs by nilfs_error for checkpoint acquisition failure ceph: don't truncate file in atomic_open random: clamp credited irq bits to maximum mixed ALSA: hda: Fix position reporting on Poulsbo scsi: stex: Properly zero out the passthrough command structure USB: serial: qcserial: add new usb-id for Dell branded EM7455 random: restore O_NONBLOCK support random: avoid reading two cache lines on irq randomness random: use expired timer rather than wq for mixing fast pool wifi: mac80211_hwsim: avoid mac80211 warning on bad rate Input: xpad - add supported devices as contributed on github Input: xpad - fix wireless 360 controller breaking after suspend ALSA: oss: Fix potential deadlock at unregistration ALSA: rawmidi: Drop register_mutex in snd_rawmidi_free() ALSA: usb-audio: Fix potential memory leaks ALSA: usb-audio: Fix NULL dererence at error path ALSA: hda/realtek: remove ALC289_FIXUP_DUAL_SPK for Dell 5530 mtd: rawnand: atmel: Unmap streaming DMA mappings iio: dac: ad5593r: Fix i2c read protocol requirements usb: add quirks for Lenovo OneLink+ Dock can: kvaser_usb: Fix use of uninitialized completion can: kvaser_usb_leaf: Fix overread with an invalid command can: kvaser_usb_leaf: Fix TX queue out of sync after restart can: kvaser_usb_leaf: Fix CAN state after restart fs: dlm: fix race between test_bit() and queue_work() fs: dlm: handle -EBUSY first in lock arg validation HID: multitouch: Add memory barriers quota: Check next/prev free block number after reading from quota file regulator: qcom_rpm: Fix circular deferral regression Revert "fs: check FMODE_LSEEK to control internal pipe splicing" parisc: fbdev/stifb: Align graphics memory size to 4MB riscv: Allow PROT_WRITE-only mmap() UM: cpuinfo: Fix a warning for CONFIG_CPUMASK_OFFSTACK PCI: Sanitise firmware BAR assignments behind a PCI-PCI bridge fbdev: smscufx: Fix use-after-free in ufx_ops_open() btrfs: fix race between quota enable and quota rescan ioctl riscv: fix build with binutils 2.38 nilfs2: fix use-after-free bug of struct nilfs_root ext4: avoid crash when inline data creation follows DIO write ext4: fix null-ptr-deref in ext4_write_info ext4: make ext4_lazyinit_thread freezable ext4: place buffer head allocation before handle start livepatch: fix race between fork and KLP transition ftrace: Properly unset FTRACE_HASH_FL_MOD ring-buffer: Allow splice to read previous partially read pages ring-buffer: Check pending waiters when doing wake ups as well ring-buffer: Fix race between reset page and reading page KVM: x86/emulator: Fix handing of POP SS to correctly set interruptibility KVM: nVMX: Unconditionally purge queued/injected events on nested "exit" selinux: use "grep -E" instead of "egrep" sh: machvec: Use char[] for section boundaries wifi: ath10k: add peer map clean up for peer delete in ath10k_sta_state() wifi: mac80211: allow bw change during channel switch in mesh bpftool: Fix a wrong type cast in btf_dumper_int spi: mt7621: Fix an error message in mt7621_spi_probe() wifi: rtl8xxxu: tighten bounds checking in rtl8xxxu_read_efuse() spi: qup: add missing clk_disable_unprepare on error in spi_qup_resume() spi: qup: add missing clk_disable_unprepare on error in spi_qup_pm_resume_runtime() wifi: rtl8xxxu: Fix skb misuse in TX queue selection bpf: btf: fix truncated last_member_type_id in btf_struct_resolve wifi: rtl8xxxu: gen2: Fix mistake in path B IQ calibration net: fs_enet: Fix wrong check in do_pd_setup bpf: Ensure correct locking around vulnerable function find_vpid() spi/omap100k:Fix PM disable depth imbalance in omap1_spi100k_probe netfilter: nft_fib: Fix for rpath check with VRF devices spi: s3c64xx: Fix large transfers with DMA vhost/vsock: Use kvmalloc/kvfree for larger packets. mISDN: fix use-after-free bugs in l1oip timer handlers sctp: handle the error returned from sctp_auth_asoc_init_active_key tcp: fix tcp_cwnd_validate() to not forget is_cwnd_limited net: rds: don't hold sock lock when cancelling work from rds_tcp_reset_callbacks() bnx2x: fix potential memory leak in bnx2x_tpa_stop() once: add DO_ONCE_SLOW() for sleepable contexts net: mvpp2: fix mvpp2 debugfs leak drm: bridge: adv7511: fix CEC power down control register offset drm/mipi-dsi: Detach devices when removing the host platform/chrome: fix double-free in chromeos_laptop_prepare() platform/x86: msi-laptop: Fix old-ec check for backlight registering platform/x86: msi-laptop: Fix resource cleanup drm/bridge: megachips: Fix a null pointer dereference bug mmc: au1xmmc: Fix an error handling path in au1xmmc_probe() ASoC: eureka-tlv320: Hold reference returned from of_find_xxx API drm/msm/dpu: index dpu_kms->hw_vbif using vbif_idx ALSA: dmaengine: increment buffer pointer atomically mmc: wmt-sdmmc: Fix an error handling path in wmt_mci_probe() ASoC: wm8997: Fix PM disable depth imbalance in wm8997_probe ASoC: wm5110: Fix PM disable depth imbalance in wm5110_probe ASoC: wm5102: Fix PM disable depth imbalance in wm5102_probe memory: of: Fix refcount leak bug in of_get_ddr_timings() soc: qcom: smsm: Fix refcount leak bugs in qcom_smsm_probe() soc: qcom: smem_state: Add refcounting for the 'state->of_node' ARM: dts: turris-omnia: Fix mpp26 pin name and comment ARM: dts: kirkwood: lsxl: fix serial line ARM: dts: kirkwood: lsxl: remove first ethernet port ARM: dts: exynos: correct s5k6a3 reset polarity on Midas family ARM: Drop CMDLINE_* dependency on ATAGS ARM: dts: exynos: fix polarity of VBUS GPIO of Origen iio: adc: at91-sama5d2_adc: fix AT91_SAMA5D2_MR_TRACKTIM_MAX iio: adc: at91-sama5d2_adc: check return status for pressure and touch iio: inkern: only release the device node when done with it iio: ABI: Fix wrong format of differential capacitance channel ABI. clk: oxnas: Hold reference returned by of_get_parent() clk: berlin: Add of_node_put() for of_get_parent() clk: tegra: Fix refcount leak in tegra210_clock_init clk: tegra: Fix refcount leak in tegra114_clock_init clk: tegra20: Fix refcount leak in tegra20_clock_init HSI: omap_ssi: Fix refcount leak in ssi_probe HSI: omap_ssi_port: Fix dma_map_sg error check media: exynos4-is: fimc-is: Add of_node_put() when breaking out of loop tty: xilinx_uartps: Fix the ignore_status media: xilinx: vipp: Fix refcount leak in xvip_graph_dma_init RDMA/rxe: Fix "kernel NULL pointer dereference" error RDMA/rxe: Fix the error caused by qp->sk dyndbg: fix module.dyndbg handling dyndbg: let query-modname override actual module name mtd: devices: docg3: check the return value of devm_ioremap() in the probe ata: fix ata_id_sense_reporting_enabled() and ata_id_has_sense_reporting() ata: fix ata_id_has_devslp() ata: fix ata_id_has_ncq_autosense() ata: fix ata_id_has_dipm() md/raid5: Ensure stripe_fill happens on non-read IO with journal xhci: Don't show warning for reinit on known broken suspend usb: gadget: function: fix dangling pnp_string in f_printer.c drivers: serial: jsm: fix some leaks in probe phy: qualcomm: call clk_disable_unprepare in the error handling staging: vt6655: fix some erroneous memory clean-up loops firmware: google: Test spinlock on panic path to avoid lockups serial: 8250: Fix restoring termios speed after suspend fsi: core: Check error number after calling ida_simple_get mfd: intel_soc_pmic: Fix an error handling path in intel_soc_pmic_i2c_probe() mfd: fsl-imx25: Fix an error handling path in mx25_tsadc_setup_irq() mfd: lp8788: Fix an error handling path in lp8788_probe() mfd: lp8788: Fix an error handling path in lp8788_irq_init() and lp8788_irq_init() mfd: sm501: Add check for platform_driver_register() dmaengine: ioat: stop mod_timer from resurrecting deleted timer in __cleanup() spmi: pmic-arb: correct duplicate APID to PPID mapping logic clk: bcm2835: fix bcm2835_clock_rate_from_divisor declaration clk: ti: dra7-atl: Fix reference leak in of_dra7_atl_clk_probe mailbox: bcm-ferxrm-mailbox: Fix error check for dma_map_sg powerpc/math_emu/efp: Include module.h powerpc/sysdev/fsl_msi: Add missing of_node_put() powerpc/pci_dn: Add missing of_node_put() powerpc/powernv: add missing of_node_put() in opal_export_attrs() x86/hyperv: Fix 'struct hv_enlightened_vmcs' definition powerpc/64s: Fix GENERIC_CPU build flags for PPC970 / G5 powerpc: Fix SPE Power ISA properties for e500v1 platforms iommu/omap: Fix buffer overflow in debugfs iommu/iova: Fix module config properly crypto: cavium - prevent integer overflow loading firmware f2fs: fix race condition on setting FI_NO_EXTENT flag ACPI: video: Add Toshiba Satellite/Portege Z830 quirk MIPS: BCM47XX: Cast memcmp() of function to (void *) powercap: intel_rapl: fix UBSAN shift-out-of-bounds issue thermal: intel_powerclamp: Use get_cpu() instead of smp_processor_id() to avoid crash NFSD: Return nfserr_serverfault if splice_ok but buf->pages have data wifi: brcmfmac: fix invalid address access when enabling SCAN log level openvswitch: Fix double reporting of drops in dropwatch openvswitch: Fix overreporting of drops in dropwatch tcp: annotate data-race around tcp_md5sig_pool_populated wifi: ath9k: avoid uninit memory read in ath9k_htc_rx_msg() xfrm: Update ipcomp_scratches with NULL when freed wifi: brcmfmac: fix use-after-free bug in brcmf_netdev_start_xmit() Bluetooth: L2CAP: initialize delayed works at l2cap_chan_create() Bluetooth: hci_sysfs: Fix attempting to call device_add multiple times can: bcm: check the result of can_send() in bcm_can_tx() wifi: rt2x00: don't run Rt5592 IQ calibration on MT7620 wifi: rt2x00: set correct TX_SW_CFG1 MAC register for MT7620 wifi: rt2x00: set SoC wmac clock register wifi: rt2x00: correctly set BBP register 86 for MT7620 net: If sock is dead don't access sock's sk_wq in sk_stream_wait_memory Bluetooth: L2CAP: Fix user-after-free r8152: Rate limit overflow messages drm: Use size_t type for len variable in drm_copy_field() drm: Prevent drm_copy_field() to attempt copying a NULL pointer drm/amd/display: fix overflow on MIN_I64 definition drm/vc4: vec: Fix timings for VEC modes drm: panel-orientation-quirks: Add quirk for Anbernic Win600 platform/x86: msi-laptop: Change DMI match / alias strings to fix module autoloading drm/amdgpu: fix initial connector audio value ARM: dts: imx7d-sdb: config the max pressure for tsc2046 ARM: dts: imx6q: add missing properties for sram ARM: dts: imx6dl: add missing properties for sram ARM: dts: imx6qp: add missing properties for sram ARM: dts: imx6sl: add missing properties for sram ARM: dts: imx6sll: add missing properties for sram ARM: dts: imx6sx: add missing properties for sram media: cx88: Fix a null-ptr-deref bug in buffer_prepare() scsi: 3w-9xxx: Avoid disabling device if failing to enable it nbd: Fix hung when signal interrupts nbd_start_device_ioctl() power: supply: adp5061: fix out-of-bounds read in adp5061_get_chg_type() staging: vt6655: fix potential memory leak ata: libahci_platform: Sanity check the DT child nodes number HID: roccat: Fix use-after-free in roccat_read() md/raid5: Wait for MD_SB_CHANGE_PENDING in raid5d usb: host: xhci: Fix potential memory leak in xhci_alloc_stream_info() usb: musb: Fix musb_gadget.c rxstate overflow bug Revert "usb: storage: Add quirk for Samsung Fit flash" nvme: copy firmware_rev on each init usb: idmouse: fix an uninit-value in idmouse_open clk: bcm2835: Make peripheral PLLC critical perf intel-pt: Fix segfault in intel_pt_print_info() with uClibc net: ieee802154: return -EINVAL for unknown addr type net/ieee802154: don't warn zero-sized raw_sendmsg() ext4: continue to expand file system when the target size doesn't reach md: Replace snprintf with scnprintf efi: libstub: drop pointless get_memory_map() call inet: fully convert sk->sk_rx_dst to RCU rules thermal: intel_powerclamp: Use first online CPU as control_cpu gcov: support GCC 12.1 and newer compilers Linux 4.19.262 Signed-off-by: Greg Kroah-Hartman <gregkh@google.com> Change-Id: If70223b939e3710c4fbc4f7cc522f07d4b4ffd45
365 lines
9.7 KiB
C
365 lines
9.7 KiB
C
/* SPDX-License-Identifier: GPL-2.0 */
|
|
#ifndef _SCSI_SCSI_CMND_H
|
|
#define _SCSI_SCSI_CMND_H
|
|
|
|
#include <linux/dma-mapping.h>
|
|
#include <linux/blkdev.h>
|
|
#include <linux/t10-pi.h>
|
|
#include <linux/list.h>
|
|
#include <linux/types.h>
|
|
#include <linux/timer.h>
|
|
#include <linux/scatterlist.h>
|
|
#include <scsi/scsi_device.h>
|
|
#include <scsi/scsi_request.h>
|
|
#include <linux/android_kabi.h>
|
|
|
|
struct Scsi_Host;
|
|
struct scsi_driver;
|
|
|
|
/*
|
|
* MAX_COMMAND_SIZE is:
|
|
* The longest fixed-length SCSI CDB as per the SCSI standard.
|
|
* fixed-length means: commands that their size can be determined
|
|
* by their opcode and the CDB does not carry a length specifier, (unlike
|
|
* the VARIABLE_LENGTH_CMD(0x7f) command). This is actually not exactly
|
|
* true and the SCSI standard also defines extended commands and
|
|
* vendor specific commands that can be bigger than 16 bytes. The kernel
|
|
* will support these using the same infrastructure used for VARLEN CDB's.
|
|
* So in effect MAX_COMMAND_SIZE means the maximum size command scsi-ml
|
|
* supports without specifying a cmd_len by ULD's
|
|
*/
|
|
#define MAX_COMMAND_SIZE 16
|
|
#if (MAX_COMMAND_SIZE > BLK_MAX_CDB)
|
|
# error MAX_COMMAND_SIZE can not be bigger than BLK_MAX_CDB
|
|
#endif
|
|
|
|
struct scsi_data_buffer {
|
|
struct sg_table table;
|
|
unsigned length;
|
|
int resid;
|
|
};
|
|
|
|
/* embedded in scsi_cmnd */
|
|
struct scsi_pointer {
|
|
char *ptr; /* data pointer */
|
|
int this_residual; /* left in this buffer */
|
|
struct scatterlist *buffer; /* which buffer */
|
|
int buffers_residual; /* how many buffers left */
|
|
|
|
dma_addr_t dma_handle;
|
|
|
|
volatile int Status;
|
|
volatile int Message;
|
|
volatile int have_data_in;
|
|
volatile int sent_command;
|
|
volatile int phase;
|
|
};
|
|
|
|
/* for scmd->flags */
|
|
#define SCMD_TAGGED (1 << 0)
|
|
#define SCMD_UNCHECKED_ISA_DMA (1 << 1)
|
|
#define SCMD_INITIALIZED (1 << 2)
|
|
/* flags preserved across unprep / reprep */
|
|
#define SCMD_PRESERVED_FLAGS (SCMD_UNCHECKED_ISA_DMA | SCMD_INITIALIZED)
|
|
|
|
struct scsi_cmnd {
|
|
struct scsi_request req;
|
|
struct scsi_device *device;
|
|
struct list_head list; /* scsi_cmnd participates in queue lists */
|
|
struct list_head eh_entry; /* entry for the host eh_cmd_q */
|
|
struct delayed_work abort_work;
|
|
|
|
struct rcu_head rcu;
|
|
|
|
int eh_eflags; /* Used by error handlr */
|
|
|
|
/*
|
|
* A SCSI Command is assigned a nonzero serial_number before passed
|
|
* to the driver's queue command function. The serial_number is
|
|
* cleared when scsi_done is entered indicating that the command
|
|
* has been completed. It is a bug for LLDDs to use this number
|
|
* for purposes other than printk (and even that is only useful
|
|
* for debugging).
|
|
*/
|
|
unsigned long serial_number;
|
|
|
|
/*
|
|
* This is set to jiffies as it was when the command was first
|
|
* allocated. It is used to time how long the command has
|
|
* been outstanding
|
|
*/
|
|
unsigned long jiffies_at_alloc;
|
|
|
|
int retries;
|
|
int allowed;
|
|
|
|
unsigned char prot_op;
|
|
unsigned char prot_type;
|
|
unsigned char prot_flags;
|
|
|
|
unsigned short cmd_len;
|
|
enum dma_data_direction sc_data_direction;
|
|
|
|
/* These elements define the operation we are about to perform */
|
|
unsigned char *cmnd;
|
|
|
|
|
|
/* These elements define the operation we ultimately want to perform */
|
|
struct scsi_data_buffer sdb;
|
|
struct scsi_data_buffer *prot_sdb;
|
|
|
|
unsigned underflow; /* Return error if less than
|
|
this amount is transferred */
|
|
|
|
unsigned transfersize; /* How much we are guaranteed to
|
|
transfer with each SCSI transfer
|
|
(ie, between disconnect /
|
|
reconnects. Probably == sector
|
|
size */
|
|
|
|
struct request *request; /* The command we are
|
|
working on */
|
|
|
|
unsigned char *sense_buffer;
|
|
/* obtained by REQUEST SENSE when
|
|
* CHECK CONDITION is received on original
|
|
* command (auto-sense). Length must be
|
|
* SCSI_SENSE_BUFFERSIZE bytes. */
|
|
|
|
/* Low-level done function - can be used by low-level driver to point
|
|
* to completion function. Not used by mid/upper level code. */
|
|
void (*scsi_done) (struct scsi_cmnd *);
|
|
|
|
/*
|
|
* The following fields can be written to by the host specific code.
|
|
* Everything else should be left alone.
|
|
*/
|
|
struct scsi_pointer SCp; /* Scratchpad used by some host adapters */
|
|
|
|
unsigned char *host_scribble; /* The host adapter is allowed to
|
|
* call scsi_malloc and get some memory
|
|
* and hang it here. The host adapter
|
|
* is also expected to call scsi_free
|
|
* to release this memory. (The memory
|
|
* obtained by scsi_malloc is guaranteed
|
|
* to be at an address < 16Mb). */
|
|
|
|
int result; /* Status code from lower level driver */
|
|
int flags; /* Command flags */
|
|
|
|
unsigned char tag; /* SCSI-II queued command tag */
|
|
|
|
ANDROID_KABI_RESERVE(1);
|
|
ANDROID_KABI_RESERVE(2);
|
|
ANDROID_KABI_RESERVE(3);
|
|
ANDROID_KABI_RESERVE(4);
|
|
};
|
|
|
|
/*
|
|
* Return the driver private allocation behind the command.
|
|
* Only works if cmd_size is set in the host template.
|
|
*/
|
|
static inline void *scsi_cmd_priv(struct scsi_cmnd *cmd)
|
|
{
|
|
return cmd + 1;
|
|
}
|
|
|
|
/* make sure not to use it with passthrough commands */
|
|
static inline struct scsi_driver *scsi_cmd_to_driver(struct scsi_cmnd *cmd)
|
|
{
|
|
return *(struct scsi_driver **)cmd->request->rq_disk->private_data;
|
|
}
|
|
|
|
extern void scsi_put_command(struct scsi_cmnd *);
|
|
extern void scsi_finish_command(struct scsi_cmnd *cmd);
|
|
|
|
extern void *scsi_kmap_atomic_sg(struct scatterlist *sg, int sg_count,
|
|
size_t *offset, size_t *len);
|
|
extern void scsi_kunmap_atomic_sg(void *virt);
|
|
|
|
extern int scsi_init_io(struct scsi_cmnd *cmd);
|
|
|
|
#ifdef CONFIG_SCSI_DMA
|
|
extern int scsi_dma_map(struct scsi_cmnd *cmd);
|
|
extern void scsi_dma_unmap(struct scsi_cmnd *cmd);
|
|
#else /* !CONFIG_SCSI_DMA */
|
|
static inline int scsi_dma_map(struct scsi_cmnd *cmd) { return -ENOSYS; }
|
|
static inline void scsi_dma_unmap(struct scsi_cmnd *cmd) { }
|
|
#endif /* !CONFIG_SCSI_DMA */
|
|
|
|
static inline unsigned scsi_sg_count(struct scsi_cmnd *cmd)
|
|
{
|
|
return cmd->sdb.table.nents;
|
|
}
|
|
|
|
static inline struct scatterlist *scsi_sglist(struct scsi_cmnd *cmd)
|
|
{
|
|
return cmd->sdb.table.sgl;
|
|
}
|
|
|
|
static inline unsigned scsi_bufflen(struct scsi_cmnd *cmd)
|
|
{
|
|
return cmd->sdb.length;
|
|
}
|
|
|
|
static inline void scsi_set_resid(struct scsi_cmnd *cmd, int resid)
|
|
{
|
|
cmd->sdb.resid = resid;
|
|
}
|
|
|
|
static inline int scsi_get_resid(struct scsi_cmnd *cmd)
|
|
{
|
|
return cmd->sdb.resid;
|
|
}
|
|
|
|
#define scsi_for_each_sg(cmd, sg, nseg, __i) \
|
|
for_each_sg(scsi_sglist(cmd), sg, nseg, __i)
|
|
|
|
static inline int scsi_bidi_cmnd(struct scsi_cmnd *cmd)
|
|
{
|
|
return blk_bidi_rq(cmd->request) &&
|
|
(cmd->request->next_rq->special != NULL);
|
|
}
|
|
|
|
static inline struct scsi_data_buffer *scsi_in(struct scsi_cmnd *cmd)
|
|
{
|
|
return scsi_bidi_cmnd(cmd) ?
|
|
cmd->request->next_rq->special : &cmd->sdb;
|
|
}
|
|
|
|
static inline struct scsi_data_buffer *scsi_out(struct scsi_cmnd *cmd)
|
|
{
|
|
return &cmd->sdb;
|
|
}
|
|
|
|
static inline int scsi_sg_copy_from_buffer(struct scsi_cmnd *cmd,
|
|
const void *buf, int buflen)
|
|
{
|
|
return sg_copy_from_buffer(scsi_sglist(cmd), scsi_sg_count(cmd),
|
|
buf, buflen);
|
|
}
|
|
|
|
static inline int scsi_sg_copy_to_buffer(struct scsi_cmnd *cmd,
|
|
void *buf, int buflen)
|
|
{
|
|
return sg_copy_to_buffer(scsi_sglist(cmd), scsi_sg_count(cmd),
|
|
buf, buflen);
|
|
}
|
|
|
|
/*
|
|
* The operations below are hints that tell the controller driver how
|
|
* to handle I/Os with DIF or similar types of protection information.
|
|
*/
|
|
enum scsi_prot_operations {
|
|
/* Normal I/O */
|
|
SCSI_PROT_NORMAL = 0,
|
|
|
|
/* OS-HBA: Protected, HBA-Target: Unprotected */
|
|
SCSI_PROT_READ_INSERT,
|
|
SCSI_PROT_WRITE_STRIP,
|
|
|
|
/* OS-HBA: Unprotected, HBA-Target: Protected */
|
|
SCSI_PROT_READ_STRIP,
|
|
SCSI_PROT_WRITE_INSERT,
|
|
|
|
/* OS-HBA: Protected, HBA-Target: Protected */
|
|
SCSI_PROT_READ_PASS,
|
|
SCSI_PROT_WRITE_PASS,
|
|
};
|
|
|
|
static inline void scsi_set_prot_op(struct scsi_cmnd *scmd, unsigned char op)
|
|
{
|
|
scmd->prot_op = op;
|
|
}
|
|
|
|
static inline unsigned char scsi_get_prot_op(struct scsi_cmnd *scmd)
|
|
{
|
|
return scmd->prot_op;
|
|
}
|
|
|
|
enum scsi_prot_flags {
|
|
SCSI_PROT_TRANSFER_PI = 1 << 0,
|
|
SCSI_PROT_GUARD_CHECK = 1 << 1,
|
|
SCSI_PROT_REF_CHECK = 1 << 2,
|
|
SCSI_PROT_REF_INCREMENT = 1 << 3,
|
|
SCSI_PROT_IP_CHECKSUM = 1 << 4,
|
|
};
|
|
|
|
/*
|
|
* The controller usually does not know anything about the target it
|
|
* is communicating with. However, when DIX is enabled the controller
|
|
* must be know target type so it can verify the protection
|
|
* information passed along with the I/O.
|
|
*/
|
|
enum scsi_prot_target_type {
|
|
SCSI_PROT_DIF_TYPE0 = 0,
|
|
SCSI_PROT_DIF_TYPE1,
|
|
SCSI_PROT_DIF_TYPE2,
|
|
SCSI_PROT_DIF_TYPE3,
|
|
};
|
|
|
|
static inline void scsi_set_prot_type(struct scsi_cmnd *scmd, unsigned char type)
|
|
{
|
|
scmd->prot_type = type;
|
|
}
|
|
|
|
static inline unsigned char scsi_get_prot_type(struct scsi_cmnd *scmd)
|
|
{
|
|
return scmd->prot_type;
|
|
}
|
|
|
|
static inline sector_t scsi_get_lba(struct scsi_cmnd *scmd)
|
|
{
|
|
return blk_rq_pos(scmd->request);
|
|
}
|
|
|
|
static inline unsigned int scsi_prot_interval(struct scsi_cmnd *scmd)
|
|
{
|
|
return scmd->device->sector_size;
|
|
}
|
|
|
|
static inline unsigned scsi_prot_sg_count(struct scsi_cmnd *cmd)
|
|
{
|
|
return cmd->prot_sdb ? cmd->prot_sdb->table.nents : 0;
|
|
}
|
|
|
|
static inline struct scatterlist *scsi_prot_sglist(struct scsi_cmnd *cmd)
|
|
{
|
|
return cmd->prot_sdb ? cmd->prot_sdb->table.sgl : NULL;
|
|
}
|
|
|
|
static inline struct scsi_data_buffer *scsi_prot(struct scsi_cmnd *cmd)
|
|
{
|
|
return cmd->prot_sdb;
|
|
}
|
|
|
|
#define scsi_for_each_prot_sg(cmd, sg, nseg, __i) \
|
|
for_each_sg(scsi_prot_sglist(cmd), sg, nseg, __i)
|
|
|
|
static inline void set_msg_byte(struct scsi_cmnd *cmd, char status)
|
|
{
|
|
cmd->result = (cmd->result & 0xffff00ff) | (status << 8);
|
|
}
|
|
|
|
static inline void set_host_byte(struct scsi_cmnd *cmd, char status)
|
|
{
|
|
cmd->result = (cmd->result & 0xff00ffff) | (status << 16);
|
|
}
|
|
|
|
static inline void set_driver_byte(struct scsi_cmnd *cmd, char status)
|
|
{
|
|
cmd->result = (cmd->result & 0x00ffffff) | (status << 24);
|
|
}
|
|
|
|
static inline unsigned scsi_transfer_length(struct scsi_cmnd *scmd)
|
|
{
|
|
unsigned int xfer_len = scsi_out(scmd)->length;
|
|
unsigned int prot_interval = scsi_prot_interval(scmd);
|
|
|
|
if (scmd->prot_flags & SCSI_PROT_TRANSFER_PI)
|
|
xfer_len += (xfer_len >> ilog2(prot_interval)) * 8;
|
|
|
|
return xfer_len;
|
|
}
|
|
|
|
#endif /* _SCSI_SCSI_CMND_H */
|