0001
0002
0003
0004
0005
0006
0007
0008
0009
0010 #include <linux/module.h>
0011 #include <linux/delay.h>
0012 #include <linux/kernel.h>
0013 #include <linux/types.h>
0014 #include <linux/spinlock.h>
0015 #include <linux/scatterlist.h>
0016 #include <linux/err.h>
0017 #include <linux/crc32.h>
0018 #include <linux/slab.h>
0019
0020 #include <scsi/scsi_tcq.h>
0021 #include <scsi/scsi.h>
0022 #include <scsi/scsi_host.h>
0023 #include <scsi/scsi_device.h>
0024 #include <scsi/scsi_cmnd.h>
0025
0026 #include <scsi/fc/fc_fc2.h>
0027
0028 #include <scsi/libfc.h>
0029
0030 #include "fc_encode.h"
0031 #include "fc_libfc.h"
0032
0033 static struct kmem_cache *scsi_pkt_cachep;
0034
0035
0036 #define FC_SRB_FREE 0
0037 #define FC_SRB_CMD_SENT (1 << 0)
0038 #define FC_SRB_RCV_STATUS (1 << 1)
0039 #define FC_SRB_ABORT_PENDING (1 << 2)
0040 #define FC_SRB_ABORTED (1 << 3)
0041 #define FC_SRB_DISCONTIG (1 << 4)
0042 #define FC_SRB_COMPL (1 << 5)
0043 #define FC_SRB_FCP_PROCESSING_TMO (1 << 6)
0044
0045 #define FC_SRB_READ (1 << 1)
0046 #define FC_SRB_WRITE (1 << 0)
0047
0048 static struct libfc_cmd_priv *libfc_priv(struct scsi_cmnd *cmd)
0049 {
0050 return scsi_cmd_priv(cmd);
0051 }
0052
0053
0054
0055
0056
0057
0058
0059
0060
0061
0062 struct fc_fcp_internal {
0063 mempool_t *scsi_pkt_pool;
0064 spinlock_t scsi_queue_lock;
0065 struct list_head scsi_pkt_queue;
0066 unsigned long last_can_queue_ramp_down_time;
0067 unsigned long last_can_queue_ramp_up_time;
0068 int max_can_queue;
0069 };
0070
0071 #define fc_get_scsi_internal(x) ((struct fc_fcp_internal *)(x)->scsi_priv)
0072
0073
0074
0075
0076
0077 static void fc_fcp_recv_data(struct fc_fcp_pkt *, struct fc_frame *);
0078 static void fc_fcp_recv(struct fc_seq *, struct fc_frame *, void *);
0079 static void fc_fcp_resp(struct fc_fcp_pkt *, struct fc_frame *);
0080 static void fc_fcp_complete_locked(struct fc_fcp_pkt *);
0081 static void fc_tm_done(struct fc_seq *, struct fc_frame *, void *);
0082 static void fc_fcp_error(struct fc_fcp_pkt *, struct fc_frame *);
0083 static void fc_fcp_recovery(struct fc_fcp_pkt *, u8 code);
0084 static void fc_fcp_timeout(struct timer_list *);
0085 static void fc_fcp_rec(struct fc_fcp_pkt *);
0086 static void fc_fcp_rec_error(struct fc_fcp_pkt *, struct fc_frame *);
0087 static void fc_fcp_rec_resp(struct fc_seq *, struct fc_frame *, void *);
0088 static void fc_io_compl(struct fc_fcp_pkt *);
0089
0090 static void fc_fcp_srr(struct fc_fcp_pkt *, enum fc_rctl, u32);
0091 static void fc_fcp_srr_resp(struct fc_seq *, struct fc_frame *, void *);
0092 static void fc_fcp_srr_error(struct fc_fcp_pkt *, struct fc_frame *);
0093
0094
0095
0096
0097 #define FC_COMPLETE 0
0098 #define FC_CMD_ABORTED 1
0099 #define FC_CMD_RESET 2
0100 #define FC_CMD_PLOGO 3
0101 #define FC_SNS_RCV 4
0102 #define FC_TRANS_ERR 5
0103 #define FC_DATA_OVRRUN 6
0104 #define FC_DATA_UNDRUN 7
0105 #define FC_ERROR 8
0106 #define FC_HRD_ERROR 9
0107 #define FC_CRC_ERROR 10
0108 #define FC_TIMED_OUT 11
0109 #define FC_TRANS_RESET 12
0110
0111
0112
0113
0114 #define FC_SCSI_TM_TOV (10 * HZ)
0115 #define FC_HOST_RESET_TIMEOUT (30 * HZ)
0116 #define FC_CAN_QUEUE_PERIOD (60 * HZ)
0117
0118 #define FC_MAX_ERROR_CNT 5
0119 #define FC_MAX_RECOV_RETRY 3
0120
0121 #define FC_FCP_DFLT_QUEUE_DEPTH 32
0122
0123
0124
0125
0126
0127
0128
0129
0130
0131 static struct fc_fcp_pkt *fc_fcp_pkt_alloc(struct fc_lport *lport, gfp_t gfp)
0132 {
0133 struct fc_fcp_internal *si = fc_get_scsi_internal(lport);
0134 struct fc_fcp_pkt *fsp;
0135
0136 fsp = mempool_alloc(si->scsi_pkt_pool, gfp);
0137 if (fsp) {
0138 memset(fsp, 0, sizeof(*fsp));
0139 fsp->lp = lport;
0140 fsp->xfer_ddp = FC_XID_UNKNOWN;
0141 refcount_set(&fsp->ref_cnt, 1);
0142 timer_setup(&fsp->timer, NULL, 0);
0143 INIT_LIST_HEAD(&fsp->list);
0144 spin_lock_init(&fsp->scsi_pkt_lock);
0145 } else {
0146 this_cpu_inc(lport->stats->FcpPktAllocFails);
0147 }
0148 return fsp;
0149 }
0150
0151
0152
0153
0154
0155
0156
0157
0158 static void fc_fcp_pkt_release(struct fc_fcp_pkt *fsp)
0159 {
0160 if (refcount_dec_and_test(&fsp->ref_cnt)) {
0161 struct fc_fcp_internal *si = fc_get_scsi_internal(fsp->lp);
0162
0163 mempool_free(fsp, si->scsi_pkt_pool);
0164 }
0165 }
0166
0167
0168
0169
0170
0171 static void fc_fcp_pkt_hold(struct fc_fcp_pkt *fsp)
0172 {
0173 refcount_inc(&fsp->ref_cnt);
0174 }
0175
0176
0177
0178
0179
0180
0181
0182
0183
0184
0185
0186
0187 static void fc_fcp_pkt_destroy(struct fc_seq *seq, void *fsp)
0188 {
0189 fc_fcp_pkt_release(fsp);
0190 }
0191
0192
0193
0194
0195
0196
0197
0198
0199
0200
0201
0202
0203
0204
0205
0206
0207
0208
0209 static inline int fc_fcp_lock_pkt(struct fc_fcp_pkt *fsp)
0210 {
0211 spin_lock_bh(&fsp->scsi_pkt_lock);
0212 if (fsp->state & FC_SRB_COMPL) {
0213 spin_unlock_bh(&fsp->scsi_pkt_lock);
0214 return -EPERM;
0215 }
0216
0217 fc_fcp_pkt_hold(fsp);
0218 return 0;
0219 }
0220
0221
0222
0223
0224
0225
0226 static inline void fc_fcp_unlock_pkt(struct fc_fcp_pkt *fsp)
0227 {
0228 spin_unlock_bh(&fsp->scsi_pkt_lock);
0229 fc_fcp_pkt_release(fsp);
0230 }
0231
0232
0233
0234
0235
0236
0237 static void fc_fcp_timer_set(struct fc_fcp_pkt *fsp, unsigned long delay)
0238 {
0239 if (!(fsp->state & FC_SRB_COMPL)) {
0240 mod_timer(&fsp->timer, jiffies + delay);
0241 fsp->timer_delay = delay;
0242 }
0243 }
0244
0245 static void fc_fcp_abort_done(struct fc_fcp_pkt *fsp)
0246 {
0247 fsp->state |= FC_SRB_ABORTED;
0248 fsp->state &= ~FC_SRB_ABORT_PENDING;
0249
0250 if (fsp->wait_for_comp)
0251 complete(&fsp->tm_done);
0252 else
0253 fc_fcp_complete_locked(fsp);
0254 }
0255
0256
0257
0258
0259
0260
0261 static int fc_fcp_send_abort(struct fc_fcp_pkt *fsp)
0262 {
0263 int rc;
0264
0265 if (!fsp->seq_ptr)
0266 return -EINVAL;
0267
0268 this_cpu_inc(fsp->lp->stats->FcpPktAborts);
0269
0270 fsp->state |= FC_SRB_ABORT_PENDING;
0271 rc = fc_seq_exch_abort(fsp->seq_ptr, 0);
0272
0273
0274
0275
0276 if (rc == -ENXIO) {
0277 fc_fcp_abort_done(fsp);
0278 rc = 0;
0279 }
0280 return rc;
0281 }
0282
0283
0284
0285
0286
0287
0288
0289
0290
0291
0292
0293 static void fc_fcp_retry_cmd(struct fc_fcp_pkt *fsp, int status_code)
0294 {
0295 if (fsp->seq_ptr) {
0296 fc_exch_done(fsp->seq_ptr);
0297 fsp->seq_ptr = NULL;
0298 }
0299
0300 fsp->state &= ~FC_SRB_ABORT_PENDING;
0301 fsp->io_status = 0;
0302 fsp->status_code = status_code;
0303 fc_fcp_complete_locked(fsp);
0304 }
0305
0306
0307
0308
0309
0310
0311 void fc_fcp_ddp_setup(struct fc_fcp_pkt *fsp, u16 xid)
0312 {
0313 struct fc_lport *lport;
0314
0315 lport = fsp->lp;
0316 if ((fsp->req_flags & FC_SRB_READ) &&
0317 (lport->lro_enabled) && (lport->tt.ddp_setup)) {
0318 if (lport->tt.ddp_setup(lport, xid, scsi_sglist(fsp->cmd),
0319 scsi_sg_count(fsp->cmd)))
0320 fsp->xfer_ddp = xid;
0321 }
0322 }
0323
0324
0325
0326
0327
0328
0329 void fc_fcp_ddp_done(struct fc_fcp_pkt *fsp)
0330 {
0331 struct fc_lport *lport;
0332
0333 if (!fsp)
0334 return;
0335
0336 if (fsp->xfer_ddp == FC_XID_UNKNOWN)
0337 return;
0338
0339 lport = fsp->lp;
0340 if (lport->tt.ddp_done) {
0341 fsp->xfer_len = lport->tt.ddp_done(lport, fsp->xfer_ddp);
0342 fsp->xfer_ddp = FC_XID_UNKNOWN;
0343 }
0344 }
0345
0346
0347
0348
0349
0350 static void fc_fcp_can_queue_ramp_up(struct fc_lport *lport)
0351 {
0352 struct fc_fcp_internal *si = fc_get_scsi_internal(lport);
0353 unsigned long flags;
0354 int can_queue;
0355
0356 spin_lock_irqsave(lport->host->host_lock, flags);
0357
0358 if (si->last_can_queue_ramp_up_time &&
0359 (time_before(jiffies, si->last_can_queue_ramp_up_time +
0360 FC_CAN_QUEUE_PERIOD)))
0361 goto unlock;
0362
0363 if (time_before(jiffies, si->last_can_queue_ramp_down_time +
0364 FC_CAN_QUEUE_PERIOD))
0365 goto unlock;
0366
0367 si->last_can_queue_ramp_up_time = jiffies;
0368
0369 can_queue = lport->host->can_queue << 1;
0370 if (can_queue >= si->max_can_queue) {
0371 can_queue = si->max_can_queue;
0372 si->last_can_queue_ramp_down_time = 0;
0373 }
0374 lport->host->can_queue = can_queue;
0375 shost_printk(KERN_ERR, lport->host, "libfc: increased "
0376 "can_queue to %d.\n", can_queue);
0377
0378 unlock:
0379 spin_unlock_irqrestore(lport->host->host_lock, flags);
0380 }
0381
0382
0383
0384
0385
0386
0387
0388
0389
0390
0391
0392 static bool fc_fcp_can_queue_ramp_down(struct fc_lport *lport)
0393 {
0394 struct fc_fcp_internal *si = fc_get_scsi_internal(lport);
0395 unsigned long flags;
0396 int can_queue;
0397 bool changed = false;
0398
0399 spin_lock_irqsave(lport->host->host_lock, flags);
0400
0401 if (si->last_can_queue_ramp_down_time &&
0402 (time_before(jiffies, si->last_can_queue_ramp_down_time +
0403 FC_CAN_QUEUE_PERIOD)))
0404 goto unlock;
0405
0406 si->last_can_queue_ramp_down_time = jiffies;
0407
0408 can_queue = lport->host->can_queue;
0409 can_queue >>= 1;
0410 if (!can_queue)
0411 can_queue = 1;
0412 lport->host->can_queue = can_queue;
0413 changed = true;
0414
0415 unlock:
0416 spin_unlock_irqrestore(lport->host->host_lock, flags);
0417 return changed;
0418 }
0419
0420
0421
0422
0423
0424
0425
0426
0427
0428 static inline struct fc_frame *fc_fcp_frame_alloc(struct fc_lport *lport,
0429 size_t len)
0430 {
0431 struct fc_frame *fp;
0432
0433 fp = fc_frame_alloc(lport, len);
0434 if (likely(fp))
0435 return fp;
0436
0437 this_cpu_inc(lport->stats->FcpFrameAllocFails);
0438
0439 fc_fcp_can_queue_ramp_down(lport);
0440 shost_printk(KERN_ERR, lport->host,
0441 "libfc: Could not allocate frame, "
0442 "reducing can_queue to %d.\n", lport->host->can_queue);
0443 return NULL;
0444 }
0445
0446
0447
0448
0449
0450
0451
0452 static inline unsigned int get_fsp_rec_tov(struct fc_fcp_pkt *fsp)
0453 {
0454 struct fc_rport_libfc_priv *rpriv = fsp->rport->dd_data;
0455 unsigned int e_d_tov = FC_DEF_E_D_TOV;
0456
0457 if (rpriv && rpriv->e_d_tov > e_d_tov)
0458 e_d_tov = rpriv->e_d_tov;
0459 return msecs_to_jiffies(e_d_tov) + HZ;
0460 }
0461
0462
0463
0464
0465
0466
0467 static void fc_fcp_recv_data(struct fc_fcp_pkt *fsp, struct fc_frame *fp)
0468 {
0469 struct scsi_cmnd *sc = fsp->cmd;
0470 struct fc_lport *lport = fsp->lp;
0471 struct fc_frame_header *fh;
0472 size_t start_offset;
0473 size_t offset;
0474 u32 crc;
0475 u32 copy_len = 0;
0476 size_t len;
0477 void *buf;
0478 struct scatterlist *sg;
0479 u32 nents;
0480 u8 host_bcode = FC_COMPLETE;
0481
0482 fh = fc_frame_header_get(fp);
0483 offset = ntohl(fh->fh_parm_offset);
0484 start_offset = offset;
0485 len = fr_len(fp) - sizeof(*fh);
0486 buf = fc_frame_payload_get(fp, 0);
0487
0488
0489
0490
0491
0492
0493
0494
0495 if (fsp->xfer_ddp != FC_XID_UNKNOWN) {
0496 fc_fcp_ddp_done(fsp);
0497 FC_FCP_DBG(fsp, "DDP I/O in fc_fcp_recv_data set ERROR\n");
0498 host_bcode = FC_ERROR;
0499 goto err;
0500 }
0501 if (offset + len > fsp->data_len) {
0502
0503 if ((fr_flags(fp) & FCPHF_CRC_UNCHECKED) &&
0504 fc_frame_crc_check(fp))
0505 goto crc_err;
0506 FC_FCP_DBG(fsp, "data received past end. len %zx offset %zx "
0507 "data_len %x\n", len, offset, fsp->data_len);
0508
0509
0510 host_bcode = FC_DATA_OVRRUN;
0511 goto err;
0512 }
0513 if (offset != fsp->xfer_len)
0514 fsp->state |= FC_SRB_DISCONTIG;
0515
0516 sg = scsi_sglist(sc);
0517 nents = scsi_sg_count(sc);
0518
0519 if (!(fr_flags(fp) & FCPHF_CRC_UNCHECKED)) {
0520 copy_len = fc_copy_buffer_to_sglist(buf, len, sg, &nents,
0521 &offset, NULL);
0522 } else {
0523 crc = crc32(~0, (u8 *) fh, sizeof(*fh));
0524 copy_len = fc_copy_buffer_to_sglist(buf, len, sg, &nents,
0525 &offset, &crc);
0526 buf = fc_frame_payload_get(fp, 0);
0527 if (len % 4)
0528 crc = crc32(crc, buf + len, 4 - (len % 4));
0529
0530 if (~crc != le32_to_cpu(fr_crc(fp))) {
0531 crc_err:
0532 this_cpu_inc(lport->stats->ErrorFrames);
0533
0534 if (this_cpu_inc_return(lport->stats->InvalidCRCCount) < FC_MAX_ERROR_CNT)
0535 printk(KERN_WARNING "libfc: CRC error on data "
0536 "frame for port (%6.6x)\n",
0537 lport->port_id);
0538
0539
0540
0541
0542
0543
0544
0545 if (fsp->state & FC_SRB_DISCONTIG) {
0546 host_bcode = FC_CRC_ERROR;
0547 goto err;
0548 }
0549 return;
0550 }
0551 }
0552
0553 if (fsp->xfer_contig_end == start_offset)
0554 fsp->xfer_contig_end += copy_len;
0555 fsp->xfer_len += copy_len;
0556
0557
0558
0559
0560
0561 if (unlikely(fsp->state & FC_SRB_RCV_STATUS) &&
0562 fsp->xfer_len == fsp->data_len - fsp->scsi_resid) {
0563 FC_FCP_DBG( fsp, "complete out-of-order sequence\n" );
0564 fc_fcp_complete_locked(fsp);
0565 }
0566 return;
0567 err:
0568 fc_fcp_recovery(fsp, host_bcode);
0569 }
0570
0571
0572
0573
0574
0575
0576
0577
0578
0579
0580
0581
0582
0583
0584 static int fc_fcp_send_data(struct fc_fcp_pkt *fsp, struct fc_seq *seq,
0585 size_t offset, size_t seq_blen)
0586 {
0587 struct fc_exch *ep;
0588 struct scsi_cmnd *sc;
0589 struct scatterlist *sg;
0590 struct fc_frame *fp = NULL;
0591 struct fc_lport *lport = fsp->lp;
0592 struct page *page;
0593 size_t remaining;
0594 size_t t_blen;
0595 size_t tlen;
0596 size_t sg_bytes;
0597 size_t frame_offset, fh_parm_offset;
0598 size_t off;
0599 int error;
0600 void *data = NULL;
0601 void *page_addr;
0602 int using_sg = lport->sg_supp;
0603 u32 f_ctl;
0604
0605 WARN_ON(seq_blen <= 0);
0606 if (unlikely(offset + seq_blen > fsp->data_len)) {
0607
0608 FC_FCP_DBG(fsp, "xfer-ready past end. seq_blen %zx "
0609 "offset %zx\n", seq_blen, offset);
0610 fc_fcp_send_abort(fsp);
0611 return 0;
0612 } else if (offset != fsp->xfer_len) {
0613
0614 FC_FCP_DBG(fsp, "xfer-ready non-contiguous. "
0615 "seq_blen %zx offset %zx\n", seq_blen, offset);
0616 }
0617
0618
0619
0620
0621
0622
0623 t_blen = fsp->max_payload;
0624 if (lport->seq_offload) {
0625 t_blen = min(seq_blen, (size_t)lport->lso_max);
0626 FC_FCP_DBG(fsp, "fsp=%p:lso:blen=%zx lso_max=0x%x t_blen=%zx\n",
0627 fsp, seq_blen, lport->lso_max, t_blen);
0628 }
0629
0630 if (t_blen > 512)
0631 t_blen &= ~(512 - 1);
0632 sc = fsp->cmd;
0633
0634 remaining = seq_blen;
0635 fh_parm_offset = frame_offset = offset;
0636 tlen = 0;
0637 seq = fc_seq_start_next(seq);
0638 f_ctl = FC_FC_REL_OFF;
0639 WARN_ON(!seq);
0640
0641 sg = scsi_sglist(sc);
0642
0643 while (remaining > 0 && sg) {
0644 if (offset >= sg->length) {
0645 offset -= sg->length;
0646 sg = sg_next(sg);
0647 continue;
0648 }
0649 if (!fp) {
0650 tlen = min(t_blen, remaining);
0651
0652
0653
0654
0655
0656
0657 if (tlen % 4)
0658 using_sg = 0;
0659 fp = fc_frame_alloc(lport, using_sg ? 0 : tlen);
0660 if (!fp)
0661 return -ENOMEM;
0662
0663 data = fc_frame_header_get(fp) + 1;
0664 fh_parm_offset = frame_offset;
0665 fr_max_payload(fp) = fsp->max_payload;
0666 }
0667
0668 off = offset + sg->offset;
0669 sg_bytes = min(tlen, sg->length - offset);
0670 sg_bytes = min(sg_bytes,
0671 (size_t) (PAGE_SIZE - (off & ~PAGE_MASK)));
0672 page = sg_page(sg) + (off >> PAGE_SHIFT);
0673 if (using_sg) {
0674 get_page(page);
0675 skb_fill_page_desc(fp_skb(fp),
0676 skb_shinfo(fp_skb(fp))->nr_frags,
0677 page, off & ~PAGE_MASK, sg_bytes);
0678 fp_skb(fp)->data_len += sg_bytes;
0679 fr_len(fp) += sg_bytes;
0680 fp_skb(fp)->truesize += PAGE_SIZE;
0681 } else {
0682
0683
0684
0685
0686 page_addr = kmap_atomic(page);
0687 memcpy(data, (char *)page_addr + (off & ~PAGE_MASK),
0688 sg_bytes);
0689 kunmap_atomic(page_addr);
0690 data += sg_bytes;
0691 }
0692 offset += sg_bytes;
0693 frame_offset += sg_bytes;
0694 tlen -= sg_bytes;
0695 remaining -= sg_bytes;
0696
0697 if ((skb_shinfo(fp_skb(fp))->nr_frags < FC_FRAME_SG_LEN) &&
0698 (tlen))
0699 continue;
0700
0701
0702
0703
0704
0705 if (remaining == 0)
0706 f_ctl |= FC_FC_SEQ_INIT | FC_FC_END_SEQ;
0707
0708 ep = fc_seq_exch(seq);
0709 fc_fill_fc_hdr(fp, FC_RCTL_DD_SOL_DATA, ep->did, ep->sid,
0710 FC_TYPE_FCP, f_ctl, fh_parm_offset);
0711
0712
0713
0714
0715 error = fc_seq_send(lport, seq, fp);
0716 if (error) {
0717 WARN_ON(1);
0718 return error;
0719 }
0720 fp = NULL;
0721 }
0722 fsp->xfer_len += seq_blen;
0723 return 0;
0724 }
0725
0726
0727
0728
0729
0730
0731 static void fc_fcp_abts_resp(struct fc_fcp_pkt *fsp, struct fc_frame *fp)
0732 {
0733 int ba_done = 1;
0734 struct fc_ba_rjt *brp;
0735 struct fc_frame_header *fh;
0736
0737 fh = fc_frame_header_get(fp);
0738 switch (fh->fh_r_ctl) {
0739 case FC_RCTL_BA_ACC:
0740 break;
0741 case FC_RCTL_BA_RJT:
0742 brp = fc_frame_payload_get(fp, sizeof(*brp));
0743 if (brp && brp->br_reason == FC_BA_RJT_LOG_ERR)
0744 break;
0745 fallthrough;
0746 default:
0747
0748
0749
0750
0751
0752 ba_done = 0;
0753 }
0754
0755 if (ba_done)
0756 fc_fcp_abort_done(fsp);
0757 }
0758
0759
0760
0761
0762
0763
0764
0765
0766
0767
0768 static void fc_fcp_recv(struct fc_seq *seq, struct fc_frame *fp, void *arg)
0769 {
0770 struct fc_fcp_pkt *fsp = (struct fc_fcp_pkt *)arg;
0771 struct fc_lport *lport = fsp->lp;
0772 struct fc_frame_header *fh;
0773 struct fcp_txrdy *dd;
0774 u8 r_ctl;
0775 int rc = 0;
0776
0777 if (IS_ERR(fp)) {
0778 fc_fcp_error(fsp, fp);
0779 return;
0780 }
0781
0782 fh = fc_frame_header_get(fp);
0783 r_ctl = fh->fh_r_ctl;
0784
0785 if (lport->state != LPORT_ST_READY) {
0786 FC_FCP_DBG(fsp, "lport state %d, ignoring r_ctl %x\n",
0787 lport->state, r_ctl);
0788 goto out;
0789 }
0790 if (fc_fcp_lock_pkt(fsp))
0791 goto out;
0792
0793 if (fh->fh_type == FC_TYPE_BLS) {
0794 fc_fcp_abts_resp(fsp, fp);
0795 goto unlock;
0796 }
0797
0798 if (fsp->state & (FC_SRB_ABORTED | FC_SRB_ABORT_PENDING)) {
0799 FC_FCP_DBG(fsp, "command aborted, ignoring r_ctl %x\n", r_ctl);
0800 goto unlock;
0801 }
0802
0803 if (r_ctl == FC_RCTL_DD_DATA_DESC) {
0804
0805
0806
0807
0808 WARN_ON(fr_flags(fp) & FCPHF_CRC_UNCHECKED);
0809 dd = fc_frame_payload_get(fp, sizeof(*dd));
0810 WARN_ON(!dd);
0811
0812 rc = fc_fcp_send_data(fsp, seq,
0813 (size_t) ntohl(dd->ft_data_ro),
0814 (size_t) ntohl(dd->ft_burst_len));
0815 if (!rc)
0816 seq->rec_data = fsp->xfer_len;
0817 } else if (r_ctl == FC_RCTL_DD_SOL_DATA) {
0818
0819
0820
0821
0822 WARN_ON(fr_len(fp) < sizeof(*fh));
0823 fc_fcp_recv_data(fsp, fp);
0824 seq->rec_data = fsp->xfer_contig_end;
0825 } else if (r_ctl == FC_RCTL_DD_CMD_STATUS) {
0826 WARN_ON(fr_flags(fp) & FCPHF_CRC_UNCHECKED);
0827
0828 fc_fcp_resp(fsp, fp);
0829 } else {
0830 FC_FCP_DBG(fsp, "unexpected frame. r_ctl %x\n", r_ctl);
0831 }
0832 unlock:
0833 fc_fcp_unlock_pkt(fsp);
0834 out:
0835 fc_frame_free(fp);
0836 }
0837
0838
0839
0840
0841
0842
0843 static void fc_fcp_resp(struct fc_fcp_pkt *fsp, struct fc_frame *fp)
0844 {
0845 struct fc_frame_header *fh;
0846 struct fcp_resp *fc_rp;
0847 struct fcp_resp_ext *rp_ex;
0848 struct fcp_resp_rsp_info *fc_rp_info;
0849 u32 plen;
0850 u32 expected_len;
0851 u32 respl = 0;
0852 u32 snsl = 0;
0853 u8 flags = 0;
0854
0855 plen = fr_len(fp);
0856 fh = (struct fc_frame_header *)fr_hdr(fp);
0857 if (unlikely(plen < sizeof(*fh) + sizeof(*fc_rp)))
0858 goto len_err;
0859 plen -= sizeof(*fh);
0860 fc_rp = (struct fcp_resp *)(fh + 1);
0861 fsp->cdb_status = fc_rp->fr_status;
0862 flags = fc_rp->fr_flags;
0863 fsp->scsi_comp_flags = flags;
0864 expected_len = fsp->data_len;
0865
0866
0867 fc_fcp_ddp_done(fsp);
0868
0869 if (unlikely((flags & ~FCP_CONF_REQ) || fc_rp->fr_status)) {
0870 rp_ex = (void *)(fc_rp + 1);
0871 if (flags & (FCP_RSP_LEN_VAL | FCP_SNS_LEN_VAL)) {
0872 if (plen < sizeof(*fc_rp) + sizeof(*rp_ex))
0873 goto len_err;
0874 fc_rp_info = (struct fcp_resp_rsp_info *)(rp_ex + 1);
0875 if (flags & FCP_RSP_LEN_VAL) {
0876 respl = ntohl(rp_ex->fr_rsp_len);
0877 if ((respl != FCP_RESP_RSP_INFO_LEN4) &&
0878 (respl != FCP_RESP_RSP_INFO_LEN8))
0879 goto len_err;
0880 if (fsp->wait_for_comp) {
0881
0882 fsp->cdb_status = fc_rp_info->rsp_code;
0883 complete(&fsp->tm_done);
0884
0885
0886
0887
0888 return;
0889 }
0890 }
0891 if (flags & FCP_SNS_LEN_VAL) {
0892 snsl = ntohl(rp_ex->fr_sns_len);
0893 if (snsl > SCSI_SENSE_BUFFERSIZE)
0894 snsl = SCSI_SENSE_BUFFERSIZE;
0895 memcpy(fsp->cmd->sense_buffer,
0896 (char *)fc_rp_info + respl, snsl);
0897 }
0898 }
0899 if (flags & (FCP_RESID_UNDER | FCP_RESID_OVER)) {
0900 if (plen < sizeof(*fc_rp) + sizeof(rp_ex->fr_resid))
0901 goto len_err;
0902 if (flags & FCP_RESID_UNDER) {
0903 fsp->scsi_resid = ntohl(rp_ex->fr_resid);
0904
0905
0906
0907
0908
0909
0910
0911
0912 if (!(flags & FCP_SNS_LEN_VAL) &&
0913 (fc_rp->fr_status == 0) &&
0914 (scsi_bufflen(fsp->cmd) -
0915 fsp->scsi_resid) < fsp->cmd->underflow)
0916 goto err;
0917 expected_len -= fsp->scsi_resid;
0918 } else {
0919 fsp->status_code = FC_ERROR;
0920 }
0921 }
0922 }
0923 fsp->state |= FC_SRB_RCV_STATUS;
0924
0925
0926
0927
0928 if (unlikely(fsp->cdb_status == SAM_STAT_GOOD &&
0929 fsp->xfer_len != expected_len)) {
0930 if (fsp->xfer_len < expected_len) {
0931
0932
0933
0934
0935
0936 if (fsp->lp->qfull) {
0937 FC_FCP_DBG(fsp, "tgt %6.6x queue busy retry\n",
0938 fsp->rport->port_id);
0939 return;
0940 }
0941 FC_FCP_DBG(fsp, "tgt %6.6x xfer len %zx data underrun "
0942 "len %x, data len %x\n",
0943 fsp->rport->port_id,
0944 fsp->xfer_len, expected_len, fsp->data_len);
0945 fc_fcp_timer_set(fsp, get_fsp_rec_tov(fsp));
0946 return;
0947 }
0948 fsp->status_code = FC_DATA_OVRRUN;
0949 FC_FCP_DBG(fsp, "tgt %6.6x xfer len %zx greater than expected, "
0950 "len %x, data len %x\n",
0951 fsp->rport->port_id,
0952 fsp->xfer_len, expected_len, fsp->data_len);
0953 }
0954 fc_fcp_complete_locked(fsp);
0955 return;
0956
0957 len_err:
0958 FC_FCP_DBG(fsp, "short FCP response. flags 0x%x len %u respl %u "
0959 "snsl %u\n", flags, fr_len(fp), respl, snsl);
0960 err:
0961 fsp->status_code = FC_ERROR;
0962 fc_fcp_complete_locked(fsp);
0963 }
0964
0965
0966
0967
0968
0969
0970
0971
0972
0973 static void fc_fcp_complete_locked(struct fc_fcp_pkt *fsp)
0974 {
0975 struct fc_lport *lport = fsp->lp;
0976 struct fc_seq *seq;
0977 struct fc_exch *ep;
0978 u32 f_ctl;
0979
0980 if (fsp->state & FC_SRB_ABORT_PENDING)
0981 return;
0982
0983 if (fsp->state & FC_SRB_ABORTED) {
0984 if (!fsp->status_code)
0985 fsp->status_code = FC_CMD_ABORTED;
0986 } else {
0987
0988
0989
0990
0991 if (fsp->cdb_status == SAM_STAT_GOOD &&
0992 fsp->xfer_len < fsp->data_len && !fsp->io_status &&
0993 (!(fsp->scsi_comp_flags & FCP_RESID_UNDER) ||
0994 fsp->xfer_len < fsp->data_len - fsp->scsi_resid)) {
0995 FC_FCP_DBG(fsp, "data underrun, xfer %zx data %x\n",
0996 fsp->xfer_len, fsp->data_len);
0997 fsp->status_code = FC_DATA_UNDRUN;
0998 }
0999 }
1000
1001 seq = fsp->seq_ptr;
1002 if (seq) {
1003 fsp->seq_ptr = NULL;
1004 if (unlikely(fsp->scsi_comp_flags & FCP_CONF_REQ)) {
1005 struct fc_frame *conf_frame;
1006 struct fc_seq *csp;
1007
1008 csp = fc_seq_start_next(seq);
1009 conf_frame = fc_fcp_frame_alloc(fsp->lp, 0);
1010 if (conf_frame) {
1011 f_ctl = FC_FC_SEQ_INIT;
1012 f_ctl |= FC_FC_LAST_SEQ | FC_FC_END_SEQ;
1013 ep = fc_seq_exch(seq);
1014 fc_fill_fc_hdr(conf_frame, FC_RCTL_DD_SOL_CTL,
1015 ep->did, ep->sid,
1016 FC_TYPE_FCP, f_ctl, 0);
1017 fc_seq_send(lport, csp, conf_frame);
1018 }
1019 }
1020 fc_exch_done(seq);
1021 }
1022
1023
1024
1025
1026
1027 if (fsp->cmd)
1028 fc_io_compl(fsp);
1029 }
1030
1031
1032
1033
1034
1035
1036 static void fc_fcp_cleanup_cmd(struct fc_fcp_pkt *fsp, int error)
1037 {
1038 if (fsp->seq_ptr) {
1039 fc_exch_done(fsp->seq_ptr);
1040 fsp->seq_ptr = NULL;
1041 }
1042 fsp->status_code = error;
1043 }
1044
1045
1046
1047
1048
1049
1050
1051
1052
1053
1054 static void fc_fcp_cleanup_each_cmd(struct fc_lport *lport, unsigned int id,
1055 unsigned int lun, int error)
1056 {
1057 struct fc_fcp_internal *si = fc_get_scsi_internal(lport);
1058 struct fc_fcp_pkt *fsp;
1059 struct scsi_cmnd *sc_cmd;
1060 unsigned long flags;
1061
1062 spin_lock_irqsave(&si->scsi_queue_lock, flags);
1063 restart:
1064 list_for_each_entry(fsp, &si->scsi_pkt_queue, list) {
1065 sc_cmd = fsp->cmd;
1066 if (id != -1 && scmd_id(sc_cmd) != id)
1067 continue;
1068
1069 if (lun != -1 && sc_cmd->device->lun != lun)
1070 continue;
1071
1072 fc_fcp_pkt_hold(fsp);
1073 spin_unlock_irqrestore(&si->scsi_queue_lock, flags);
1074
1075 spin_lock_bh(&fsp->scsi_pkt_lock);
1076 if (!(fsp->state & FC_SRB_COMPL)) {
1077 fsp->state |= FC_SRB_COMPL;
1078
1079
1080
1081
1082
1083
1084
1085
1086
1087 spin_unlock_bh(&fsp->scsi_pkt_lock);
1088
1089 fc_fcp_cleanup_cmd(fsp, error);
1090
1091 spin_lock_bh(&fsp->scsi_pkt_lock);
1092 fc_io_compl(fsp);
1093 }
1094 spin_unlock_bh(&fsp->scsi_pkt_lock);
1095
1096 fc_fcp_pkt_release(fsp);
1097 spin_lock_irqsave(&si->scsi_queue_lock, flags);
1098
1099
1100
1101
1102 goto restart;
1103 }
1104 spin_unlock_irqrestore(&si->scsi_queue_lock, flags);
1105 }
1106
1107
1108
1109
1110
1111 static void fc_fcp_abort_io(struct fc_lport *lport)
1112 {
1113 fc_fcp_cleanup_each_cmd(lport, -1, -1, FC_HRD_ERROR);
1114 }
1115
1116
1117
1118
1119
1120
1121
1122
1123
1124 static int fc_fcp_pkt_send(struct fc_lport *lport, struct fc_fcp_pkt *fsp)
1125 {
1126 struct fc_fcp_internal *si = fc_get_scsi_internal(lport);
1127 unsigned long flags;
1128 int rc;
1129
1130 libfc_priv(fsp->cmd)->fsp = fsp;
1131 fsp->cdb_cmd.fc_dl = htonl(fsp->data_len);
1132 fsp->cdb_cmd.fc_flags = fsp->req_flags & ~FCP_CFL_LEN_MASK;
1133
1134 int_to_scsilun(fsp->cmd->device->lun, &fsp->cdb_cmd.fc_lun);
1135 memcpy(fsp->cdb_cmd.fc_cdb, fsp->cmd->cmnd, fsp->cmd->cmd_len);
1136
1137 spin_lock_irqsave(&si->scsi_queue_lock, flags);
1138 list_add_tail(&fsp->list, &si->scsi_pkt_queue);
1139 spin_unlock_irqrestore(&si->scsi_queue_lock, flags);
1140 rc = lport->tt.fcp_cmd_send(lport, fsp, fc_fcp_recv);
1141 if (unlikely(rc)) {
1142 spin_lock_irqsave(&si->scsi_queue_lock, flags);
1143 libfc_priv(fsp->cmd)->fsp = NULL;
1144 list_del(&fsp->list);
1145 spin_unlock_irqrestore(&si->scsi_queue_lock, flags);
1146 }
1147
1148 return rc;
1149 }
1150
1151
1152
1153
1154
1155
1156
1157 static int fc_fcp_cmd_send(struct fc_lport *lport, struct fc_fcp_pkt *fsp,
1158 void (*resp)(struct fc_seq *,
1159 struct fc_frame *fp,
1160 void *arg))
1161 {
1162 struct fc_frame *fp;
1163 struct fc_seq *seq;
1164 struct fc_rport *rport;
1165 struct fc_rport_libfc_priv *rpriv;
1166 const size_t len = sizeof(fsp->cdb_cmd);
1167 int rc = 0;
1168
1169 if (fc_fcp_lock_pkt(fsp))
1170 return 0;
1171
1172 fp = fc_fcp_frame_alloc(lport, sizeof(fsp->cdb_cmd));
1173 if (!fp) {
1174 rc = -1;
1175 goto unlock;
1176 }
1177
1178 memcpy(fc_frame_payload_get(fp, len), &fsp->cdb_cmd, len);
1179 fr_fsp(fp) = fsp;
1180 rport = fsp->rport;
1181 fsp->max_payload = rport->maxframe_size;
1182 rpriv = rport->dd_data;
1183
1184 fc_fill_fc_hdr(fp, FC_RCTL_DD_UNSOL_CMD, rport->port_id,
1185 rpriv->local_port->port_id, FC_TYPE_FCP,
1186 FC_FCTL_REQ, 0);
1187
1188 seq = fc_exch_seq_send(lport, fp, resp, fc_fcp_pkt_destroy, fsp, 0);
1189 if (!seq) {
1190 rc = -1;
1191 goto unlock;
1192 }
1193 fsp->seq_ptr = seq;
1194 fc_fcp_pkt_hold(fsp);
1195
1196 fsp->timer.function = fc_fcp_timeout;
1197 if (rpriv->flags & FC_RP_FLAGS_REC_SUPPORTED)
1198 fc_fcp_timer_set(fsp, get_fsp_rec_tov(fsp));
1199
1200 unlock:
1201 fc_fcp_unlock_pkt(fsp);
1202 return rc;
1203 }
1204
1205
1206
1207
1208
1209
1210 static void fc_fcp_error(struct fc_fcp_pkt *fsp, struct fc_frame *fp)
1211 {
1212 int error = PTR_ERR(fp);
1213
1214 if (fc_fcp_lock_pkt(fsp))
1215 return;
1216
1217 if (error == -FC_EX_CLOSED) {
1218 fc_fcp_retry_cmd(fsp, FC_ERROR);
1219 goto unlock;
1220 }
1221
1222
1223
1224
1225
1226 fsp->state &= ~FC_SRB_ABORT_PENDING;
1227 fsp->status_code = FC_CMD_PLOGO;
1228 fc_fcp_complete_locked(fsp);
1229 unlock:
1230 fc_fcp_unlock_pkt(fsp);
1231 }
1232
1233
1234
1235
1236
1237
1238
1239 static int fc_fcp_pkt_abort(struct fc_fcp_pkt *fsp)
1240 {
1241 int rc = FAILED;
1242 unsigned long ticks_left;
1243
1244 FC_FCP_DBG(fsp, "pkt abort state %x\n", fsp->state);
1245 if (fc_fcp_send_abort(fsp)) {
1246 FC_FCP_DBG(fsp, "failed to send abort\n");
1247 return FAILED;
1248 }
1249
1250 if (fsp->state & FC_SRB_ABORTED) {
1251 FC_FCP_DBG(fsp, "target abort cmd completed\n");
1252 return SUCCESS;
1253 }
1254
1255 init_completion(&fsp->tm_done);
1256 fsp->wait_for_comp = 1;
1257
1258 spin_unlock_bh(&fsp->scsi_pkt_lock);
1259 ticks_left = wait_for_completion_timeout(&fsp->tm_done,
1260 FC_SCSI_TM_TOV);
1261 spin_lock_bh(&fsp->scsi_pkt_lock);
1262 fsp->wait_for_comp = 0;
1263
1264 if (!ticks_left) {
1265 FC_FCP_DBG(fsp, "target abort cmd failed\n");
1266 } else if (fsp->state & FC_SRB_ABORTED) {
1267 FC_FCP_DBG(fsp, "target abort cmd passed\n");
1268 rc = SUCCESS;
1269 fc_fcp_complete_locked(fsp);
1270 }
1271
1272 return rc;
1273 }
1274
1275
1276
1277
1278
1279 static void fc_lun_reset_send(struct timer_list *t)
1280 {
1281 struct fc_fcp_pkt *fsp = from_timer(fsp, t, timer);
1282 struct fc_lport *lport = fsp->lp;
1283
1284 if (lport->tt.fcp_cmd_send(lport, fsp, fc_tm_done)) {
1285 if (fsp->recov_retry++ >= FC_MAX_RECOV_RETRY)
1286 return;
1287 if (fc_fcp_lock_pkt(fsp))
1288 return;
1289 fsp->timer.function = fc_lun_reset_send;
1290 fc_fcp_timer_set(fsp, get_fsp_rec_tov(fsp));
1291 fc_fcp_unlock_pkt(fsp);
1292 }
1293 }
1294
1295
1296
1297
1298
1299
1300
1301
1302
1303 static int fc_lun_reset(struct fc_lport *lport, struct fc_fcp_pkt *fsp,
1304 unsigned int id, unsigned int lun)
1305 {
1306 int rc;
1307
1308 fsp->cdb_cmd.fc_dl = htonl(fsp->data_len);
1309 fsp->cdb_cmd.fc_tm_flags = FCP_TMF_LUN_RESET;
1310 int_to_scsilun(lun, &fsp->cdb_cmd.fc_lun);
1311
1312 fsp->wait_for_comp = 1;
1313 init_completion(&fsp->tm_done);
1314
1315 fc_lun_reset_send(&fsp->timer);
1316
1317
1318
1319
1320
1321 rc = wait_for_completion_timeout(&fsp->tm_done, FC_SCSI_TM_TOV);
1322
1323 spin_lock_bh(&fsp->scsi_pkt_lock);
1324 fsp->state |= FC_SRB_COMPL;
1325 spin_unlock_bh(&fsp->scsi_pkt_lock);
1326
1327 del_timer_sync(&fsp->timer);
1328
1329 spin_lock_bh(&fsp->scsi_pkt_lock);
1330 if (fsp->seq_ptr) {
1331 fc_exch_done(fsp->seq_ptr);
1332 fsp->seq_ptr = NULL;
1333 }
1334 fsp->wait_for_comp = 0;
1335 spin_unlock_bh(&fsp->scsi_pkt_lock);
1336
1337 if (!rc) {
1338 FC_SCSI_DBG(lport, "lun reset failed\n");
1339 return FAILED;
1340 }
1341
1342
1343 if (fsp->cdb_status != FCP_TMF_CMPL)
1344 return FAILED;
1345
1346 FC_SCSI_DBG(lport, "lun reset to lun %u completed\n", lun);
1347 fc_fcp_cleanup_each_cmd(lport, id, lun, FC_CMD_ABORTED);
1348 return SUCCESS;
1349 }
1350
1351
1352
1353
1354
1355
1356
1357 static void fc_tm_done(struct fc_seq *seq, struct fc_frame *fp, void *arg)
1358 {
1359 struct fc_fcp_pkt *fsp = arg;
1360 struct fc_frame_header *fh;
1361
1362 if (IS_ERR(fp)) {
1363
1364
1365
1366
1367
1368
1369 return;
1370 }
1371
1372 if (fc_fcp_lock_pkt(fsp))
1373 goto out;
1374
1375
1376
1377
1378 if (!fsp->seq_ptr || !fsp->wait_for_comp)
1379 goto out_unlock;
1380
1381 fh = fc_frame_header_get(fp);
1382 if (fh->fh_type != FC_TYPE_BLS)
1383 fc_fcp_resp(fsp, fp);
1384 fsp->seq_ptr = NULL;
1385 fc_exch_done(seq);
1386 out_unlock:
1387 fc_fcp_unlock_pkt(fsp);
1388 out:
1389 fc_frame_free(fp);
1390 }
1391
1392
1393
1394
1395
1396 static void fc_fcp_cleanup(struct fc_lport *lport)
1397 {
1398 fc_fcp_cleanup_each_cmd(lport, -1, -1, FC_ERROR);
1399 }
1400
1401
1402
1403
1404
1405
1406
1407
1408
1409
1410
1411
1412 static void fc_fcp_timeout(struct timer_list *t)
1413 {
1414 struct fc_fcp_pkt *fsp = from_timer(fsp, t, timer);
1415 struct fc_rport *rport = fsp->rport;
1416 struct fc_rport_libfc_priv *rpriv = rport->dd_data;
1417
1418 if (fc_fcp_lock_pkt(fsp))
1419 return;
1420
1421 if (fsp->cdb_cmd.fc_tm_flags)
1422 goto unlock;
1423
1424 if (fsp->lp->qfull) {
1425 FC_FCP_DBG(fsp, "fcp timeout, resetting timer delay %d\n",
1426 fsp->timer_delay);
1427 fsp->timer.function = fc_fcp_timeout;
1428 fc_fcp_timer_set(fsp, fsp->timer_delay);
1429 goto unlock;
1430 }
1431 FC_FCP_DBG(fsp, "fcp timeout, delay %d flags %x state %x\n",
1432 fsp->timer_delay, rpriv->flags, fsp->state);
1433 fsp->state |= FC_SRB_FCP_PROCESSING_TMO;
1434
1435 if (rpriv->flags & FC_RP_FLAGS_REC_SUPPORTED)
1436 fc_fcp_rec(fsp);
1437 else if (fsp->state & FC_SRB_RCV_STATUS)
1438 fc_fcp_complete_locked(fsp);
1439 else
1440 fc_fcp_recovery(fsp, FC_TIMED_OUT);
1441 fsp->state &= ~FC_SRB_FCP_PROCESSING_TMO;
1442 unlock:
1443 fc_fcp_unlock_pkt(fsp);
1444 }
1445
1446
1447
1448
1449
1450 static void fc_fcp_rec(struct fc_fcp_pkt *fsp)
1451 {
1452 struct fc_lport *lport;
1453 struct fc_frame *fp;
1454 struct fc_rport *rport;
1455 struct fc_rport_libfc_priv *rpriv;
1456
1457 lport = fsp->lp;
1458 rport = fsp->rport;
1459 rpriv = rport->dd_data;
1460 if (!fsp->seq_ptr || rpriv->rp_state != RPORT_ST_READY) {
1461 fsp->status_code = FC_HRD_ERROR;
1462 fsp->io_status = 0;
1463 fc_fcp_complete_locked(fsp);
1464 return;
1465 }
1466
1467 fp = fc_fcp_frame_alloc(lport, sizeof(struct fc_els_rec));
1468 if (!fp)
1469 goto retry;
1470
1471 fr_seq(fp) = fsp->seq_ptr;
1472 fc_fill_fc_hdr(fp, FC_RCTL_ELS_REQ, rport->port_id,
1473 rpriv->local_port->port_id, FC_TYPE_ELS,
1474 FC_FCTL_REQ, 0);
1475 if (lport->tt.elsct_send(lport, rport->port_id, fp, ELS_REC,
1476 fc_fcp_rec_resp, fsp,
1477 2 * lport->r_a_tov)) {
1478 fc_fcp_pkt_hold(fsp);
1479 return;
1480 }
1481 retry:
1482 if (fsp->recov_retry++ < FC_MAX_RECOV_RETRY)
1483 fc_fcp_timer_set(fsp, get_fsp_rec_tov(fsp));
1484 else
1485 fc_fcp_recovery(fsp, FC_TIMED_OUT);
1486 }
1487
1488
1489
1490
1491
1492
1493
1494
1495
1496
1497
1498
1499 static void fc_fcp_rec_resp(struct fc_seq *seq, struct fc_frame *fp, void *arg)
1500 {
1501 struct fc_fcp_pkt *fsp = (struct fc_fcp_pkt *)arg;
1502 struct fc_els_rec_acc *recp;
1503 struct fc_els_ls_rjt *rjt;
1504 u32 e_stat;
1505 u8 opcode;
1506 u32 offset;
1507 enum dma_data_direction data_dir;
1508 enum fc_rctl r_ctl;
1509 struct fc_rport_libfc_priv *rpriv;
1510
1511 if (IS_ERR(fp)) {
1512 fc_fcp_rec_error(fsp, fp);
1513 return;
1514 }
1515
1516 if (fc_fcp_lock_pkt(fsp))
1517 goto out;
1518
1519 fsp->recov_retry = 0;
1520 opcode = fc_frame_payload_op(fp);
1521 if (opcode == ELS_LS_RJT) {
1522 rjt = fc_frame_payload_get(fp, sizeof(*rjt));
1523 switch (rjt->er_reason) {
1524 default:
1525 FC_FCP_DBG(fsp,
1526 "device %x invalid REC reject %d/%d\n",
1527 fsp->rport->port_id, rjt->er_reason,
1528 rjt->er_explan);
1529 fallthrough;
1530 case ELS_RJT_UNSUP:
1531 FC_FCP_DBG(fsp, "device does not support REC\n");
1532 rpriv = fsp->rport->dd_data;
1533
1534
1535
1536
1537
1538 rpriv->flags &= ~FC_RP_FLAGS_REC_SUPPORTED;
1539 break;
1540 case ELS_RJT_LOGIC:
1541 case ELS_RJT_UNAB:
1542 FC_FCP_DBG(fsp, "device %x REC reject %d/%d\n",
1543 fsp->rport->port_id, rjt->er_reason,
1544 rjt->er_explan);
1545
1546
1547
1548
1549
1550
1551 if (rjt->er_explan == ELS_EXPL_OXID_RXID) {
1552 struct fc_exch *ep = fc_seq_exch(fsp->seq_ptr);
1553 ep->state |= FC_EX_QUARANTINE;
1554 fsp->state |= FC_SRB_ABORTED;
1555 fc_fcp_retry_cmd(fsp, FC_TRANS_RESET);
1556 break;
1557 }
1558 fc_fcp_recovery(fsp, FC_TRANS_RESET);
1559 break;
1560 }
1561 } else if (opcode == ELS_LS_ACC) {
1562 if (fsp->state & FC_SRB_ABORTED)
1563 goto unlock_out;
1564
1565 data_dir = fsp->cmd->sc_data_direction;
1566 recp = fc_frame_payload_get(fp, sizeof(*recp));
1567 offset = ntohl(recp->reca_fc4value);
1568 e_stat = ntohl(recp->reca_e_stat);
1569
1570 if (e_stat & ESB_ST_COMPLETE) {
1571
1572
1573
1574
1575
1576
1577
1578
1579
1580
1581
1582
1583
1584
1585
1586 if (data_dir == DMA_TO_DEVICE) {
1587 r_ctl = FC_RCTL_DD_CMD_STATUS;
1588 } else if (fsp->xfer_contig_end == offset) {
1589 r_ctl = FC_RCTL_DD_CMD_STATUS;
1590 } else {
1591 offset = fsp->xfer_contig_end;
1592 r_ctl = FC_RCTL_DD_SOL_DATA;
1593 }
1594 fc_fcp_srr(fsp, r_ctl, offset);
1595 } else if (e_stat & ESB_ST_SEQ_INIT) {
1596
1597
1598
1599
1600 fc_fcp_timer_set(fsp, get_fsp_rec_tov(fsp));
1601 } else {
1602
1603
1604
1605
1606
1607
1608
1609
1610
1611
1612
1613
1614
1615
1616
1617
1618 r_ctl = FC_RCTL_DD_SOL_DATA;
1619 if (data_dir == DMA_TO_DEVICE) {
1620 r_ctl = FC_RCTL_DD_CMD_STATUS;
1621 if (offset < fsp->data_len)
1622 r_ctl = FC_RCTL_DD_DATA_DESC;
1623 } else if (offset == fsp->xfer_contig_end) {
1624 r_ctl = FC_RCTL_DD_CMD_STATUS;
1625 } else if (fsp->xfer_contig_end < offset) {
1626 offset = fsp->xfer_contig_end;
1627 }
1628 fc_fcp_srr(fsp, r_ctl, offset);
1629 }
1630 }
1631 unlock_out:
1632 fc_fcp_unlock_pkt(fsp);
1633 out:
1634 fc_fcp_pkt_release(fsp);
1635 fc_frame_free(fp);
1636 }
1637
1638
1639
1640
1641
1642
1643 static void fc_fcp_rec_error(struct fc_fcp_pkt *fsp, struct fc_frame *fp)
1644 {
1645 int error = PTR_ERR(fp);
1646
1647 if (fc_fcp_lock_pkt(fsp))
1648 goto out;
1649
1650 switch (error) {
1651 case -FC_EX_CLOSED:
1652 FC_FCP_DBG(fsp, "REC %p fid %6.6x exchange closed\n",
1653 fsp, fsp->rport->port_id);
1654 fc_fcp_retry_cmd(fsp, FC_ERROR);
1655 break;
1656
1657 default:
1658 FC_FCP_DBG(fsp, "REC %p fid %6.6x error unexpected error %d\n",
1659 fsp, fsp->rport->port_id, error);
1660 fsp->status_code = FC_CMD_PLOGO;
1661 fallthrough;
1662
1663 case -FC_EX_TIMEOUT:
1664
1665
1666
1667
1668 FC_FCP_DBG(fsp, "REC %p fid %6.6x exchange timeout retry %d/%d\n",
1669 fsp, fsp->rport->port_id, fsp->recov_retry,
1670 FC_MAX_RECOV_RETRY);
1671 if (fsp->recov_retry++ < FC_MAX_RECOV_RETRY)
1672 fc_fcp_rec(fsp);
1673 else
1674 fc_fcp_recovery(fsp, FC_ERROR);
1675 break;
1676 }
1677 fc_fcp_unlock_pkt(fsp);
1678 out:
1679 fc_fcp_pkt_release(fsp);
1680 }
1681
1682
1683
1684
1685
1686
1687 static void fc_fcp_recovery(struct fc_fcp_pkt *fsp, u8 code)
1688 {
1689 FC_FCP_DBG(fsp, "start recovery code %x\n", code);
1690 fsp->status_code = code;
1691 fsp->cdb_status = 0;
1692 fsp->io_status = 0;
1693
1694
1695
1696
1697 fc_fcp_send_abort(fsp);
1698 }
1699
1700
1701
1702
1703
1704
1705
1706
1707
1708 static void fc_fcp_srr(struct fc_fcp_pkt *fsp, enum fc_rctl r_ctl, u32 offset)
1709 {
1710 struct fc_lport *lport = fsp->lp;
1711 struct fc_rport *rport;
1712 struct fc_rport_libfc_priv *rpriv;
1713 struct fc_exch *ep = fc_seq_exch(fsp->seq_ptr);
1714 struct fc_seq *seq;
1715 struct fcp_srr *srr;
1716 struct fc_frame *fp;
1717
1718 rport = fsp->rport;
1719 rpriv = rport->dd_data;
1720
1721 if (!(rpriv->flags & FC_RP_FLAGS_RETRY) ||
1722 rpriv->rp_state != RPORT_ST_READY)
1723 goto retry;
1724 fp = fc_fcp_frame_alloc(lport, sizeof(*srr));
1725 if (!fp)
1726 goto retry;
1727
1728 srr = fc_frame_payload_get(fp, sizeof(*srr));
1729 memset(srr, 0, sizeof(*srr));
1730 srr->srr_op = ELS_SRR;
1731 srr->srr_ox_id = htons(ep->oxid);
1732 srr->srr_rx_id = htons(ep->rxid);
1733 srr->srr_r_ctl = r_ctl;
1734 srr->srr_rel_off = htonl(offset);
1735
1736 fc_fill_fc_hdr(fp, FC_RCTL_ELS4_REQ, rport->port_id,
1737 rpriv->local_port->port_id, FC_TYPE_FCP,
1738 FC_FCTL_REQ, 0);
1739
1740 seq = fc_exch_seq_send(lport, fp, fc_fcp_srr_resp,
1741 fc_fcp_pkt_destroy,
1742 fsp, get_fsp_rec_tov(fsp));
1743 if (!seq)
1744 goto retry;
1745
1746 fsp->recov_seq = seq;
1747 fsp->xfer_len = offset;
1748 fsp->xfer_contig_end = offset;
1749 fsp->state &= ~FC_SRB_RCV_STATUS;
1750 fc_fcp_pkt_hold(fsp);
1751 return;
1752 retry:
1753 fc_fcp_retry_cmd(fsp, FC_TRANS_RESET);
1754 }
1755
1756
1757
1758
1759
1760
1761
1762 static void fc_fcp_srr_resp(struct fc_seq *seq, struct fc_frame *fp, void *arg)
1763 {
1764 struct fc_fcp_pkt *fsp = arg;
1765 struct fc_frame_header *fh;
1766
1767 if (IS_ERR(fp)) {
1768 fc_fcp_srr_error(fsp, fp);
1769 return;
1770 }
1771
1772 if (fc_fcp_lock_pkt(fsp))
1773 goto out;
1774
1775 fh = fc_frame_header_get(fp);
1776
1777
1778
1779
1780
1781
1782
1783 if (fh->fh_type == FC_TYPE_BLS) {
1784 fc_fcp_unlock_pkt(fsp);
1785 return;
1786 }
1787
1788 switch (fc_frame_payload_op(fp)) {
1789 case ELS_LS_ACC:
1790 fsp->recov_retry = 0;
1791 fc_fcp_timer_set(fsp, get_fsp_rec_tov(fsp));
1792 break;
1793 case ELS_LS_RJT:
1794 default:
1795 fc_fcp_recovery(fsp, FC_ERROR);
1796 break;
1797 }
1798 fc_fcp_unlock_pkt(fsp);
1799 out:
1800 fc_exch_done(seq);
1801 fc_frame_free(fp);
1802 }
1803
1804
1805
1806
1807
1808
1809 static void fc_fcp_srr_error(struct fc_fcp_pkt *fsp, struct fc_frame *fp)
1810 {
1811 if (fc_fcp_lock_pkt(fsp))
1812 goto out;
1813 switch (PTR_ERR(fp)) {
1814 case -FC_EX_TIMEOUT:
1815 FC_FCP_DBG(fsp, "SRR timeout, retries %d\n", fsp->recov_retry);
1816 if (fsp->recov_retry++ < FC_MAX_RECOV_RETRY)
1817 fc_fcp_rec(fsp);
1818 else
1819 fc_fcp_recovery(fsp, FC_TIMED_OUT);
1820 break;
1821 case -FC_EX_CLOSED:
1822 FC_FCP_DBG(fsp, "SRR error, exchange closed\n");
1823 fallthrough;
1824 default:
1825 fc_fcp_retry_cmd(fsp, FC_ERROR);
1826 break;
1827 }
1828 fc_fcp_unlock_pkt(fsp);
1829 out:
1830 fc_exch_done(fsp->recov_seq);
1831 }
1832
1833
1834
1835
1836
1837 static inline int fc_fcp_lport_queue_ready(struct fc_lport *lport)
1838 {
1839
1840 return (lport->state == LPORT_ST_READY) &&
1841 lport->link_up && !lport->qfull;
1842 }
1843
1844
1845
1846
1847
1848
1849
1850
1851 int fc_queuecommand(struct Scsi_Host *shost, struct scsi_cmnd *sc_cmd)
1852 {
1853 struct fc_lport *lport = shost_priv(shost);
1854 struct fc_rport *rport = starget_to_rport(scsi_target(sc_cmd->device));
1855 struct fc_fcp_pkt *fsp;
1856 int rval;
1857 int rc = 0;
1858
1859 rval = fc_remote_port_chkready(rport);
1860 if (rval) {
1861 sc_cmd->result = rval;
1862 scsi_done(sc_cmd);
1863 return 0;
1864 }
1865
1866 if (!*(struct fc_remote_port **)rport->dd_data) {
1867
1868
1869
1870
1871 sc_cmd->result = DID_IMM_RETRY << 16;
1872 scsi_done(sc_cmd);
1873 goto out;
1874 }
1875
1876 if (!fc_fcp_lport_queue_ready(lport)) {
1877 if (lport->qfull) {
1878 if (fc_fcp_can_queue_ramp_down(lport))
1879 shost_printk(KERN_ERR, lport->host,
1880 "libfc: queue full, "
1881 "reducing can_queue to %d.\n",
1882 lport->host->can_queue);
1883 }
1884 rc = SCSI_MLQUEUE_HOST_BUSY;
1885 goto out;
1886 }
1887
1888 fsp = fc_fcp_pkt_alloc(lport, GFP_ATOMIC);
1889 if (fsp == NULL) {
1890 rc = SCSI_MLQUEUE_HOST_BUSY;
1891 goto out;
1892 }
1893
1894
1895
1896
1897 fsp->cmd = sc_cmd;
1898 fsp->rport = rport;
1899
1900
1901
1902
1903 fsp->data_len = scsi_bufflen(sc_cmd);
1904 fsp->xfer_len = 0;
1905
1906
1907
1908
1909 if (sc_cmd->sc_data_direction == DMA_FROM_DEVICE) {
1910 fsp->req_flags = FC_SRB_READ;
1911 this_cpu_inc(lport->stats->InputRequests);
1912 this_cpu_add(lport->stats->InputBytes, fsp->data_len);
1913 } else if (sc_cmd->sc_data_direction == DMA_TO_DEVICE) {
1914 fsp->req_flags = FC_SRB_WRITE;
1915 this_cpu_inc(lport->stats->OutputRequests);
1916 this_cpu_add(lport->stats->OutputBytes, fsp->data_len);
1917 } else {
1918 fsp->req_flags = 0;
1919 this_cpu_inc(lport->stats->ControlRequests);
1920 }
1921
1922
1923
1924
1925
1926
1927 rval = fc_fcp_pkt_send(lport, fsp);
1928 if (rval != 0) {
1929 fsp->state = FC_SRB_FREE;
1930 fc_fcp_pkt_release(fsp);
1931 rc = SCSI_MLQUEUE_HOST_BUSY;
1932 }
1933 out:
1934 return rc;
1935 }
1936 EXPORT_SYMBOL(fc_queuecommand);
1937
1938
1939
1940
1941
1942
1943
1944
1945 static void fc_io_compl(struct fc_fcp_pkt *fsp)
1946 {
1947 struct fc_fcp_internal *si;
1948 struct scsi_cmnd *sc_cmd;
1949 struct fc_lport *lport;
1950 unsigned long flags;
1951
1952
1953 fc_fcp_ddp_done(fsp);
1954
1955 fsp->state |= FC_SRB_COMPL;
1956 if (!(fsp->state & FC_SRB_FCP_PROCESSING_TMO)) {
1957 spin_unlock_bh(&fsp->scsi_pkt_lock);
1958 del_timer_sync(&fsp->timer);
1959 spin_lock_bh(&fsp->scsi_pkt_lock);
1960 }
1961
1962 lport = fsp->lp;
1963 si = fc_get_scsi_internal(lport);
1964
1965
1966
1967
1968
1969 if (si->last_can_queue_ramp_down_time)
1970 fc_fcp_can_queue_ramp_up(lport);
1971
1972 sc_cmd = fsp->cmd;
1973 libfc_priv(sc_cmd)->status = fsp->cdb_status;
1974 switch (fsp->status_code) {
1975 case FC_COMPLETE:
1976 if (fsp->cdb_status == 0) {
1977
1978
1979
1980 sc_cmd->result = DID_OK << 16;
1981 if (fsp->scsi_resid)
1982 libfc_priv(sc_cmd)->resid_len = fsp->scsi_resid;
1983 } else {
1984
1985
1986
1987
1988 sc_cmd->result = (DID_OK << 16) | fsp->cdb_status;
1989 }
1990 break;
1991 case FC_ERROR:
1992 FC_FCP_DBG(fsp, "Returning DID_ERROR to scsi-ml "
1993 "due to FC_ERROR\n");
1994 sc_cmd->result = DID_ERROR << 16;
1995 break;
1996 case FC_DATA_UNDRUN:
1997 if ((fsp->cdb_status == 0) && !(fsp->req_flags & FC_SRB_READ)) {
1998
1999
2000
2001
2002 if (fsp->state & FC_SRB_RCV_STATUS) {
2003 sc_cmd->result = DID_OK << 16;
2004 } else {
2005 FC_FCP_DBG(fsp, "Returning DID_ERROR to scsi-ml"
2006 " due to FC_DATA_UNDRUN (trans)\n");
2007 sc_cmd->result = DID_ERROR << 16;
2008 }
2009 } else {
2010
2011
2012
2013 FC_FCP_DBG(fsp, "Returning DID_ERROR to scsi-ml "
2014 "due to FC_DATA_UNDRUN (scsi)\n");
2015 libfc_priv(sc_cmd)->resid_len = fsp->scsi_resid;
2016 sc_cmd->result = (DID_ERROR << 16) | fsp->cdb_status;
2017 }
2018 break;
2019 case FC_DATA_OVRRUN:
2020
2021
2022
2023 FC_FCP_DBG(fsp, "Returning DID_ERROR to scsi-ml "
2024 "due to FC_DATA_OVRRUN\n");
2025 sc_cmd->result = (DID_ERROR << 16) | fsp->cdb_status;
2026 break;
2027 case FC_CMD_ABORTED:
2028 if (host_byte(sc_cmd->result) == DID_TIME_OUT)
2029 FC_FCP_DBG(fsp, "Returning DID_TIME_OUT to scsi-ml "
2030 "due to FC_CMD_ABORTED\n");
2031 else {
2032 FC_FCP_DBG(fsp, "Returning DID_ERROR to scsi-ml "
2033 "due to FC_CMD_ABORTED\n");
2034 set_host_byte(sc_cmd, DID_ERROR);
2035 }
2036 sc_cmd->result |= fsp->io_status;
2037 break;
2038 case FC_CMD_RESET:
2039 FC_FCP_DBG(fsp, "Returning DID_RESET to scsi-ml "
2040 "due to FC_CMD_RESET\n");
2041 sc_cmd->result = (DID_RESET << 16);
2042 break;
2043 case FC_TRANS_RESET:
2044 FC_FCP_DBG(fsp, "Returning DID_SOFT_ERROR to scsi-ml "
2045 "due to FC_TRANS_RESET\n");
2046 sc_cmd->result = (DID_SOFT_ERROR << 16);
2047 break;
2048 case FC_HRD_ERROR:
2049 FC_FCP_DBG(fsp, "Returning DID_NO_CONNECT to scsi-ml "
2050 "due to FC_HRD_ERROR\n");
2051 sc_cmd->result = (DID_NO_CONNECT << 16);
2052 break;
2053 case FC_CRC_ERROR:
2054 FC_FCP_DBG(fsp, "Returning DID_PARITY to scsi-ml "
2055 "due to FC_CRC_ERROR\n");
2056 sc_cmd->result = (DID_PARITY << 16);
2057 break;
2058 case FC_TIMED_OUT:
2059 FC_FCP_DBG(fsp, "Returning DID_BUS_BUSY to scsi-ml "
2060 "due to FC_TIMED_OUT\n");
2061 sc_cmd->result = (DID_BUS_BUSY << 16) | fsp->io_status;
2062 break;
2063 default:
2064 FC_FCP_DBG(fsp, "Returning DID_ERROR to scsi-ml "
2065 "due to unknown error\n");
2066 sc_cmd->result = (DID_ERROR << 16);
2067 break;
2068 }
2069
2070 if (lport->state != LPORT_ST_READY && fsp->status_code != FC_COMPLETE)
2071 sc_cmd->result = (DID_TRANSPORT_DISRUPTED << 16);
2072
2073 spin_lock_irqsave(&si->scsi_queue_lock, flags);
2074 list_del(&fsp->list);
2075 libfc_priv(sc_cmd)->fsp = NULL;
2076 spin_unlock_irqrestore(&si->scsi_queue_lock, flags);
2077 scsi_done(sc_cmd);
2078
2079
2080 fc_fcp_pkt_release(fsp);
2081 }
2082
2083
2084
2085
2086
2087
2088
2089
2090 int fc_eh_abort(struct scsi_cmnd *sc_cmd)
2091 {
2092 struct fc_fcp_pkt *fsp;
2093 struct fc_lport *lport;
2094 struct fc_fcp_internal *si;
2095 int rc = FAILED;
2096 unsigned long flags;
2097 int rval;
2098
2099 rval = fc_block_scsi_eh(sc_cmd);
2100 if (rval)
2101 return rval;
2102
2103 lport = shost_priv(sc_cmd->device->host);
2104 if (lport->state != LPORT_ST_READY)
2105 return rc;
2106 else if (!lport->link_up)
2107 return rc;
2108
2109 si = fc_get_scsi_internal(lport);
2110 spin_lock_irqsave(&si->scsi_queue_lock, flags);
2111 fsp = libfc_priv(sc_cmd)->fsp;
2112 if (!fsp) {
2113
2114 spin_unlock_irqrestore(&si->scsi_queue_lock, flags);
2115 return SUCCESS;
2116 }
2117
2118 fc_fcp_pkt_hold(fsp);
2119 spin_unlock_irqrestore(&si->scsi_queue_lock, flags);
2120
2121 if (fc_fcp_lock_pkt(fsp)) {
2122
2123 rc = SUCCESS;
2124 goto release_pkt;
2125 }
2126
2127 rc = fc_fcp_pkt_abort(fsp);
2128 fc_fcp_unlock_pkt(fsp);
2129
2130 release_pkt:
2131 fc_fcp_pkt_release(fsp);
2132 return rc;
2133 }
2134 EXPORT_SYMBOL(fc_eh_abort);
2135
2136
2137
2138
2139
2140
2141
2142
2143 int fc_eh_device_reset(struct scsi_cmnd *sc_cmd)
2144 {
2145 struct fc_lport *lport;
2146 struct fc_fcp_pkt *fsp;
2147 struct fc_rport *rport = starget_to_rport(scsi_target(sc_cmd->device));
2148 int rc = FAILED;
2149 int rval;
2150
2151 rval = fc_block_scsi_eh(sc_cmd);
2152 if (rval)
2153 return rval;
2154
2155 lport = shost_priv(sc_cmd->device->host);
2156
2157 if (lport->state != LPORT_ST_READY)
2158 return rc;
2159
2160 FC_SCSI_DBG(lport, "Resetting rport (%6.6x)\n", rport->port_id);
2161
2162 fsp = fc_fcp_pkt_alloc(lport, GFP_NOIO);
2163 if (fsp == NULL) {
2164 printk(KERN_WARNING "libfc: could not allocate scsi_pkt\n");
2165 goto out;
2166 }
2167
2168
2169
2170
2171
2172
2173 fsp->rport = rport;
2174
2175
2176
2177
2178 rc = fc_lun_reset(lport, fsp, scmd_id(sc_cmd), sc_cmd->device->lun);
2179 fsp->state = FC_SRB_FREE;
2180 fc_fcp_pkt_release(fsp);
2181
2182 out:
2183 return rc;
2184 }
2185 EXPORT_SYMBOL(fc_eh_device_reset);
2186
2187
2188
2189
2190
2191 int fc_eh_host_reset(struct scsi_cmnd *sc_cmd)
2192 {
2193 struct Scsi_Host *shost = sc_cmd->device->host;
2194 struct fc_lport *lport = shost_priv(shost);
2195 unsigned long wait_tmo;
2196
2197 FC_SCSI_DBG(lport, "Resetting host\n");
2198
2199 fc_lport_reset(lport);
2200 wait_tmo = jiffies + FC_HOST_RESET_TIMEOUT;
2201 while (!fc_fcp_lport_queue_ready(lport) && time_before(jiffies,
2202 wait_tmo))
2203 msleep(1000);
2204
2205 if (fc_fcp_lport_queue_ready(lport)) {
2206 shost_printk(KERN_INFO, shost, "libfc: Host reset succeeded "
2207 "on port (%6.6x)\n", lport->port_id);
2208 return SUCCESS;
2209 } else {
2210 shost_printk(KERN_INFO, shost, "libfc: Host reset failed, "
2211 "port (%6.6x) is not ready.\n",
2212 lport->port_id);
2213 return FAILED;
2214 }
2215 }
2216 EXPORT_SYMBOL(fc_eh_host_reset);
2217
2218
2219
2220
2221
2222
2223
2224
2225 int fc_slave_alloc(struct scsi_device *sdev)
2226 {
2227 struct fc_rport *rport = starget_to_rport(scsi_target(sdev));
2228
2229 if (!rport || fc_remote_port_chkready(rport))
2230 return -ENXIO;
2231
2232 scsi_change_queue_depth(sdev, FC_FCP_DFLT_QUEUE_DEPTH);
2233 return 0;
2234 }
2235 EXPORT_SYMBOL(fc_slave_alloc);
2236
2237
2238
2239
2240
2241 void fc_fcp_destroy(struct fc_lport *lport)
2242 {
2243 struct fc_fcp_internal *si = fc_get_scsi_internal(lport);
2244
2245 if (!list_empty(&si->scsi_pkt_queue))
2246 printk(KERN_ERR "libfc: Leaked SCSI packets when destroying "
2247 "port (%6.6x)\n", lport->port_id);
2248
2249 mempool_destroy(si->scsi_pkt_pool);
2250 kfree(si);
2251 lport->scsi_priv = NULL;
2252 }
2253 EXPORT_SYMBOL(fc_fcp_destroy);
2254
2255 int fc_setup_fcp(void)
2256 {
2257 int rc = 0;
2258
2259 scsi_pkt_cachep = kmem_cache_create("libfc_fcp_pkt",
2260 sizeof(struct fc_fcp_pkt),
2261 0, SLAB_HWCACHE_ALIGN, NULL);
2262 if (!scsi_pkt_cachep) {
2263 printk(KERN_ERR "libfc: Unable to allocate SRB cache, "
2264 "module load failed!");
2265 rc = -ENOMEM;
2266 }
2267
2268 return rc;
2269 }
2270
2271 void fc_destroy_fcp(void)
2272 {
2273 kmem_cache_destroy(scsi_pkt_cachep);
2274 }
2275
2276
2277
2278
2279
2280 int fc_fcp_init(struct fc_lport *lport)
2281 {
2282 int rc;
2283 struct fc_fcp_internal *si;
2284
2285 if (!lport->tt.fcp_cmd_send)
2286 lport->tt.fcp_cmd_send = fc_fcp_cmd_send;
2287
2288 if (!lport->tt.fcp_cleanup)
2289 lport->tt.fcp_cleanup = fc_fcp_cleanup;
2290
2291 if (!lport->tt.fcp_abort_io)
2292 lport->tt.fcp_abort_io = fc_fcp_abort_io;
2293
2294 si = kzalloc(sizeof(struct fc_fcp_internal), GFP_KERNEL);
2295 if (!si)
2296 return -ENOMEM;
2297 lport->scsi_priv = si;
2298 si->max_can_queue = lport->host->can_queue;
2299 INIT_LIST_HEAD(&si->scsi_pkt_queue);
2300 spin_lock_init(&si->scsi_queue_lock);
2301
2302 si->scsi_pkt_pool = mempool_create_slab_pool(2, scsi_pkt_cachep);
2303 if (!si->scsi_pkt_pool) {
2304 rc = -ENOMEM;
2305 goto free_internal;
2306 }
2307 return 0;
2308
2309 free_internal:
2310 kfree(si);
2311 return rc;
2312 }
2313 EXPORT_SYMBOL(fc_fcp_init);