Orange Pi5 kernel

Deprecated Linux kernel 5.10.110 for OrangePi 5/5B/5+ boards

3 Commits   0 Branches   0 Tags
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   1) // SPDX-License-Identifier: GPL-2.0-only
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   2) /*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   3)  * Changes:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   4)  * Arnaldo Carvalho de Melo <acme@conectiva.com.br> 08/23/2000
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   5)  * - get rid of some verify_areas and use __copy*user and __get/put_user
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   6)  *   for the ones that remain
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   7)  */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   8) #include <linux/module.h>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   9) #include <linux/blkdev.h>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  10) #include <linux/interrupt.h>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  11) #include <linux/errno.h>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  12) #include <linux/kernel.h>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  13) #include <linux/sched.h>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  14) #include <linux/mm.h>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  15) #include <linux/string.h>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  16) #include <linux/uaccess.h>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  17) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  18) #include <scsi/scsi.h>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  19) #include <scsi/scsi_cmnd.h>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  20) #include <scsi/scsi_device.h>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  21) #include <scsi/scsi_eh.h>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  22) #include <scsi/scsi_host.h>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  23) #include <scsi/scsi_ioctl.h>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  24) #include <scsi/sg.h>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  25) #include <scsi/scsi_dbg.h>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  26) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  27) #include "scsi_logging.h"
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  28) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  29) #define NORMAL_RETRIES			5
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  30) #define IOCTL_NORMAL_TIMEOUT			(10 * HZ)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  31) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  32) #define MAX_BUF PAGE_SIZE
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  33) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  34) /**
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  35)  * ioctl_probe  --  return host identification
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  36)  * @host:	host to identify
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  37)  * @buffer:	userspace buffer for identification
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  38)  *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  39)  * Return an identifying string at @buffer, if @buffer is non-NULL, filling
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  40)  * to the length stored at * (int *) @buffer.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  41)  */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  42) static int ioctl_probe(struct Scsi_Host *host, void __user *buffer)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  43) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  44) 	unsigned int len, slen;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  45) 	const char *string;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  46) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  47) 	if (buffer) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  48) 		if (get_user(len, (unsigned int __user *) buffer))
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  49) 			return -EFAULT;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  50) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  51) 		if (host->hostt->info)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  52) 			string = host->hostt->info(host);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  53) 		else
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  54) 			string = host->hostt->name;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  55) 		if (string) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  56) 			slen = strlen(string);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  57) 			if (len > slen)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  58) 				len = slen + 1;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  59) 			if (copy_to_user(buffer, string, len))
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  60) 				return -EFAULT;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  61) 		}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  62) 	}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  63) 	return 1;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  64) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  65) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  66) /*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  67) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  68)  * The SCSI_IOCTL_SEND_COMMAND ioctl sends a command out to the SCSI host.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  69)  * The IOCTL_NORMAL_TIMEOUT and NORMAL_RETRIES  variables are used.  
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  70)  * 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  71)  * dev is the SCSI device struct ptr, *(int *) arg is the length of the
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  72)  * input data, if any, not including the command string & counts, 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  73)  * *((int *)arg + 1) is the output buffer size in bytes.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  74)  * 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  75)  * *(char *) ((int *) arg)[2] the actual command byte.   
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  76)  * 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  77)  * Note that if more than MAX_BUF bytes are requested to be transferred,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  78)  * the ioctl will fail with error EINVAL.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  79)  * 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  80)  * This size *does not* include the initial lengths that were passed.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  81)  * 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  82)  * The SCSI command is read from the memory location immediately after the
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  83)  * length words, and the input data is right after the command.  The SCSI
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  84)  * routines know the command size based on the opcode decode.  
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  85)  * 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  86)  * The output area is then filled in starting from the command byte. 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  87)  */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  88) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  89) static int ioctl_internal_command(struct scsi_device *sdev, char *cmd,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  90) 				  int timeout, int retries)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  91) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  92) 	int result;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  93) 	struct scsi_sense_hdr sshdr;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  94) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  95) 	SCSI_LOG_IOCTL(1, sdev_printk(KERN_INFO, sdev,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  96) 				      "Trying ioctl with scsi command %d\n", *cmd));
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  97) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  98) 	result = scsi_execute_req(sdev, cmd, DMA_NONE, NULL, 0,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  99) 				  &sshdr, timeout, retries, NULL);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 100) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 101) 	SCSI_LOG_IOCTL(2, sdev_printk(KERN_INFO, sdev,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 102) 				      "Ioctl returned  0x%x\n", result));
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 103) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 104) 	if (driver_byte(result) == DRIVER_SENSE &&
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 105) 	    scsi_sense_valid(&sshdr)) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 106) 		switch (sshdr.sense_key) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 107) 		case ILLEGAL_REQUEST:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 108) 			if (cmd[0] == ALLOW_MEDIUM_REMOVAL)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 109) 				sdev->lockable = 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 110) 			else
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 111) 				sdev_printk(KERN_INFO, sdev,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 112) 					    "ioctl_internal_command: "
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 113) 					    "ILLEGAL REQUEST "
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 114) 					    "asc=0x%x ascq=0x%x\n",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 115) 					    sshdr.asc, sshdr.ascq);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 116) 			break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 117) 		case NOT_READY:	/* This happens if there is no disc in drive */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 118) 			if (sdev->removable)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 119) 				break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 120) 			fallthrough;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 121) 		case UNIT_ATTENTION:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 122) 			if (sdev->removable) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 123) 				sdev->changed = 1;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 124) 				result = 0;	/* This is no longer considered an error */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 125) 				break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 126) 			}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 127) 			fallthrough;	/* for non-removable media */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 128) 		default:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 129) 			sdev_printk(KERN_INFO, sdev,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 130) 				    "ioctl_internal_command return code = %x\n",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 131) 				    result);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 132) 			scsi_print_sense_hdr(sdev, NULL, &sshdr);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 133) 			break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 134) 		}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 135) 	}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 136) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 137) 	SCSI_LOG_IOCTL(2, sdev_printk(KERN_INFO, sdev,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 138) 				      "IOCTL Releasing command\n"));
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 139) 	return result;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 140) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 141) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 142) int scsi_set_medium_removal(struct scsi_device *sdev, char state)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 143) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 144) 	char scsi_cmd[MAX_COMMAND_SIZE];
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 145) 	int ret;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 146) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 147) 	if (!sdev->removable || !sdev->lockable)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 148) 	       return 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 149) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 150) 	scsi_cmd[0] = ALLOW_MEDIUM_REMOVAL;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 151) 	scsi_cmd[1] = 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 152) 	scsi_cmd[2] = 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 153) 	scsi_cmd[3] = 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 154) 	scsi_cmd[4] = state;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 155) 	scsi_cmd[5] = 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 156) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 157) 	ret = ioctl_internal_command(sdev, scsi_cmd,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 158) 			IOCTL_NORMAL_TIMEOUT, NORMAL_RETRIES);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 159) 	if (ret == 0)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 160) 		sdev->locked = (state == SCSI_REMOVAL_PREVENT);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 161) 	return ret;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 162) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 163) EXPORT_SYMBOL(scsi_set_medium_removal);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 164) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 165) /*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 166)  * The scsi_ioctl_get_pci() function places into arg the value
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 167)  * pci_dev::slot_name (8 characters) for the PCI device (if any).
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 168)  * Returns: 0 on success
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 169)  *          -ENXIO if there isn't a PCI device pointer
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 170)  *                 (could be because the SCSI driver hasn't been
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 171)  *                  updated yet, or because it isn't a SCSI
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 172)  *                  device)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 173)  *          any copy_to_user() error on failure there
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 174)  */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 175) static int scsi_ioctl_get_pci(struct scsi_device *sdev, void __user *arg)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 176) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 177) 	struct device *dev = scsi_get_device(sdev->host);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 178) 	const char *name;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 179) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 180)         if (!dev)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 181) 		return -ENXIO;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 182) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 183) 	name = dev_name(dev);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 184) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 185) 	/* compatibility with old ioctl which only returned
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 186) 	 * 20 characters */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 187)         return copy_to_user(arg, name, min(strlen(name), (size_t)20))
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 188) 		? -EFAULT: 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 189) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 190) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 191) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 192) static int scsi_ioctl_common(struct scsi_device *sdev, int cmd, void __user *arg)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 193) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 194) 	char scsi_cmd[MAX_COMMAND_SIZE];
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 195) 	struct scsi_sense_hdr sense_hdr;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 196) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 197) 	/* Check for deprecated ioctls ... all the ioctls which don't
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 198) 	 * follow the new unique numbering scheme are deprecated */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 199) 	switch (cmd) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 200) 	case SCSI_IOCTL_SEND_COMMAND:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 201) 	case SCSI_IOCTL_TEST_UNIT_READY:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 202) 	case SCSI_IOCTL_BENCHMARK_COMMAND:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 203) 	case SCSI_IOCTL_SYNC:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 204) 	case SCSI_IOCTL_START_UNIT:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 205) 	case SCSI_IOCTL_STOP_UNIT:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 206) 		printk(KERN_WARNING "program %s is using a deprecated SCSI "
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 207) 		       "ioctl, please convert it to SG_IO\n", current->comm);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 208) 		break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 209) 	default:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 210) 		break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 211) 	}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 212) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 213) 	switch (cmd) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 214) 	case SCSI_IOCTL_GET_IDLUN: {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 215) 		struct scsi_idlun v = {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 216) 			.dev_id = (sdev->id & 0xff)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 217) 				 + ((sdev->lun & 0xff) << 8)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 218) 				 + ((sdev->channel & 0xff) << 16)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 219) 				 + ((sdev->host->host_no & 0xff) << 24),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 220) 			.host_unique_id = sdev->host->unique_id
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 221) 		};
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 222) 		if (copy_to_user(arg, &v, sizeof(struct scsi_idlun)))
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 223) 			return -EFAULT;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 224) 		return 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 225) 	}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 226) 	case SCSI_IOCTL_GET_BUS_NUMBER:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 227) 		return put_user(sdev->host->host_no, (int __user *)arg);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 228) 	case SCSI_IOCTL_PROBE_HOST:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 229) 		return ioctl_probe(sdev->host, arg);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 230) 	case SCSI_IOCTL_SEND_COMMAND:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 231) 		if (!capable(CAP_SYS_ADMIN) || !capable(CAP_SYS_RAWIO))
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 232) 			return -EACCES;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 233) 		return sg_scsi_ioctl(sdev->request_queue, NULL, 0, arg);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 234) 	case SCSI_IOCTL_DOORLOCK:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 235) 		return scsi_set_medium_removal(sdev, SCSI_REMOVAL_PREVENT);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 236) 	case SCSI_IOCTL_DOORUNLOCK:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 237) 		return scsi_set_medium_removal(sdev, SCSI_REMOVAL_ALLOW);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 238) 	case SCSI_IOCTL_TEST_UNIT_READY:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 239) 		return scsi_test_unit_ready(sdev, IOCTL_NORMAL_TIMEOUT,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 240) 					    NORMAL_RETRIES, &sense_hdr);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 241) 	case SCSI_IOCTL_START_UNIT:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 242) 		scsi_cmd[0] = START_STOP;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 243) 		scsi_cmd[1] = 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 244) 		scsi_cmd[2] = scsi_cmd[3] = scsi_cmd[5] = 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 245) 		scsi_cmd[4] = 1;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 246) 		return ioctl_internal_command(sdev, scsi_cmd,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 247) 				     START_STOP_TIMEOUT, NORMAL_RETRIES);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 248) 	case SCSI_IOCTL_STOP_UNIT:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 249) 		scsi_cmd[0] = START_STOP;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 250) 		scsi_cmd[1] = 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 251) 		scsi_cmd[2] = scsi_cmd[3] = scsi_cmd[5] = 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 252) 		scsi_cmd[4] = 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 253) 		return ioctl_internal_command(sdev, scsi_cmd,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 254) 				     START_STOP_TIMEOUT, NORMAL_RETRIES);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 255)         case SCSI_IOCTL_GET_PCI:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 256)                 return scsi_ioctl_get_pci(sdev, arg);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 257) 	case SG_SCSI_RESET:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 258) 		return scsi_ioctl_reset(sdev, arg);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 259) 	}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 260) 	return -ENOIOCTLCMD;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 261) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 262) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 263) /**
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 264)  * scsi_ioctl - Dispatch ioctl to scsi device
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 265)  * @sdev: scsi device receiving ioctl
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 266)  * @cmd: which ioctl is it
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 267)  * @arg: data associated with ioctl
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 268)  *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 269)  * Description: The scsi_ioctl() function differs from most ioctls in that it
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 270)  * does not take a major/minor number as the dev field.  Rather, it takes
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 271)  * a pointer to a &struct scsi_device.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 272)  */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 273) int scsi_ioctl(struct scsi_device *sdev, int cmd, void __user *arg)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 274) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 275) 	int ret = scsi_ioctl_common(sdev, cmd, arg);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 276) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 277) 	if (ret != -ENOIOCTLCMD)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 278) 		return ret;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 279) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 280) 	if (sdev->host->hostt->ioctl)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 281) 		return sdev->host->hostt->ioctl(sdev, cmd, arg);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 282) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 283) 	return -EINVAL;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 284) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 285) EXPORT_SYMBOL(scsi_ioctl);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 286) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 287) #ifdef CONFIG_COMPAT
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 288) int scsi_compat_ioctl(struct scsi_device *sdev, int cmd, void __user *arg)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 289) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 290) 	int ret = scsi_ioctl_common(sdev, cmd, arg);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 291) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 292) 	if (ret != -ENOIOCTLCMD)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 293) 		return ret;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 294) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 295) 	if (sdev->host->hostt->compat_ioctl)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 296) 		return sdev->host->hostt->compat_ioctl(sdev, cmd, arg);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 297) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 298) 	return ret;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 299) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 300) EXPORT_SYMBOL(scsi_compat_ioctl);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 301) #endif
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 302) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 303) /*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 304)  * We can process a reset even when a device isn't fully operable.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 305)  */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 306) int scsi_ioctl_block_when_processing_errors(struct scsi_device *sdev, int cmd,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 307) 		bool ndelay)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 308) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 309) 	if (cmd == SG_SCSI_RESET && ndelay) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 310) 		if (scsi_host_in_recovery(sdev->host))
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 311) 			return -EAGAIN;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 312) 	} else {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 313) 		if (!scsi_block_when_processing_errors(sdev))
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 314) 			return -ENODEV;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 315) 	}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 316) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 317) 	return 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 318) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 319) EXPORT_SYMBOL_GPL(scsi_ioctl_block_when_processing_errors);