44a79a5c6d32d77abf45e530d47dd08cf7fc9526
[platform/adaptation/renesas_rcar/renesas_kernel.git] / drivers / target / target_core_pscsi.c
1 /*******************************************************************************
2  * Filename:  target_core_pscsi.c
3  *
4  * This file contains the generic target mode <-> Linux SCSI subsystem plugin.
5  *
6  * Copyright (c) 2003, 2004, 2005 PyX Technologies, Inc.
7  * Copyright (c) 2005, 2006, 2007 SBE, Inc.
8  * Copyright (c) 2007-2010 Rising Tide Systems
9  * Copyright (c) 2008-2010 Linux-iSCSI.org
10  *
11  * Nicholas A. Bellinger <nab@kernel.org>
12  *
13  * This program is free software; you can redistribute it and/or modify
14  * it under the terms of the GNU General Public License as published by
15  * the Free Software Foundation; either version 2 of the License, or
16  * (at your option) any later version.
17  *
18  * This program is distributed in the hope that it will be useful,
19  * but WITHOUT ANY WARRANTY; without even the implied warranty of
20  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
21  * GNU General Public License for more details.
22  *
23  * You should have received a copy of the GNU General Public License
24  * along with this program; if not, write to the Free Software
25  * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
26  *
27  ******************************************************************************/
28
29 #include <linux/version.h>
30 #include <linux/string.h>
31 #include <linux/parser.h>
32 #include <linux/timer.h>
33 #include <linux/blkdev.h>
34 #include <linux/blk_types.h>
35 #include <linux/slab.h>
36 #include <linux/spinlock.h>
37 #include <linux/genhd.h>
38 #include <linux/cdrom.h>
39 #include <linux/file.h>
40 #include <scsi/scsi.h>
41 #include <scsi/scsi_device.h>
42 #include <scsi/scsi_cmnd.h>
43 #include <scsi/scsi_host.h>
44 #include <scsi/scsi_tcq.h>
45
46 #include <target/target_core_base.h>
47 #include <target/target_core_device.h>
48 #include <target/target_core_transport.h>
49
50 #include "target_core_pscsi.h"
51
52 #define ISPRINT(a)  ((a >= ' ') && (a <= '~'))
53
54 static struct se_subsystem_api pscsi_template;
55
56 static void pscsi_req_done(struct request *, int);
57
58 /*      pscsi_attach_hba():
59  *
60  *      pscsi_get_sh() used scsi_host_lookup() to locate struct Scsi_Host.
61  *      from the passed SCSI Host ID.
62  */
63 static int pscsi_attach_hba(struct se_hba *hba, u32 host_id)
64 {
65         struct pscsi_hba_virt *phv;
66
67         phv = kzalloc(sizeof(struct pscsi_hba_virt), GFP_KERNEL);
68         if (!(phv)) {
69                 printk(KERN_ERR "Unable to allocate struct pscsi_hba_virt\n");
70                 return -ENOMEM;
71         }
72         phv->phv_host_id = host_id;
73         phv->phv_mode = PHV_VIRUTAL_HOST_ID;
74
75         hba->hba_ptr = (void *)phv;
76
77         printk(KERN_INFO "CORE_HBA[%d] - TCM SCSI HBA Driver %s on"
78                 " Generic Target Core Stack %s\n", hba->hba_id,
79                 PSCSI_VERSION, TARGET_CORE_MOD_VERSION);
80         printk(KERN_INFO "CORE_HBA[%d] - Attached SCSI HBA to Generic\n",
81                hba->hba_id);
82
83         return 0;
84 }
85
86 static void pscsi_detach_hba(struct se_hba *hba)
87 {
88         struct pscsi_hba_virt *phv = hba->hba_ptr;
89         struct Scsi_Host *scsi_host = phv->phv_lld_host;
90
91         if (scsi_host) {
92                 scsi_host_put(scsi_host);
93
94                 printk(KERN_INFO "CORE_HBA[%d] - Detached SCSI HBA: %s from"
95                         " Generic Target Core\n", hba->hba_id,
96                         (scsi_host->hostt->name) ? (scsi_host->hostt->name) :
97                         "Unknown");
98         } else
99                 printk(KERN_INFO "CORE_HBA[%d] - Detached Virtual SCSI HBA"
100                         " from Generic Target Core\n", hba->hba_id);
101
102         kfree(phv);
103         hba->hba_ptr = NULL;
104 }
105
106 static int pscsi_pmode_enable_hba(struct se_hba *hba, unsigned long mode_flag)
107 {
108         struct pscsi_hba_virt *phv = (struct pscsi_hba_virt *)hba->hba_ptr;
109         struct Scsi_Host *sh = phv->phv_lld_host;
110         /*
111          * Release the struct Scsi_Host
112          */
113         if (!(mode_flag)) {
114                 if (!(sh))
115                         return 0;
116
117                 phv->phv_lld_host = NULL;
118                 phv->phv_mode = PHV_VIRUTAL_HOST_ID;
119
120                 printk(KERN_INFO "CORE_HBA[%d] - Disabled pSCSI HBA Passthrough"
121                         " %s\n", hba->hba_id, (sh->hostt->name) ?
122                         (sh->hostt->name) : "Unknown");
123
124                 scsi_host_put(sh);
125                 return 0;
126         }
127         /*
128          * Otherwise, locate struct Scsi_Host from the original passed
129          * pSCSI Host ID and enable for phba mode
130          */
131         sh = scsi_host_lookup(phv->phv_host_id);
132         if (IS_ERR(sh)) {
133                 printk(KERN_ERR "pSCSI: Unable to locate SCSI Host for"
134                         " phv_host_id: %d\n", phv->phv_host_id);
135                 return PTR_ERR(sh);
136         }
137
138         phv->phv_lld_host = sh;
139         phv->phv_mode = PHV_LLD_SCSI_HOST_NO;
140
141         printk(KERN_INFO "CORE_HBA[%d] - Enabled pSCSI HBA Passthrough %s\n",
142                 hba->hba_id, (sh->hostt->name) ? (sh->hostt->name) : "Unknown");
143
144         return 1;
145 }
146
147 static void pscsi_tape_read_blocksize(struct se_device *dev,
148                 struct scsi_device *sdev)
149 {
150         unsigned char cdb[MAX_COMMAND_SIZE], *buf;
151         int ret;
152
153         buf = kzalloc(12, GFP_KERNEL);
154         if (!buf)
155                 return;
156
157         memset(cdb, 0, MAX_COMMAND_SIZE);
158         cdb[0] = MODE_SENSE;
159         cdb[4] = 0x0c; /* 12 bytes */
160
161         ret = scsi_execute_req(sdev, cdb, DMA_FROM_DEVICE, buf, 12, NULL,
162                         HZ, 1, NULL);
163         if (ret)
164                 goto out_free;
165
166         /*
167          * If MODE_SENSE still returns zero, set the default value to 1024.
168          */
169         sdev->sector_size = (buf[9] << 16) | (buf[10] << 8) | (buf[11]);
170         if (!sdev->sector_size)
171                 sdev->sector_size = 1024;
172 out_free:
173         kfree(buf);
174 }
175
176 static void
177 pscsi_set_inquiry_info(struct scsi_device *sdev, struct t10_wwn *wwn)
178 {
179         unsigned char *buf;
180
181         if (sdev->inquiry_len < INQUIRY_LEN)
182                 return;
183
184         buf = sdev->inquiry;
185         if (!buf)
186                 return;
187         /*
188          * Use sdev->inquiry from drivers/scsi/scsi_scan.c:scsi_alloc_sdev()
189          */
190         memcpy(&wwn->vendor[0], &buf[8], sizeof(wwn->vendor));
191         memcpy(&wwn->model[0], &buf[16], sizeof(wwn->model));
192         memcpy(&wwn->revision[0], &buf[32], sizeof(wwn->revision));
193 }
194
195 static int
196 pscsi_get_inquiry_vpd_serial(struct scsi_device *sdev, struct t10_wwn *wwn)
197 {
198         unsigned char cdb[MAX_COMMAND_SIZE], *buf;
199         int ret;
200
201         buf = kzalloc(INQUIRY_VPD_SERIAL_LEN, GFP_KERNEL);
202         if (!buf)
203                 return -ENOMEM;
204
205         memset(cdb, 0, MAX_COMMAND_SIZE);
206         cdb[0] = INQUIRY;
207         cdb[1] = 0x01; /* Query VPD */
208         cdb[2] = 0x80; /* Unit Serial Number */
209         cdb[3] = (INQUIRY_VPD_SERIAL_LEN >> 8) & 0xff;
210         cdb[4] = (INQUIRY_VPD_SERIAL_LEN & 0xff);
211
212         ret = scsi_execute_req(sdev, cdb, DMA_FROM_DEVICE, buf,
213                               INQUIRY_VPD_SERIAL_LEN, NULL, HZ, 1, NULL);
214         if (ret)
215                 goto out_free;
216
217         snprintf(&wwn->unit_serial[0], INQUIRY_VPD_SERIAL_LEN, "%s", &buf[4]);
218
219         wwn->t10_sub_dev->su_dev_flags |= SDF_FIRMWARE_VPD_UNIT_SERIAL;
220
221         kfree(buf);
222         return 0;
223
224 out_free:
225         kfree(buf);
226         return -EPERM;
227 }
228
229 static void
230 pscsi_get_inquiry_vpd_device_ident(struct scsi_device *sdev,
231                 struct t10_wwn *wwn)
232 {
233         unsigned char cdb[MAX_COMMAND_SIZE], *buf, *page_83;
234         int ident_len, page_len, off = 4, ret;
235         struct t10_vpd *vpd;
236
237         buf = kzalloc(INQUIRY_VPD_SERIAL_LEN, GFP_KERNEL);
238         if (!buf)
239                 return;
240
241         memset(cdb, 0, MAX_COMMAND_SIZE);
242         cdb[0] = INQUIRY;
243         cdb[1] = 0x01; /* Query VPD */
244         cdb[2] = 0x83; /* Device Identifier */
245         cdb[3] = (INQUIRY_VPD_DEVICE_IDENTIFIER_LEN >> 8) & 0xff;
246         cdb[4] = (INQUIRY_VPD_DEVICE_IDENTIFIER_LEN & 0xff);
247
248         ret = scsi_execute_req(sdev, cdb, DMA_FROM_DEVICE, buf,
249                               INQUIRY_VPD_DEVICE_IDENTIFIER_LEN,
250                               NULL, HZ, 1, NULL);
251         if (ret)
252                 goto out;
253
254         page_len = (buf[2] << 8) | buf[3];
255         while (page_len > 0) {
256                 /* Grab a pointer to the Identification descriptor */
257                 page_83 = &buf[off];
258                 ident_len = page_83[3];
259                 if (!ident_len) {
260                         printk(KERN_ERR "page_83[3]: identifier"
261                                         " length zero!\n");
262                         break;
263                 }
264                 printk(KERN_INFO "T10 VPD Identifer Length: %d\n", ident_len);
265
266                 vpd = kzalloc(sizeof(struct t10_vpd), GFP_KERNEL);
267                 if (!vpd) {
268                         printk(KERN_ERR "Unable to allocate memory for"
269                                         " struct t10_vpd\n");
270                         goto out;
271                 }
272                 INIT_LIST_HEAD(&vpd->vpd_list);
273
274                 transport_set_vpd_proto_id(vpd, page_83);
275                 transport_set_vpd_assoc(vpd, page_83);
276
277                 if (transport_set_vpd_ident_type(vpd, page_83) < 0) {
278                         off += (ident_len + 4);
279                         page_len -= (ident_len + 4);
280                         kfree(vpd);
281                         continue;
282                 }
283                 if (transport_set_vpd_ident(vpd, page_83) < 0) {
284                         off += (ident_len + 4);
285                         page_len -= (ident_len + 4);
286                         kfree(vpd);
287                         continue;
288                 }
289
290                 list_add_tail(&vpd->vpd_list, &wwn->t10_vpd_list);
291                 off += (ident_len + 4);
292                 page_len -= (ident_len + 4);
293         }
294
295 out:
296         kfree(buf);
297 }
298
299 /*      pscsi_add_device_to_list():
300  *
301  *
302  */
303 static struct se_device *pscsi_add_device_to_list(
304         struct se_hba *hba,
305         struct se_subsystem_dev *se_dev,
306         struct pscsi_dev_virt *pdv,
307         struct scsi_device *sd,
308         int dev_flags)
309 {
310         struct se_device *dev;
311         struct se_dev_limits dev_limits;
312         struct request_queue *q;
313         struct queue_limits *limits;
314
315         memset(&dev_limits, 0, sizeof(struct se_dev_limits));
316
317         if (!sd->queue_depth) {
318                 sd->queue_depth = PSCSI_DEFAULT_QUEUEDEPTH;
319
320                 printk(KERN_ERR "Set broken SCSI Device %d:%d:%d"
321                         " queue_depth to %d\n", sd->channel, sd->id,
322                                 sd->lun, sd->queue_depth);
323         }
324         /*
325          * Setup the local scope queue_limits from struct request_queue->limits
326          * to pass into transport_add_device_to_core_hba() as struct se_dev_limits.
327          */
328         q = sd->request_queue;
329         limits = &dev_limits.limits;
330         limits->logical_block_size = sd->sector_size;
331         limits->max_hw_sectors = (sd->host->max_sectors > queue_max_hw_sectors(q)) ?
332                                   queue_max_hw_sectors(q) : sd->host->max_sectors;
333         limits->max_sectors = (sd->host->max_sectors > queue_max_sectors(q)) ?
334                                   queue_max_sectors(q) : sd->host->max_sectors;
335         dev_limits.hw_queue_depth = sd->queue_depth;
336         dev_limits.queue_depth = sd->queue_depth;
337         /*
338          * Setup our standard INQUIRY info into se_dev->t10_wwn
339          */
340         pscsi_set_inquiry_info(sd, &se_dev->t10_wwn);
341
342         /*
343          * Set the pointer pdv->pdv_sd to from passed struct scsi_device,
344          * which has already been referenced with Linux SCSI code with
345          * scsi_device_get() in this file's pscsi_create_virtdevice().
346          *
347          * The passthrough operations called by the transport_add_device_*
348          * function below will require this pointer to be set for passthroug
349          *  ops.
350          *
351          * For the shutdown case in pscsi_free_device(), this struct
352          * scsi_device  reference is released with Linux SCSI code
353          * scsi_device_put() and the pdv->pdv_sd cleared.
354          */
355         pdv->pdv_sd = sd;
356
357         dev = transport_add_device_to_core_hba(hba, &pscsi_template,
358                                 se_dev, dev_flags, (void *)pdv,
359                                 &dev_limits, NULL, NULL);
360         if (!(dev)) {
361                 pdv->pdv_sd = NULL;
362                 return NULL;
363         }
364
365         /*
366          * Locate VPD WWN Information used for various purposes within
367          * the Storage Engine.
368          */
369         if (!pscsi_get_inquiry_vpd_serial(sd, &se_dev->t10_wwn)) {
370                 /*
371                  * If VPD Unit Serial returned GOOD status, try
372                  * VPD Device Identification page (0x83).
373                  */
374                 pscsi_get_inquiry_vpd_device_ident(sd, &se_dev->t10_wwn);
375         }
376
377         /*
378          * For TYPE_TAPE, attempt to determine blocksize with MODE_SENSE.
379          */
380         if (sd->type == TYPE_TAPE)
381                 pscsi_tape_read_blocksize(dev, sd);
382         return dev;
383 }
384
385 static void *pscsi_allocate_virtdevice(struct se_hba *hba, const char *name)
386 {
387         struct pscsi_dev_virt *pdv;
388
389         pdv = kzalloc(sizeof(struct pscsi_dev_virt), GFP_KERNEL);
390         if (!(pdv)) {
391                 printk(KERN_ERR "Unable to allocate memory for struct pscsi_dev_virt\n");
392                 return NULL;
393         }
394         pdv->pdv_se_hba = hba;
395
396         printk(KERN_INFO "PSCSI: Allocated pdv: %p for %s\n", pdv, name);
397         return (void *)pdv;
398 }
399
400 /*
401  * Called with struct Scsi_Host->host_lock called.
402  */
403 static struct se_device *pscsi_create_type_disk(
404         struct scsi_device *sd,
405         struct pscsi_dev_virt *pdv,
406         struct se_subsystem_dev *se_dev,
407         struct se_hba *hba)
408         __releases(sh->host_lock)
409 {
410         struct se_device *dev;
411         struct pscsi_hba_virt *phv = (struct pscsi_hba_virt *)pdv->pdv_se_hba->hba_ptr;
412         struct Scsi_Host *sh = sd->host;
413         struct block_device *bd;
414         u32 dev_flags = 0;
415
416         if (scsi_device_get(sd)) {
417                 printk(KERN_ERR "scsi_device_get() failed for %d:%d:%d:%d\n",
418                         sh->host_no, sd->channel, sd->id, sd->lun);
419                 spin_unlock_irq(sh->host_lock);
420                 return NULL;
421         }
422         spin_unlock_irq(sh->host_lock);
423         /*
424          * Claim exclusive struct block_device access to struct scsi_device
425          * for TYPE_DISK using supplied udev_path
426          */
427         bd = blkdev_get_by_path(se_dev->se_dev_udev_path,
428                                 FMODE_WRITE|FMODE_READ|FMODE_EXCL, pdv);
429         if (IS_ERR(bd)) {
430                 printk(KERN_ERR "pSCSI: blkdev_get_by_path() failed\n");
431                 scsi_device_put(sd);
432                 return NULL;
433         }
434         pdv->pdv_bd = bd;
435
436         dev = pscsi_add_device_to_list(hba, se_dev, pdv, sd, dev_flags);
437         if (!(dev)) {
438                 blkdev_put(pdv->pdv_bd, FMODE_WRITE|FMODE_READ|FMODE_EXCL);
439                 scsi_device_put(sd);
440                 return NULL;
441         }
442         printk(KERN_INFO "CORE_PSCSI[%d] - Added TYPE_DISK for %d:%d:%d:%d\n",
443                 phv->phv_host_id, sh->host_no, sd->channel, sd->id, sd->lun);
444
445         return dev;
446 }
447
448 /*
449  * Called with struct Scsi_Host->host_lock called.
450  */
451 static struct se_device *pscsi_create_type_rom(
452         struct scsi_device *sd,
453         struct pscsi_dev_virt *pdv,
454         struct se_subsystem_dev *se_dev,
455         struct se_hba *hba)
456         __releases(sh->host_lock)
457 {
458         struct se_device *dev;
459         struct pscsi_hba_virt *phv = (struct pscsi_hba_virt *)pdv->pdv_se_hba->hba_ptr;
460         struct Scsi_Host *sh = sd->host;
461         u32 dev_flags = 0;
462
463         if (scsi_device_get(sd)) {
464                 printk(KERN_ERR "scsi_device_get() failed for %d:%d:%d:%d\n",
465                         sh->host_no, sd->channel, sd->id, sd->lun);
466                 spin_unlock_irq(sh->host_lock);
467                 return NULL;
468         }
469         spin_unlock_irq(sh->host_lock);
470
471         dev = pscsi_add_device_to_list(hba, se_dev, pdv, sd, dev_flags);
472         if (!(dev)) {
473                 scsi_device_put(sd);
474                 return NULL;
475         }
476         printk(KERN_INFO "CORE_PSCSI[%d] - Added Type: %s for %d:%d:%d:%d\n",
477                 phv->phv_host_id, scsi_device_type(sd->type), sh->host_no,
478                 sd->channel, sd->id, sd->lun);
479
480         return dev;
481 }
482
483 /*
484  *Called with struct Scsi_Host->host_lock called.
485  */
486 static struct se_device *pscsi_create_type_other(
487         struct scsi_device *sd,
488         struct pscsi_dev_virt *pdv,
489         struct se_subsystem_dev *se_dev,
490         struct se_hba *hba)
491         __releases(sh->host_lock)
492 {
493         struct se_device *dev;
494         struct pscsi_hba_virt *phv = (struct pscsi_hba_virt *)pdv->pdv_se_hba->hba_ptr;
495         struct Scsi_Host *sh = sd->host;
496         u32 dev_flags = 0;
497
498         spin_unlock_irq(sh->host_lock);
499         dev = pscsi_add_device_to_list(hba, se_dev, pdv, sd, dev_flags);
500         if (!(dev))
501                 return NULL;
502
503         printk(KERN_INFO "CORE_PSCSI[%d] - Added Type: %s for %d:%d:%d:%d\n",
504                 phv->phv_host_id, scsi_device_type(sd->type), sh->host_no,
505                 sd->channel, sd->id, sd->lun);
506
507         return dev;
508 }
509
510 static struct se_device *pscsi_create_virtdevice(
511         struct se_hba *hba,
512         struct se_subsystem_dev *se_dev,
513         void *p)
514 {
515         struct pscsi_dev_virt *pdv = (struct pscsi_dev_virt *)p;
516         struct se_device *dev;
517         struct scsi_device *sd;
518         struct pscsi_hba_virt *phv = (struct pscsi_hba_virt *)hba->hba_ptr;
519         struct Scsi_Host *sh = phv->phv_lld_host;
520         int legacy_mode_enable = 0;
521
522         if (!(pdv)) {
523                 printk(KERN_ERR "Unable to locate struct pscsi_dev_virt"
524                                 " parameter\n");
525                 return ERR_PTR(-EINVAL);
526         }
527         /*
528          * If not running in PHV_LLD_SCSI_HOST_NO mode, locate the
529          * struct Scsi_Host we will need to bring the TCM/pSCSI object online
530          */
531         if (!(sh)) {
532                 if (phv->phv_mode == PHV_LLD_SCSI_HOST_NO) {
533                         printk(KERN_ERR "pSCSI: Unable to locate struct"
534                                 " Scsi_Host for PHV_LLD_SCSI_HOST_NO\n");
535                         return ERR_PTR(-ENODEV);
536                 }
537                 /*
538                  * For the newer PHV_VIRUTAL_HOST_ID struct scsi_device
539                  * reference, we enforce that udev_path has been set
540                  */
541                 if (!(se_dev->su_dev_flags & SDF_USING_UDEV_PATH)) {
542                         printk(KERN_ERR "pSCSI: udev_path attribute has not"
543                                 " been set before ENABLE=1\n");
544                         return ERR_PTR(-EINVAL);
545                 }
546                 /*
547                  * If no scsi_host_id= was passed for PHV_VIRUTAL_HOST_ID,
548                  * use the original TCM hba ID to reference Linux/SCSI Host No
549                  * and enable for PHV_LLD_SCSI_HOST_NO mode.
550                  */
551                 if (!(pdv->pdv_flags & PDF_HAS_VIRT_HOST_ID)) {
552                         spin_lock(&hba->device_lock);
553                         if (!(list_empty(&hba->hba_dev_list))) {
554                                 printk(KERN_ERR "pSCSI: Unable to set hba_mode"
555                                         " with active devices\n");
556                                 spin_unlock(&hba->device_lock);
557                                 return ERR_PTR(-EEXIST);
558                         }
559                         spin_unlock(&hba->device_lock);
560
561                         if (pscsi_pmode_enable_hba(hba, 1) != 1)
562                                 return ERR_PTR(-ENODEV);
563
564                         legacy_mode_enable = 1;
565                         hba->hba_flags |= HBA_FLAGS_PSCSI_MODE;
566                         sh = phv->phv_lld_host;
567                 } else {
568                         sh = scsi_host_lookup(pdv->pdv_host_id);
569                         if (IS_ERR(sh)) {
570                                 printk(KERN_ERR "pSCSI: Unable to locate"
571                                         " pdv_host_id: %d\n", pdv->pdv_host_id);
572                                 return (struct se_device *) sh;
573                         }
574                 }
575         } else {
576                 if (phv->phv_mode == PHV_VIRUTAL_HOST_ID) {
577                         printk(KERN_ERR "pSCSI: PHV_VIRUTAL_HOST_ID set while"
578                                 " struct Scsi_Host exists\n");
579                         return ERR_PTR(-EEXIST);
580                 }
581         }
582
583         spin_lock_irq(sh->host_lock);
584         list_for_each_entry(sd, &sh->__devices, siblings) {
585                 if ((pdv->pdv_channel_id != sd->channel) ||
586                     (pdv->pdv_target_id != sd->id) ||
587                     (pdv->pdv_lun_id != sd->lun))
588                         continue;
589                 /*
590                  * Functions will release the held struct scsi_host->host_lock
591                  * before calling calling pscsi_add_device_to_list() to register
592                  * struct scsi_device with target_core_mod.
593                  */
594                 switch (sd->type) {
595                 case TYPE_DISK:
596                         dev = pscsi_create_type_disk(sd, pdv, se_dev, hba);
597                         break;
598                 case TYPE_ROM:
599                         dev = pscsi_create_type_rom(sd, pdv, se_dev, hba);
600                         break;
601                 default:
602                         dev = pscsi_create_type_other(sd, pdv, se_dev, hba);
603                         break;
604                 }
605
606                 if (!(dev)) {
607                         if (phv->phv_mode == PHV_VIRUTAL_HOST_ID)
608                                 scsi_host_put(sh);
609                         else if (legacy_mode_enable) {
610                                 pscsi_pmode_enable_hba(hba, 0);
611                                 hba->hba_flags &= ~HBA_FLAGS_PSCSI_MODE;
612                         }
613                         pdv->pdv_sd = NULL;
614                         return ERR_PTR(-ENODEV);
615                 }
616                 return dev;
617         }
618         spin_unlock_irq(sh->host_lock);
619
620         printk(KERN_ERR "pSCSI: Unable to locate %d:%d:%d:%d\n", sh->host_no,
621                 pdv->pdv_channel_id,  pdv->pdv_target_id, pdv->pdv_lun_id);
622
623         if (phv->phv_mode == PHV_VIRUTAL_HOST_ID)
624                 scsi_host_put(sh);
625         else if (legacy_mode_enable) {
626                 pscsi_pmode_enable_hba(hba, 0);
627                 hba->hba_flags &= ~HBA_FLAGS_PSCSI_MODE;
628         }
629
630         return ERR_PTR(-ENODEV);
631 }
632
633 /*      pscsi_free_device(): (Part of se_subsystem_api_t template)
634  *
635  *
636  */
637 static void pscsi_free_device(void *p)
638 {
639         struct pscsi_dev_virt *pdv = p;
640         struct pscsi_hba_virt *phv = pdv->pdv_se_hba->hba_ptr;
641         struct scsi_device *sd = pdv->pdv_sd;
642
643         if (sd) {
644                 /*
645                  * Release exclusive pSCSI internal struct block_device claim for
646                  * struct scsi_device with TYPE_DISK from pscsi_create_type_disk()
647                  */
648                 if ((sd->type == TYPE_DISK) && pdv->pdv_bd) {
649                         blkdev_put(pdv->pdv_bd,
650                                    FMODE_WRITE|FMODE_READ|FMODE_EXCL);
651                         pdv->pdv_bd = NULL;
652                 }
653                 /*
654                  * For HBA mode PHV_LLD_SCSI_HOST_NO, release the reference
655                  * to struct Scsi_Host now.
656                  */
657                 if ((phv->phv_mode == PHV_LLD_SCSI_HOST_NO) &&
658                     (phv->phv_lld_host != NULL))
659                         scsi_host_put(phv->phv_lld_host);
660
661                 if ((sd->type == TYPE_DISK) || (sd->type == TYPE_ROM))
662                         scsi_device_put(sd);
663
664                 pdv->pdv_sd = NULL;
665         }
666
667         kfree(pdv);
668 }
669
670 static inline struct pscsi_plugin_task *PSCSI_TASK(struct se_task *task)
671 {
672         return container_of(task, struct pscsi_plugin_task, pscsi_task);
673 }
674
675
676 /*      pscsi_transport_complete():
677  *
678  *
679  */
680 static int pscsi_transport_complete(struct se_task *task)
681 {
682         struct pscsi_dev_virt *pdv = task->se_dev->dev_ptr;
683         struct scsi_device *sd = pdv->pdv_sd;
684         int result;
685         struct pscsi_plugin_task *pt = PSCSI_TASK(task);
686         unsigned char *cdb = &pt->pscsi_cdb[0];
687
688         result = pt->pscsi_result;
689         /*
690          * Hack to make sure that Write-Protect modepage is set if R/O mode is
691          * forced.
692          */
693         if (((cdb[0] == MODE_SENSE) || (cdb[0] == MODE_SENSE_10)) &&
694              (status_byte(result) << 1) == SAM_STAT_GOOD) {
695                 if (!task->task_se_cmd->se_deve)
696                         goto after_mode_sense;
697
698                 if (task->task_se_cmd->se_deve->lun_flags &
699                                 TRANSPORT_LUNFLAGS_READ_ONLY) {
700                         unsigned char *buf = task->task_se_cmd->t_task->t_task_buf;
701
702                         if (cdb[0] == MODE_SENSE_10) {
703                                 if (!(buf[3] & 0x80))
704                                         buf[3] |= 0x80;
705                         } else {
706                                 if (!(buf[2] & 0x80))
707                                         buf[2] |= 0x80;
708                         }
709                 }
710         }
711 after_mode_sense:
712
713         if (sd->type != TYPE_TAPE)
714                 goto after_mode_select;
715
716         /*
717          * Hack to correctly obtain the initiator requested blocksize for
718          * TYPE_TAPE.  Since this value is dependent upon each tape media,
719          * struct scsi_device->sector_size will not contain the correct value
720          * by default, so we go ahead and set it so
721          * TRANSPORT(dev)->get_blockdev() returns the correct value to the
722          * storage engine.
723          */
724         if (((cdb[0] == MODE_SELECT) || (cdb[0] == MODE_SELECT_10)) &&
725               (status_byte(result) << 1) == SAM_STAT_GOOD) {
726                 unsigned char *buf;
727                 struct scatterlist *sg = task->task_sg;
728                 u16 bdl;
729                 u32 blocksize;
730
731                 buf = sg_virt(&sg[0]);
732                 if (!(buf)) {
733                         printk(KERN_ERR "Unable to get buf for scatterlist\n");
734                         goto after_mode_select;
735                 }
736
737                 if (cdb[0] == MODE_SELECT)
738                         bdl = (buf[3]);
739                 else
740                         bdl = (buf[6] << 8) | (buf[7]);
741
742                 if (!bdl)
743                         goto after_mode_select;
744
745                 if (cdb[0] == MODE_SELECT)
746                         blocksize = (buf[9] << 16) | (buf[10] << 8) |
747                                         (buf[11]);
748                 else
749                         blocksize = (buf[13] << 16) | (buf[14] << 8) |
750                                         (buf[15]);
751
752                 sd->sector_size = blocksize;
753         }
754 after_mode_select:
755
756         if (status_byte(result) & CHECK_CONDITION)
757                 return 1;
758
759         return 0;
760 }
761
762 static struct se_task *
763 pscsi_alloc_task(struct se_cmd *cmd)
764 {
765         struct pscsi_plugin_task *pt;
766         unsigned char *cdb = cmd->t_task->t_task_cdb;
767
768         pt = kzalloc(sizeof(struct pscsi_plugin_task), GFP_KERNEL);
769         if (!pt) {
770                 printk(KERN_ERR "Unable to allocate struct pscsi_plugin_task\n");
771                 return NULL;
772         }
773
774         /*
775          * If TCM Core is signaling a > TCM_MAX_COMMAND_SIZE allocation,
776          * allocate the extended CDB buffer for per struct se_task context
777          * pt->pscsi_cdb now.
778          */
779         if (cmd->t_task->t_task_cdb != cmd->t_task->__t_task_cdb) {
780
781                 pt->pscsi_cdb = kzalloc(scsi_command_size(cdb), GFP_KERNEL);
782                 if (!(pt->pscsi_cdb)) {
783                         printk(KERN_ERR "pSCSI: Unable to allocate extended"
784                                         " pt->pscsi_cdb\n");
785                         kfree(pt);
786                         return NULL;
787                 }
788         } else
789                 pt->pscsi_cdb = &pt->__pscsi_cdb[0];
790
791         return &pt->pscsi_task;
792 }
793
794 static inline void pscsi_blk_init_request(
795         struct se_task *task,
796         struct pscsi_plugin_task *pt,
797         struct request *req,
798         int bidi_read)
799 {
800         /*
801          * Defined as "scsi command" in include/linux/blkdev.h.
802          */
803         req->cmd_type = REQ_TYPE_BLOCK_PC;
804         /*
805          * For the extra BIDI-COMMAND READ struct request we do not
806          * need to setup the remaining structure members
807          */
808         if (bidi_read)
809                 return;
810         /*
811          * Setup the done function pointer for struct request,
812          * also set the end_io_data pointer.to struct se_task.
813          */
814         req->end_io = pscsi_req_done;
815         req->end_io_data = (void *)task;
816         /*
817          * Load the referenced struct se_task's SCSI CDB into
818          * include/linux/blkdev.h:struct request->cmd
819          */
820         req->cmd_len = scsi_command_size(pt->pscsi_cdb);
821         req->cmd = &pt->pscsi_cdb[0];
822         /*
823          * Setup pointer for outgoing sense data.
824          */
825         req->sense = (void *)&pt->pscsi_sense[0];
826         req->sense_len = 0;
827 }
828
829 /*
830  * Used for pSCSI data payloads for all *NON* SCF_SCSI_DATA_SG_IO_CDB
831 */
832 static int pscsi_blk_get_request(struct se_task *task)
833 {
834         struct pscsi_plugin_task *pt = PSCSI_TASK(task);
835         struct pscsi_dev_virt *pdv = task->se_dev->dev_ptr;
836
837         pt->pscsi_req = blk_get_request(pdv->pdv_sd->request_queue,
838                         (task->task_data_direction == DMA_TO_DEVICE),
839                         GFP_KERNEL);
840         if (!(pt->pscsi_req) || IS_ERR(pt->pscsi_req)) {
841                 printk(KERN_ERR "PSCSI: blk_get_request() failed: %ld\n",
842                                 IS_ERR(pt->pscsi_req));
843                 return PYX_TRANSPORT_LU_COMM_FAILURE;
844         }
845         /*
846          * Setup the newly allocated struct request for REQ_TYPE_BLOCK_PC,
847          * and setup rq callback, CDB and sense.
848          */
849         pscsi_blk_init_request(task, pt, pt->pscsi_req, 0);
850         return 0;
851 }
852
853 /*      pscsi_do_task(): (Part of se_subsystem_api_t template)
854  *
855  *
856  */
857 static int pscsi_do_task(struct se_task *task)
858 {
859         struct pscsi_plugin_task *pt = PSCSI_TASK(task);
860         struct pscsi_dev_virt *pdv = task->se_dev->dev_ptr;
861         /*
862          * Set the struct request->timeout value based on peripheral
863          * device type from SCSI.
864          */
865         if (pdv->pdv_sd->type == TYPE_DISK)
866                 pt->pscsi_req->timeout = PS_TIMEOUT_DISK;
867         else
868                 pt->pscsi_req->timeout = PS_TIMEOUT_OTHER;
869
870         pt->pscsi_req->retries = PS_RETRY;
871         /*
872          * Queue the struct request into the struct scsi_device->request_queue.
873          * Also check for HEAD_OF_QUEUE SAM TASK attr from received se_cmd
874          * descriptor
875          */
876         blk_execute_rq_nowait(pdv->pdv_sd->request_queue, NULL, pt->pscsi_req,
877                         (task->task_se_cmd->sam_task_attr == MSG_HEAD_TAG),
878                         pscsi_req_done);
879
880         return PYX_TRANSPORT_SENT_TO_TRANSPORT;
881 }
882
883 static void pscsi_free_task(struct se_task *task)
884 {
885         struct pscsi_plugin_task *pt = PSCSI_TASK(task);
886         struct se_cmd *cmd = task->task_se_cmd;
887
888         /*
889          * Release the extended CDB allocation from pscsi_alloc_task()
890          * if one exists.
891          */
892         if (cmd->t_task->t_task_cdb != cmd->t_task->__t_task_cdb)
893                 kfree(pt->pscsi_cdb);
894         /*
895          * We do not release the bio(s) here associated with this task, as
896          * this is handled by bio_put() and pscsi_bi_endio().
897          */
898         kfree(pt);
899 }
900
901 enum {
902         Opt_scsi_host_id, Opt_scsi_channel_id, Opt_scsi_target_id,
903         Opt_scsi_lun_id, Opt_err
904 };
905
906 static match_table_t tokens = {
907         {Opt_scsi_host_id, "scsi_host_id=%d"},
908         {Opt_scsi_channel_id, "scsi_channel_id=%d"},
909         {Opt_scsi_target_id, "scsi_target_id=%d"},
910         {Opt_scsi_lun_id, "scsi_lun_id=%d"},
911         {Opt_err, NULL}
912 };
913
914 static ssize_t pscsi_set_configfs_dev_params(struct se_hba *hba,
915         struct se_subsystem_dev *se_dev,
916         const char *page,
917         ssize_t count)
918 {
919         struct pscsi_dev_virt *pdv = se_dev->se_dev_su_ptr;
920         struct pscsi_hba_virt *phv = hba->hba_ptr;
921         char *orig, *ptr, *opts;
922         substring_t args[MAX_OPT_ARGS];
923         int ret = 0, arg, token;
924
925         opts = kstrdup(page, GFP_KERNEL);
926         if (!opts)
927                 return -ENOMEM;
928
929         orig = opts;
930
931         while ((ptr = strsep(&opts, ",")) != NULL) {
932                 if (!*ptr)
933                         continue;
934
935                 token = match_token(ptr, tokens, args);
936                 switch (token) {
937                 case Opt_scsi_host_id:
938                         if (phv->phv_mode == PHV_LLD_SCSI_HOST_NO) {
939                                 printk(KERN_ERR "PSCSI[%d]: Unable to accept"
940                                         " scsi_host_id while phv_mode =="
941                                         " PHV_LLD_SCSI_HOST_NO\n",
942                                         phv->phv_host_id);
943                                 ret = -EINVAL;
944                                 goto out;
945                         }
946                         match_int(args, &arg);
947                         pdv->pdv_host_id = arg;
948                         printk(KERN_INFO "PSCSI[%d]: Referencing SCSI Host ID:"
949                                 " %d\n", phv->phv_host_id, pdv->pdv_host_id);
950                         pdv->pdv_flags |= PDF_HAS_VIRT_HOST_ID;
951                         break;
952                 case Opt_scsi_channel_id:
953                         match_int(args, &arg);
954                         pdv->pdv_channel_id = arg;
955                         printk(KERN_INFO "PSCSI[%d]: Referencing SCSI Channel"
956                                 " ID: %d\n",  phv->phv_host_id,
957                                 pdv->pdv_channel_id);
958                         pdv->pdv_flags |= PDF_HAS_CHANNEL_ID;
959                         break;
960                 case Opt_scsi_target_id:
961                         match_int(args, &arg);
962                         pdv->pdv_target_id = arg;
963                         printk(KERN_INFO "PSCSI[%d]: Referencing SCSI Target"
964                                 " ID: %d\n", phv->phv_host_id,
965                                 pdv->pdv_target_id);
966                         pdv->pdv_flags |= PDF_HAS_TARGET_ID;
967                         break;
968                 case Opt_scsi_lun_id:
969                         match_int(args, &arg);
970                         pdv->pdv_lun_id = arg;
971                         printk(KERN_INFO "PSCSI[%d]: Referencing SCSI LUN ID:"
972                                 " %d\n", phv->phv_host_id, pdv->pdv_lun_id);
973                         pdv->pdv_flags |= PDF_HAS_LUN_ID;
974                         break;
975                 default:
976                         break;
977                 }
978         }
979
980 out:
981         kfree(orig);
982         return (!ret) ? count : ret;
983 }
984
985 static ssize_t pscsi_check_configfs_dev_params(
986         struct se_hba *hba,
987         struct se_subsystem_dev *se_dev)
988 {
989         struct pscsi_dev_virt *pdv = se_dev->se_dev_su_ptr;
990
991         if (!(pdv->pdv_flags & PDF_HAS_CHANNEL_ID) ||
992             !(pdv->pdv_flags & PDF_HAS_TARGET_ID) ||
993             !(pdv->pdv_flags & PDF_HAS_LUN_ID)) {
994                 printk(KERN_ERR "Missing scsi_channel_id=, scsi_target_id= and"
995                         " scsi_lun_id= parameters\n");
996                 return -EINVAL;
997         }
998
999         return 0;
1000 }
1001
1002 static ssize_t pscsi_show_configfs_dev_params(struct se_hba *hba,
1003                                               struct se_subsystem_dev *se_dev,
1004                                               char *b)
1005 {
1006         struct pscsi_hba_virt *phv = hba->hba_ptr;
1007         struct pscsi_dev_virt *pdv = se_dev->se_dev_su_ptr;
1008         struct scsi_device *sd = pdv->pdv_sd;
1009         unsigned char host_id[16];
1010         ssize_t bl;
1011         int i;
1012
1013         if (phv->phv_mode == PHV_VIRUTAL_HOST_ID)
1014                 snprintf(host_id, 16, "%d", pdv->pdv_host_id);
1015         else
1016                 snprintf(host_id, 16, "PHBA Mode");
1017
1018         bl = sprintf(b, "SCSI Device Bus Location:"
1019                 " Channel ID: %d Target ID: %d LUN: %d Host ID: %s\n",
1020                 pdv->pdv_channel_id, pdv->pdv_target_id, pdv->pdv_lun_id,
1021                 host_id);
1022
1023         if (sd) {
1024                 bl += sprintf(b + bl, "        ");
1025                 bl += sprintf(b + bl, "Vendor: ");
1026                 for (i = 0; i < 8; i++) {
1027                         if (ISPRINT(sd->vendor[i]))   /* printable character? */
1028                                 bl += sprintf(b + bl, "%c", sd->vendor[i]);
1029                         else
1030                                 bl += sprintf(b + bl, " ");
1031                 }
1032                 bl += sprintf(b + bl, " Model: ");
1033                 for (i = 0; i < 16; i++) {
1034                         if (ISPRINT(sd->model[i]))   /* printable character ? */
1035                                 bl += sprintf(b + bl, "%c", sd->model[i]);
1036                         else
1037                                 bl += sprintf(b + bl, " ");
1038                 }
1039                 bl += sprintf(b + bl, " Rev: ");
1040                 for (i = 0; i < 4; i++) {
1041                         if (ISPRINT(sd->rev[i]))   /* printable character ? */
1042                                 bl += sprintf(b + bl, "%c", sd->rev[i]);
1043                         else
1044                                 bl += sprintf(b + bl, " ");
1045                 }
1046                 bl += sprintf(b + bl, "\n");
1047         }
1048         return bl;
1049 }
1050
1051 static void pscsi_bi_endio(struct bio *bio, int error)
1052 {
1053         bio_put(bio);
1054 }
1055
1056 static inline struct bio *pscsi_get_bio(struct pscsi_dev_virt *pdv, int sg_num)
1057 {
1058         struct bio *bio;
1059         /*
1060          * Use bio_malloc() following the comment in for bio -> struct request
1061          * in block/blk-core.c:blk_make_request()
1062          */
1063         bio = bio_kmalloc(GFP_KERNEL, sg_num);
1064         if (!(bio)) {
1065                 printk(KERN_ERR "PSCSI: bio_kmalloc() failed\n");
1066                 return NULL;
1067         }
1068         bio->bi_end_io = pscsi_bi_endio;
1069
1070         return bio;
1071 }
1072
1073 #if 0
1074 #define DEBUG_PSCSI(x...) printk(x)
1075 #else
1076 #define DEBUG_PSCSI(x...)
1077 #endif
1078
1079 static int __pscsi_map_task_SG(
1080         struct se_task *task,
1081         struct scatterlist *task_sg,
1082         u32 task_sg_num,
1083         int bidi_read)
1084 {
1085         struct pscsi_plugin_task *pt = PSCSI_TASK(task);
1086         struct pscsi_dev_virt *pdv = task->se_dev->dev_ptr;
1087         struct bio *bio = NULL, *hbio = NULL, *tbio = NULL;
1088         struct page *page;
1089         struct scatterlist *sg;
1090         u32 data_len = task->task_size, i, len, bytes, off;
1091         int nr_pages = (task->task_size + task_sg[0].offset +
1092                         PAGE_SIZE - 1) >> PAGE_SHIFT;
1093         int nr_vecs = 0, rc, ret = PYX_TRANSPORT_OUT_OF_MEMORY_RESOURCES;
1094         int rw = (task->task_data_direction == DMA_TO_DEVICE);
1095
1096         if (!task->task_size)
1097                 return 0;
1098         /*
1099          * For SCF_SCSI_DATA_SG_IO_CDB, Use fs/bio.c:bio_add_page() to setup
1100          * the bio_vec maplist from TC< struct se_mem -> task->task_sg ->
1101          * struct scatterlist memory.  The struct se_task->task_sg[] currently needs
1102          * to be attached to struct bios for submission to Linux/SCSI using
1103          * struct request to struct scsi_device->request_queue.
1104          *
1105          * Note that this will be changing post v2.6.28 as Target_Core_Mod/pSCSI
1106          * is ported to upstream SCSI passthrough functionality that accepts
1107          * struct scatterlist->page_link or struct page as a paraemeter.
1108          */
1109         DEBUG_PSCSI("PSCSI: nr_pages: %d\n", nr_pages);
1110
1111         for_each_sg(task_sg, sg, task_sg_num, i) {
1112                 page = sg_page(sg);
1113                 off = sg->offset;
1114                 len = sg->length;
1115
1116                 DEBUG_PSCSI("PSCSI: i: %d page: %p len: %d off: %d\n", i,
1117                         page, len, off);
1118
1119                 while (len > 0 && data_len > 0) {
1120                         bytes = min_t(unsigned int, len, PAGE_SIZE - off);
1121                         bytes = min(bytes, data_len);
1122
1123                         if (!(bio)) {
1124                                 nr_vecs = min_t(int, BIO_MAX_PAGES, nr_pages);
1125                                 nr_pages -= nr_vecs;
1126                                 /*
1127                                  * Calls bio_kmalloc() and sets bio->bi_end_io()
1128                                  */
1129                                 bio = pscsi_get_bio(pdv, nr_vecs);
1130                                 if (!(bio))
1131                                         goto fail;
1132
1133                                 if (rw)
1134                                         bio->bi_rw |= REQ_WRITE;
1135
1136                                 DEBUG_PSCSI("PSCSI: Allocated bio: %p,"
1137                                         " dir: %s nr_vecs: %d\n", bio,
1138                                         (rw) ? "rw" : "r", nr_vecs);
1139                                 /*
1140                                  * Set *hbio pointer to handle the case:
1141                                  * nr_pages > BIO_MAX_PAGES, where additional
1142                                  * bios need to be added to complete a given
1143                                  * struct se_task
1144                                  */
1145                                 if (!hbio)
1146                                         hbio = tbio = bio;
1147                                 else
1148                                         tbio = tbio->bi_next = bio;
1149                         }
1150
1151                         DEBUG_PSCSI("PSCSI: Calling bio_add_pc_page() i: %d"
1152                                 " bio: %p page: %p len: %d off: %d\n", i, bio,
1153                                 page, len, off);
1154
1155                         rc = bio_add_pc_page(pdv->pdv_sd->request_queue,
1156                                         bio, page, bytes, off);
1157                         if (rc != bytes)
1158                                 goto fail;
1159
1160                         DEBUG_PSCSI("PSCSI: bio->bi_vcnt: %d nr_vecs: %d\n",
1161                                 bio->bi_vcnt, nr_vecs);
1162
1163                         if (bio->bi_vcnt > nr_vecs) {
1164                                 DEBUG_PSCSI("PSCSI: Reached bio->bi_vcnt max:"
1165                                         " %d i: %d bio: %p, allocating another"
1166                                         " bio\n", bio->bi_vcnt, i, bio);
1167                                 /*
1168                                  * Clear the pointer so that another bio will
1169                                  * be allocated with pscsi_get_bio() above, the
1170                                  * current bio has already been set *tbio and
1171                                  * bio->bi_next.
1172                                  */
1173                                 bio = NULL;
1174                         }
1175
1176                         page++;
1177                         len -= bytes;
1178                         data_len -= bytes;
1179                         off = 0;
1180                 }
1181         }
1182         /*
1183          * Setup the primary pt->pscsi_req used for non BIDI and BIDI-COMMAND
1184          * primary SCSI WRITE poayload mapped for struct se_task->task_sg[]
1185          */
1186         if (!(bidi_read)) {
1187                 /*
1188                  * Starting with v2.6.31, call blk_make_request() passing in *hbio to
1189                  * allocate the pSCSI task a struct request.
1190                  */
1191                 pt->pscsi_req = blk_make_request(pdv->pdv_sd->request_queue,
1192                                         hbio, GFP_KERNEL);
1193                 if (!(pt->pscsi_req)) {
1194                         printk(KERN_ERR "pSCSI: blk_make_request() failed\n");
1195                         goto fail;
1196                 }
1197                 /*
1198                  * Setup the newly allocated struct request for REQ_TYPE_BLOCK_PC,
1199                  * and setup rq callback, CDB and sense.
1200                  */
1201                 pscsi_blk_init_request(task, pt, pt->pscsi_req, 0);
1202
1203                 return task->task_sg_num;
1204         }
1205         /*
1206          * Setup the secondary pt->pscsi_req->next_rq used for the extra BIDI-COMMAND
1207          * SCSI READ paylaod mapped for struct se_task->task_sg_bidi[]
1208          */
1209         pt->pscsi_req->next_rq = blk_make_request(pdv->pdv_sd->request_queue,
1210                                         hbio, GFP_KERNEL);
1211         if (!(pt->pscsi_req->next_rq)) {
1212                 printk(KERN_ERR "pSCSI: blk_make_request() failed for BIDI\n");
1213                 goto fail;
1214         }
1215         pscsi_blk_init_request(task, pt, pt->pscsi_req->next_rq, 1);
1216
1217         return task->task_sg_num;
1218 fail:
1219         while (hbio) {
1220                 bio = hbio;
1221                 hbio = hbio->bi_next;
1222                 bio->bi_next = NULL;
1223                 bio_endio(bio, 0);
1224         }
1225         return ret;
1226 }
1227
1228 static int pscsi_map_task_SG(struct se_task *task)
1229 {
1230         int ret;
1231
1232         /*
1233          * Setup the main struct request for the task->task_sg[] payload
1234          */
1235
1236         ret = __pscsi_map_task_SG(task, task->task_sg, task->task_sg_num, 0);
1237         if (ret >= 0 && task->task_sg_bidi) {
1238                 /*
1239                  * If present, set up the extra BIDI-COMMAND SCSI READ
1240                  * struct request and payload.
1241                  */
1242                 ret = __pscsi_map_task_SG(task, task->task_sg_bidi,
1243                                         task->task_sg_num, 1);
1244         }
1245
1246         if (ret < 0)
1247                 return PYX_TRANSPORT_LU_COMM_FAILURE;
1248         return 0;
1249 }
1250
1251 /*      pscsi_map_task_non_SG():
1252  *
1253  *
1254  */
1255 static int pscsi_map_task_non_SG(struct se_task *task)
1256 {
1257         struct se_cmd *cmd = task->task_se_cmd;
1258         struct pscsi_plugin_task *pt = PSCSI_TASK(task);
1259         struct pscsi_dev_virt *pdv = task->se_dev->dev_ptr;
1260         int ret = 0;
1261
1262         if (pscsi_blk_get_request(task) < 0)
1263                 return PYX_TRANSPORT_LU_COMM_FAILURE;
1264
1265         if (!task->task_size)
1266                 return 0;
1267
1268         ret = blk_rq_map_kern(pdv->pdv_sd->request_queue,
1269                         pt->pscsi_req, cmd->t_task->t_task_buf,
1270                         task->task_size, GFP_KERNEL);
1271         if (ret < 0) {
1272                 printk(KERN_ERR "PSCSI: blk_rq_map_kern() failed: %d\n", ret);
1273                 return PYX_TRANSPORT_LU_COMM_FAILURE;
1274         }
1275         return 0;
1276 }
1277
1278 static int pscsi_CDB_none(struct se_task *task)
1279 {
1280         return pscsi_blk_get_request(task);
1281 }
1282
1283 /*      pscsi_get_cdb():
1284  *
1285  *
1286  */
1287 static unsigned char *pscsi_get_cdb(struct se_task *task)
1288 {
1289         struct pscsi_plugin_task *pt = PSCSI_TASK(task);
1290
1291         return pt->pscsi_cdb;
1292 }
1293
1294 /*      pscsi_get_sense_buffer():
1295  *
1296  *
1297  */
1298 static unsigned char *pscsi_get_sense_buffer(struct se_task *task)
1299 {
1300         struct pscsi_plugin_task *pt = PSCSI_TASK(task);
1301
1302         return (unsigned char *)&pt->pscsi_sense[0];
1303 }
1304
1305 /*      pscsi_get_device_rev():
1306  *
1307  *
1308  */
1309 static u32 pscsi_get_device_rev(struct se_device *dev)
1310 {
1311         struct pscsi_dev_virt *pdv = dev->dev_ptr;
1312         struct scsi_device *sd = pdv->pdv_sd;
1313
1314         return (sd->scsi_level - 1) ? sd->scsi_level - 1 : 1;
1315 }
1316
1317 /*      pscsi_get_device_type():
1318  *
1319  *
1320  */
1321 static u32 pscsi_get_device_type(struct se_device *dev)
1322 {
1323         struct pscsi_dev_virt *pdv = dev->dev_ptr;
1324         struct scsi_device *sd = pdv->pdv_sd;
1325
1326         return sd->type;
1327 }
1328
1329 static sector_t pscsi_get_blocks(struct se_device *dev)
1330 {
1331         struct pscsi_dev_virt *pdv = dev->dev_ptr;
1332
1333         if (pdv->pdv_bd && pdv->pdv_bd->bd_part)
1334                 return pdv->pdv_bd->bd_part->nr_sects;
1335
1336         dump_stack();
1337         return 0;
1338 }
1339
1340 /*      pscsi_handle_SAM_STATUS_failures():
1341  *
1342  *
1343  */
1344 static inline void pscsi_process_SAM_status(
1345         struct se_task *task,
1346         struct pscsi_plugin_task *pt)
1347 {
1348         task->task_scsi_status = status_byte(pt->pscsi_result);
1349         if ((task->task_scsi_status)) {
1350                 task->task_scsi_status <<= 1;
1351                 printk(KERN_INFO "PSCSI Status Byte exception at task: %p CDB:"
1352                         " 0x%02x Result: 0x%08x\n", task, pt->pscsi_cdb[0],
1353                         pt->pscsi_result);
1354         }
1355
1356         switch (host_byte(pt->pscsi_result)) {
1357         case DID_OK:
1358                 transport_complete_task(task, (!task->task_scsi_status));
1359                 break;
1360         default:
1361                 printk(KERN_INFO "PSCSI Host Byte exception at task: %p CDB:"
1362                         " 0x%02x Result: 0x%08x\n", task, pt->pscsi_cdb[0],
1363                         pt->pscsi_result);
1364                 task->task_scsi_status = SAM_STAT_CHECK_CONDITION;
1365                 task->task_error_status = PYX_TRANSPORT_UNKNOWN_SAM_OPCODE;
1366                 task->task_se_cmd->transport_error_status =
1367                                         PYX_TRANSPORT_UNKNOWN_SAM_OPCODE;
1368                 transport_complete_task(task, 0);
1369                 break;
1370         }
1371 }
1372
1373 static void pscsi_req_done(struct request *req, int uptodate)
1374 {
1375         struct se_task *task = req->end_io_data;
1376         struct pscsi_plugin_task *pt = PSCSI_TASK(task);
1377
1378         pt->pscsi_result = req->errors;
1379         pt->pscsi_resid = req->resid_len;
1380
1381         pscsi_process_SAM_status(task, pt);
1382         /*
1383          * Release BIDI-READ if present
1384          */
1385         if (req->next_rq != NULL)
1386                 __blk_put_request(req->q, req->next_rq);
1387
1388         __blk_put_request(req->q, req);
1389         pt->pscsi_req = NULL;
1390 }
1391
1392 static struct se_subsystem_api pscsi_template = {
1393         .name                   = "pscsi",
1394         .owner                  = THIS_MODULE,
1395         .transport_type         = TRANSPORT_PLUGIN_PHBA_PDEV,
1396         .cdb_none               = pscsi_CDB_none,
1397         .map_task_non_SG        = pscsi_map_task_non_SG,
1398         .map_task_SG            = pscsi_map_task_SG,
1399         .attach_hba             = pscsi_attach_hba,
1400         .detach_hba             = pscsi_detach_hba,
1401         .pmode_enable_hba       = pscsi_pmode_enable_hba,
1402         .allocate_virtdevice    = pscsi_allocate_virtdevice,
1403         .create_virtdevice      = pscsi_create_virtdevice,
1404         .free_device            = pscsi_free_device,
1405         .transport_complete     = pscsi_transport_complete,
1406         .alloc_task             = pscsi_alloc_task,
1407         .do_task                = pscsi_do_task,
1408         .free_task              = pscsi_free_task,
1409         .check_configfs_dev_params = pscsi_check_configfs_dev_params,
1410         .set_configfs_dev_params = pscsi_set_configfs_dev_params,
1411         .show_configfs_dev_params = pscsi_show_configfs_dev_params,
1412         .get_cdb                = pscsi_get_cdb,
1413         .get_sense_buffer       = pscsi_get_sense_buffer,
1414         .get_device_rev         = pscsi_get_device_rev,
1415         .get_device_type        = pscsi_get_device_type,
1416         .get_blocks             = pscsi_get_blocks,
1417 };
1418
1419 static int __init pscsi_module_init(void)
1420 {
1421         return transport_subsystem_register(&pscsi_template);
1422 }
1423
1424 static void pscsi_module_exit(void)
1425 {
1426         transport_subsystem_release(&pscsi_template);
1427 }
1428
1429 MODULE_DESCRIPTION("TCM PSCSI subsystem plugin");
1430 MODULE_AUTHOR("nab@Linux-iSCSI.org");
1431 MODULE_LICENSE("GPL");
1432
1433 module_init(pscsi_module_init);
1434 module_exit(pscsi_module_exit);