xref: /linux/drivers/target/target_core_pscsi.c (revision d6e0175cf3f9737a760482d185bb73566bcc9331)
1c66ac9dbSNicholas Bellinger /*******************************************************************************
2c66ac9dbSNicholas Bellinger  * Filename:  target_core_pscsi.c
3c66ac9dbSNicholas Bellinger  *
4c66ac9dbSNicholas Bellinger  * This file contains the generic target mode <-> Linux SCSI subsystem plugin.
5c66ac9dbSNicholas Bellinger  *
6c66ac9dbSNicholas Bellinger  * Copyright (c) 2003, 2004, 2005 PyX Technologies, Inc.
7c66ac9dbSNicholas Bellinger  * Copyright (c) 2005, 2006, 2007 SBE, Inc.
8c66ac9dbSNicholas Bellinger  * Copyright (c) 2007-2010 Rising Tide Systems
9c66ac9dbSNicholas Bellinger  * Copyright (c) 2008-2010 Linux-iSCSI.org
10c66ac9dbSNicholas Bellinger  *
11c66ac9dbSNicholas Bellinger  * Nicholas A. Bellinger <nab@kernel.org>
12c66ac9dbSNicholas Bellinger  *
13c66ac9dbSNicholas Bellinger  * This program is free software; you can redistribute it and/or modify
14c66ac9dbSNicholas Bellinger  * it under the terms of the GNU General Public License as published by
15c66ac9dbSNicholas Bellinger  * the Free Software Foundation; either version 2 of the License, or
16c66ac9dbSNicholas Bellinger  * (at your option) any later version.
17c66ac9dbSNicholas Bellinger  *
18c66ac9dbSNicholas Bellinger  * This program is distributed in the hope that it will be useful,
19c66ac9dbSNicholas Bellinger  * but WITHOUT ANY WARRANTY; without even the implied warranty of
20c66ac9dbSNicholas Bellinger  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
21c66ac9dbSNicholas Bellinger  * GNU General Public License for more details.
22c66ac9dbSNicholas Bellinger  *
23c66ac9dbSNicholas Bellinger  * You should have received a copy of the GNU General Public License
24c66ac9dbSNicholas Bellinger  * along with this program; if not, write to the Free Software
25c66ac9dbSNicholas Bellinger  * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
26c66ac9dbSNicholas Bellinger  *
27c66ac9dbSNicholas Bellinger  ******************************************************************************/
28c66ac9dbSNicholas Bellinger 
29c66ac9dbSNicholas Bellinger #include <linux/string.h>
30c66ac9dbSNicholas Bellinger #include <linux/parser.h>
31c66ac9dbSNicholas Bellinger #include <linux/timer.h>
32c66ac9dbSNicholas Bellinger #include <linux/blkdev.h>
33c66ac9dbSNicholas Bellinger #include <linux/blk_types.h>
34c66ac9dbSNicholas Bellinger #include <linux/slab.h>
35c66ac9dbSNicholas Bellinger #include <linux/spinlock.h>
36c66ac9dbSNicholas Bellinger #include <linux/genhd.h>
37c66ac9dbSNicholas Bellinger #include <linux/cdrom.h>
38*d6e0175cSChristoph Hellwig #include <linux/ratelimit.h>
39827509e3SPaul Gortmaker #include <linux/module.h>
40*d6e0175cSChristoph Hellwig #include <asm/unaligned.h>
41*d6e0175cSChristoph Hellwig 
42c66ac9dbSNicholas Bellinger #include <scsi/scsi.h>
43c66ac9dbSNicholas Bellinger #include <scsi/scsi_device.h>
44c66ac9dbSNicholas Bellinger #include <scsi/scsi_cmnd.h>
45c66ac9dbSNicholas Bellinger #include <scsi/scsi_host.h>
46e66ecd50SNicholas Bellinger #include <scsi/scsi_tcq.h>
47c66ac9dbSNicholas Bellinger 
48c66ac9dbSNicholas Bellinger #include <target/target_core_base.h>
49c4795fb2SChristoph Hellwig #include <target/target_core_backend.h>
50c66ac9dbSNicholas Bellinger 
51*d6e0175cSChristoph Hellwig #include "target_core_alua.h"
52c66ac9dbSNicholas Bellinger #include "target_core_pscsi.h"
53c66ac9dbSNicholas Bellinger 
54c66ac9dbSNicholas Bellinger #define ISPRINT(a)  ((a >= ' ') && (a <= '~'))
55c66ac9dbSNicholas Bellinger 
56c66ac9dbSNicholas Bellinger static struct se_subsystem_api pscsi_template;
57c66ac9dbSNicholas Bellinger 
58c66ac9dbSNicholas Bellinger static void pscsi_req_done(struct request *, int);
59c66ac9dbSNicholas Bellinger 
60c66ac9dbSNicholas Bellinger /*	pscsi_attach_hba():
61c66ac9dbSNicholas Bellinger  *
62c66ac9dbSNicholas Bellinger  * 	pscsi_get_sh() used scsi_host_lookup() to locate struct Scsi_Host.
63c66ac9dbSNicholas Bellinger  *	from the passed SCSI Host ID.
64c66ac9dbSNicholas Bellinger  */
65c66ac9dbSNicholas Bellinger static int pscsi_attach_hba(struct se_hba *hba, u32 host_id)
66c66ac9dbSNicholas Bellinger {
67c66ac9dbSNicholas Bellinger 	struct pscsi_hba_virt *phv;
68c66ac9dbSNicholas Bellinger 
69c66ac9dbSNicholas Bellinger 	phv = kzalloc(sizeof(struct pscsi_hba_virt), GFP_KERNEL);
706708bb27SAndy Grover 	if (!phv) {
716708bb27SAndy Grover 		pr_err("Unable to allocate struct pscsi_hba_virt\n");
72e3d6f909SAndy Grover 		return -ENOMEM;
73c66ac9dbSNicholas Bellinger 	}
74c66ac9dbSNicholas Bellinger 	phv->phv_host_id = host_id;
75e6a8a41aSStefan Hajnoczi 	phv->phv_mode = PHV_VIRTUAL_HOST_ID;
76c66ac9dbSNicholas Bellinger 
775951146dSAndy Grover 	hba->hba_ptr = phv;
78c66ac9dbSNicholas Bellinger 
796708bb27SAndy Grover 	pr_debug("CORE_HBA[%d] - TCM SCSI HBA Driver %s on"
80c66ac9dbSNicholas Bellinger 		" Generic Target Core Stack %s\n", hba->hba_id,
81c66ac9dbSNicholas Bellinger 		PSCSI_VERSION, TARGET_CORE_MOD_VERSION);
826708bb27SAndy Grover 	pr_debug("CORE_HBA[%d] - Attached SCSI HBA to Generic\n",
83e3d6f909SAndy Grover 	       hba->hba_id);
84c66ac9dbSNicholas Bellinger 
85c66ac9dbSNicholas Bellinger 	return 0;
86c66ac9dbSNicholas Bellinger }
87c66ac9dbSNicholas Bellinger 
88c66ac9dbSNicholas Bellinger static void pscsi_detach_hba(struct se_hba *hba)
89c66ac9dbSNicholas Bellinger {
90c66ac9dbSNicholas Bellinger 	struct pscsi_hba_virt *phv = hba->hba_ptr;
91c66ac9dbSNicholas Bellinger 	struct Scsi_Host *scsi_host = phv->phv_lld_host;
92c66ac9dbSNicholas Bellinger 
93c66ac9dbSNicholas Bellinger 	if (scsi_host) {
94c66ac9dbSNicholas Bellinger 		scsi_host_put(scsi_host);
95c66ac9dbSNicholas Bellinger 
966708bb27SAndy Grover 		pr_debug("CORE_HBA[%d] - Detached SCSI HBA: %s from"
97c66ac9dbSNicholas Bellinger 			" Generic Target Core\n", hba->hba_id,
98c66ac9dbSNicholas Bellinger 			(scsi_host->hostt->name) ? (scsi_host->hostt->name) :
99c66ac9dbSNicholas Bellinger 			"Unknown");
100c66ac9dbSNicholas Bellinger 	} else
1016708bb27SAndy Grover 		pr_debug("CORE_HBA[%d] - Detached Virtual SCSI HBA"
102c66ac9dbSNicholas Bellinger 			" from Generic Target Core\n", hba->hba_id);
103c66ac9dbSNicholas Bellinger 
104c66ac9dbSNicholas Bellinger 	kfree(phv);
105c66ac9dbSNicholas Bellinger 	hba->hba_ptr = NULL;
106c66ac9dbSNicholas Bellinger }
107c66ac9dbSNicholas Bellinger 
108c66ac9dbSNicholas Bellinger static int pscsi_pmode_enable_hba(struct se_hba *hba, unsigned long mode_flag)
109c66ac9dbSNicholas Bellinger {
1108359cf43SJörn Engel 	struct pscsi_hba_virt *phv = hba->hba_ptr;
111c66ac9dbSNicholas Bellinger 	struct Scsi_Host *sh = phv->phv_lld_host;
112c66ac9dbSNicholas Bellinger 	/*
113c66ac9dbSNicholas Bellinger 	 * Release the struct Scsi_Host
114c66ac9dbSNicholas Bellinger 	 */
1156708bb27SAndy Grover 	if (!mode_flag) {
1166708bb27SAndy Grover 		if (!sh)
117c66ac9dbSNicholas Bellinger 			return 0;
118c66ac9dbSNicholas Bellinger 
119c66ac9dbSNicholas Bellinger 		phv->phv_lld_host = NULL;
120e6a8a41aSStefan Hajnoczi 		phv->phv_mode = PHV_VIRTUAL_HOST_ID;
121c66ac9dbSNicholas Bellinger 
1226708bb27SAndy Grover 		pr_debug("CORE_HBA[%d] - Disabled pSCSI HBA Passthrough"
123c66ac9dbSNicholas Bellinger 			" %s\n", hba->hba_id, (sh->hostt->name) ?
124c66ac9dbSNicholas Bellinger 			(sh->hostt->name) : "Unknown");
125c66ac9dbSNicholas Bellinger 
126c66ac9dbSNicholas Bellinger 		scsi_host_put(sh);
127c66ac9dbSNicholas Bellinger 		return 0;
128c66ac9dbSNicholas Bellinger 	}
129c66ac9dbSNicholas Bellinger 	/*
130c66ac9dbSNicholas Bellinger 	 * Otherwise, locate struct Scsi_Host from the original passed
131c66ac9dbSNicholas Bellinger 	 * pSCSI Host ID and enable for phba mode
132c66ac9dbSNicholas Bellinger 	 */
133e3d6f909SAndy Grover 	sh = scsi_host_lookup(phv->phv_host_id);
134e3d6f909SAndy Grover 	if (IS_ERR(sh)) {
1356708bb27SAndy Grover 		pr_err("pSCSI: Unable to locate SCSI Host for"
136c66ac9dbSNicholas Bellinger 			" phv_host_id: %d\n", phv->phv_host_id);
137e3d6f909SAndy Grover 		return PTR_ERR(sh);
138c66ac9dbSNicholas Bellinger 	}
139c66ac9dbSNicholas Bellinger 
140c66ac9dbSNicholas Bellinger 	phv->phv_lld_host = sh;
141c66ac9dbSNicholas Bellinger 	phv->phv_mode = PHV_LLD_SCSI_HOST_NO;
142c66ac9dbSNicholas Bellinger 
1436708bb27SAndy Grover 	pr_debug("CORE_HBA[%d] - Enabled pSCSI HBA Passthrough %s\n",
144c66ac9dbSNicholas Bellinger 		hba->hba_id, (sh->hostt->name) ? (sh->hostt->name) : "Unknown");
145c66ac9dbSNicholas Bellinger 
146c66ac9dbSNicholas Bellinger 	return 1;
147c66ac9dbSNicholas Bellinger }
148c66ac9dbSNicholas Bellinger 
149c66ac9dbSNicholas Bellinger static void pscsi_tape_read_blocksize(struct se_device *dev,
150c66ac9dbSNicholas Bellinger 		struct scsi_device *sdev)
151c66ac9dbSNicholas Bellinger {
152c66ac9dbSNicholas Bellinger 	unsigned char cdb[MAX_COMMAND_SIZE], *buf;
153c66ac9dbSNicholas Bellinger 	int ret;
154c66ac9dbSNicholas Bellinger 
155c66ac9dbSNicholas Bellinger 	buf = kzalloc(12, GFP_KERNEL);
156c66ac9dbSNicholas Bellinger 	if (!buf)
157c66ac9dbSNicholas Bellinger 		return;
158c66ac9dbSNicholas Bellinger 
159c66ac9dbSNicholas Bellinger 	memset(cdb, 0, MAX_COMMAND_SIZE);
160c66ac9dbSNicholas Bellinger 	cdb[0] = MODE_SENSE;
161c66ac9dbSNicholas Bellinger 	cdb[4] = 0x0c; /* 12 bytes */
162c66ac9dbSNicholas Bellinger 
163c66ac9dbSNicholas Bellinger 	ret = scsi_execute_req(sdev, cdb, DMA_FROM_DEVICE, buf, 12, NULL,
164c66ac9dbSNicholas Bellinger 			HZ, 1, NULL);
165c66ac9dbSNicholas Bellinger 	if (ret)
166c66ac9dbSNicholas Bellinger 		goto out_free;
167c66ac9dbSNicholas Bellinger 
168c66ac9dbSNicholas Bellinger 	/*
169c66ac9dbSNicholas Bellinger 	 * If MODE_SENSE still returns zero, set the default value to 1024.
170c66ac9dbSNicholas Bellinger 	 */
171c66ac9dbSNicholas Bellinger 	sdev->sector_size = (buf[9] << 16) | (buf[10] << 8) | (buf[11]);
172c66ac9dbSNicholas Bellinger 	if (!sdev->sector_size)
173c66ac9dbSNicholas Bellinger 		sdev->sector_size = 1024;
174c66ac9dbSNicholas Bellinger out_free:
175c66ac9dbSNicholas Bellinger 	kfree(buf);
176c66ac9dbSNicholas Bellinger }
177c66ac9dbSNicholas Bellinger 
178c66ac9dbSNicholas Bellinger static void
179c66ac9dbSNicholas Bellinger pscsi_set_inquiry_info(struct scsi_device *sdev, struct t10_wwn *wwn)
180c66ac9dbSNicholas Bellinger {
181c66ac9dbSNicholas Bellinger 	unsigned char *buf;
182c66ac9dbSNicholas Bellinger 
183c66ac9dbSNicholas Bellinger 	if (sdev->inquiry_len < INQUIRY_LEN)
184c66ac9dbSNicholas Bellinger 		return;
185c66ac9dbSNicholas Bellinger 
186c66ac9dbSNicholas Bellinger 	buf = sdev->inquiry;
187c66ac9dbSNicholas Bellinger 	if (!buf)
188c66ac9dbSNicholas Bellinger 		return;
189c66ac9dbSNicholas Bellinger 	/*
190c66ac9dbSNicholas Bellinger 	 * Use sdev->inquiry from drivers/scsi/scsi_scan.c:scsi_alloc_sdev()
191c66ac9dbSNicholas Bellinger 	 */
192c66ac9dbSNicholas Bellinger 	memcpy(&wwn->vendor[0], &buf[8], sizeof(wwn->vendor));
193c66ac9dbSNicholas Bellinger 	memcpy(&wwn->model[0], &buf[16], sizeof(wwn->model));
194c66ac9dbSNicholas Bellinger 	memcpy(&wwn->revision[0], &buf[32], sizeof(wwn->revision));
195c66ac9dbSNicholas Bellinger }
196c66ac9dbSNicholas Bellinger 
197c66ac9dbSNicholas Bellinger static int
198c66ac9dbSNicholas Bellinger pscsi_get_inquiry_vpd_serial(struct scsi_device *sdev, struct t10_wwn *wwn)
199c66ac9dbSNicholas Bellinger {
200c66ac9dbSNicholas Bellinger 	unsigned char cdb[MAX_COMMAND_SIZE], *buf;
201c66ac9dbSNicholas Bellinger 	int ret;
202c66ac9dbSNicholas Bellinger 
203c66ac9dbSNicholas Bellinger 	buf = kzalloc(INQUIRY_VPD_SERIAL_LEN, GFP_KERNEL);
204c66ac9dbSNicholas Bellinger 	if (!buf)
205e3d6f909SAndy Grover 		return -ENOMEM;
206c66ac9dbSNicholas Bellinger 
207c66ac9dbSNicholas Bellinger 	memset(cdb, 0, MAX_COMMAND_SIZE);
208c66ac9dbSNicholas Bellinger 	cdb[0] = INQUIRY;
209c66ac9dbSNicholas Bellinger 	cdb[1] = 0x01; /* Query VPD */
210c66ac9dbSNicholas Bellinger 	cdb[2] = 0x80; /* Unit Serial Number */
211c66ac9dbSNicholas Bellinger 	cdb[3] = (INQUIRY_VPD_SERIAL_LEN >> 8) & 0xff;
212c66ac9dbSNicholas Bellinger 	cdb[4] = (INQUIRY_VPD_SERIAL_LEN & 0xff);
213c66ac9dbSNicholas Bellinger 
214c66ac9dbSNicholas Bellinger 	ret = scsi_execute_req(sdev, cdb, DMA_FROM_DEVICE, buf,
215c66ac9dbSNicholas Bellinger 			      INQUIRY_VPD_SERIAL_LEN, NULL, HZ, 1, NULL);
216c66ac9dbSNicholas Bellinger 	if (ret)
217c66ac9dbSNicholas Bellinger 		goto out_free;
218c66ac9dbSNicholas Bellinger 
219c66ac9dbSNicholas Bellinger 	snprintf(&wwn->unit_serial[0], INQUIRY_VPD_SERIAL_LEN, "%s", &buf[4]);
220c66ac9dbSNicholas Bellinger 
221c66ac9dbSNicholas Bellinger 	wwn->t10_sub_dev->su_dev_flags |= SDF_FIRMWARE_VPD_UNIT_SERIAL;
222c66ac9dbSNicholas Bellinger 
223c66ac9dbSNicholas Bellinger 	kfree(buf);
224c66ac9dbSNicholas Bellinger 	return 0;
225c66ac9dbSNicholas Bellinger 
226c66ac9dbSNicholas Bellinger out_free:
227c66ac9dbSNicholas Bellinger 	kfree(buf);
228e3d6f909SAndy Grover 	return -EPERM;
229c66ac9dbSNicholas Bellinger }
230c66ac9dbSNicholas Bellinger 
231c66ac9dbSNicholas Bellinger static void
232c66ac9dbSNicholas Bellinger pscsi_get_inquiry_vpd_device_ident(struct scsi_device *sdev,
233c66ac9dbSNicholas Bellinger 		struct t10_wwn *wwn)
234c66ac9dbSNicholas Bellinger {
235c66ac9dbSNicholas Bellinger 	unsigned char cdb[MAX_COMMAND_SIZE], *buf, *page_83;
236c66ac9dbSNicholas Bellinger 	int ident_len, page_len, off = 4, ret;
237c66ac9dbSNicholas Bellinger 	struct t10_vpd *vpd;
238c66ac9dbSNicholas Bellinger 
239c66ac9dbSNicholas Bellinger 	buf = kzalloc(INQUIRY_VPD_SERIAL_LEN, GFP_KERNEL);
240c66ac9dbSNicholas Bellinger 	if (!buf)
241c66ac9dbSNicholas Bellinger 		return;
242c66ac9dbSNicholas Bellinger 
243c66ac9dbSNicholas Bellinger 	memset(cdb, 0, MAX_COMMAND_SIZE);
244c66ac9dbSNicholas Bellinger 	cdb[0] = INQUIRY;
245c66ac9dbSNicholas Bellinger 	cdb[1] = 0x01; /* Query VPD */
246c66ac9dbSNicholas Bellinger 	cdb[2] = 0x83; /* Device Identifier */
247c66ac9dbSNicholas Bellinger 	cdb[3] = (INQUIRY_VPD_DEVICE_IDENTIFIER_LEN >> 8) & 0xff;
248c66ac9dbSNicholas Bellinger 	cdb[4] = (INQUIRY_VPD_DEVICE_IDENTIFIER_LEN & 0xff);
249c66ac9dbSNicholas Bellinger 
250c66ac9dbSNicholas Bellinger 	ret = scsi_execute_req(sdev, cdb, DMA_FROM_DEVICE, buf,
251c66ac9dbSNicholas Bellinger 			      INQUIRY_VPD_DEVICE_IDENTIFIER_LEN,
252c66ac9dbSNicholas Bellinger 			      NULL, HZ, 1, NULL);
253c66ac9dbSNicholas Bellinger 	if (ret)
254c66ac9dbSNicholas Bellinger 		goto out;
255c66ac9dbSNicholas Bellinger 
256c66ac9dbSNicholas Bellinger 	page_len = (buf[2] << 8) | buf[3];
257c66ac9dbSNicholas Bellinger 	while (page_len > 0) {
258c66ac9dbSNicholas Bellinger 		/* Grab a pointer to the Identification descriptor */
259c66ac9dbSNicholas Bellinger 		page_83 = &buf[off];
260c66ac9dbSNicholas Bellinger 		ident_len = page_83[3];
261c66ac9dbSNicholas Bellinger 		if (!ident_len) {
2626708bb27SAndy Grover 			pr_err("page_83[3]: identifier"
263c66ac9dbSNicholas Bellinger 					" length zero!\n");
264c66ac9dbSNicholas Bellinger 			break;
265c66ac9dbSNicholas Bellinger 		}
2666708bb27SAndy Grover 		pr_debug("T10 VPD Identifer Length: %d\n", ident_len);
267c66ac9dbSNicholas Bellinger 
268c66ac9dbSNicholas Bellinger 		vpd = kzalloc(sizeof(struct t10_vpd), GFP_KERNEL);
269c66ac9dbSNicholas Bellinger 		if (!vpd) {
2706708bb27SAndy Grover 			pr_err("Unable to allocate memory for"
271c66ac9dbSNicholas Bellinger 					" struct t10_vpd\n");
272c66ac9dbSNicholas Bellinger 			goto out;
273c66ac9dbSNicholas Bellinger 		}
274c66ac9dbSNicholas Bellinger 		INIT_LIST_HEAD(&vpd->vpd_list);
275c66ac9dbSNicholas Bellinger 
276c66ac9dbSNicholas Bellinger 		transport_set_vpd_proto_id(vpd, page_83);
277c66ac9dbSNicholas Bellinger 		transport_set_vpd_assoc(vpd, page_83);
278c66ac9dbSNicholas Bellinger 
279c66ac9dbSNicholas Bellinger 		if (transport_set_vpd_ident_type(vpd, page_83) < 0) {
280c66ac9dbSNicholas Bellinger 			off += (ident_len + 4);
281c66ac9dbSNicholas Bellinger 			page_len -= (ident_len + 4);
282c66ac9dbSNicholas Bellinger 			kfree(vpd);
283c66ac9dbSNicholas Bellinger 			continue;
284c66ac9dbSNicholas Bellinger 		}
285c66ac9dbSNicholas Bellinger 		if (transport_set_vpd_ident(vpd, page_83) < 0) {
286c66ac9dbSNicholas Bellinger 			off += (ident_len + 4);
287c66ac9dbSNicholas Bellinger 			page_len -= (ident_len + 4);
288c66ac9dbSNicholas Bellinger 			kfree(vpd);
289c66ac9dbSNicholas Bellinger 			continue;
290c66ac9dbSNicholas Bellinger 		}
291c66ac9dbSNicholas Bellinger 
292c66ac9dbSNicholas Bellinger 		list_add_tail(&vpd->vpd_list, &wwn->t10_vpd_list);
293c66ac9dbSNicholas Bellinger 		off += (ident_len + 4);
294c66ac9dbSNicholas Bellinger 		page_len -= (ident_len + 4);
295c66ac9dbSNicholas Bellinger 	}
296c66ac9dbSNicholas Bellinger 
297c66ac9dbSNicholas Bellinger out:
298c66ac9dbSNicholas Bellinger 	kfree(buf);
299c66ac9dbSNicholas Bellinger }
300c66ac9dbSNicholas Bellinger 
301c66ac9dbSNicholas Bellinger /*	pscsi_add_device_to_list():
302c66ac9dbSNicholas Bellinger  *
303c66ac9dbSNicholas Bellinger  *
304c66ac9dbSNicholas Bellinger  */
305c66ac9dbSNicholas Bellinger static struct se_device *pscsi_add_device_to_list(
306c66ac9dbSNicholas Bellinger 	struct se_hba *hba,
307c66ac9dbSNicholas Bellinger 	struct se_subsystem_dev *se_dev,
308c66ac9dbSNicholas Bellinger 	struct pscsi_dev_virt *pdv,
309c66ac9dbSNicholas Bellinger 	struct scsi_device *sd,
310c66ac9dbSNicholas Bellinger 	int dev_flags)
311c66ac9dbSNicholas Bellinger {
312c66ac9dbSNicholas Bellinger 	struct se_device *dev;
313c66ac9dbSNicholas Bellinger 	struct se_dev_limits dev_limits;
314c66ac9dbSNicholas Bellinger 	struct request_queue *q;
315c66ac9dbSNicholas Bellinger 	struct queue_limits *limits;
316c66ac9dbSNicholas Bellinger 
317c66ac9dbSNicholas Bellinger 	memset(&dev_limits, 0, sizeof(struct se_dev_limits));
318c66ac9dbSNicholas Bellinger 
319c66ac9dbSNicholas Bellinger 	if (!sd->queue_depth) {
320c66ac9dbSNicholas Bellinger 		sd->queue_depth = PSCSI_DEFAULT_QUEUEDEPTH;
321c66ac9dbSNicholas Bellinger 
3226708bb27SAndy Grover 		pr_err("Set broken SCSI Device %d:%d:%d"
323c66ac9dbSNicholas Bellinger 			" queue_depth to %d\n", sd->channel, sd->id,
324c66ac9dbSNicholas Bellinger 				sd->lun, sd->queue_depth);
325c66ac9dbSNicholas Bellinger 	}
326c66ac9dbSNicholas Bellinger 	/*
327c66ac9dbSNicholas Bellinger 	 * Setup the local scope queue_limits from struct request_queue->limits
328c66ac9dbSNicholas Bellinger 	 * to pass into transport_add_device_to_core_hba() as struct se_dev_limits.
329c66ac9dbSNicholas Bellinger 	 */
330c66ac9dbSNicholas Bellinger 	q = sd->request_queue;
331c66ac9dbSNicholas Bellinger 	limits = &dev_limits.limits;
332c66ac9dbSNicholas Bellinger 	limits->logical_block_size = sd->sector_size;
333a1d8b49aSAndy Grover 	limits->max_hw_sectors = min_t(int, sd->host->max_sectors, queue_max_hw_sectors(q));
334a1d8b49aSAndy Grover 	limits->max_sectors = min_t(int, sd->host->max_sectors, queue_max_sectors(q));
335c66ac9dbSNicholas Bellinger 	dev_limits.hw_queue_depth = sd->queue_depth;
336c66ac9dbSNicholas Bellinger 	dev_limits.queue_depth = sd->queue_depth;
337c66ac9dbSNicholas Bellinger 	/*
338c66ac9dbSNicholas Bellinger 	 * Setup our standard INQUIRY info into se_dev->t10_wwn
339c66ac9dbSNicholas Bellinger 	 */
340c66ac9dbSNicholas Bellinger 	pscsi_set_inquiry_info(sd, &se_dev->t10_wwn);
341c66ac9dbSNicholas Bellinger 
342c66ac9dbSNicholas Bellinger 	/*
343c66ac9dbSNicholas Bellinger 	 * Set the pointer pdv->pdv_sd to from passed struct scsi_device,
344c66ac9dbSNicholas Bellinger 	 * which has already been referenced with Linux SCSI code with
345c66ac9dbSNicholas Bellinger 	 * scsi_device_get() in this file's pscsi_create_virtdevice().
346c66ac9dbSNicholas Bellinger 	 *
347c66ac9dbSNicholas Bellinger 	 * The passthrough operations called by the transport_add_device_*
348c66ac9dbSNicholas Bellinger 	 * function below will require this pointer to be set for passthroug
349c66ac9dbSNicholas Bellinger 	 *  ops.
350c66ac9dbSNicholas Bellinger 	 *
351c66ac9dbSNicholas Bellinger 	 * For the shutdown case in pscsi_free_device(), this struct
352c66ac9dbSNicholas Bellinger 	 * scsi_device  reference is released with Linux SCSI code
353c66ac9dbSNicholas Bellinger 	 * scsi_device_put() and the pdv->pdv_sd cleared.
354c66ac9dbSNicholas Bellinger 	 */
355c66ac9dbSNicholas Bellinger 	pdv->pdv_sd = sd;
356c66ac9dbSNicholas Bellinger 	dev = transport_add_device_to_core_hba(hba, &pscsi_template,
3575951146dSAndy Grover 				se_dev, dev_flags, pdv,
358c66ac9dbSNicholas Bellinger 				&dev_limits, NULL, NULL);
3596708bb27SAndy Grover 	if (!dev) {
360c66ac9dbSNicholas Bellinger 		pdv->pdv_sd = NULL;
361c66ac9dbSNicholas Bellinger 		return NULL;
362c66ac9dbSNicholas Bellinger 	}
363c66ac9dbSNicholas Bellinger 
364c66ac9dbSNicholas Bellinger 	/*
365c66ac9dbSNicholas Bellinger 	 * Locate VPD WWN Information used for various purposes within
366c66ac9dbSNicholas Bellinger 	 * the Storage Engine.
367c66ac9dbSNicholas Bellinger 	 */
368c66ac9dbSNicholas Bellinger 	if (!pscsi_get_inquiry_vpd_serial(sd, &se_dev->t10_wwn)) {
369c66ac9dbSNicholas Bellinger 		/*
370c66ac9dbSNicholas Bellinger 		 * If VPD Unit Serial returned GOOD status, try
371c66ac9dbSNicholas Bellinger 		 * VPD Device Identification page (0x83).
372c66ac9dbSNicholas Bellinger 		 */
373c66ac9dbSNicholas Bellinger 		pscsi_get_inquiry_vpd_device_ident(sd, &se_dev->t10_wwn);
374c66ac9dbSNicholas Bellinger 	}
375c66ac9dbSNicholas Bellinger 
376c66ac9dbSNicholas Bellinger 	/*
377c66ac9dbSNicholas Bellinger 	 * For TYPE_TAPE, attempt to determine blocksize with MODE_SENSE.
378c66ac9dbSNicholas Bellinger 	 */
379c66ac9dbSNicholas Bellinger 	if (sd->type == TYPE_TAPE)
380c66ac9dbSNicholas Bellinger 		pscsi_tape_read_blocksize(dev, sd);
381c66ac9dbSNicholas Bellinger 	return dev;
382c66ac9dbSNicholas Bellinger }
383c66ac9dbSNicholas Bellinger 
384c66ac9dbSNicholas Bellinger static void *pscsi_allocate_virtdevice(struct se_hba *hba, const char *name)
385c66ac9dbSNicholas Bellinger {
386c66ac9dbSNicholas Bellinger 	struct pscsi_dev_virt *pdv;
387c66ac9dbSNicholas Bellinger 
388c66ac9dbSNicholas Bellinger 	pdv = kzalloc(sizeof(struct pscsi_dev_virt), GFP_KERNEL);
3896708bb27SAndy Grover 	if (!pdv) {
3906708bb27SAndy Grover 		pr_err("Unable to allocate memory for struct pscsi_dev_virt\n");
391c66ac9dbSNicholas Bellinger 		return NULL;
392c66ac9dbSNicholas Bellinger 	}
393c66ac9dbSNicholas Bellinger 	pdv->pdv_se_hba = hba;
394c66ac9dbSNicholas Bellinger 
3956708bb27SAndy Grover 	pr_debug("PSCSI: Allocated pdv: %p for %s\n", pdv, name);
3965951146dSAndy Grover 	return pdv;
397c66ac9dbSNicholas Bellinger }
398c66ac9dbSNicholas Bellinger 
399c66ac9dbSNicholas Bellinger /*
400c66ac9dbSNicholas Bellinger  * Called with struct Scsi_Host->host_lock called.
401c66ac9dbSNicholas Bellinger  */
402c66ac9dbSNicholas Bellinger static struct se_device *pscsi_create_type_disk(
403c66ac9dbSNicholas Bellinger 	struct scsi_device *sd,
404c66ac9dbSNicholas Bellinger 	struct pscsi_dev_virt *pdv,
405c66ac9dbSNicholas Bellinger 	struct se_subsystem_dev *se_dev,
406c66ac9dbSNicholas Bellinger 	struct se_hba *hba)
4075dd7ed2eSDan Carpenter 	__releases(sh->host_lock)
408c66ac9dbSNicholas Bellinger {
409c66ac9dbSNicholas Bellinger 	struct se_device *dev;
4108359cf43SJörn Engel 	struct pscsi_hba_virt *phv = pdv->pdv_se_hba->hba_ptr;
411c66ac9dbSNicholas Bellinger 	struct Scsi_Host *sh = sd->host;
412c66ac9dbSNicholas Bellinger 	struct block_device *bd;
413c66ac9dbSNicholas Bellinger 	u32 dev_flags = 0;
414c66ac9dbSNicholas Bellinger 
415c66ac9dbSNicholas Bellinger 	if (scsi_device_get(sd)) {
4166708bb27SAndy Grover 		pr_err("scsi_device_get() failed for %d:%d:%d:%d\n",
417c66ac9dbSNicholas Bellinger 			sh->host_no, sd->channel, sd->id, sd->lun);
418c66ac9dbSNicholas Bellinger 		spin_unlock_irq(sh->host_lock);
419c66ac9dbSNicholas Bellinger 		return NULL;
420c66ac9dbSNicholas Bellinger 	}
421c66ac9dbSNicholas Bellinger 	spin_unlock_irq(sh->host_lock);
422c66ac9dbSNicholas Bellinger 	/*
423c66ac9dbSNicholas Bellinger 	 * Claim exclusive struct block_device access to struct scsi_device
424c66ac9dbSNicholas Bellinger 	 * for TYPE_DISK using supplied udev_path
425c66ac9dbSNicholas Bellinger 	 */
426c66ac9dbSNicholas Bellinger 	bd = blkdev_get_by_path(se_dev->se_dev_udev_path,
427c66ac9dbSNicholas Bellinger 				FMODE_WRITE|FMODE_READ|FMODE_EXCL, pdv);
4283ae279d2SDan Carpenter 	if (IS_ERR(bd)) {
4296708bb27SAndy Grover 		pr_err("pSCSI: blkdev_get_by_path() failed\n");
430c66ac9dbSNicholas Bellinger 		scsi_device_put(sd);
431c66ac9dbSNicholas Bellinger 		return NULL;
432c66ac9dbSNicholas Bellinger 	}
433c66ac9dbSNicholas Bellinger 	pdv->pdv_bd = bd;
434c66ac9dbSNicholas Bellinger 
435c66ac9dbSNicholas Bellinger 	dev = pscsi_add_device_to_list(hba, se_dev, pdv, sd, dev_flags);
4366708bb27SAndy Grover 	if (!dev) {
437c66ac9dbSNicholas Bellinger 		blkdev_put(pdv->pdv_bd, FMODE_WRITE|FMODE_READ|FMODE_EXCL);
438c66ac9dbSNicholas Bellinger 		scsi_device_put(sd);
439c66ac9dbSNicholas Bellinger 		return NULL;
440c66ac9dbSNicholas Bellinger 	}
4416708bb27SAndy Grover 	pr_debug("CORE_PSCSI[%d] - Added TYPE_DISK for %d:%d:%d:%d\n",
442c66ac9dbSNicholas Bellinger 		phv->phv_host_id, sh->host_no, sd->channel, sd->id, sd->lun);
443c66ac9dbSNicholas Bellinger 
444c66ac9dbSNicholas Bellinger 	return dev;
445c66ac9dbSNicholas Bellinger }
446c66ac9dbSNicholas Bellinger 
447c66ac9dbSNicholas Bellinger /*
448c66ac9dbSNicholas Bellinger  * Called with struct Scsi_Host->host_lock called.
449c66ac9dbSNicholas Bellinger  */
450c66ac9dbSNicholas Bellinger static struct se_device *pscsi_create_type_rom(
451c66ac9dbSNicholas Bellinger 	struct scsi_device *sd,
452c66ac9dbSNicholas Bellinger 	struct pscsi_dev_virt *pdv,
453c66ac9dbSNicholas Bellinger 	struct se_subsystem_dev *se_dev,
454c66ac9dbSNicholas Bellinger 	struct se_hba *hba)
4555dd7ed2eSDan Carpenter 	__releases(sh->host_lock)
456c66ac9dbSNicholas Bellinger {
457c66ac9dbSNicholas Bellinger 	struct se_device *dev;
4588359cf43SJörn Engel 	struct pscsi_hba_virt *phv = pdv->pdv_se_hba->hba_ptr;
459c66ac9dbSNicholas Bellinger 	struct Scsi_Host *sh = sd->host;
460c66ac9dbSNicholas Bellinger 	u32 dev_flags = 0;
461c66ac9dbSNicholas Bellinger 
462c66ac9dbSNicholas Bellinger 	if (scsi_device_get(sd)) {
4636708bb27SAndy Grover 		pr_err("scsi_device_get() failed for %d:%d:%d:%d\n",
464c66ac9dbSNicholas Bellinger 			sh->host_no, sd->channel, sd->id, sd->lun);
465c66ac9dbSNicholas Bellinger 		spin_unlock_irq(sh->host_lock);
466c66ac9dbSNicholas Bellinger 		return NULL;
467c66ac9dbSNicholas Bellinger 	}
468c66ac9dbSNicholas Bellinger 	spin_unlock_irq(sh->host_lock);
469c66ac9dbSNicholas Bellinger 
470c66ac9dbSNicholas Bellinger 	dev = pscsi_add_device_to_list(hba, se_dev, pdv, sd, dev_flags);
4716708bb27SAndy Grover 	if (!dev) {
472c66ac9dbSNicholas Bellinger 		scsi_device_put(sd);
473c66ac9dbSNicholas Bellinger 		return NULL;
474c66ac9dbSNicholas Bellinger 	}
4756708bb27SAndy Grover 	pr_debug("CORE_PSCSI[%d] - Added Type: %s for %d:%d:%d:%d\n",
476c66ac9dbSNicholas Bellinger 		phv->phv_host_id, scsi_device_type(sd->type), sh->host_no,
477c66ac9dbSNicholas Bellinger 		sd->channel, sd->id, sd->lun);
478c66ac9dbSNicholas Bellinger 
479c66ac9dbSNicholas Bellinger 	return dev;
480c66ac9dbSNicholas Bellinger }
481c66ac9dbSNicholas Bellinger 
482c66ac9dbSNicholas Bellinger /*
483c66ac9dbSNicholas Bellinger  *Called with struct Scsi_Host->host_lock called.
484c66ac9dbSNicholas Bellinger  */
485c66ac9dbSNicholas Bellinger static struct se_device *pscsi_create_type_other(
486c66ac9dbSNicholas Bellinger 	struct scsi_device *sd,
487c66ac9dbSNicholas Bellinger 	struct pscsi_dev_virt *pdv,
488c66ac9dbSNicholas Bellinger 	struct se_subsystem_dev *se_dev,
489c66ac9dbSNicholas Bellinger 	struct se_hba *hba)
4905dd7ed2eSDan Carpenter 	__releases(sh->host_lock)
491c66ac9dbSNicholas Bellinger {
492c66ac9dbSNicholas Bellinger 	struct se_device *dev;
4938359cf43SJörn Engel 	struct pscsi_hba_virt *phv = pdv->pdv_se_hba->hba_ptr;
494c66ac9dbSNicholas Bellinger 	struct Scsi_Host *sh = sd->host;
495c66ac9dbSNicholas Bellinger 	u32 dev_flags = 0;
496c66ac9dbSNicholas Bellinger 
497c66ac9dbSNicholas Bellinger 	spin_unlock_irq(sh->host_lock);
498c66ac9dbSNicholas Bellinger 	dev = pscsi_add_device_to_list(hba, se_dev, pdv, sd, dev_flags);
4996708bb27SAndy Grover 	if (!dev)
500c66ac9dbSNicholas Bellinger 		return NULL;
501c66ac9dbSNicholas Bellinger 
5026708bb27SAndy Grover 	pr_debug("CORE_PSCSI[%d] - Added Type: %s for %d:%d:%d:%d\n",
503c66ac9dbSNicholas Bellinger 		phv->phv_host_id, scsi_device_type(sd->type), sh->host_no,
504c66ac9dbSNicholas Bellinger 		sd->channel, sd->id, sd->lun);
505c66ac9dbSNicholas Bellinger 
506c66ac9dbSNicholas Bellinger 	return dev;
507c66ac9dbSNicholas Bellinger }
508c66ac9dbSNicholas Bellinger 
509c66ac9dbSNicholas Bellinger static struct se_device *pscsi_create_virtdevice(
510c66ac9dbSNicholas Bellinger 	struct se_hba *hba,
511c66ac9dbSNicholas Bellinger 	struct se_subsystem_dev *se_dev,
512c66ac9dbSNicholas Bellinger 	void *p)
513c66ac9dbSNicholas Bellinger {
5148359cf43SJörn Engel 	struct pscsi_dev_virt *pdv = p;
515c66ac9dbSNicholas Bellinger 	struct se_device *dev;
516c66ac9dbSNicholas Bellinger 	struct scsi_device *sd;
5178359cf43SJörn Engel 	struct pscsi_hba_virt *phv = hba->hba_ptr;
518c66ac9dbSNicholas Bellinger 	struct Scsi_Host *sh = phv->phv_lld_host;
519c66ac9dbSNicholas Bellinger 	int legacy_mode_enable = 0;
520c66ac9dbSNicholas Bellinger 
5216708bb27SAndy Grover 	if (!pdv) {
5226708bb27SAndy Grover 		pr_err("Unable to locate struct pscsi_dev_virt"
523c66ac9dbSNicholas Bellinger 				" parameter\n");
524613640e4SNicholas Bellinger 		return ERR_PTR(-EINVAL);
525c66ac9dbSNicholas Bellinger 	}
526c66ac9dbSNicholas Bellinger 	/*
527c66ac9dbSNicholas Bellinger 	 * If not running in PHV_LLD_SCSI_HOST_NO mode, locate the
528c66ac9dbSNicholas Bellinger 	 * struct Scsi_Host we will need to bring the TCM/pSCSI object online
529c66ac9dbSNicholas Bellinger 	 */
5306708bb27SAndy Grover 	if (!sh) {
531c66ac9dbSNicholas Bellinger 		if (phv->phv_mode == PHV_LLD_SCSI_HOST_NO) {
5326708bb27SAndy Grover 			pr_err("pSCSI: Unable to locate struct"
533c66ac9dbSNicholas Bellinger 				" Scsi_Host for PHV_LLD_SCSI_HOST_NO\n");
534613640e4SNicholas Bellinger 			return ERR_PTR(-ENODEV);
535c66ac9dbSNicholas Bellinger 		}
536c66ac9dbSNicholas Bellinger 		/*
537e6a8a41aSStefan Hajnoczi 		 * For the newer PHV_VIRTUAL_HOST_ID struct scsi_device
538c66ac9dbSNicholas Bellinger 		 * reference, we enforce that udev_path has been set
539c66ac9dbSNicholas Bellinger 		 */
540c66ac9dbSNicholas Bellinger 		if (!(se_dev->su_dev_flags & SDF_USING_UDEV_PATH)) {
5416708bb27SAndy Grover 			pr_err("pSCSI: udev_path attribute has not"
542c66ac9dbSNicholas Bellinger 				" been set before ENABLE=1\n");
543613640e4SNicholas Bellinger 			return ERR_PTR(-EINVAL);
544c66ac9dbSNicholas Bellinger 		}
545c66ac9dbSNicholas Bellinger 		/*
546e6a8a41aSStefan Hajnoczi 		 * If no scsi_host_id= was passed for PHV_VIRTUAL_HOST_ID,
547c66ac9dbSNicholas Bellinger 		 * use the original TCM hba ID to reference Linux/SCSI Host No
548c66ac9dbSNicholas Bellinger 		 * and enable for PHV_LLD_SCSI_HOST_NO mode.
549c66ac9dbSNicholas Bellinger 		 */
550c66ac9dbSNicholas Bellinger 		if (!(pdv->pdv_flags & PDF_HAS_VIRT_HOST_ID)) {
551c66ac9dbSNicholas Bellinger 			spin_lock(&hba->device_lock);
5526708bb27SAndy Grover 			if (!list_empty(&hba->hba_dev_list)) {
5536708bb27SAndy Grover 				pr_err("pSCSI: Unable to set hba_mode"
554c66ac9dbSNicholas Bellinger 					" with active devices\n");
555c66ac9dbSNicholas Bellinger 				spin_unlock(&hba->device_lock);
556613640e4SNicholas Bellinger 				return ERR_PTR(-EEXIST);
557c66ac9dbSNicholas Bellinger 			}
558c66ac9dbSNicholas Bellinger 			spin_unlock(&hba->device_lock);
559c66ac9dbSNicholas Bellinger 
560c66ac9dbSNicholas Bellinger 			if (pscsi_pmode_enable_hba(hba, 1) != 1)
561613640e4SNicholas Bellinger 				return ERR_PTR(-ENODEV);
562c66ac9dbSNicholas Bellinger 
563c66ac9dbSNicholas Bellinger 			legacy_mode_enable = 1;
564c66ac9dbSNicholas Bellinger 			hba->hba_flags |= HBA_FLAGS_PSCSI_MODE;
565c66ac9dbSNicholas Bellinger 			sh = phv->phv_lld_host;
566c66ac9dbSNicholas Bellinger 		} else {
567e3d6f909SAndy Grover 			sh = scsi_host_lookup(pdv->pdv_host_id);
568e3d6f909SAndy Grover 			if (IS_ERR(sh)) {
5696708bb27SAndy Grover 				pr_err("pSCSI: Unable to locate"
570c66ac9dbSNicholas Bellinger 					" pdv_host_id: %d\n", pdv->pdv_host_id);
571942d8264SDan Carpenter 				return ERR_CAST(sh);
572c66ac9dbSNicholas Bellinger 			}
573c66ac9dbSNicholas Bellinger 		}
574c66ac9dbSNicholas Bellinger 	} else {
575e6a8a41aSStefan Hajnoczi 		if (phv->phv_mode == PHV_VIRTUAL_HOST_ID) {
576e6a8a41aSStefan Hajnoczi 			pr_err("pSCSI: PHV_VIRTUAL_HOST_ID set while"
577c66ac9dbSNicholas Bellinger 				" struct Scsi_Host exists\n");
578613640e4SNicholas Bellinger 			return ERR_PTR(-EEXIST);
579c66ac9dbSNicholas Bellinger 		}
580c66ac9dbSNicholas Bellinger 	}
581c66ac9dbSNicholas Bellinger 
582c66ac9dbSNicholas Bellinger 	spin_lock_irq(sh->host_lock);
583c66ac9dbSNicholas Bellinger 	list_for_each_entry(sd, &sh->__devices, siblings) {
584c66ac9dbSNicholas Bellinger 		if ((pdv->pdv_channel_id != sd->channel) ||
585c66ac9dbSNicholas Bellinger 		    (pdv->pdv_target_id != sd->id) ||
586c66ac9dbSNicholas Bellinger 		    (pdv->pdv_lun_id != sd->lun))
587c66ac9dbSNicholas Bellinger 			continue;
588c66ac9dbSNicholas Bellinger 		/*
589c66ac9dbSNicholas Bellinger 		 * Functions will release the held struct scsi_host->host_lock
590c66ac9dbSNicholas Bellinger 		 * before calling calling pscsi_add_device_to_list() to register
591c66ac9dbSNicholas Bellinger 		 * struct scsi_device with target_core_mod.
592c66ac9dbSNicholas Bellinger 		 */
593c66ac9dbSNicholas Bellinger 		switch (sd->type) {
594c66ac9dbSNicholas Bellinger 		case TYPE_DISK:
595c66ac9dbSNicholas Bellinger 			dev = pscsi_create_type_disk(sd, pdv, se_dev, hba);
596c66ac9dbSNicholas Bellinger 			break;
597c66ac9dbSNicholas Bellinger 		case TYPE_ROM:
598c66ac9dbSNicholas Bellinger 			dev = pscsi_create_type_rom(sd, pdv, se_dev, hba);
599c66ac9dbSNicholas Bellinger 			break;
600c66ac9dbSNicholas Bellinger 		default:
601c66ac9dbSNicholas Bellinger 			dev = pscsi_create_type_other(sd, pdv, se_dev, hba);
602c66ac9dbSNicholas Bellinger 			break;
603c66ac9dbSNicholas Bellinger 		}
604c66ac9dbSNicholas Bellinger 
6056708bb27SAndy Grover 		if (!dev) {
606e6a8a41aSStefan Hajnoczi 			if (phv->phv_mode == PHV_VIRTUAL_HOST_ID)
607c66ac9dbSNicholas Bellinger 				scsi_host_put(sh);
608c66ac9dbSNicholas Bellinger 			else if (legacy_mode_enable) {
609c66ac9dbSNicholas Bellinger 				pscsi_pmode_enable_hba(hba, 0);
610c66ac9dbSNicholas Bellinger 				hba->hba_flags &= ~HBA_FLAGS_PSCSI_MODE;
611c66ac9dbSNicholas Bellinger 			}
612c66ac9dbSNicholas Bellinger 			pdv->pdv_sd = NULL;
613613640e4SNicholas Bellinger 			return ERR_PTR(-ENODEV);
614c66ac9dbSNicholas Bellinger 		}
615c66ac9dbSNicholas Bellinger 		return dev;
616c66ac9dbSNicholas Bellinger 	}
617c66ac9dbSNicholas Bellinger 	spin_unlock_irq(sh->host_lock);
618c66ac9dbSNicholas Bellinger 
6196708bb27SAndy Grover 	pr_err("pSCSI: Unable to locate %d:%d:%d:%d\n", sh->host_no,
620c66ac9dbSNicholas Bellinger 		pdv->pdv_channel_id,  pdv->pdv_target_id, pdv->pdv_lun_id);
621c66ac9dbSNicholas Bellinger 
622e6a8a41aSStefan Hajnoczi 	if (phv->phv_mode == PHV_VIRTUAL_HOST_ID)
623c66ac9dbSNicholas Bellinger 		scsi_host_put(sh);
624c66ac9dbSNicholas Bellinger 	else if (legacy_mode_enable) {
625c66ac9dbSNicholas Bellinger 		pscsi_pmode_enable_hba(hba, 0);
626c66ac9dbSNicholas Bellinger 		hba->hba_flags &= ~HBA_FLAGS_PSCSI_MODE;
627c66ac9dbSNicholas Bellinger 	}
628c66ac9dbSNicholas Bellinger 
629613640e4SNicholas Bellinger 	return ERR_PTR(-ENODEV);
630c66ac9dbSNicholas Bellinger }
631c66ac9dbSNicholas Bellinger 
632c66ac9dbSNicholas Bellinger /*	pscsi_free_device(): (Part of se_subsystem_api_t template)
633c66ac9dbSNicholas Bellinger  *
634c66ac9dbSNicholas Bellinger  *
635c66ac9dbSNicholas Bellinger  */
636c66ac9dbSNicholas Bellinger static void pscsi_free_device(void *p)
637c66ac9dbSNicholas Bellinger {
638c66ac9dbSNicholas Bellinger 	struct pscsi_dev_virt *pdv = p;
639c66ac9dbSNicholas Bellinger 	struct pscsi_hba_virt *phv = pdv->pdv_se_hba->hba_ptr;
640c66ac9dbSNicholas Bellinger 	struct scsi_device *sd = pdv->pdv_sd;
641c66ac9dbSNicholas Bellinger 
642c66ac9dbSNicholas Bellinger 	if (sd) {
643c66ac9dbSNicholas Bellinger 		/*
644c66ac9dbSNicholas Bellinger 		 * Release exclusive pSCSI internal struct block_device claim for
645c66ac9dbSNicholas Bellinger 		 * struct scsi_device with TYPE_DISK from pscsi_create_type_disk()
646c66ac9dbSNicholas Bellinger 		 */
647c66ac9dbSNicholas Bellinger 		if ((sd->type == TYPE_DISK) && pdv->pdv_bd) {
648c66ac9dbSNicholas Bellinger 			blkdev_put(pdv->pdv_bd,
649c66ac9dbSNicholas Bellinger 				   FMODE_WRITE|FMODE_READ|FMODE_EXCL);
650c66ac9dbSNicholas Bellinger 			pdv->pdv_bd = NULL;
651c66ac9dbSNicholas Bellinger 		}
652c66ac9dbSNicholas Bellinger 		/*
653c66ac9dbSNicholas Bellinger 		 * For HBA mode PHV_LLD_SCSI_HOST_NO, release the reference
654c66ac9dbSNicholas Bellinger 		 * to struct Scsi_Host now.
655c66ac9dbSNicholas Bellinger 		 */
656c66ac9dbSNicholas Bellinger 		if ((phv->phv_mode == PHV_LLD_SCSI_HOST_NO) &&
657c66ac9dbSNicholas Bellinger 		    (phv->phv_lld_host != NULL))
658c66ac9dbSNicholas Bellinger 			scsi_host_put(phv->phv_lld_host);
659c66ac9dbSNicholas Bellinger 
660c66ac9dbSNicholas Bellinger 		if ((sd->type == TYPE_DISK) || (sd->type == TYPE_ROM))
661c66ac9dbSNicholas Bellinger 			scsi_device_put(sd);
662c66ac9dbSNicholas Bellinger 
663c66ac9dbSNicholas Bellinger 		pdv->pdv_sd = NULL;
664c66ac9dbSNicholas Bellinger 	}
665c66ac9dbSNicholas Bellinger 
666c66ac9dbSNicholas Bellinger 	kfree(pdv);
667c66ac9dbSNicholas Bellinger }
668c66ac9dbSNicholas Bellinger 
6695787cacdSChristoph Hellwig static int pscsi_transport_complete(struct se_cmd *cmd, struct scatterlist *sg)
670c66ac9dbSNicholas Bellinger {
6715787cacdSChristoph Hellwig 	struct pscsi_dev_virt *pdv = cmd->se_dev->dev_ptr;
672c66ac9dbSNicholas Bellinger 	struct scsi_device *sd = pdv->pdv_sd;
673c66ac9dbSNicholas Bellinger 	int result;
6745787cacdSChristoph Hellwig 	struct pscsi_plugin_task *pt = cmd->priv;
675c66ac9dbSNicholas Bellinger 	unsigned char *cdb = &pt->pscsi_cdb[0];
676c66ac9dbSNicholas Bellinger 
677c66ac9dbSNicholas Bellinger 	result = pt->pscsi_result;
678c66ac9dbSNicholas Bellinger 	/*
679c66ac9dbSNicholas Bellinger 	 * Hack to make sure that Write-Protect modepage is set if R/O mode is
680c66ac9dbSNicholas Bellinger 	 * forced.
681c66ac9dbSNicholas Bellinger 	 */
682c66ac9dbSNicholas Bellinger 	if (((cdb[0] == MODE_SENSE) || (cdb[0] == MODE_SENSE_10)) &&
683c66ac9dbSNicholas Bellinger 	     (status_byte(result) << 1) == SAM_STAT_GOOD) {
6845787cacdSChristoph Hellwig 		if (!cmd->se_deve)
685c66ac9dbSNicholas Bellinger 			goto after_mode_sense;
686c66ac9dbSNicholas Bellinger 
6875787cacdSChristoph Hellwig 		if (cmd->se_deve->lun_flags & TRANSPORT_LUNFLAGS_READ_ONLY) {
6885787cacdSChristoph Hellwig 			unsigned char *buf = transport_kmap_data_sg(cmd);
689c66ac9dbSNicholas Bellinger 
690c66ac9dbSNicholas Bellinger 			if (cdb[0] == MODE_SENSE_10) {
691c66ac9dbSNicholas Bellinger 				if (!(buf[3] & 0x80))
692c66ac9dbSNicholas Bellinger 					buf[3] |= 0x80;
693c66ac9dbSNicholas Bellinger 			} else {
694c66ac9dbSNicholas Bellinger 				if (!(buf[2] & 0x80))
695c66ac9dbSNicholas Bellinger 					buf[2] |= 0x80;
696c66ac9dbSNicholas Bellinger 			}
69705d1c7c0SAndy Grover 
6985787cacdSChristoph Hellwig 			transport_kunmap_data_sg(cmd);
699c66ac9dbSNicholas Bellinger 		}
700c66ac9dbSNicholas Bellinger 	}
701c66ac9dbSNicholas Bellinger after_mode_sense:
702c66ac9dbSNicholas Bellinger 
703c66ac9dbSNicholas Bellinger 	if (sd->type != TYPE_TAPE)
704c66ac9dbSNicholas Bellinger 		goto after_mode_select;
705c66ac9dbSNicholas Bellinger 
706c66ac9dbSNicholas Bellinger 	/*
707c66ac9dbSNicholas Bellinger 	 * Hack to correctly obtain the initiator requested blocksize for
708c66ac9dbSNicholas Bellinger 	 * TYPE_TAPE.  Since this value is dependent upon each tape media,
709c66ac9dbSNicholas Bellinger 	 * struct scsi_device->sector_size will not contain the correct value
710c66ac9dbSNicholas Bellinger 	 * by default, so we go ahead and set it so
711c66ac9dbSNicholas Bellinger 	 * TRANSPORT(dev)->get_blockdev() returns the correct value to the
712c66ac9dbSNicholas Bellinger 	 * storage engine.
713c66ac9dbSNicholas Bellinger 	 */
714c66ac9dbSNicholas Bellinger 	if (((cdb[0] == MODE_SELECT) || (cdb[0] == MODE_SELECT_10)) &&
715c66ac9dbSNicholas Bellinger 	      (status_byte(result) << 1) == SAM_STAT_GOOD) {
716c66ac9dbSNicholas Bellinger 		unsigned char *buf;
717c66ac9dbSNicholas Bellinger 		u16 bdl;
718c66ac9dbSNicholas Bellinger 		u32 blocksize;
719c66ac9dbSNicholas Bellinger 
720c66ac9dbSNicholas Bellinger 		buf = sg_virt(&sg[0]);
7216708bb27SAndy Grover 		if (!buf) {
7226708bb27SAndy Grover 			pr_err("Unable to get buf for scatterlist\n");
723c66ac9dbSNicholas Bellinger 			goto after_mode_select;
724c66ac9dbSNicholas Bellinger 		}
725c66ac9dbSNicholas Bellinger 
726c66ac9dbSNicholas Bellinger 		if (cdb[0] == MODE_SELECT)
727c66ac9dbSNicholas Bellinger 			bdl = (buf[3]);
728c66ac9dbSNicholas Bellinger 		else
729c66ac9dbSNicholas Bellinger 			bdl = (buf[6] << 8) | (buf[7]);
730c66ac9dbSNicholas Bellinger 
731c66ac9dbSNicholas Bellinger 		if (!bdl)
732c66ac9dbSNicholas Bellinger 			goto after_mode_select;
733c66ac9dbSNicholas Bellinger 
734c66ac9dbSNicholas Bellinger 		if (cdb[0] == MODE_SELECT)
735c66ac9dbSNicholas Bellinger 			blocksize = (buf[9] << 16) | (buf[10] << 8) |
736c66ac9dbSNicholas Bellinger 					(buf[11]);
737c66ac9dbSNicholas Bellinger 		else
738c66ac9dbSNicholas Bellinger 			blocksize = (buf[13] << 16) | (buf[14] << 8) |
739c66ac9dbSNicholas Bellinger 					(buf[15]);
740c66ac9dbSNicholas Bellinger 
741c66ac9dbSNicholas Bellinger 		sd->sector_size = blocksize;
742c66ac9dbSNicholas Bellinger 	}
743c66ac9dbSNicholas Bellinger after_mode_select:
744c66ac9dbSNicholas Bellinger 
745c66ac9dbSNicholas Bellinger 	if (status_byte(result) & CHECK_CONDITION)
746c66ac9dbSNicholas Bellinger 		return 1;
747c66ac9dbSNicholas Bellinger 
748c66ac9dbSNicholas Bellinger 	return 0;
749c66ac9dbSNicholas Bellinger }
750c66ac9dbSNicholas Bellinger 
751c66ac9dbSNicholas Bellinger enum {
752c66ac9dbSNicholas Bellinger 	Opt_scsi_host_id, Opt_scsi_channel_id, Opt_scsi_target_id,
753c66ac9dbSNicholas Bellinger 	Opt_scsi_lun_id, Opt_err
754c66ac9dbSNicholas Bellinger };
755c66ac9dbSNicholas Bellinger 
756c66ac9dbSNicholas Bellinger static match_table_t tokens = {
757c66ac9dbSNicholas Bellinger 	{Opt_scsi_host_id, "scsi_host_id=%d"},
758c66ac9dbSNicholas Bellinger 	{Opt_scsi_channel_id, "scsi_channel_id=%d"},
759c66ac9dbSNicholas Bellinger 	{Opt_scsi_target_id, "scsi_target_id=%d"},
760c66ac9dbSNicholas Bellinger 	{Opt_scsi_lun_id, "scsi_lun_id=%d"},
761c66ac9dbSNicholas Bellinger 	{Opt_err, NULL}
762c66ac9dbSNicholas Bellinger };
763c66ac9dbSNicholas Bellinger 
764c66ac9dbSNicholas Bellinger static ssize_t pscsi_set_configfs_dev_params(struct se_hba *hba,
765c66ac9dbSNicholas Bellinger 	struct se_subsystem_dev *se_dev,
766c66ac9dbSNicholas Bellinger 	const char *page,
767c66ac9dbSNicholas Bellinger 	ssize_t count)
768c66ac9dbSNicholas Bellinger {
769c66ac9dbSNicholas Bellinger 	struct pscsi_dev_virt *pdv = se_dev->se_dev_su_ptr;
770c66ac9dbSNicholas Bellinger 	struct pscsi_hba_virt *phv = hba->hba_ptr;
771c66ac9dbSNicholas Bellinger 	char *orig, *ptr, *opts;
772c66ac9dbSNicholas Bellinger 	substring_t args[MAX_OPT_ARGS];
773c66ac9dbSNicholas Bellinger 	int ret = 0, arg, token;
774c66ac9dbSNicholas Bellinger 
775c66ac9dbSNicholas Bellinger 	opts = kstrdup(page, GFP_KERNEL);
776c66ac9dbSNicholas Bellinger 	if (!opts)
777c66ac9dbSNicholas Bellinger 		return -ENOMEM;
778c66ac9dbSNicholas Bellinger 
779c66ac9dbSNicholas Bellinger 	orig = opts;
780c66ac9dbSNicholas Bellinger 
78190c161b6SSebastian Andrzej Siewior 	while ((ptr = strsep(&opts, ",\n")) != NULL) {
782c66ac9dbSNicholas Bellinger 		if (!*ptr)
783c66ac9dbSNicholas Bellinger 			continue;
784c66ac9dbSNicholas Bellinger 
785c66ac9dbSNicholas Bellinger 		token = match_token(ptr, tokens, args);
786c66ac9dbSNicholas Bellinger 		switch (token) {
787c66ac9dbSNicholas Bellinger 		case Opt_scsi_host_id:
788c66ac9dbSNicholas Bellinger 			if (phv->phv_mode == PHV_LLD_SCSI_HOST_NO) {
7896708bb27SAndy Grover 				pr_err("PSCSI[%d]: Unable to accept"
790c66ac9dbSNicholas Bellinger 					" scsi_host_id while phv_mode =="
791c66ac9dbSNicholas Bellinger 					" PHV_LLD_SCSI_HOST_NO\n",
792c66ac9dbSNicholas Bellinger 					phv->phv_host_id);
793c66ac9dbSNicholas Bellinger 				ret = -EINVAL;
794c66ac9dbSNicholas Bellinger 				goto out;
795c66ac9dbSNicholas Bellinger 			}
796c66ac9dbSNicholas Bellinger 			match_int(args, &arg);
797c66ac9dbSNicholas Bellinger 			pdv->pdv_host_id = arg;
7986708bb27SAndy Grover 			pr_debug("PSCSI[%d]: Referencing SCSI Host ID:"
799c66ac9dbSNicholas Bellinger 				" %d\n", phv->phv_host_id, pdv->pdv_host_id);
800c66ac9dbSNicholas Bellinger 			pdv->pdv_flags |= PDF_HAS_VIRT_HOST_ID;
801c66ac9dbSNicholas Bellinger 			break;
802c66ac9dbSNicholas Bellinger 		case Opt_scsi_channel_id:
803c66ac9dbSNicholas Bellinger 			match_int(args, &arg);
804c66ac9dbSNicholas Bellinger 			pdv->pdv_channel_id = arg;
8056708bb27SAndy Grover 			pr_debug("PSCSI[%d]: Referencing SCSI Channel"
806c66ac9dbSNicholas Bellinger 				" ID: %d\n",  phv->phv_host_id,
807c66ac9dbSNicholas Bellinger 				pdv->pdv_channel_id);
808c66ac9dbSNicholas Bellinger 			pdv->pdv_flags |= PDF_HAS_CHANNEL_ID;
809c66ac9dbSNicholas Bellinger 			break;
810c66ac9dbSNicholas Bellinger 		case Opt_scsi_target_id:
811c66ac9dbSNicholas Bellinger 			match_int(args, &arg);
812c66ac9dbSNicholas Bellinger 			pdv->pdv_target_id = arg;
8136708bb27SAndy Grover 			pr_debug("PSCSI[%d]: Referencing SCSI Target"
814c66ac9dbSNicholas Bellinger 				" ID: %d\n", phv->phv_host_id,
815c66ac9dbSNicholas Bellinger 				pdv->pdv_target_id);
816c66ac9dbSNicholas Bellinger 			pdv->pdv_flags |= PDF_HAS_TARGET_ID;
817c66ac9dbSNicholas Bellinger 			break;
818c66ac9dbSNicholas Bellinger 		case Opt_scsi_lun_id:
819c66ac9dbSNicholas Bellinger 			match_int(args, &arg);
820c66ac9dbSNicholas Bellinger 			pdv->pdv_lun_id = arg;
8216708bb27SAndy Grover 			pr_debug("PSCSI[%d]: Referencing SCSI LUN ID:"
822c66ac9dbSNicholas Bellinger 				" %d\n", phv->phv_host_id, pdv->pdv_lun_id);
823c66ac9dbSNicholas Bellinger 			pdv->pdv_flags |= PDF_HAS_LUN_ID;
824c66ac9dbSNicholas Bellinger 			break;
825c66ac9dbSNicholas Bellinger 		default:
826c66ac9dbSNicholas Bellinger 			break;
827c66ac9dbSNicholas Bellinger 		}
828c66ac9dbSNicholas Bellinger 	}
829c66ac9dbSNicholas Bellinger 
830c66ac9dbSNicholas Bellinger out:
831c66ac9dbSNicholas Bellinger 	kfree(orig);
832c66ac9dbSNicholas Bellinger 	return (!ret) ? count : ret;
833c66ac9dbSNicholas Bellinger }
834c66ac9dbSNicholas Bellinger 
835c66ac9dbSNicholas Bellinger static ssize_t pscsi_check_configfs_dev_params(
836c66ac9dbSNicholas Bellinger 	struct se_hba *hba,
837c66ac9dbSNicholas Bellinger 	struct se_subsystem_dev *se_dev)
838c66ac9dbSNicholas Bellinger {
839c66ac9dbSNicholas Bellinger 	struct pscsi_dev_virt *pdv = se_dev->se_dev_su_ptr;
840c66ac9dbSNicholas Bellinger 
841c66ac9dbSNicholas Bellinger 	if (!(pdv->pdv_flags & PDF_HAS_CHANNEL_ID) ||
842c66ac9dbSNicholas Bellinger 	    !(pdv->pdv_flags & PDF_HAS_TARGET_ID) ||
843c66ac9dbSNicholas Bellinger 	    !(pdv->pdv_flags & PDF_HAS_LUN_ID)) {
8446708bb27SAndy Grover 		pr_err("Missing scsi_channel_id=, scsi_target_id= and"
845c66ac9dbSNicholas Bellinger 			" scsi_lun_id= parameters\n");
846e3d6f909SAndy Grover 		return -EINVAL;
847c66ac9dbSNicholas Bellinger 	}
848c66ac9dbSNicholas Bellinger 
849c66ac9dbSNicholas Bellinger 	return 0;
850c66ac9dbSNicholas Bellinger }
851c66ac9dbSNicholas Bellinger 
852c66ac9dbSNicholas Bellinger static ssize_t pscsi_show_configfs_dev_params(struct se_hba *hba,
853c66ac9dbSNicholas Bellinger 					      struct se_subsystem_dev *se_dev,
854c66ac9dbSNicholas Bellinger 					      char *b)
855c66ac9dbSNicholas Bellinger {
856c66ac9dbSNicholas Bellinger 	struct pscsi_hba_virt *phv = hba->hba_ptr;
857c66ac9dbSNicholas Bellinger         struct pscsi_dev_virt *pdv = se_dev->se_dev_su_ptr;
858c66ac9dbSNicholas Bellinger 	struct scsi_device *sd = pdv->pdv_sd;
859c66ac9dbSNicholas Bellinger 	unsigned char host_id[16];
860c66ac9dbSNicholas Bellinger 	ssize_t bl;
861c66ac9dbSNicholas Bellinger 	int i;
862c66ac9dbSNicholas Bellinger 
863e6a8a41aSStefan Hajnoczi 	if (phv->phv_mode == PHV_VIRTUAL_HOST_ID)
864c66ac9dbSNicholas Bellinger 		snprintf(host_id, 16, "%d", pdv->pdv_host_id);
865c66ac9dbSNicholas Bellinger 	else
866c66ac9dbSNicholas Bellinger 		snprintf(host_id, 16, "PHBA Mode");
867c66ac9dbSNicholas Bellinger 
868c66ac9dbSNicholas Bellinger 	bl = sprintf(b, "SCSI Device Bus Location:"
869c66ac9dbSNicholas Bellinger 		" Channel ID: %d Target ID: %d LUN: %d Host ID: %s\n",
870c66ac9dbSNicholas Bellinger 		pdv->pdv_channel_id, pdv->pdv_target_id, pdv->pdv_lun_id,
871c66ac9dbSNicholas Bellinger 		host_id);
872c66ac9dbSNicholas Bellinger 
873c66ac9dbSNicholas Bellinger 	if (sd) {
874c66ac9dbSNicholas Bellinger 		bl += sprintf(b + bl, "        ");
875c66ac9dbSNicholas Bellinger 		bl += sprintf(b + bl, "Vendor: ");
876c66ac9dbSNicholas Bellinger 		for (i = 0; i < 8; i++) {
877c66ac9dbSNicholas Bellinger 			if (ISPRINT(sd->vendor[i]))   /* printable character? */
878c66ac9dbSNicholas Bellinger 				bl += sprintf(b + bl, "%c", sd->vendor[i]);
879c66ac9dbSNicholas Bellinger 			else
880c66ac9dbSNicholas Bellinger 				bl += sprintf(b + bl, " ");
881c66ac9dbSNicholas Bellinger 		}
882c66ac9dbSNicholas Bellinger 		bl += sprintf(b + bl, " Model: ");
883c66ac9dbSNicholas Bellinger 		for (i = 0; i < 16; i++) {
884c66ac9dbSNicholas Bellinger 			if (ISPRINT(sd->model[i]))   /* printable character ? */
885c66ac9dbSNicholas Bellinger 				bl += sprintf(b + bl, "%c", sd->model[i]);
886c66ac9dbSNicholas Bellinger 			else
887c66ac9dbSNicholas Bellinger 				bl += sprintf(b + bl, " ");
888c66ac9dbSNicholas Bellinger 		}
889c66ac9dbSNicholas Bellinger 		bl += sprintf(b + bl, " Rev: ");
890c66ac9dbSNicholas Bellinger 		for (i = 0; i < 4; i++) {
891c66ac9dbSNicholas Bellinger 			if (ISPRINT(sd->rev[i]))   /* printable character ? */
892c66ac9dbSNicholas Bellinger 				bl += sprintf(b + bl, "%c", sd->rev[i]);
893c66ac9dbSNicholas Bellinger 			else
894c66ac9dbSNicholas Bellinger 				bl += sprintf(b + bl, " ");
895c66ac9dbSNicholas Bellinger 		}
896c66ac9dbSNicholas Bellinger 		bl += sprintf(b + bl, "\n");
897c66ac9dbSNicholas Bellinger 	}
898c66ac9dbSNicholas Bellinger 	return bl;
899c66ac9dbSNicholas Bellinger }
900c66ac9dbSNicholas Bellinger 
901c66ac9dbSNicholas Bellinger static void pscsi_bi_endio(struct bio *bio, int error)
902c66ac9dbSNicholas Bellinger {
903c66ac9dbSNicholas Bellinger 	bio_put(bio);
904c66ac9dbSNicholas Bellinger }
905c66ac9dbSNicholas Bellinger 
906a1d8b49aSAndy Grover static inline struct bio *pscsi_get_bio(int sg_num)
907c66ac9dbSNicholas Bellinger {
908c66ac9dbSNicholas Bellinger 	struct bio *bio;
909c66ac9dbSNicholas Bellinger 	/*
910c66ac9dbSNicholas Bellinger 	 * Use bio_malloc() following the comment in for bio -> struct request
911c66ac9dbSNicholas Bellinger 	 * in block/blk-core.c:blk_make_request()
912c66ac9dbSNicholas Bellinger 	 */
913c66ac9dbSNicholas Bellinger 	bio = bio_kmalloc(GFP_KERNEL, sg_num);
9146708bb27SAndy Grover 	if (!bio) {
9156708bb27SAndy Grover 		pr_err("PSCSI: bio_kmalloc() failed\n");
916c66ac9dbSNicholas Bellinger 		return NULL;
917c66ac9dbSNicholas Bellinger 	}
918c66ac9dbSNicholas Bellinger 	bio->bi_end_io = pscsi_bi_endio;
919c66ac9dbSNicholas Bellinger 
920c66ac9dbSNicholas Bellinger 	return bio;
921c66ac9dbSNicholas Bellinger }
922c66ac9dbSNicholas Bellinger 
9235787cacdSChristoph Hellwig static int pscsi_map_sg(struct se_cmd *cmd, struct scatterlist *sgl,
9245787cacdSChristoph Hellwig 		u32 sgl_nents, enum dma_data_direction data_direction,
92502b1a746SChristoph Hellwig 		struct bio **hbio)
926c66ac9dbSNicholas Bellinger {
9275787cacdSChristoph Hellwig 	struct pscsi_dev_virt *pdv = cmd->se_dev->dev_ptr;
92802b1a746SChristoph Hellwig 	struct bio *bio = NULL, *tbio = NULL;
929c66ac9dbSNicholas Bellinger 	struct page *page;
930c66ac9dbSNicholas Bellinger 	struct scatterlist *sg;
9317a83aa4eSChristoph Hellwig 	u32 data_len = cmd->data_length, i, len, bytes, off;
9325787cacdSChristoph Hellwig 	int nr_pages = (cmd->data_length + sgl[0].offset +
933c66ac9dbSNicholas Bellinger 			PAGE_SIZE - 1) >> PAGE_SHIFT;
93403e98c9eSNicholas Bellinger 	int nr_vecs = 0, rc;
9355787cacdSChristoph Hellwig 	int rw = (data_direction == DMA_TO_DEVICE);
936c66ac9dbSNicholas Bellinger 
93702b1a746SChristoph Hellwig 	*hbio = NULL;
93802b1a746SChristoph Hellwig 
9396708bb27SAndy Grover 	pr_debug("PSCSI: nr_pages: %d\n", nr_pages);
940c66ac9dbSNicholas Bellinger 
9415787cacdSChristoph Hellwig 	for_each_sg(sgl, sg, sgl_nents, i) {
942c66ac9dbSNicholas Bellinger 		page = sg_page(sg);
943c66ac9dbSNicholas Bellinger 		off = sg->offset;
944c66ac9dbSNicholas Bellinger 		len = sg->length;
945c66ac9dbSNicholas Bellinger 
9466708bb27SAndy Grover 		pr_debug("PSCSI: i: %d page: %p len: %d off: %d\n", i,
947c66ac9dbSNicholas Bellinger 			page, len, off);
948c66ac9dbSNicholas Bellinger 
949c66ac9dbSNicholas Bellinger 		while (len > 0 && data_len > 0) {
950c66ac9dbSNicholas Bellinger 			bytes = min_t(unsigned int, len, PAGE_SIZE - off);
951c66ac9dbSNicholas Bellinger 			bytes = min(bytes, data_len);
952c66ac9dbSNicholas Bellinger 
9536708bb27SAndy Grover 			if (!bio) {
954c66ac9dbSNicholas Bellinger 				nr_vecs = min_t(int, BIO_MAX_PAGES, nr_pages);
955c66ac9dbSNicholas Bellinger 				nr_pages -= nr_vecs;
956c66ac9dbSNicholas Bellinger 				/*
957c66ac9dbSNicholas Bellinger 				 * Calls bio_kmalloc() and sets bio->bi_end_io()
958c66ac9dbSNicholas Bellinger 				 */
959a1d8b49aSAndy Grover 				bio = pscsi_get_bio(nr_vecs);
9606708bb27SAndy Grover 				if (!bio)
961c66ac9dbSNicholas Bellinger 					goto fail;
962c66ac9dbSNicholas Bellinger 
963c66ac9dbSNicholas Bellinger 				if (rw)
964c66ac9dbSNicholas Bellinger 					bio->bi_rw |= REQ_WRITE;
965c66ac9dbSNicholas Bellinger 
9666708bb27SAndy Grover 				pr_debug("PSCSI: Allocated bio: %p,"
967c66ac9dbSNicholas Bellinger 					" dir: %s nr_vecs: %d\n", bio,
968c66ac9dbSNicholas Bellinger 					(rw) ? "rw" : "r", nr_vecs);
969c66ac9dbSNicholas Bellinger 				/*
970c66ac9dbSNicholas Bellinger 				 * Set *hbio pointer to handle the case:
971c66ac9dbSNicholas Bellinger 				 * nr_pages > BIO_MAX_PAGES, where additional
972c66ac9dbSNicholas Bellinger 				 * bios need to be added to complete a given
9735787cacdSChristoph Hellwig 				 * command.
974c66ac9dbSNicholas Bellinger 				 */
97502b1a746SChristoph Hellwig 				if (!*hbio)
97602b1a746SChristoph Hellwig 					*hbio = tbio = bio;
977c66ac9dbSNicholas Bellinger 				else
978c66ac9dbSNicholas Bellinger 					tbio = tbio->bi_next = bio;
979c66ac9dbSNicholas Bellinger 			}
980c66ac9dbSNicholas Bellinger 
9816708bb27SAndy Grover 			pr_debug("PSCSI: Calling bio_add_pc_page() i: %d"
982c66ac9dbSNicholas Bellinger 				" bio: %p page: %p len: %d off: %d\n", i, bio,
983c66ac9dbSNicholas Bellinger 				page, len, off);
984c66ac9dbSNicholas Bellinger 
985c66ac9dbSNicholas Bellinger 			rc = bio_add_pc_page(pdv->pdv_sd->request_queue,
986c66ac9dbSNicholas Bellinger 					bio, page, bytes, off);
987c66ac9dbSNicholas Bellinger 			if (rc != bytes)
988c66ac9dbSNicholas Bellinger 				goto fail;
989c66ac9dbSNicholas Bellinger 
9906708bb27SAndy Grover 			pr_debug("PSCSI: bio->bi_vcnt: %d nr_vecs: %d\n",
991c66ac9dbSNicholas Bellinger 				bio->bi_vcnt, nr_vecs);
992c66ac9dbSNicholas Bellinger 
993c66ac9dbSNicholas Bellinger 			if (bio->bi_vcnt > nr_vecs) {
9946708bb27SAndy Grover 				pr_debug("PSCSI: Reached bio->bi_vcnt max:"
995c66ac9dbSNicholas Bellinger 					" %d i: %d bio: %p, allocating another"
996c66ac9dbSNicholas Bellinger 					" bio\n", bio->bi_vcnt, i, bio);
997c66ac9dbSNicholas Bellinger 				/*
998c66ac9dbSNicholas Bellinger 				 * Clear the pointer so that another bio will
999c66ac9dbSNicholas Bellinger 				 * be allocated with pscsi_get_bio() above, the
1000c66ac9dbSNicholas Bellinger 				 * current bio has already been set *tbio and
1001c66ac9dbSNicholas Bellinger 				 * bio->bi_next.
1002c66ac9dbSNicholas Bellinger 				 */
1003c66ac9dbSNicholas Bellinger 				bio = NULL;
1004c66ac9dbSNicholas Bellinger 			}
1005c66ac9dbSNicholas Bellinger 
1006c66ac9dbSNicholas Bellinger 			page++;
1007c66ac9dbSNicholas Bellinger 			len -= bytes;
1008c66ac9dbSNicholas Bellinger 			data_len -= bytes;
1009c66ac9dbSNicholas Bellinger 			off = 0;
1010c66ac9dbSNicholas Bellinger 		}
1011c66ac9dbSNicholas Bellinger 	}
1012c66ac9dbSNicholas Bellinger 
10135787cacdSChristoph Hellwig 	return sgl_nents;
1014c66ac9dbSNicholas Bellinger fail:
101502b1a746SChristoph Hellwig 	while (*hbio) {
101602b1a746SChristoph Hellwig 		bio = *hbio;
101702b1a746SChristoph Hellwig 		*hbio = (*hbio)->bi_next;
1018c66ac9dbSNicholas Bellinger 		bio->bi_next = NULL;
101902b1a746SChristoph Hellwig 		bio_endio(bio, 0);	/* XXX: should be error */
1020c66ac9dbSNicholas Bellinger 	}
102103e98c9eSNicholas Bellinger 	cmd->scsi_sense_reason = TCM_LOGICAL_UNIT_COMMUNICATION_FAILURE;
102203e98c9eSNicholas Bellinger 	return -ENOMEM;
1023c66ac9dbSNicholas Bellinger }
1024c66ac9dbSNicholas Bellinger 
1025*d6e0175cSChristoph Hellwig static inline u32 pscsi_get_sectors_6(
1026*d6e0175cSChristoph Hellwig 	unsigned char *cdb,
1027*d6e0175cSChristoph Hellwig 	struct se_cmd *cmd,
1028*d6e0175cSChristoph Hellwig 	int *ret)
1029*d6e0175cSChristoph Hellwig {
1030*d6e0175cSChristoph Hellwig 	struct se_device *dev = cmd->se_dev;
1031*d6e0175cSChristoph Hellwig 
1032*d6e0175cSChristoph Hellwig 	/*
1033*d6e0175cSChristoph Hellwig 	 * Assume TYPE_DISK for non struct se_device objects.
1034*d6e0175cSChristoph Hellwig 	 * Use 8-bit sector value.
1035*d6e0175cSChristoph Hellwig 	 */
1036*d6e0175cSChristoph Hellwig 	if (!dev)
1037*d6e0175cSChristoph Hellwig 		goto type_disk;
1038*d6e0175cSChristoph Hellwig 
1039*d6e0175cSChristoph Hellwig 	/*
1040*d6e0175cSChristoph Hellwig 	 * Use 24-bit allocation length for TYPE_TAPE.
1041*d6e0175cSChristoph Hellwig 	 */
1042*d6e0175cSChristoph Hellwig 	if (dev->transport->get_device_type(dev) == TYPE_TAPE)
1043*d6e0175cSChristoph Hellwig 		return (u32)(cdb[2] << 16) + (cdb[3] << 8) + cdb[4];
1044*d6e0175cSChristoph Hellwig 
1045*d6e0175cSChristoph Hellwig 	/*
1046*d6e0175cSChristoph Hellwig 	 * Everything else assume TYPE_DISK Sector CDB location.
1047*d6e0175cSChristoph Hellwig 	 * Use 8-bit sector value.  SBC-3 says:
1048*d6e0175cSChristoph Hellwig 	 *
1049*d6e0175cSChristoph Hellwig 	 *   A TRANSFER LENGTH field set to zero specifies that 256
1050*d6e0175cSChristoph Hellwig 	 *   logical blocks shall be written.  Any other value
1051*d6e0175cSChristoph Hellwig 	 *   specifies the number of logical blocks that shall be
1052*d6e0175cSChristoph Hellwig 	 *   written.
1053*d6e0175cSChristoph Hellwig 	 */
1054*d6e0175cSChristoph Hellwig type_disk:
1055*d6e0175cSChristoph Hellwig 	return cdb[4] ? : 256;
1056*d6e0175cSChristoph Hellwig }
1057*d6e0175cSChristoph Hellwig 
1058*d6e0175cSChristoph Hellwig static inline u32 pscsi_get_sectors_10(
1059*d6e0175cSChristoph Hellwig 	unsigned char *cdb,
1060*d6e0175cSChristoph Hellwig 	struct se_cmd *cmd,
1061*d6e0175cSChristoph Hellwig 	int *ret)
1062*d6e0175cSChristoph Hellwig {
1063*d6e0175cSChristoph Hellwig 	struct se_device *dev = cmd->se_dev;
1064*d6e0175cSChristoph Hellwig 
1065*d6e0175cSChristoph Hellwig 	/*
1066*d6e0175cSChristoph Hellwig 	 * Assume TYPE_DISK for non struct se_device objects.
1067*d6e0175cSChristoph Hellwig 	 * Use 16-bit sector value.
1068*d6e0175cSChristoph Hellwig 	 */
1069*d6e0175cSChristoph Hellwig 	if (!dev)
1070*d6e0175cSChristoph Hellwig 		goto type_disk;
1071*d6e0175cSChristoph Hellwig 
1072*d6e0175cSChristoph Hellwig 	/*
1073*d6e0175cSChristoph Hellwig 	 * XXX_10 is not defined in SSC, throw an exception
1074*d6e0175cSChristoph Hellwig 	 */
1075*d6e0175cSChristoph Hellwig 	if (dev->transport->get_device_type(dev) == TYPE_TAPE) {
1076*d6e0175cSChristoph Hellwig 		*ret = -EINVAL;
1077*d6e0175cSChristoph Hellwig 		return 0;
1078*d6e0175cSChristoph Hellwig 	}
1079*d6e0175cSChristoph Hellwig 
1080*d6e0175cSChristoph Hellwig 	/*
1081*d6e0175cSChristoph Hellwig 	 * Everything else assume TYPE_DISK Sector CDB location.
1082*d6e0175cSChristoph Hellwig 	 * Use 16-bit sector value.
1083*d6e0175cSChristoph Hellwig 	 */
1084*d6e0175cSChristoph Hellwig type_disk:
1085*d6e0175cSChristoph Hellwig 	return (u32)(cdb[7] << 8) + cdb[8];
1086*d6e0175cSChristoph Hellwig }
1087*d6e0175cSChristoph Hellwig 
1088*d6e0175cSChristoph Hellwig static inline u32 pscsi_get_sectors_12(
1089*d6e0175cSChristoph Hellwig 	unsigned char *cdb,
1090*d6e0175cSChristoph Hellwig 	struct se_cmd *cmd,
1091*d6e0175cSChristoph Hellwig 	int *ret)
1092*d6e0175cSChristoph Hellwig {
1093*d6e0175cSChristoph Hellwig 	struct se_device *dev = cmd->se_dev;
1094*d6e0175cSChristoph Hellwig 
1095*d6e0175cSChristoph Hellwig 	/*
1096*d6e0175cSChristoph Hellwig 	 * Assume TYPE_DISK for non struct se_device objects.
1097*d6e0175cSChristoph Hellwig 	 * Use 32-bit sector value.
1098*d6e0175cSChristoph Hellwig 	 */
1099*d6e0175cSChristoph Hellwig 	if (!dev)
1100*d6e0175cSChristoph Hellwig 		goto type_disk;
1101*d6e0175cSChristoph Hellwig 
1102*d6e0175cSChristoph Hellwig 	/*
1103*d6e0175cSChristoph Hellwig 	 * XXX_12 is not defined in SSC, throw an exception
1104*d6e0175cSChristoph Hellwig 	 */
1105*d6e0175cSChristoph Hellwig 	if (dev->transport->get_device_type(dev) == TYPE_TAPE) {
1106*d6e0175cSChristoph Hellwig 		*ret = -EINVAL;
1107*d6e0175cSChristoph Hellwig 		return 0;
1108*d6e0175cSChristoph Hellwig 	}
1109*d6e0175cSChristoph Hellwig 
1110*d6e0175cSChristoph Hellwig 	/*
1111*d6e0175cSChristoph Hellwig 	 * Everything else assume TYPE_DISK Sector CDB location.
1112*d6e0175cSChristoph Hellwig 	 * Use 32-bit sector value.
1113*d6e0175cSChristoph Hellwig 	 */
1114*d6e0175cSChristoph Hellwig type_disk:
1115*d6e0175cSChristoph Hellwig 	return (u32)(cdb[6] << 24) + (cdb[7] << 16) + (cdb[8] << 8) + cdb[9];
1116*d6e0175cSChristoph Hellwig }
1117*d6e0175cSChristoph Hellwig 
1118*d6e0175cSChristoph Hellwig static inline u32 pscsi_get_sectors_16(
1119*d6e0175cSChristoph Hellwig 	unsigned char *cdb,
1120*d6e0175cSChristoph Hellwig 	struct se_cmd *cmd,
1121*d6e0175cSChristoph Hellwig 	int *ret)
1122*d6e0175cSChristoph Hellwig {
1123*d6e0175cSChristoph Hellwig 	struct se_device *dev = cmd->se_dev;
1124*d6e0175cSChristoph Hellwig 
1125*d6e0175cSChristoph Hellwig 	/*
1126*d6e0175cSChristoph Hellwig 	 * Assume TYPE_DISK for non struct se_device objects.
1127*d6e0175cSChristoph Hellwig 	 * Use 32-bit sector value.
1128*d6e0175cSChristoph Hellwig 	 */
1129*d6e0175cSChristoph Hellwig 	if (!dev)
1130*d6e0175cSChristoph Hellwig 		goto type_disk;
1131*d6e0175cSChristoph Hellwig 
1132*d6e0175cSChristoph Hellwig 	/*
1133*d6e0175cSChristoph Hellwig 	 * Use 24-bit allocation length for TYPE_TAPE.
1134*d6e0175cSChristoph Hellwig 	 */
1135*d6e0175cSChristoph Hellwig 	if (dev->transport->get_device_type(dev) == TYPE_TAPE)
1136*d6e0175cSChristoph Hellwig 		return (u32)(cdb[12] << 16) + (cdb[13] << 8) + cdb[14];
1137*d6e0175cSChristoph Hellwig 
1138*d6e0175cSChristoph Hellwig type_disk:
1139*d6e0175cSChristoph Hellwig 	return (u32)(cdb[10] << 24) + (cdb[11] << 16) +
1140*d6e0175cSChristoph Hellwig 		    (cdb[12] << 8) + cdb[13];
1141*d6e0175cSChristoph Hellwig }
1142*d6e0175cSChristoph Hellwig 
1143*d6e0175cSChristoph Hellwig /*
1144*d6e0175cSChristoph Hellwig  * Used for VARIABLE_LENGTH_CDB WRITE_32 and READ_32 variants
1145*d6e0175cSChristoph Hellwig  */
1146*d6e0175cSChristoph Hellwig static inline u32 pscsi_get_sectors_32(
1147*d6e0175cSChristoph Hellwig 	unsigned char *cdb,
1148*d6e0175cSChristoph Hellwig 	struct se_cmd *cmd,
1149*d6e0175cSChristoph Hellwig 	int *ret)
1150*d6e0175cSChristoph Hellwig {
1151*d6e0175cSChristoph Hellwig 	/*
1152*d6e0175cSChristoph Hellwig 	 * Assume TYPE_DISK for non struct se_device objects.
1153*d6e0175cSChristoph Hellwig 	 * Use 32-bit sector value.
1154*d6e0175cSChristoph Hellwig 	 */
1155*d6e0175cSChristoph Hellwig 	return (u32)(cdb[28] << 24) + (cdb[29] << 16) +
1156*d6e0175cSChristoph Hellwig 		    (cdb[30] << 8) + cdb[31];
1157*d6e0175cSChristoph Hellwig 
1158*d6e0175cSChristoph Hellwig }
1159*d6e0175cSChristoph Hellwig 
1160*d6e0175cSChristoph Hellwig static inline u32 pscsi_get_lba_21(unsigned char *cdb)
1161*d6e0175cSChristoph Hellwig {
1162*d6e0175cSChristoph Hellwig 	return ((cdb[1] & 0x1f) << 16) | (cdb[2] << 8) | cdb[3];
1163*d6e0175cSChristoph Hellwig }
1164*d6e0175cSChristoph Hellwig 
1165*d6e0175cSChristoph Hellwig static inline u32 pscsi_get_lba_32(unsigned char *cdb)
1166*d6e0175cSChristoph Hellwig {
1167*d6e0175cSChristoph Hellwig 	return (cdb[2] << 24) | (cdb[3] << 16) | (cdb[4] << 8) | cdb[5];
1168*d6e0175cSChristoph Hellwig }
1169*d6e0175cSChristoph Hellwig 
1170*d6e0175cSChristoph Hellwig static inline unsigned long long pscsi_get_lba_64(unsigned char *cdb)
1171*d6e0175cSChristoph Hellwig {
1172*d6e0175cSChristoph Hellwig 	unsigned int __v1, __v2;
1173*d6e0175cSChristoph Hellwig 
1174*d6e0175cSChristoph Hellwig 	__v1 = (cdb[2] << 24) | (cdb[3] << 16) | (cdb[4] << 8) | cdb[5];
1175*d6e0175cSChristoph Hellwig 	__v2 = (cdb[6] << 24) | (cdb[7] << 16) | (cdb[8] << 8) | cdb[9];
1176*d6e0175cSChristoph Hellwig 
1177*d6e0175cSChristoph Hellwig 	return ((unsigned long long)__v2) | (unsigned long long)__v1 << 32;
1178*d6e0175cSChristoph Hellwig }
1179*d6e0175cSChristoph Hellwig 
1180*d6e0175cSChristoph Hellwig /*
1181*d6e0175cSChristoph Hellwig  * For VARIABLE_LENGTH_CDB w/ 32 byte extended CDBs
1182*d6e0175cSChristoph Hellwig  */
1183*d6e0175cSChristoph Hellwig static inline unsigned long long pscsi_get_lba_64_ext(unsigned char *cdb)
1184*d6e0175cSChristoph Hellwig {
1185*d6e0175cSChristoph Hellwig 	unsigned int __v1, __v2;
1186*d6e0175cSChristoph Hellwig 
1187*d6e0175cSChristoph Hellwig 	__v1 = (cdb[12] << 24) | (cdb[13] << 16) | (cdb[14] << 8) | cdb[15];
1188*d6e0175cSChristoph Hellwig 	__v2 = (cdb[16] << 24) | (cdb[17] << 16) | (cdb[18] << 8) | cdb[19];
1189*d6e0175cSChristoph Hellwig 
1190*d6e0175cSChristoph Hellwig 	return ((unsigned long long)__v2) | (unsigned long long)__v1 << 32;
1191*d6e0175cSChristoph Hellwig }
1192*d6e0175cSChristoph Hellwig 
1193*d6e0175cSChristoph Hellwig 
1194*d6e0175cSChristoph Hellwig static inline u32 pscsi_get_size(
1195*d6e0175cSChristoph Hellwig 	u32 sectors,
1196*d6e0175cSChristoph Hellwig 	unsigned char *cdb,
1197*d6e0175cSChristoph Hellwig 	struct se_cmd *cmd)
1198*d6e0175cSChristoph Hellwig {
1199*d6e0175cSChristoph Hellwig 	struct se_device *dev = cmd->se_dev;
1200*d6e0175cSChristoph Hellwig 
1201*d6e0175cSChristoph Hellwig 	if (dev->transport->get_device_type(dev) == TYPE_TAPE) {
1202*d6e0175cSChristoph Hellwig 		if (cdb[1] & 1) { /* sectors */
1203*d6e0175cSChristoph Hellwig 			return dev->se_sub_dev->se_dev_attrib.block_size * sectors;
1204*d6e0175cSChristoph Hellwig 		} else /* bytes */
1205*d6e0175cSChristoph Hellwig 			return sectors;
1206*d6e0175cSChristoph Hellwig 	}
1207*d6e0175cSChristoph Hellwig 
1208*d6e0175cSChristoph Hellwig 	pr_debug("Returning block_size: %u, sectors: %u == %u for"
1209*d6e0175cSChristoph Hellwig 		" %s object\n", dev->se_sub_dev->se_dev_attrib.block_size,
1210*d6e0175cSChristoph Hellwig 		sectors, dev->se_sub_dev->se_dev_attrib.block_size * sectors,
1211*d6e0175cSChristoph Hellwig 		dev->transport->name);
1212*d6e0175cSChristoph Hellwig 
1213*d6e0175cSChristoph Hellwig 	return dev->se_sub_dev->se_dev_attrib.block_size * sectors;
1214*d6e0175cSChristoph Hellwig }
1215*d6e0175cSChristoph Hellwig 
1216*d6e0175cSChristoph Hellwig static int pscsi_parse_cdb(struct se_cmd *cmd, unsigned int *size)
1217*d6e0175cSChristoph Hellwig {
1218*d6e0175cSChristoph Hellwig 	struct se_device *dev = cmd->se_dev;
1219*d6e0175cSChristoph Hellwig 	struct se_subsystem_dev *su_dev = dev->se_sub_dev;
1220*d6e0175cSChristoph Hellwig 	unsigned char *cdb = cmd->t_task_cdb;
1221*d6e0175cSChristoph Hellwig 	int sector_ret = 0;
1222*d6e0175cSChristoph Hellwig 	u32 sectors = 0;
1223*d6e0175cSChristoph Hellwig 	u16 service_action;
1224*d6e0175cSChristoph Hellwig 	int ret;
1225*d6e0175cSChristoph Hellwig 
1226*d6e0175cSChristoph Hellwig 	if (cmd->se_cmd_flags & SCF_BIDI)
1227*d6e0175cSChristoph Hellwig 		goto out_unsupported_cdb;
1228*d6e0175cSChristoph Hellwig 
1229*d6e0175cSChristoph Hellwig 	switch (cdb[0]) {
1230*d6e0175cSChristoph Hellwig 	case READ_6:
1231*d6e0175cSChristoph Hellwig 		sectors = pscsi_get_sectors_6(cdb, cmd, &sector_ret);
1232*d6e0175cSChristoph Hellwig 		if (sector_ret)
1233*d6e0175cSChristoph Hellwig 			goto out_unsupported_cdb;
1234*d6e0175cSChristoph Hellwig 		*size = pscsi_get_size(sectors, cdb, cmd);
1235*d6e0175cSChristoph Hellwig 		cmd->t_task_lba = pscsi_get_lba_21(cdb);
1236*d6e0175cSChristoph Hellwig 		cmd->se_cmd_flags |= SCF_SCSI_DATA_CDB;
1237*d6e0175cSChristoph Hellwig 		break;
1238*d6e0175cSChristoph Hellwig 	case READ_10:
1239*d6e0175cSChristoph Hellwig 		sectors = pscsi_get_sectors_10(cdb, cmd, &sector_ret);
1240*d6e0175cSChristoph Hellwig 		if (sector_ret)
1241*d6e0175cSChristoph Hellwig 			goto out_unsupported_cdb;
1242*d6e0175cSChristoph Hellwig 		*size = pscsi_get_size(sectors, cdb, cmd);
1243*d6e0175cSChristoph Hellwig 		cmd->t_task_lba = pscsi_get_lba_32(cdb);
1244*d6e0175cSChristoph Hellwig 		cmd->se_cmd_flags |= SCF_SCSI_DATA_CDB;
1245*d6e0175cSChristoph Hellwig 		break;
1246*d6e0175cSChristoph Hellwig 	case READ_12:
1247*d6e0175cSChristoph Hellwig 		sectors = pscsi_get_sectors_12(cdb, cmd, &sector_ret);
1248*d6e0175cSChristoph Hellwig 		if (sector_ret)
1249*d6e0175cSChristoph Hellwig 			goto out_unsupported_cdb;
1250*d6e0175cSChristoph Hellwig 		*size = pscsi_get_size(sectors, cdb, cmd);
1251*d6e0175cSChristoph Hellwig 		cmd->t_task_lba = pscsi_get_lba_32(cdb);
1252*d6e0175cSChristoph Hellwig 		cmd->se_cmd_flags |= SCF_SCSI_DATA_CDB;
1253*d6e0175cSChristoph Hellwig 		break;
1254*d6e0175cSChristoph Hellwig 	case READ_16:
1255*d6e0175cSChristoph Hellwig 		sectors = pscsi_get_sectors_16(cdb, cmd, &sector_ret);
1256*d6e0175cSChristoph Hellwig 		if (sector_ret)
1257*d6e0175cSChristoph Hellwig 			goto out_unsupported_cdb;
1258*d6e0175cSChristoph Hellwig 		*size = pscsi_get_size(sectors, cdb, cmd);
1259*d6e0175cSChristoph Hellwig 		cmd->t_task_lba = pscsi_get_lba_64(cdb);
1260*d6e0175cSChristoph Hellwig 		cmd->se_cmd_flags |= SCF_SCSI_DATA_CDB;
1261*d6e0175cSChristoph Hellwig 		break;
1262*d6e0175cSChristoph Hellwig 	case WRITE_6:
1263*d6e0175cSChristoph Hellwig 		sectors = pscsi_get_sectors_6(cdb, cmd, &sector_ret);
1264*d6e0175cSChristoph Hellwig 		if (sector_ret)
1265*d6e0175cSChristoph Hellwig 			goto out_unsupported_cdb;
1266*d6e0175cSChristoph Hellwig 		*size = pscsi_get_size(sectors, cdb, cmd);
1267*d6e0175cSChristoph Hellwig 		cmd->t_task_lba = pscsi_get_lba_21(cdb);
1268*d6e0175cSChristoph Hellwig 		cmd->se_cmd_flags |= SCF_SCSI_DATA_CDB;
1269*d6e0175cSChristoph Hellwig 		break;
1270*d6e0175cSChristoph Hellwig 	case WRITE_10:
1271*d6e0175cSChristoph Hellwig 	case WRITE_VERIFY:
1272*d6e0175cSChristoph Hellwig 		sectors = pscsi_get_sectors_10(cdb, cmd, &sector_ret);
1273*d6e0175cSChristoph Hellwig 		if (sector_ret)
1274*d6e0175cSChristoph Hellwig 			goto out_unsupported_cdb;
1275*d6e0175cSChristoph Hellwig 		*size = pscsi_get_size(sectors, cdb, cmd);
1276*d6e0175cSChristoph Hellwig 		cmd->t_task_lba = pscsi_get_lba_32(cdb);
1277*d6e0175cSChristoph Hellwig 		if (cdb[1] & 0x8)
1278*d6e0175cSChristoph Hellwig 			cmd->se_cmd_flags |= SCF_FUA;
1279*d6e0175cSChristoph Hellwig 		cmd->se_cmd_flags |= SCF_SCSI_DATA_CDB;
1280*d6e0175cSChristoph Hellwig 		break;
1281*d6e0175cSChristoph Hellwig 	case WRITE_12:
1282*d6e0175cSChristoph Hellwig 		sectors = pscsi_get_sectors_12(cdb, cmd, &sector_ret);
1283*d6e0175cSChristoph Hellwig 		if (sector_ret)
1284*d6e0175cSChristoph Hellwig 			goto out_unsupported_cdb;
1285*d6e0175cSChristoph Hellwig 		*size = pscsi_get_size(sectors, cdb, cmd);
1286*d6e0175cSChristoph Hellwig 		cmd->t_task_lba = pscsi_get_lba_32(cdb);
1287*d6e0175cSChristoph Hellwig 		if (cdb[1] & 0x8)
1288*d6e0175cSChristoph Hellwig 			cmd->se_cmd_flags |= SCF_FUA;
1289*d6e0175cSChristoph Hellwig 		cmd->se_cmd_flags |= SCF_SCSI_DATA_CDB;
1290*d6e0175cSChristoph Hellwig 		break;
1291*d6e0175cSChristoph Hellwig 	case WRITE_16:
1292*d6e0175cSChristoph Hellwig 		sectors = pscsi_get_sectors_16(cdb, cmd, &sector_ret);
1293*d6e0175cSChristoph Hellwig 		if (sector_ret)
1294*d6e0175cSChristoph Hellwig 			goto out_unsupported_cdb;
1295*d6e0175cSChristoph Hellwig 		*size = pscsi_get_size(sectors, cdb, cmd);
1296*d6e0175cSChristoph Hellwig 		cmd->t_task_lba = pscsi_get_lba_64(cdb);
1297*d6e0175cSChristoph Hellwig 		if (cdb[1] & 0x8)
1298*d6e0175cSChristoph Hellwig 			cmd->se_cmd_flags |= SCF_FUA;
1299*d6e0175cSChristoph Hellwig 		cmd->se_cmd_flags |= SCF_SCSI_DATA_CDB;
1300*d6e0175cSChristoph Hellwig 		break;
1301*d6e0175cSChristoph Hellwig 	case VARIABLE_LENGTH_CMD:
1302*d6e0175cSChristoph Hellwig 		service_action = get_unaligned_be16(&cdb[8]);
1303*d6e0175cSChristoph Hellwig 		switch (service_action) {
1304*d6e0175cSChristoph Hellwig 		case WRITE_SAME_32:
1305*d6e0175cSChristoph Hellwig 			sectors = pscsi_get_sectors_32(cdb, cmd, &sector_ret);
1306*d6e0175cSChristoph Hellwig 			if (sector_ret)
1307*d6e0175cSChristoph Hellwig 				goto out_unsupported_cdb;
1308*d6e0175cSChristoph Hellwig 
1309*d6e0175cSChristoph Hellwig 			if (!sectors) {
1310*d6e0175cSChristoph Hellwig 				pr_err("WSNZ=1, WRITE_SAME w/sectors=0 not"
1311*d6e0175cSChristoph Hellwig 				       " supported\n");
1312*d6e0175cSChristoph Hellwig 				goto out_invalid_cdb_field;
1313*d6e0175cSChristoph Hellwig 			}
1314*d6e0175cSChristoph Hellwig 
1315*d6e0175cSChristoph Hellwig 			*size = pscsi_get_size(1, cdb, cmd);
1316*d6e0175cSChristoph Hellwig 			cmd->t_task_lba = get_unaligned_be64(&cdb[12]);
1317*d6e0175cSChristoph Hellwig 			break;
1318*d6e0175cSChristoph Hellwig 		default:
1319*d6e0175cSChristoph Hellwig 			pr_err("VARIABLE_LENGTH_CMD service action"
1320*d6e0175cSChristoph Hellwig 				" 0x%04x not supported\n", service_action);
1321*d6e0175cSChristoph Hellwig 			goto out_unsupported_cdb;
1322*d6e0175cSChristoph Hellwig 		}
1323*d6e0175cSChristoph Hellwig 		break;
1324*d6e0175cSChristoph Hellwig 	case GPCMD_READ_BUFFER_CAPACITY:
1325*d6e0175cSChristoph Hellwig 	case GPCMD_SEND_OPC:
1326*d6e0175cSChristoph Hellwig 		*size = (cdb[7] << 8) + cdb[8];
1327*d6e0175cSChristoph Hellwig 		break;
1328*d6e0175cSChristoph Hellwig 	case READ_BLOCK_LIMITS:
1329*d6e0175cSChristoph Hellwig 		*size = READ_BLOCK_LEN;
1330*d6e0175cSChristoph Hellwig 		break;
1331*d6e0175cSChristoph Hellwig 	case GPCMD_GET_CONFIGURATION:
1332*d6e0175cSChristoph Hellwig 	case GPCMD_READ_FORMAT_CAPACITIES:
1333*d6e0175cSChristoph Hellwig 	case GPCMD_READ_DISC_INFO:
1334*d6e0175cSChristoph Hellwig 	case GPCMD_READ_TRACK_RZONE_INFO:
1335*d6e0175cSChristoph Hellwig 		*size = (cdb[7] << 8) + cdb[8];
1336*d6e0175cSChristoph Hellwig 		break;
1337*d6e0175cSChristoph Hellwig 	case GPCMD_MECHANISM_STATUS:
1338*d6e0175cSChristoph Hellwig 	case GPCMD_READ_DVD_STRUCTURE:
1339*d6e0175cSChristoph Hellwig 		*size = (cdb[8] << 8) + cdb[9];
1340*d6e0175cSChristoph Hellwig 		break;
1341*d6e0175cSChristoph Hellwig 	case READ_POSITION:
1342*d6e0175cSChristoph Hellwig 		*size = READ_POSITION_LEN;
1343*d6e0175cSChristoph Hellwig 		break;
1344*d6e0175cSChristoph Hellwig 	case READ_BUFFER:
1345*d6e0175cSChristoph Hellwig 		*size = (cdb[6] << 16) + (cdb[7] << 8) + cdb[8];
1346*d6e0175cSChristoph Hellwig 		break;
1347*d6e0175cSChristoph Hellwig 	case READ_CAPACITY:
1348*d6e0175cSChristoph Hellwig 		*size = READ_CAP_LEN;
1349*d6e0175cSChristoph Hellwig 		break;
1350*d6e0175cSChristoph Hellwig 	case READ_MEDIA_SERIAL_NUMBER:
1351*d6e0175cSChristoph Hellwig 	case SERVICE_ACTION_IN:
1352*d6e0175cSChristoph Hellwig 	case ACCESS_CONTROL_IN:
1353*d6e0175cSChristoph Hellwig 	case ACCESS_CONTROL_OUT:
1354*d6e0175cSChristoph Hellwig 		*size = (cdb[10] << 24) | (cdb[11] << 16) |
1355*d6e0175cSChristoph Hellwig 		       (cdb[12] << 8) | cdb[13];
1356*d6e0175cSChristoph Hellwig 		break;
1357*d6e0175cSChristoph Hellwig 	case READ_TOC:
1358*d6e0175cSChristoph Hellwig 		*size = cdb[8];
1359*d6e0175cSChristoph Hellwig 		break;
1360*d6e0175cSChristoph Hellwig 	case READ_ELEMENT_STATUS:
1361*d6e0175cSChristoph Hellwig 		*size = 65536 * cdb[7] + 256 * cdb[8] + cdb[9];
1362*d6e0175cSChristoph Hellwig 		break;
1363*d6e0175cSChristoph Hellwig 	case SYNCHRONIZE_CACHE:
1364*d6e0175cSChristoph Hellwig 	case SYNCHRONIZE_CACHE_16:
1365*d6e0175cSChristoph Hellwig 		/*
1366*d6e0175cSChristoph Hellwig 		 * Extract LBA and range to be flushed for emulated SYNCHRONIZE_CACHE
1367*d6e0175cSChristoph Hellwig 		 */
1368*d6e0175cSChristoph Hellwig 		if (cdb[0] == SYNCHRONIZE_CACHE) {
1369*d6e0175cSChristoph Hellwig 			sectors = pscsi_get_sectors_10(cdb, cmd, &sector_ret);
1370*d6e0175cSChristoph Hellwig 			cmd->t_task_lba = pscsi_get_lba_32(cdb);
1371*d6e0175cSChristoph Hellwig 		} else {
1372*d6e0175cSChristoph Hellwig 			sectors = pscsi_get_sectors_16(cdb, cmd, &sector_ret);
1373*d6e0175cSChristoph Hellwig 			cmd->t_task_lba = pscsi_get_lba_64(cdb);
1374*d6e0175cSChristoph Hellwig 		}
1375*d6e0175cSChristoph Hellwig 		if (sector_ret)
1376*d6e0175cSChristoph Hellwig 			goto out_unsupported_cdb;
1377*d6e0175cSChristoph Hellwig 
1378*d6e0175cSChristoph Hellwig 		*size = pscsi_get_size(sectors, cdb, cmd);
1379*d6e0175cSChristoph Hellwig 		break;
1380*d6e0175cSChristoph Hellwig 	case UNMAP:
1381*d6e0175cSChristoph Hellwig 		*size = get_unaligned_be16(&cdb[7]);
1382*d6e0175cSChristoph Hellwig 		break;
1383*d6e0175cSChristoph Hellwig 	case WRITE_SAME_16:
1384*d6e0175cSChristoph Hellwig 		sectors = pscsi_get_sectors_16(cdb, cmd, &sector_ret);
1385*d6e0175cSChristoph Hellwig 		if (sector_ret)
1386*d6e0175cSChristoph Hellwig 			goto out_unsupported_cdb;
1387*d6e0175cSChristoph Hellwig 
1388*d6e0175cSChristoph Hellwig 		if (!sectors) {
1389*d6e0175cSChristoph Hellwig 			pr_err("WSNZ=1, WRITE_SAME w/sectors=0 not supported\n");
1390*d6e0175cSChristoph Hellwig 			goto out_invalid_cdb_field;
1391*d6e0175cSChristoph Hellwig 		}
1392*d6e0175cSChristoph Hellwig 
1393*d6e0175cSChristoph Hellwig 		*size = pscsi_get_size(1, cdb, cmd);
1394*d6e0175cSChristoph Hellwig 		cmd->t_task_lba = get_unaligned_be64(&cdb[2]);
1395*d6e0175cSChristoph Hellwig 		break;
1396*d6e0175cSChristoph Hellwig 	case WRITE_SAME:
1397*d6e0175cSChristoph Hellwig 		sectors = pscsi_get_sectors_10(cdb, cmd, &sector_ret);
1398*d6e0175cSChristoph Hellwig 		if (sector_ret)
1399*d6e0175cSChristoph Hellwig 			goto out_unsupported_cdb;
1400*d6e0175cSChristoph Hellwig 
1401*d6e0175cSChristoph Hellwig 		if (!sectors) {
1402*d6e0175cSChristoph Hellwig 			pr_err("WSNZ=1, WRITE_SAME w/sectors=0 not supported\n");
1403*d6e0175cSChristoph Hellwig 			goto out_invalid_cdb_field;
1404*d6e0175cSChristoph Hellwig 		}
1405*d6e0175cSChristoph Hellwig 
1406*d6e0175cSChristoph Hellwig 		*size = pscsi_get_size(1, cdb, cmd);
1407*d6e0175cSChristoph Hellwig 		cmd->t_task_lba = get_unaligned_be32(&cdb[2]);
1408*d6e0175cSChristoph Hellwig 		break;
1409*d6e0175cSChristoph Hellwig 	case ALLOW_MEDIUM_REMOVAL:
1410*d6e0175cSChristoph Hellwig 	case ERASE:
1411*d6e0175cSChristoph Hellwig 	case REZERO_UNIT:
1412*d6e0175cSChristoph Hellwig 	case SEEK_10:
1413*d6e0175cSChristoph Hellwig 	case SPACE:
1414*d6e0175cSChristoph Hellwig 	case START_STOP:
1415*d6e0175cSChristoph Hellwig 	case VERIFY:
1416*d6e0175cSChristoph Hellwig 	case WRITE_FILEMARKS:
1417*d6e0175cSChristoph Hellwig 	case GPCMD_CLOSE_TRACK:
1418*d6e0175cSChristoph Hellwig 	case INITIALIZE_ELEMENT_STATUS:
1419*d6e0175cSChristoph Hellwig 	case GPCMD_LOAD_UNLOAD:
1420*d6e0175cSChristoph Hellwig 	case GPCMD_SET_SPEED:
1421*d6e0175cSChristoph Hellwig 	case MOVE_MEDIUM:
1422*d6e0175cSChristoph Hellwig 		*size = 0;
1423*d6e0175cSChristoph Hellwig 		break;
1424*d6e0175cSChristoph Hellwig 	case GET_EVENT_STATUS_NOTIFICATION:
1425*d6e0175cSChristoph Hellwig 		*size = (cdb[7] << 8) | cdb[8];
1426*d6e0175cSChristoph Hellwig 		break;
1427*d6e0175cSChristoph Hellwig 	case ATA_16:
1428*d6e0175cSChristoph Hellwig 		switch (cdb[2] & 0x3) {		/* T_LENGTH */
1429*d6e0175cSChristoph Hellwig 		case 0x0:
1430*d6e0175cSChristoph Hellwig 			sectors = 0;
1431*d6e0175cSChristoph Hellwig 			break;
1432*d6e0175cSChristoph Hellwig 		case 0x1:
1433*d6e0175cSChristoph Hellwig 			sectors = (((cdb[1] & 0x1) ? cdb[3] : 0) << 8) | cdb[4];
1434*d6e0175cSChristoph Hellwig 			break;
1435*d6e0175cSChristoph Hellwig 		case 0x2:
1436*d6e0175cSChristoph Hellwig 			sectors = (((cdb[1] & 0x1) ? cdb[5] : 0) << 8) | cdb[6];
1437*d6e0175cSChristoph Hellwig 			break;
1438*d6e0175cSChristoph Hellwig 		case 0x3:
1439*d6e0175cSChristoph Hellwig 			pr_err("T_LENGTH=0x3 not supported for ATA_16\n");
1440*d6e0175cSChristoph Hellwig 			goto out_invalid_cdb_field;
1441*d6e0175cSChristoph Hellwig 		}
1442*d6e0175cSChristoph Hellwig 
1443*d6e0175cSChristoph Hellwig 		/* BYTE_BLOCK */
1444*d6e0175cSChristoph Hellwig 		if (cdb[2] & 0x4) {
1445*d6e0175cSChristoph Hellwig 			/* BLOCK T_TYPE: 512 or sector */
1446*d6e0175cSChristoph Hellwig 			*size = sectors * ((cdb[2] & 0x10) ?
1447*d6e0175cSChristoph Hellwig 				dev->se_sub_dev->se_dev_attrib.block_size : 512);
1448*d6e0175cSChristoph Hellwig 		} else {
1449*d6e0175cSChristoph Hellwig 			/* BYTE */
1450*d6e0175cSChristoph Hellwig 			*size = sectors;
1451*d6e0175cSChristoph Hellwig 		}
1452*d6e0175cSChristoph Hellwig 		break;
1453*d6e0175cSChristoph Hellwig 	default:
1454*d6e0175cSChristoph Hellwig 		ret = spc_parse_cdb(cmd, size, true);
1455*d6e0175cSChristoph Hellwig 		if (ret)
1456*d6e0175cSChristoph Hellwig 			return ret;
1457*d6e0175cSChristoph Hellwig 	}
1458*d6e0175cSChristoph Hellwig 
1459*d6e0175cSChristoph Hellwig 	if (cmd->se_cmd_flags & SCF_SCSI_DATA_CDB) {
1460*d6e0175cSChristoph Hellwig 		if (sectors > su_dev->se_dev_attrib.fabric_max_sectors) {
1461*d6e0175cSChristoph Hellwig 			printk_ratelimited(KERN_ERR "SCSI OP %02xh with too"
1462*d6e0175cSChristoph Hellwig 				" big sectors %u exceeds fabric_max_sectors:"
1463*d6e0175cSChristoph Hellwig 				" %u\n", cdb[0], sectors,
1464*d6e0175cSChristoph Hellwig 				su_dev->se_dev_attrib.fabric_max_sectors);
1465*d6e0175cSChristoph Hellwig 			goto out_invalid_cdb_field;
1466*d6e0175cSChristoph Hellwig 		}
1467*d6e0175cSChristoph Hellwig 		if (sectors > su_dev->se_dev_attrib.hw_max_sectors) {
1468*d6e0175cSChristoph Hellwig 			printk_ratelimited(KERN_ERR "SCSI OP %02xh with too"
1469*d6e0175cSChristoph Hellwig 				" big sectors %u exceeds backend hw_max_sectors:"
1470*d6e0175cSChristoph Hellwig 				" %u\n", cdb[0], sectors,
1471*d6e0175cSChristoph Hellwig 				su_dev->se_dev_attrib.hw_max_sectors);
1472*d6e0175cSChristoph Hellwig 			goto out_invalid_cdb_field;
1473*d6e0175cSChristoph Hellwig 		}
1474*d6e0175cSChristoph Hellwig 	}
1475*d6e0175cSChristoph Hellwig 
1476*d6e0175cSChristoph Hellwig 	return 0;
1477*d6e0175cSChristoph Hellwig 
1478*d6e0175cSChristoph Hellwig out_unsupported_cdb:
1479*d6e0175cSChristoph Hellwig 	cmd->se_cmd_flags |= SCF_SCSI_CDB_EXCEPTION;
1480*d6e0175cSChristoph Hellwig 	cmd->scsi_sense_reason = TCM_UNSUPPORTED_SCSI_OPCODE;
1481*d6e0175cSChristoph Hellwig 	return -EINVAL;
1482*d6e0175cSChristoph Hellwig out_invalid_cdb_field:
1483*d6e0175cSChristoph Hellwig 	cmd->se_cmd_flags |= SCF_SCSI_CDB_EXCEPTION;
1484*d6e0175cSChristoph Hellwig 	cmd->scsi_sense_reason = TCM_INVALID_CDB_FIELD;
1485*d6e0175cSChristoph Hellwig 	return -EINVAL;
1486*d6e0175cSChristoph Hellwig }
1487*d6e0175cSChristoph Hellwig 
1488*d6e0175cSChristoph Hellwig 
14895787cacdSChristoph Hellwig static int pscsi_execute_cmd(struct se_cmd *cmd, struct scatterlist *sgl,
14905787cacdSChristoph Hellwig 		u32 sgl_nents, enum dma_data_direction data_direction)
1491c66ac9dbSNicholas Bellinger {
14925787cacdSChristoph Hellwig 	struct pscsi_dev_virt *pdv = cmd->se_dev->dev_ptr;
14935787cacdSChristoph Hellwig 	struct pscsi_plugin_task *pt;
149402b1a746SChristoph Hellwig 	struct request *req;
149502b1a746SChristoph Hellwig 	struct bio *hbio;
1496c66ac9dbSNicholas Bellinger 	int ret;
1497c66ac9dbSNicholas Bellinger 
14985787cacdSChristoph Hellwig 	/*
14995787cacdSChristoph Hellwig 	 * Dynamically alloc cdb space, since it may be larger than
15005787cacdSChristoph Hellwig 	 * TCM_MAX_COMMAND_SIZE
15015787cacdSChristoph Hellwig 	 */
15025787cacdSChristoph Hellwig 	pt = kzalloc(sizeof(*pt) + scsi_command_size(cmd->t_task_cdb), GFP_KERNEL);
15035787cacdSChristoph Hellwig 	if (!pt) {
15045787cacdSChristoph Hellwig 		cmd->scsi_sense_reason = TCM_LOGICAL_UNIT_COMMUNICATION_FAILURE;
15055787cacdSChristoph Hellwig 		return -ENOMEM;
15065787cacdSChristoph Hellwig 	}
15075787cacdSChristoph Hellwig 	cmd->priv = pt;
15085787cacdSChristoph Hellwig 
1509ed3102c6SChristoph Hellwig 	memcpy(pt->pscsi_cdb, cmd->t_task_cdb,
1510ed3102c6SChristoph Hellwig 		scsi_command_size(cmd->t_task_cdb));
1511485fd0d1SChristoph Hellwig 
151264f1db38SChristoph Hellwig 	if (!sgl) {
151302b1a746SChristoph Hellwig 		req = blk_get_request(pdv->pdv_sd->request_queue,
15145787cacdSChristoph Hellwig 				(data_direction == DMA_TO_DEVICE),
151502b1a746SChristoph Hellwig 				GFP_KERNEL);
151602b1a746SChristoph Hellwig 		if (!req || IS_ERR(req)) {
151702b1a746SChristoph Hellwig 			pr_err("PSCSI: blk_get_request() failed: %ld\n",
151802b1a746SChristoph Hellwig 					req ? IS_ERR(req) : -ENOMEM);
151903e98c9eSNicholas Bellinger 			cmd->scsi_sense_reason =
152003e98c9eSNicholas Bellinger 				TCM_LOGICAL_UNIT_COMMUNICATION_FAILURE;
15215787cacdSChristoph Hellwig 			goto fail;
152202b1a746SChristoph Hellwig 		}
152302b1a746SChristoph Hellwig 	} else {
15247a83aa4eSChristoph Hellwig 		BUG_ON(!cmd->data_length);
152502b1a746SChristoph Hellwig 
15265787cacdSChristoph Hellwig 		ret = pscsi_map_sg(cmd, sgl, sgl_nents, data_direction, &hbio);
152703e98c9eSNicholas Bellinger 		if (ret < 0) {
152803e98c9eSNicholas Bellinger 			cmd->scsi_sense_reason =
152903e98c9eSNicholas Bellinger 				TCM_LOGICAL_UNIT_COMMUNICATION_FAILURE;
15305787cacdSChristoph Hellwig 			goto fail;
153103e98c9eSNicholas Bellinger 		}
1532c66ac9dbSNicholas Bellinger 
153302b1a746SChristoph Hellwig 		req = blk_make_request(pdv->pdv_sd->request_queue, hbio,
153402b1a746SChristoph Hellwig 				       GFP_KERNEL);
1535ed327ed3SDan Carpenter 		if (IS_ERR(req)) {
153602b1a746SChristoph Hellwig 			pr_err("pSCSI: blk_make_request() failed\n");
15375787cacdSChristoph Hellwig 			goto fail_free_bio;
153802b1a746SChristoph Hellwig 		}
153902b1a746SChristoph Hellwig 	}
154002b1a746SChristoph Hellwig 
154102b1a746SChristoph Hellwig 	req->cmd_type = REQ_TYPE_BLOCK_PC;
154202b1a746SChristoph Hellwig 	req->end_io = pscsi_req_done;
15435787cacdSChristoph Hellwig 	req->end_io_data = cmd;
154402b1a746SChristoph Hellwig 	req->cmd_len = scsi_command_size(pt->pscsi_cdb);
154502b1a746SChristoph Hellwig 	req->cmd = &pt->pscsi_cdb[0];
154602b1a746SChristoph Hellwig 	req->sense = &pt->pscsi_sense[0];
154702b1a746SChristoph Hellwig 	req->sense_len = 0;
154802b1a746SChristoph Hellwig 	if (pdv->pdv_sd->type == TYPE_DISK)
154902b1a746SChristoph Hellwig 		req->timeout = PS_TIMEOUT_DISK;
155002b1a746SChristoph Hellwig 	else
155102b1a746SChristoph Hellwig 		req->timeout = PS_TIMEOUT_OTHER;
155202b1a746SChristoph Hellwig 	req->retries = PS_RETRY;
155302b1a746SChristoph Hellwig 
155402b1a746SChristoph Hellwig 	blk_execute_rq_nowait(pdv->pdv_sd->request_queue, NULL, req,
15555787cacdSChristoph Hellwig 			(cmd->sam_task_attr == MSG_HEAD_TAG),
155602b1a746SChristoph Hellwig 			pscsi_req_done);
155702b1a746SChristoph Hellwig 
155803e98c9eSNicholas Bellinger 	return 0;
155902b1a746SChristoph Hellwig 
15605787cacdSChristoph Hellwig fail_free_bio:
156102b1a746SChristoph Hellwig 	while (hbio) {
156202b1a746SChristoph Hellwig 		struct bio *bio = hbio;
156302b1a746SChristoph Hellwig 		hbio = hbio->bi_next;
156402b1a746SChristoph Hellwig 		bio->bi_next = NULL;
156502b1a746SChristoph Hellwig 		bio_endio(bio, 0);	/* XXX: should be error */
156602b1a746SChristoph Hellwig 	}
156703e98c9eSNicholas Bellinger 	cmd->scsi_sense_reason = TCM_LOGICAL_UNIT_COMMUNICATION_FAILURE;
15685787cacdSChristoph Hellwig fail:
15695787cacdSChristoph Hellwig 	kfree(pt);
157003e98c9eSNicholas Bellinger 	return -ENOMEM;
157102b1a746SChristoph Hellwig }
157202b1a746SChristoph Hellwig 
15735787cacdSChristoph Hellwig static unsigned char *pscsi_get_sense_buffer(struct se_cmd *cmd)
1574c66ac9dbSNicholas Bellinger {
15755787cacdSChristoph Hellwig 	struct pscsi_plugin_task *pt = cmd->priv;
1576c66ac9dbSNicholas Bellinger 
15778359cf43SJörn Engel 	return pt->pscsi_sense;
1578c66ac9dbSNicholas Bellinger }
1579c66ac9dbSNicholas Bellinger 
1580c66ac9dbSNicholas Bellinger /*	pscsi_get_device_rev():
1581c66ac9dbSNicholas Bellinger  *
1582c66ac9dbSNicholas Bellinger  *
1583c66ac9dbSNicholas Bellinger  */
1584c66ac9dbSNicholas Bellinger static u32 pscsi_get_device_rev(struct se_device *dev)
1585c66ac9dbSNicholas Bellinger {
1586c66ac9dbSNicholas Bellinger 	struct pscsi_dev_virt *pdv = dev->dev_ptr;
1587c66ac9dbSNicholas Bellinger 	struct scsi_device *sd = pdv->pdv_sd;
1588c66ac9dbSNicholas Bellinger 
1589c66ac9dbSNicholas Bellinger 	return (sd->scsi_level - 1) ? sd->scsi_level - 1 : 1;
1590c66ac9dbSNicholas Bellinger }
1591c66ac9dbSNicholas Bellinger 
1592c66ac9dbSNicholas Bellinger /*	pscsi_get_device_type():
1593c66ac9dbSNicholas Bellinger  *
1594c66ac9dbSNicholas Bellinger  *
1595c66ac9dbSNicholas Bellinger  */
1596c66ac9dbSNicholas Bellinger static u32 pscsi_get_device_type(struct se_device *dev)
1597c66ac9dbSNicholas Bellinger {
1598c66ac9dbSNicholas Bellinger 	struct pscsi_dev_virt *pdv = dev->dev_ptr;
1599c66ac9dbSNicholas Bellinger 	struct scsi_device *sd = pdv->pdv_sd;
1600c66ac9dbSNicholas Bellinger 
1601c66ac9dbSNicholas Bellinger 	return sd->type;
1602c66ac9dbSNicholas Bellinger }
1603c66ac9dbSNicholas Bellinger 
1604c66ac9dbSNicholas Bellinger static sector_t pscsi_get_blocks(struct se_device *dev)
1605c66ac9dbSNicholas Bellinger {
1606c66ac9dbSNicholas Bellinger 	struct pscsi_dev_virt *pdv = dev->dev_ptr;
1607c66ac9dbSNicholas Bellinger 
1608c66ac9dbSNicholas Bellinger 	if (pdv->pdv_bd && pdv->pdv_bd->bd_part)
1609c66ac9dbSNicholas Bellinger 		return pdv->pdv_bd->bd_part->nr_sects;
1610c66ac9dbSNicholas Bellinger 
1611c66ac9dbSNicholas Bellinger 	dump_stack();
1612c66ac9dbSNicholas Bellinger 	return 0;
1613c66ac9dbSNicholas Bellinger }
1614c66ac9dbSNicholas Bellinger 
16155787cacdSChristoph Hellwig static void pscsi_req_done(struct request *req, int uptodate)
1616c66ac9dbSNicholas Bellinger {
16175787cacdSChristoph Hellwig 	struct se_cmd *cmd = req->end_io_data;
16185787cacdSChristoph Hellwig 	struct pscsi_plugin_task *pt = cmd->priv;
16195787cacdSChristoph Hellwig 
16205787cacdSChristoph Hellwig 	pt->pscsi_result = req->errors;
16215787cacdSChristoph Hellwig 	pt->pscsi_resid = req->resid_len;
16225787cacdSChristoph Hellwig 
16235787cacdSChristoph Hellwig 	cmd->scsi_status = status_byte(pt->pscsi_result) << 1;
16245787cacdSChristoph Hellwig 	if (cmd->scsi_status) {
16255787cacdSChristoph Hellwig 		pr_debug("PSCSI Status Byte exception at cmd: %p CDB:"
16265787cacdSChristoph Hellwig 			" 0x%02x Result: 0x%08x\n", cmd, pt->pscsi_cdb[0],
1627c66ac9dbSNicholas Bellinger 			pt->pscsi_result);
1628c66ac9dbSNicholas Bellinger 	}
1629c66ac9dbSNicholas Bellinger 
1630c66ac9dbSNicholas Bellinger 	switch (host_byte(pt->pscsi_result)) {
1631c66ac9dbSNicholas Bellinger 	case DID_OK:
16325787cacdSChristoph Hellwig 		target_complete_cmd(cmd, cmd->scsi_status);
1633c66ac9dbSNicholas Bellinger 		break;
1634c66ac9dbSNicholas Bellinger 	default:
16355787cacdSChristoph Hellwig 		pr_debug("PSCSI Host Byte exception at cmd: %p CDB:"
16365787cacdSChristoph Hellwig 			" 0x%02x Result: 0x%08x\n", cmd, pt->pscsi_cdb[0],
1637c66ac9dbSNicholas Bellinger 			pt->pscsi_result);
16385787cacdSChristoph Hellwig 		cmd->scsi_sense_reason = TCM_UNSUPPORTED_SCSI_OPCODE;
16395787cacdSChristoph Hellwig 		target_complete_cmd(cmd, SAM_STAT_CHECK_CONDITION);
1640c66ac9dbSNicholas Bellinger 		break;
1641c66ac9dbSNicholas Bellinger 	}
1642c66ac9dbSNicholas Bellinger 
1643c66ac9dbSNicholas Bellinger 	__blk_put_request(req->q, req);
16445787cacdSChristoph Hellwig 	kfree(pt);
1645c66ac9dbSNicholas Bellinger }
1646c66ac9dbSNicholas Bellinger 
1647c66ac9dbSNicholas Bellinger static struct se_subsystem_api pscsi_template = {
1648c66ac9dbSNicholas Bellinger 	.name			= "pscsi",
1649c66ac9dbSNicholas Bellinger 	.owner			= THIS_MODULE,
1650c66ac9dbSNicholas Bellinger 	.transport_type		= TRANSPORT_PLUGIN_PHBA_PDEV,
1651c66ac9dbSNicholas Bellinger 	.attach_hba		= pscsi_attach_hba,
1652c66ac9dbSNicholas Bellinger 	.detach_hba		= pscsi_detach_hba,
1653c66ac9dbSNicholas Bellinger 	.pmode_enable_hba	= pscsi_pmode_enable_hba,
1654c66ac9dbSNicholas Bellinger 	.allocate_virtdevice	= pscsi_allocate_virtdevice,
1655c66ac9dbSNicholas Bellinger 	.create_virtdevice	= pscsi_create_virtdevice,
1656c66ac9dbSNicholas Bellinger 	.free_device		= pscsi_free_device,
1657c66ac9dbSNicholas Bellinger 	.transport_complete	= pscsi_transport_complete,
1658*d6e0175cSChristoph Hellwig 	.parse_cdb		= pscsi_parse_cdb,
16595787cacdSChristoph Hellwig 	.execute_cmd		= pscsi_execute_cmd,
1660c66ac9dbSNicholas Bellinger 	.check_configfs_dev_params = pscsi_check_configfs_dev_params,
1661c66ac9dbSNicholas Bellinger 	.set_configfs_dev_params = pscsi_set_configfs_dev_params,
1662c66ac9dbSNicholas Bellinger 	.show_configfs_dev_params = pscsi_show_configfs_dev_params,
1663c66ac9dbSNicholas Bellinger 	.get_sense_buffer	= pscsi_get_sense_buffer,
1664c66ac9dbSNicholas Bellinger 	.get_device_rev		= pscsi_get_device_rev,
1665c66ac9dbSNicholas Bellinger 	.get_device_type	= pscsi_get_device_type,
1666c66ac9dbSNicholas Bellinger 	.get_blocks		= pscsi_get_blocks,
1667c66ac9dbSNicholas Bellinger };
1668c66ac9dbSNicholas Bellinger 
1669c66ac9dbSNicholas Bellinger static int __init pscsi_module_init(void)
1670c66ac9dbSNicholas Bellinger {
1671c66ac9dbSNicholas Bellinger 	return transport_subsystem_register(&pscsi_template);
1672c66ac9dbSNicholas Bellinger }
1673c66ac9dbSNicholas Bellinger 
1674c66ac9dbSNicholas Bellinger static void pscsi_module_exit(void)
1675c66ac9dbSNicholas Bellinger {
1676c66ac9dbSNicholas Bellinger 	transport_subsystem_release(&pscsi_template);
1677c66ac9dbSNicholas Bellinger }
1678c66ac9dbSNicholas Bellinger 
1679c66ac9dbSNicholas Bellinger MODULE_DESCRIPTION("TCM PSCSI subsystem plugin");
1680c66ac9dbSNicholas Bellinger MODULE_AUTHOR("nab@Linux-iSCSI.org");
1681c66ac9dbSNicholas Bellinger MODULE_LICENSE("GPL");
1682c66ac9dbSNicholas Bellinger 
1683c66ac9dbSNicholas Bellinger module_init(pscsi_module_init);
1684c66ac9dbSNicholas Bellinger module_exit(pscsi_module_exit);
1685