2 * IBM eServer i/pSeries Virtual SCSI Target Driver
3 * Copyright (C) 2003-2005 Dave Boutcher (boutcher@us.ibm.com) IBM Corp.
4 * Santiago Leon (santil@us.ibm.com) IBM Corp.
5 * Linda Xie (lxie@us.ibm.com) IBM Corp.
7 * Copyright (C) 2005-2006 FUJITA Tomonori <tomof@acm.org>
9 * This program is free software; you can redistribute it and/or modify
10 * it under the terms of the GNU General Public License as published by
11 * the Free Software Foundation; either version 2 of the License, or
12 * (at your option) any later version.
14 * This program is distributed in the hope that it will be useful,
15 * but WITHOUT ANY WARRANTY; without even the implied warranty of
16 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
17 * GNU General Public License for more details.
19 * You should have received a copy of the GNU General Public License
20 * along with this program; if not, write to the Free Software
21 * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307
24 #include <linux/interrupt.h>
25 #include <linux/module.h>
26 #include <scsi/scsi.h>
27 #include <scsi/scsi_host.h>
28 #include <scsi/scsi_tgt.h>
29 #include <scsi/libsrp.h>
30 #include <asm/hvcall.h>
31 #include <asm/iommu.h>
37 #define INITIAL_SRP_LIMIT 16
38 #define DEFAULT_MAX_SECTORS 512
40 #define TGT_NAME "ibmvstgt"
45 #define h_copy_rdma(l, sa, sb, da, db) \
46 plpar_hcall_norets(H_COPY_RDMA, l, sa, sb, da, db)
47 #define h_send_crq(ua, l, h) \
48 plpar_hcall_norets(H_SEND_CRQ, ua, l, h)
49 #define h_reg_crq(ua, tok, sz)\
50 plpar_hcall_norets(H_REG_CRQ, ua, tok, sz);
51 #define h_free_crq(ua) \
52 plpar_hcall_norets(H_FREE_CRQ, ua);
54 /* tmp - will replace with SCSI logging stuff */
55 #define eprintk(fmt, args...) \
57 printk("%s(%d) " fmt, __FUNCTION__, __LINE__, ##args); \
59 /* #define dprintk eprintk */
60 #define dprintk(fmt, args...)
63 struct vio_dev
*dma_dev
;
65 struct crq_queue crq_queue
;
66 struct work_struct crq_work
;
70 struct srp_target
*target
;
73 static struct workqueue_struct
*vtgtd
;
76 * These are fixed for the system and come from the Open Firmware device tree.
77 * We just store them here to save getting them every time.
79 static char system_id
[64] = "";
80 static char partition_name
[97] = "UNKNOWN";
81 static unsigned int partition_number
= -1;
83 static struct vio_port
*target_to_port(struct srp_target
*target
)
85 return (struct vio_port
*) target
->ldata
;
88 static inline union viosrp_iu
*vio_iu(struct iu_entry
*iue
)
90 return (union viosrp_iu
*) (iue
->sbuf
->buf
);
93 static int send_iu(struct iu_entry
*iue
, uint64_t length
, uint8_t format
)
95 struct srp_target
*target
= iue
->target
;
96 struct vio_port
*vport
= target_to_port(target
);
99 struct viosrp_crq cooked
;
103 /* First copy the SRP */
104 rc
= h_copy_rdma(length
, vport
->liobn
, iue
->sbuf
->dma
,
105 vport
->riobn
, iue
->remote_token
);
108 eprintk("Error %ld transferring data\n", rc
);
110 crq
.cooked
.valid
= 0x80;
111 crq
.cooked
.format
= format
;
112 crq
.cooked
.reserved
= 0x00;
113 crq
.cooked
.timeout
= 0x00;
114 crq
.cooked
.IU_length
= length
;
115 crq
.cooked
.IU_data_ptr
= vio_iu(iue
)->srp
.rsp
.tag
;
118 crq
.cooked
.status
= 0x99; /* Just needs to be non-zero */
120 crq
.cooked
.status
= 0x00;
122 rc1
= h_send_crq(vport
->dma_dev
->unit_address
, crq
.raw
[0], crq
.raw
[1]);
125 eprintk("%ld sending response\n", rc1
);
132 #define SRP_RSP_SENSE_DATA_LEN 18
134 static int send_rsp(struct iu_entry
*iue
, struct scsi_cmnd
*sc
,
135 unsigned char status
, unsigned char asc
)
137 union viosrp_iu
*iu
= vio_iu(iue
);
138 uint64_t tag
= iu
->srp
.rsp
.tag
;
140 /* If the linked bit is on and status is good */
141 if (test_bit(V_LINKED
, &iue
->flags
) && (status
== NO_SENSE
))
144 memset(iu
, 0, sizeof(struct srp_rsp
));
145 iu
->srp
.rsp
.opcode
= SRP_RSP
;
146 iu
->srp
.rsp
.req_lim_delta
= 1;
147 iu
->srp
.rsp
.tag
= tag
;
149 if (test_bit(V_DIOVER
, &iue
->flags
))
150 iu
->srp
.rsp
.flags
|= SRP_RSP_FLAG_DIOVER
;
152 iu
->srp
.rsp
.data_in_res_cnt
= 0;
153 iu
->srp
.rsp
.data_out_res_cnt
= 0;
155 iu
->srp
.rsp
.flags
&= ~SRP_RSP_FLAG_RSPVALID
;
157 iu
->srp
.rsp
.resp_data_len
= 0;
158 iu
->srp
.rsp
.status
= status
;
160 uint8_t *sense
= iu
->srp
.rsp
.data
;
163 iu
->srp
.rsp
.flags
|= SRP_RSP_FLAG_SNSVALID
;
164 iu
->srp
.rsp
.sense_data_len
= SCSI_SENSE_BUFFERSIZE
;
165 memcpy(sense
, sc
->sense_buffer
, SCSI_SENSE_BUFFERSIZE
);
167 iu
->srp
.rsp
.status
= SAM_STAT_CHECK_CONDITION
;
168 iu
->srp
.rsp
.flags
|= SRP_RSP_FLAG_SNSVALID
;
169 iu
->srp
.rsp
.sense_data_len
= SRP_RSP_SENSE_DATA_LEN
;
171 /* Valid bit and 'current errors' */
172 sense
[0] = (0x1 << 7 | 0x70);
175 /* Additional sense length */
176 sense
[7] = 0xa; /* 10 bytes */
177 /* Additional sense code */
182 send_iu(iue
, sizeof(iu
->srp
.rsp
) + SRP_RSP_SENSE_DATA_LEN
,
188 static void handle_cmd_queue(struct srp_target
*target
)
190 struct Scsi_Host
*shost
= target
->shost
;
191 struct iu_entry
*iue
;
197 spin_lock_irqsave(&target
->lock
, flags
);
199 list_for_each_entry(iue
, &target
->cmd_queue
, ilist
) {
200 if (!test_and_set_bit(V_FLYING
, &iue
->flags
)) {
201 spin_unlock_irqrestore(&target
->lock
, flags
);
202 cmd
= iue
->sbuf
->buf
;
203 err
= srp_cmd_queue(shost
, cmd
, iue
, 0);
205 eprintk("cannot queue cmd %p %d\n", cmd
, err
);
212 spin_unlock_irqrestore(&target
->lock
, flags
);
215 static int ibmvstgt_rdma(struct scsi_cmnd
*sc
, struct scatterlist
*sg
, int nsg
,
216 struct srp_direct_buf
*md
, int nmd
,
217 enum dma_data_direction dir
, unsigned int rest
)
219 struct iu_entry
*iue
= (struct iu_entry
*) sc
->SCp
.ptr
;
220 struct srp_target
*target
= iue
->target
;
221 struct vio_port
*vport
= target_to_port(target
);
224 unsigned int done
= 0;
228 token
= sg_dma_address(sg
+ sidx
);
230 for (i
= 0; i
< nmd
&& rest
; i
++) {
231 unsigned int mdone
, mlen
;
233 mlen
= min(rest
, md
[i
].len
);
234 for (mdone
= 0; mlen
;) {
235 int slen
= min(sg_dma_len(sg
+ sidx
) - soff
, mlen
);
237 if (dir
== DMA_TO_DEVICE
)
238 err
= h_copy_rdma(slen
,
244 err
= h_copy_rdma(slen
,
250 if (err
!= H_SUCCESS
) {
251 eprintk("rdma error %d %d\n", dir
, slen
);
260 if (soff
== sg_dma_len(sg
+ sidx
)) {
263 token
= sg_dma_address(sg
+ sidx
);
266 eprintk("out of sg %p %d %d\n",
280 static int ibmvstgt_transfer_data(struct scsi_cmnd
*sc
,
281 void (*done
)(struct scsi_cmnd
*))
283 struct iu_entry
*iue
= (struct iu_entry
*) sc
->SCp
.ptr
;
286 err
= srp_transfer_data(sc
, &vio_iu(iue
)->srp
.cmd
, ibmvstgt_rdma
, 1, 1);
293 static int ibmvstgt_cmd_done(struct scsi_cmnd
*sc
,
294 void (*done
)(struct scsi_cmnd
*))
297 struct iu_entry
*iue
= (struct iu_entry
*) sc
->SCp
.ptr
;
298 struct srp_target
*target
= iue
->target
;
300 dprintk("%p %p %x\n", iue
, target
, vio_iu(iue
)->srp
.cmd
.cdb
[0]);
302 spin_lock_irqsave(&target
->lock
, flags
);
303 list_del(&iue
->ilist
);
304 spin_unlock_irqrestore(&target
->lock
, flags
);
306 if (sc
->result
!= SAM_STAT_GOOD
) {
307 eprintk("operation failed %p %d %x\n",
308 iue
, sc
->result
, vio_iu(iue
)->srp
.cmd
.cdb
[0]);
309 send_rsp(iue
, sc
, HARDWARE_ERROR
, 0x00);
311 send_rsp(iue
, sc
, NO_SENSE
, 0x00);
318 int send_adapter_info(struct iu_entry
*iue
,
319 dma_addr_t remote_buffer
, uint16_t length
)
321 struct srp_target
*target
= iue
->target
;
322 struct vio_port
*vport
= target_to_port(target
);
323 struct Scsi_Host
*shost
= target
->shost
;
324 dma_addr_t data_token
;
325 struct mad_adapter_info_data
*info
;
328 info
= dma_alloc_coherent(target
->dev
, sizeof(*info
), &data_token
,
331 eprintk("bad dma_alloc_coherent %p\n", target
);
335 /* Get remote info */
336 err
= h_copy_rdma(sizeof(*info
), vport
->riobn
, remote_buffer
,
337 vport
->liobn
, data_token
);
338 if (err
== H_SUCCESS
) {
339 dprintk("Client connect: %s (%d)\n",
340 info
->partition_name
, info
->partition_number
);
343 memset(info
, 0, sizeof(*info
));
345 strcpy(info
->srp_version
, "16.a");
346 strncpy(info
->partition_name
, partition_name
,
347 sizeof(info
->partition_name
));
348 info
->partition_number
= partition_number
;
349 info
->mad_version
= 1;
351 info
->port_max_txu
[0] = shost
->hostt
->max_sectors
<< 9;
353 /* Send our info to remote */
354 err
= h_copy_rdma(sizeof(*info
), vport
->liobn
, data_token
,
355 vport
->riobn
, remote_buffer
);
357 dma_free_coherent(target
->dev
, sizeof(*info
), info
, data_token
);
359 if (err
!= H_SUCCESS
) {
360 eprintk("Error sending adapter info %d\n", err
);
367 static void process_login(struct iu_entry
*iue
)
369 union viosrp_iu
*iu
= vio_iu(iue
);
370 struct srp_login_rsp
*rsp
= &iu
->srp
.login_rsp
;
371 uint64_t tag
= iu
->srp
.rsp
.tag
;
373 /* TODO handle case that requested size is wrong and
374 * buffer format is wrong
376 memset(iu
, 0, sizeof(struct srp_login_rsp
));
377 rsp
->opcode
= SRP_LOGIN_RSP
;
378 rsp
->req_lim_delta
= INITIAL_SRP_LIMIT
;
380 rsp
->max_it_iu_len
= sizeof(union srp_iu
);
381 rsp
->max_ti_iu_len
= sizeof(union srp_iu
);
382 /* direct and indirect */
383 rsp
->buf_fmt
= SRP_BUF_FORMAT_DIRECT
| SRP_BUF_FORMAT_INDIRECT
;
385 send_iu(iue
, sizeof(*rsp
), VIOSRP_SRP_FORMAT
);
388 static inline void queue_cmd(struct iu_entry
*iue
)
390 struct srp_target
*target
= iue
->target
;
393 spin_lock_irqsave(&target
->lock
, flags
);
394 list_add_tail(&iue
->ilist
, &target
->cmd_queue
);
395 spin_unlock_irqrestore(&target
->lock
, flags
);
398 static int process_tsk_mgmt(struct iu_entry
*iue
)
400 union viosrp_iu
*iu
= vio_iu(iue
);
403 dprintk("%p %u\n", iue
, iu
->srp
.tsk_mgmt
.tsk_mgmt_func
);
405 switch (iu
->srp
.tsk_mgmt
.tsk_mgmt_func
) {
406 case SRP_TSK_ABORT_TASK
:
409 case SRP_TSK_ABORT_TASK_SET
:
412 case SRP_TSK_CLEAR_TASK_SET
:
415 case SRP_TSK_LUN_RESET
:
416 fn
= LOGICAL_UNIT_RESET
;
418 case SRP_TSK_CLEAR_ACA
:
425 scsi_tgt_tsk_mgmt_request(iue
->target
->shost
, fn
,
426 iu
->srp
.tsk_mgmt
.task_tag
,
427 (struct scsi_lun
*) &iu
->srp
.tsk_mgmt
.lun
,
430 send_rsp(iue
, NULL
, ILLEGAL_REQUEST
, 0x20);
435 static int process_mad_iu(struct iu_entry
*iue
)
437 union viosrp_iu
*iu
= vio_iu(iue
);
438 struct viosrp_adapter_info
*info
;
439 struct viosrp_host_config
*conf
;
441 switch (iu
->mad
.empty_iu
.common
.type
) {
442 case VIOSRP_EMPTY_IU_TYPE
:
443 eprintk("%s\n", "Unsupported EMPTY MAD IU");
445 case VIOSRP_ERROR_LOG_TYPE
:
446 eprintk("%s\n", "Unsupported ERROR LOG MAD IU");
447 iu
->mad
.error_log
.common
.status
= 1;
448 send_iu(iue
, sizeof(iu
->mad
.error_log
), VIOSRP_MAD_FORMAT
);
450 case VIOSRP_ADAPTER_INFO_TYPE
:
451 info
= &iu
->mad
.adapter_info
;
452 info
->common
.status
= send_adapter_info(iue
, info
->buffer
,
453 info
->common
.length
);
454 send_iu(iue
, sizeof(*info
), VIOSRP_MAD_FORMAT
);
456 case VIOSRP_HOST_CONFIG_TYPE
:
457 conf
= &iu
->mad
.host_config
;
458 conf
->common
.status
= 1;
459 send_iu(iue
, sizeof(*conf
), VIOSRP_MAD_FORMAT
);
462 eprintk("Unknown type %u\n", iu
->srp
.rsp
.opcode
);
468 static int process_srp_iu(struct iu_entry
*iue
)
470 union viosrp_iu
*iu
= vio_iu(iue
);
472 u8 opcode
= iu
->srp
.rsp
.opcode
;
479 done
= process_tsk_mgmt(iue
);
493 eprintk("Unsupported type %u\n", opcode
);
496 eprintk("Unknown type %u\n", opcode
);
502 static void process_iu(struct viosrp_crq
*crq
, struct srp_target
*target
)
504 struct vio_port
*vport
= target_to_port(target
);
505 struct iu_entry
*iue
;
508 iue
= srp_iu_get(target
);
510 eprintk("Error getting IU from pool, %p\n", target
);
514 iue
->remote_token
= crq
->IU_data_ptr
;
516 err
= h_copy_rdma(crq
->IU_length
, vport
->riobn
,
517 iue
->remote_token
, vport
->liobn
, iue
->sbuf
->dma
);
519 if (err
!= H_SUCCESS
) {
520 eprintk("%ld transferring data error %p\n", err
, iue
);
525 if (crq
->format
== VIOSRP_MAD_FORMAT
)
526 done
= process_mad_iu(iue
);
528 done
= process_srp_iu(iue
);
534 static irqreturn_t
ibmvstgt_interrupt(int irq
, void *data
)
536 struct srp_target
*target
= (struct srp_target
*) data
;
537 struct vio_port
*vport
= target_to_port(target
);
539 vio_disable_interrupts(vport
->dma_dev
);
540 queue_work(vtgtd
, &vport
->crq_work
);
545 static int crq_queue_create(struct crq_queue
*queue
, struct srp_target
*target
)
548 struct vio_port
*vport
= target_to_port(target
);
550 queue
->msgs
= (struct viosrp_crq
*) get_zeroed_page(GFP_KERNEL
);
553 queue
->size
= PAGE_SIZE
/ sizeof(*queue
->msgs
);
555 queue
->msg_token
= dma_map_single(target
->dev
, queue
->msgs
,
556 queue
->size
* sizeof(*queue
->msgs
),
559 if (dma_mapping_error(queue
->msg_token
))
562 err
= h_reg_crq(vport
->dma_dev
->unit_address
, queue
->msg_token
,
565 /* If the adapter was left active for some reason (like kexec)
566 * try freeing and re-registering
568 if (err
== H_RESOURCE
) {
570 err
= h_free_crq(vport
->dma_dev
->unit_address
);
571 } while (err
== H_BUSY
|| H_IS_LONG_BUSY(err
));
573 err
= h_reg_crq(vport
->dma_dev
->unit_address
, queue
->msg_token
,
577 if (err
!= H_SUCCESS
&& err
!= 2) {
578 eprintk("Error 0x%x opening virtual adapter\n", err
);
582 err
= request_irq(vport
->dma_dev
->irq
, &ibmvstgt_interrupt
,
583 IRQF_DISABLED
, "ibmvstgt", target
);
587 vio_enable_interrupts(vport
->dma_dev
);
589 h_send_crq(vport
->dma_dev
->unit_address
, 0xC001000000000000, 0);
592 spin_lock_init(&queue
->lock
);
598 err
= h_free_crq(vport
->dma_dev
->unit_address
);
599 } while (err
== H_BUSY
|| H_IS_LONG_BUSY(err
));
602 dma_unmap_single(target
->dev
, queue
->msg_token
,
603 queue
->size
* sizeof(*queue
->msgs
), DMA_BIDIRECTIONAL
);
605 free_page((unsigned long) queue
->msgs
);
611 static void crq_queue_destroy(struct srp_target
*target
)
613 struct vio_port
*vport
= target_to_port(target
);
614 struct crq_queue
*queue
= &vport
->crq_queue
;
617 free_irq(vport
->dma_dev
->irq
, target
);
619 err
= h_free_crq(vport
->dma_dev
->unit_address
);
620 } while (err
== H_BUSY
|| H_IS_LONG_BUSY(err
));
622 dma_unmap_single(target
->dev
, queue
->msg_token
,
623 queue
->size
* sizeof(*queue
->msgs
), DMA_BIDIRECTIONAL
);
625 free_page((unsigned long) queue
->msgs
);
628 static void process_crq(struct viosrp_crq
*crq
, struct srp_target
*target
)
630 struct vio_port
*vport
= target_to_port(target
);
631 dprintk("%x %x\n", crq
->valid
, crq
->format
);
633 switch (crq
->valid
) {
636 switch (crq
->format
) {
638 h_send_crq(vport
->dma_dev
->unit_address
,
639 0xC002000000000000, 0);
644 eprintk("Unknown format %u\n", crq
->format
);
648 /* transport event */
652 switch (crq
->format
) {
653 case VIOSRP_SRP_FORMAT
:
654 case VIOSRP_MAD_FORMAT
:
655 process_iu(crq
, target
);
657 case VIOSRP_OS400_FORMAT
:
658 case VIOSRP_AIX_FORMAT
:
659 case VIOSRP_LINUX_FORMAT
:
660 case VIOSRP_INLINE_FORMAT
:
661 eprintk("Unsupported format %u\n", crq
->format
);
664 eprintk("Unknown format %u\n", crq
->format
);
668 eprintk("unknown message type 0x%02x!?\n", crq
->valid
);
672 static inline struct viosrp_crq
*next_crq(struct crq_queue
*queue
)
674 struct viosrp_crq
*crq
;
677 spin_lock_irqsave(&queue
->lock
, flags
);
678 crq
= &queue
->msgs
[queue
->cur
];
679 if (crq
->valid
& 0x80) {
680 if (++queue
->cur
== queue
->size
)
684 spin_unlock_irqrestore(&queue
->lock
, flags
);
689 static void handle_crq(struct work_struct
*work
)
691 struct vio_port
*vport
= container_of(work
, struct vio_port
, crq_work
);
692 struct srp_target
*target
= vport
->target
;
693 struct viosrp_crq
*crq
;
697 while ((crq
= next_crq(&vport
->crq_queue
)) != NULL
) {
698 process_crq(crq
, target
);
702 vio_enable_interrupts(vport
->dma_dev
);
704 crq
= next_crq(&vport
->crq_queue
);
706 vio_disable_interrupts(vport
->dma_dev
);
707 process_crq(crq
, target
);
713 handle_cmd_queue(target
);
717 static int ibmvstgt_eh_abort_handler(struct scsi_cmnd
*sc
)
720 struct iu_entry
*iue
= (struct iu_entry
*) sc
->SCp
.ptr
;
721 struct srp_target
*target
= iue
->target
;
723 dprintk("%p %p %x\n", iue
, target
, vio_iu(iue
)->srp
.cmd
.cdb
[0]);
725 spin_lock_irqsave(&target
->lock
, flags
);
726 list_del(&iue
->ilist
);
727 spin_unlock_irqrestore(&target
->lock
, flags
);
734 static int ibmvstgt_tsk_mgmt_response(u64 mid
, int result
)
736 struct iu_entry
*iue
= (struct iu_entry
*) ((void *) mid
);
737 union viosrp_iu
*iu
= vio_iu(iue
);
738 unsigned char status
, asc
;
740 eprintk("%p %d\n", iue
, result
);
744 switch (iu
->srp
.tsk_mgmt
.tsk_mgmt_func
) {
745 case SRP_TSK_ABORT_TASK
:
748 status
= ABORTED_COMMAND
;
754 send_rsp(iue
, NULL
, status
, asc
);
760 static ssize_t
system_id_show(struct class_device
*cdev
, char *buf
)
762 return snprintf(buf
, PAGE_SIZE
, "%s\n", system_id
);
765 static ssize_t
partition_number_show(struct class_device
*cdev
, char *buf
)
767 return snprintf(buf
, PAGE_SIZE
, "%x\n", partition_number
);
770 static ssize_t
unit_address_show(struct class_device
*cdev
, char *buf
)
772 struct Scsi_Host
*shost
= class_to_shost(cdev
);
773 struct srp_target
*target
= host_to_srp_target(shost
);
774 struct vio_port
*vport
= target_to_port(target
);
775 return snprintf(buf
, PAGE_SIZE
, "%x\n", vport
->dma_dev
->unit_address
);
778 static CLASS_DEVICE_ATTR(system_id
, S_IRUGO
, system_id_show
, NULL
);
779 static CLASS_DEVICE_ATTR(partition_number
, S_IRUGO
, partition_number_show
, NULL
);
780 static CLASS_DEVICE_ATTR(unit_address
, S_IRUGO
, unit_address_show
, NULL
);
782 static struct class_device_attribute
*ibmvstgt_attrs
[] = {
783 &class_device_attr_system_id
,
784 &class_device_attr_partition_number
,
785 &class_device_attr_unit_address
,
789 static struct scsi_host_template ibmvstgt_sht
= {
791 .module
= THIS_MODULE
,
792 .can_queue
= INITIAL_SRP_LIMIT
,
793 .sg_tablesize
= SG_ALL
,
794 .use_clustering
= DISABLE_CLUSTERING
,
795 .max_sectors
= DEFAULT_MAX_SECTORS
,
796 .transfer_response
= ibmvstgt_cmd_done
,
797 .transfer_data
= ibmvstgt_transfer_data
,
798 .eh_abort_handler
= ibmvstgt_eh_abort_handler
,
799 .tsk_mgmt_response
= ibmvstgt_tsk_mgmt_response
,
800 .shost_attrs
= ibmvstgt_attrs
,
801 .proc_name
= TGT_NAME
,
804 static int ibmvstgt_probe(struct vio_dev
*dev
, const struct vio_device_id
*id
)
806 struct Scsi_Host
*shost
;
807 struct srp_target
*target
;
808 struct vio_port
*vport
;
809 unsigned int *dma
, dma_size
;
812 vport
= kzalloc(sizeof(struct vio_port
), GFP_KERNEL
);
815 shost
= scsi_host_alloc(&ibmvstgt_sht
, sizeof(struct srp_target
));
818 err
= scsi_tgt_alloc_queue(shost
);
822 target
= host_to_srp_target(shost
);
823 target
->shost
= shost
;
824 vport
->dma_dev
= dev
;
825 target
->ldata
= vport
;
826 vport
->target
= target
;
827 err
= srp_target_alloc(target
, &dev
->dev
, INITIAL_SRP_LIMIT
,
832 dma
= (unsigned int *) vio_get_attribute(dev
, "ibm,my-dma-window",
834 if (!dma
|| dma_size
!= 40) {
835 eprintk("Couldn't get window property %d\n", dma_size
);
837 goto free_srp_target
;
839 vport
->liobn
= dma
[0];
840 vport
->riobn
= dma
[5];
842 INIT_WORK(&vport
->crq_work
, handle_crq
);
844 err
= crq_queue_create(&vport
->crq_queue
, target
);
846 goto free_srp_target
;
848 err
= scsi_add_host(shost
, target
->dev
);
854 crq_queue_destroy(target
);
856 srp_target_free(target
);
858 scsi_host_put(shost
);
864 static int ibmvstgt_remove(struct vio_dev
*dev
)
866 struct srp_target
*target
= (struct srp_target
*) dev
->dev
.driver_data
;
867 struct Scsi_Host
*shost
= target
->shost
;
868 struct vio_port
*vport
= target
->ldata
;
870 crq_queue_destroy(target
);
871 scsi_remove_host(shost
);
872 scsi_tgt_free_queue(shost
);
873 srp_target_free(target
);
875 scsi_host_put(shost
);
879 static struct vio_device_id ibmvstgt_device_table
[] __devinitdata
= {
880 {"v-scsi-host", "IBM,v-scsi-host"},
884 MODULE_DEVICE_TABLE(vio
, ibmvstgt_device_table
);
886 static struct vio_driver ibmvstgt_driver
= {
887 .id_table
= ibmvstgt_device_table
,
888 .probe
= ibmvstgt_probe
,
889 .remove
= ibmvstgt_remove
,
892 .owner
= THIS_MODULE
,
896 static int get_system_info(void)
898 struct device_node
*rootdn
;
899 const char *id
, *model
, *name
;
902 rootdn
= find_path_device("/");
906 model
= get_property(rootdn
, "model", NULL
);
907 id
= get_property(rootdn
, "system-id", NULL
);
909 snprintf(system_id
, sizeof(system_id
), "%s-%s", model
, id
);
911 name
= get_property(rootdn
, "ibm,partition-name", NULL
);
913 strncpy(partition_name
, name
, sizeof(partition_name
));
915 num
= (unsigned int *) get_property(rootdn
, "ibm,partition-no", NULL
);
917 partition_number
= *num
;
922 static int ibmvstgt_init(void)
926 printk("IBM eServer i/pSeries Virtual SCSI Target Driver\n");
928 vtgtd
= create_workqueue("ibmvtgtd");
932 err
= get_system_info();
936 err
= vio_register_driver(&ibmvstgt_driver
);
943 destroy_workqueue(vtgtd
);
947 static void ibmvstgt_exit(void)
949 printk("Unregister IBM virtual SCSI driver\n");
951 destroy_workqueue(vtgtd
);
952 vio_unregister_driver(&ibmvstgt_driver
);
955 MODULE_DESCRIPTION("IBM Virtual SCSI Target");
956 MODULE_AUTHOR("Santiago Leon");
957 MODULE_LICENSE("GPL");
959 module_init(ibmvstgt_init
);
960 module_exit(ibmvstgt_exit
);