Lines Matching defs:cp

46 static void sym_complete_error (struct sym_hcb *np, struct sym_ccb *cp);
47 static void sym_complete_ok (struct sym_hcb *np, struct sym_ccb *cp);
48 static int sym_compute_residual(struct sym_hcb *np, struct sym_ccb *cp);
60 static void sym_print_msg(struct sym_ccb *cp, char *label, u_char *msg)
62 sym_print_addr(cp->cmd, "%s: ", label);
1406 static int sym_prepare_nego(struct sym_hcb *np, struct sym_ccb *cp, u_char *msgptr)
1408 struct sym_tcb *tp = &np->target[cp->target];
1449 cp->nego_status = nego;
1452 tp->nego_cp = cp; /* Keep track a nego will be performed */
1454 sym_print_nego_msg(np, cp->target,
1467 void sym_put_start_queue(struct sym_hcb *np, struct sym_ccb *cp)
1486 np->last_cp = cp;
1495 cp->host_xflags |= HX_DMAP_DIRTY;
1507 np->squeue [np->squeueput] = cpu_to_scr(cp->ccb_ba);
1512 scmd_printk(KERN_DEBUG, cp->cmd, "queuepos=%d\n",
1530 struct sym_ccb *cp;
1546 cp = sym_que_entry(qp, struct sym_ccb, link2_ccbq);
1547 if (cp->tag != NO_TAG) {
1553 lp->itlq_tbl[cp->tag] = cpu_to_scr(cp->ccb_ba);
1562 lp->head.itl_task_sa = cpu_to_scr(cp->ccb_ba);
1567 cp->started = 1;
1569 sym_put_start_queue(np, cp);
1583 struct sym_ccb *cp;
1599 cp = sym_ccb_from_dsa(np, dsa);
1600 if (cp) {
1602 sym_complete_ok (np, cp);
1631 struct sym_ccb *cp;
1635 cp = sym_que_entry(qp, struct sym_ccb, link_ccbq);
1636 sym_insque_tail(&cp->link_ccbq, &np->busy_ccbq);
1638 if (cp->host_status == HS_WAIT)
1640 cmd = cp->cmd;
1645 struct sym_tcb *tp = &np->target[cp->target];
1646 struct sym_lcb *lp = sym_lp(tp, cp->lun);
1648 sym_remque(&cp->link2_ccbq);
1649 sym_insque_tail(&cp->link2_ccbq,
1651 if (cp->started) {
1652 if (cp->tag != NO_TAG)
1658 cp->started = 0;
1662 sym_free_ccb(np, cp);
2023 struct sym_ccb *cp;
2024 cp = sym_que_entry(qp, struct sym_ccb, link_ccbq);
2025 if (cp->target != target)
2027 cp->phys.select.sel_scntl3 = tp->head.wval;
2028 cp->phys.select.sel_sxfer = tp->head.sval;
2030 cp->phys.select.sel_scntl4 = tp->head.uval;
2177 struct sym_ccb *cp = sym_ccb_from_dsa(np, dsa);
2200 if (cp) {
2201 cp->host_status = hsts;
2306 struct sym_ccb *cp = sym_ccb_from_dsa(np, dsa);
2324 if (!cp)
2338 cp->xerr_status |= XE_PARITY_ERR;
2361 sym_set_script_dp (np, cp, dsp);
2401 struct sym_ccb *cp;
2412 * locate matching cp if any.
2414 cp = sym_ccb_from_dsa(np, dsa);
2457 if (cp && (cp->phys.select.sel_scntl3 & EWS)) {
2500 cp, (unsigned)dsp, (unsigned)nxtdsp, vdsp, cmd);
2509 if (!cp) {
2521 tblp = (u32 *) ((char*) &cp->phys + oadr);
2543 sym_print_addr(cp->cmd,
2554 sym_print_addr(cp->cmd,
2574 nxtdsp = scr_to_cpu(cp->phys.pm0.ret);
2576 nxtdsp = scr_to_cpu(cp->phys.pm1.ret);
2583 pm = &cp->phys.pm0;
2587 pm = &cp->phys.pm1;
2609 if ((cmd & 7) == 1 && cp && (cp->phys.select.sel_scntl3 & EWS) &&
2619 cp->phys.wresid.addr = cpu_to_scr(tmp);
2622 cp->phys.wresid.size = cpu_to_scr((tmp&0xff000000) | 1);
2640 sym_print_addr(cp->cmd, "PM %x %x %x / %x %x %x.\n",
2650 sym_set_script_dp (np, cp, newcmd);
2702 if (cp->tag != NO_TAG && olen - rest <= 3) {
2703 cp->host_status = HS_BUSY;
2704 np->msgout[0] = IDENTIFY(0, cp->lun);
2715 struct scsi_device *dev = cp->cmd->device;
2968 struct sym_ccb *cp;
2981 cp = sym_ccb_from_dsa(np, scr_to_cpu(np->squeue[i]));
2982 assert(cp);
2985 cp->host_flags &= ~HF_HINT_IARB;
2987 if ((target == -1 || cp->target == target) &&
2988 (lun == -1 || cp->lun == lun) &&
2989 (task == -1 || cp->tag == task)) {
2991 sym_set_cam_status(cp->cmd, DID_SOFT_ERROR);
2993 sym_set_cam_status(cp->cmd, DID_REQUEUE);
2995 sym_remque(&cp->link_ccbq);
2996 sym_insque_tail(&cp->link_ccbq, &np->comp_ccbq);
3030 static void sym_sir_bad_scsi_status(struct sym_hcb *np, int num, struct sym_ccb *cp)
3033 u_char s_status = cp->ssss_status;
3034 u_char h_flags = cp->host_flags;
3059 sym_print_addr(cp->cmd, "%s\n",
3064 sym_complete_error (np, cp);
3072 sym_complete_error (np, cp);
3080 sym_dequeue_from_squeue(np, i, cp->target, cp->lun, -1);
3087 cp->sv_scsi_status = cp->ssss_status;
3088 cp->sv_xerr_status = cp->xerr_status;
3089 cp->sv_resid = sym_compute_residual(np, cp);
3096 cp->scsi_smsg2[0] = IDENTIFY(0, cp->lun);
3107 * cp->nego_status is filled by sym_prepare_nego().
3109 cp->nego_status = 0;
3110 msglen += sym_prepare_nego(np, cp, &cp->scsi_smsg2[msglen]);
3114 cp->phys.smsg.addr = CCB_BA(cp, scsi_smsg2);
3115 cp->phys.smsg.size = cpu_to_scr(msglen);
3120 cp->phys.cmd.addr = CCB_BA(cp, sensecmd);
3121 cp->phys.cmd.size = cpu_to_scr(6);
3126 cp->sensecmd[0] = REQUEST_SENSE;
3127 cp->sensecmd[1] = 0;
3128 if (cp->cmd->device->scsi_level <= SCSI_2 && cp->lun <= 7)
3129 cp->sensecmd[1] = cp->lun << 5;
3130 cp->sensecmd[4] = SYM_SNS_BBUF_LEN;
3131 cp->data_len = SYM_SNS_BBUF_LEN;
3136 memset(cp->sns_bbuf, 0, SYM_SNS_BBUF_LEN);
3137 cp->phys.sense.addr = CCB_BA(cp, sns_bbuf);
3138 cp->phys.sense.size = cpu_to_scr(SYM_SNS_BBUF_LEN);
3145 cp->phys.head.savep = cpu_to_scr(startp);
3146 cp->phys.head.lastp = cpu_to_scr(startp);
3147 cp->startp = cpu_to_scr(startp);
3148 cp->goalp = cpu_to_scr(startp + 16);
3150 cp->host_xflags = 0;
3151 cp->host_status = cp->nego_status ? HS_NEGOTIATE : HS_BUSY;
3152 cp->ssss_status = S_ILLEGAL;
3153 cp->host_flags = (HF_SENSE|HF_DATA_IN);
3154 cp->xerr_status = 0;
3155 cp->extra_bytes = 0;
3157 cp->phys.head.go.start = cpu_to_scr(SCRIPTA_BA(np, select));
3162 sym_put_start_queue(np, cp);
3190 struct sym_ccb *cp;
3206 cp = sym_que_entry(qp, struct sym_ccb, link_ccbq);
3207 cmd = cp->cmd;
3208 if (cp->host_status != HS_DISCONNECT ||
3209 cp->target != target ||
3210 (lun != -1 && cp->lun != lun) ||
3212 (cp->tag != NO_TAG && cp->scsi_smsg[2] != task))) {
3213 sym_insque_tail(&cp->link_ccbq, &np->busy_ccbq);
3216 sym_insque_tail(&cp->link_ccbq, &np->comp_ccbq);
3223 printf("XXXX TASK @%p CLEARED\n", cp);
3272 struct sym_ccb *cp;
3313 cp = sym_que_entry(qp,struct sym_ccb,link_ccbq);
3314 if (cp->host_status != HS_DISCONNECT)
3316 if (cp->to_abort) {
3317 target = cp->target;
3343 cp = NULL;
3345 cp = sym_que_entry(qp, struct sym_ccb, link_ccbq);
3346 if (cp->host_status != HS_BUSY &&
3347 cp->host_status != HS_NEGOTIATE)
3349 if (!cp->to_abort)
3357 if (cp == np->last_cp) {
3358 cp->to_abort = 0;
3381 i = sym_dequeue_from_squeue(np, i, cp->target, cp->lun, -1);
3387 assert(i && sym_get_cam_status(cp->cmd) == DID_SOFT_ERROR);
3389 sym_remque(&cp->link_ccbq);
3390 sym_insque_tail(&cp->link_ccbq, &np->comp_ccbq);
3395 if (cp->to_abort == 2)
3396 sym_set_cam_status(cp->cmd, DID_TIME_OUT);
3398 sym_set_cam_status(cp->cmd, DID_ABORT);
3459 cp = NULL;
3461 cp = sym_que_entry(qp, struct sym_ccb, link_ccbq);
3462 if (cp->host_status != HS_DISCONNECT)
3464 if (cp->target != target)
3466 if (!cp->to_abort)
3489 np->abrt_msg[0] = IDENTIFY(0, cp->lun);
3497 if (cp->tag == NO_TAG) {
3501 np->abrt_msg[1] = cp->scsi_smsg[1];
3502 np->abrt_msg[2] = cp->scsi_smsg[2];
3511 if (cp->to_abort == 2)
3512 sym_set_cam_status(cp->cmd, DID_TIME_OUT);
3513 cp->to_abort = 0; /* We donnot expect to fail here */
3627 static int sym_evaluate_dp(struct sym_hcb *np, struct sym_ccb *cp, u32 scr, int *ofs)
3641 pm = &cp->phys.pm0;
3643 pm = &cp->phys.pm1;
3655 if (cp->host_flags & HF_SENSE) {
3666 tmp = scr_to_cpu(cp->goalp);
3670 dp_sgmin = SYM_CONF_MAX_SG - cp->segments;
3688 tmp = scr_to_cpu(cp->phys.data[dp_sg].size);
3699 tmp = scr_to_cpu(cp->phys.data[dp_sg].size);
3720 if (dp_sg > cp->ext_sg ||
3721 (dp_sg == cp->ext_sg && dp_ofs > cp->ext_ofs)) {
3722 cp->ext_sg = dp_sg;
3723 cp->ext_ofs = dp_ofs;
3745 static void sym_modify_dp(struct sym_hcb *np, struct sym_tcb *tp, struct sym_ccb *cp, int ofs)
3748 u32 dp_scr = sym_get_script_dp (np, cp);
3758 if (cp->host_flags & HF_SENSE)
3765 dp_sg = sym_evaluate_dp(np, cp, dp_scr, &dp_ofs);
3773 dp_ret = cpu_to_scr(cp->goalp);
3794 pm = &cp->phys.pm0;
3798 pm = &cp->phys.pm1;
3814 tmp = scr_to_cpu(cp->phys.data[dp_sg-1].addr);
3815 tmp += scr_to_cpu(cp->phys.data[dp_sg-1].size) + dp_ofs;
3820 sym_set_script_dp (np, cp, dp_scr);
3844 int sym_compute_residual(struct sym_hcb *np, struct sym_ccb *cp)
3856 if (cp->xerr_status & (XE_EXTRA_DATA|XE_SODL_UNRUN|XE_SWIDE_OVRUN)) {
3857 if (cp->xerr_status & XE_EXTRA_DATA)
3858 resid -= cp->extra_bytes;
3859 if (cp->xerr_status & XE_SODL_UNRUN)
3861 if (cp->xerr_status & XE_SWIDE_OVRUN)
3869 if (cp->phys.head.lastp == cp->goalp)
3876 if (cp->startp == cp->phys.head.lastp ||
3877 sym_evaluate_dp(np, cp, scr_to_cpu(cp->phys.head.lastp),
3879 return cp->data_len - cp->odd_byte_adjustment;
3885 if (cp->host_flags & HF_SENSE) {
3893 resid = -cp->ext_ofs;
3894 for (dp_sg = cp->ext_sg; dp_sg < SYM_CONF_MAX_SG; ++dp_sg) {
3895 u_int tmp = scr_to_cpu(cp->phys.data[dp_sg].size);
3899 resid -= cp->odd_byte_adjustment;
3945 sym_sync_nego_check(struct sym_hcb *np, int req, struct sym_ccb *cp)
3947 int target = cp->target;
3982 sym_print_addr(cp->cmd,
4023 static void sym_sync_nego(struct sym_hcb *np, struct sym_tcb *tp, struct sym_ccb *cp)
4033 if (cp->nego_status && cp->nego_status != NS_SYNC)
4041 result = sym_sync_nego_check(np, req, cp);
4045 cp->nego_status = NS_SYNC;
4160 static void sym_ppr_nego(struct sym_hcb *np, struct sym_tcb *tp, struct sym_ccb *cp)
4170 if (cp->nego_status && cp->nego_status != NS_PPR)
4178 result = sym_ppr_nego_check(np, req, cp->target);
4182 cp->nego_status = NS_PPR;
4197 sym_wide_nego_check(struct sym_hcb *np, int req, struct sym_ccb *cp)
4199 int target = cp->target;
4221 sym_print_addr(cp->cmd, "wdtr: wide=%d chg=%d.\n",
4260 static void sym_wide_nego(struct sym_hcb *np, struct sym_tcb *tp, struct sym_ccb *cp)
4270 if (cp->nego_status && cp->nego_status != NS_WIDE)
4278 result = sym_wide_nego_check(np, req, cp);
4282 cp->nego_status = NS_WIDE;
4295 sym_print_nego_msg(np, cp->target,
4299 cp->nego_status = NS_SYNC;
4324 static void sym_nego_default(struct sym_hcb *np, struct sym_tcb *tp, struct sym_ccb *cp)
4326 switch (cp->nego_status) {
4329 sym_setpprot (np, cp->target, 0, 0, 0, 0, 0, 0);
4340 sym_setsync (np, cp->target, 0, 0, 0, 0);
4343 sym_setwide (np, cp->target, 0);
4348 cp->nego_status = 0;
4355 static void sym_nego_rejected(struct sym_hcb *np, struct sym_tcb *tp, struct sym_ccb *cp)
4357 sym_nego_default(np, tp, cp);
4361 #define sym_printk(lvl, tp, cp, fmt, v...) do { \
4362 if (cp) \
4363 scmd_printk(lvl, cp->cmd, fmt, ##v); \
4375 struct sym_ccb *cp = sym_ccb_from_dsa(np, dsa);
4397 sym_complete_error(np, cp);
4413 sym_printk(KERN_WARNING, tp, cp,
4421 sym_printk(KERN_WARNING, tp, cp,
4429 sym_printk(KERN_WARNING, tp, cp,
4458 sym_printk(KERN_WARNING, tp, cp,
4470 if (cp) {
4471 cp->xerr_status &= ~XE_PARITY_ERR;
4472 if (!cp->xerr_status)
4483 if (!cp)
4485 sym_sir_bad_scsi_status(np, num, cp);
4492 sym_print_msg(cp, "M_REJECT to send for ", np->msgin);
4502 if (cp) {
4504 cp->xerr_status |= XE_SWIDE_OVRUN;
4513 if (cp) {
4515 cp->xerr_status |= XE_SODL_UNRUN;
4525 if (cp) {
4527 cp->xerr_status |= XE_EXTRA_DATA;
4528 cp->extra_bytes += INL(np, nc_scratcha);
4535 if (cp) {
4537 cp->xerr_status |= XE_BAD_PHASE;
4544 if (!cp)
4556 sym_print_msg(cp, "extended msg ",
4560 sym_modify_dp(np, tp, cp, tmp);
4563 sym_sync_nego(np, tp, cp);
4566 sym_ppr_nego(np, tp, cp);
4569 sym_wide_nego(np, tp, cp);
4584 sym_print_msg(cp, "1 or 2 byte ", np->msgin);
4585 if (cp->host_flags & HF_SENSE)
4588 sym_modify_dp(np, tp, cp, -1);
4592 sym_nego_rejected(np, tp, cp);
4594 sym_print_addr(cp->cmd,
4608 sym_print_msg(cp, "WEIRD message received", np->msgin);
4624 sym_nego_default(np, tp, cp);
4652 struct sym_ccb *cp = NULL;
4662 cp = sym_que_entry(qp, struct sym_ccb, link_ccbq);
4696 lp->itlq_tbl[tag] = cpu_to_scr(cp->ccb_ba);
4701 cp->tags_si = lp->tags_si;
4702 ++lp->tags_sum[cp->tags_si];
4730 lp->head.itl_task_sa = cpu_to_scr(cp->ccb_ba);
4742 sym_insque_tail(&cp->link_ccbq, &np->busy_ccbq);
4745 sym_remque(&cp->link2_ccbq);
4746 sym_insque_tail(&cp->link2_ccbq, &lp->waiting_ccbq);
4750 cp->to_abort = 0;
4751 cp->odd_byte_adjustment = 0;
4752 cp->tag = tag;
4753 cp->order = tag_order;
4754 cp->target = tn;
4755 cp->lun = ln;
4758 sym_print_addr(cmd, "ccb @%p using tag %d.\n", cp, tag);
4762 return cp;
4764 sym_insque_head(&cp->link_ccbq, &np->free_ccbq);
4771 void sym_free_ccb (struct sym_hcb *np, struct sym_ccb *cp)
4773 struct sym_tcb *tp = &np->target[cp->target];
4774 struct sym_lcb *lp = sym_lp(tp, cp->lun);
4777 sym_print_addr(cp->cmd, "ccb @%p freeing tag %d.\n",
4778 cp, cp->tag);
4788 if (cp->tag != NO_TAG) {
4790 --lp->tags_sum[cp->tags_si];
4795 lp->cb_tags[lp->if_tag] = cp->tag;
4802 lp->itlq_tbl[cp->tag] = cpu_to_scr(np->bad_itlq_ba);
4825 if (cp == tp->nego_cp)
4833 if (cp == np->last_cp)
4840 cp->cmd = NULL;
4841 cp->host_status = HS_IDLE;
4842 sym_remque(&cp->link_ccbq);
4843 sym_insque_head(&cp->link_ccbq, &np->free_ccbq);
4847 sym_remque(&cp->link2_ccbq);
4848 sym_insque_tail(&cp->link2_ccbq, &np->dummy_ccbq);
4849 if (cp->started) {
4850 if (cp->tag != NO_TAG)
4856 cp->started = 0;
4865 struct sym_ccb *cp = NULL;
4878 cp = sym_calloc_dma(sizeof(struct sym_ccb), "CCB");
4879 if (!cp)
4890 cp->ccb_ba = vtobus(cp);
4895 hcode = CCB_HASH_CODE(cp->ccb_ba);
4896 cp->link_ccbh = np->ccbh[hcode];
4897 np->ccbh[hcode] = cp;
4902 cp->phys.head.go.start = cpu_to_scr(SCRIPTA_BA(np, idle));
4903 cp->phys.head.go.restart = cpu_to_scr(SCRIPTB_BA(np, bad_i_t_l));
4908 cp->phys.smsg_ext.addr = cpu_to_scr(HCB_BA(np, msgin[2]));
4913 sym_insque_head(&cp->link_ccbq, &np->free_ccbq);
4919 sym_insque_head(&cp->link2_ccbq, &np->dummy_ccbq);
4921 return cp;
4923 if (cp)
4924 sym_mfree_dma(cp, sizeof(*cp), "CCB");
4934 struct sym_ccb *cp;
4937 cp = np->ccbh[hcode];
4938 while (cp) {
4939 if (cp->ccb_ba == dsa)
4941 cp = cp->link_ccbh;
4944 return cp;
5130 int sym_queue_scsiio(struct sym_hcb *np, struct scsi_cmnd *cmd, struct sym_ccb *cp)
5142 cp->cmd = cmd;
5147 tp = &np->target[cp->target];
5154 can_disconnect = (cp->tag != NO_TAG) ||
5157 msgptr = cp->scsi_smsg;
5164 if (cp->tag != NO_TAG) {
5165 u_char order = cp->order;
5204 msgptr[msglen++] = cp->tag;
5206 msgptr[msglen++] = (cp->tag << 1) + 1;
5217 cp->nego_status = 0;
5221 msglen += sym_prepare_nego(np, cp, msgptr + msglen);
5227 cp->phys.head.go.start = cpu_to_scr(SCRIPTA_BA(np, select));
5228 cp->phys.head.go.restart = cpu_to_scr(SCRIPTA_BA(np, resel_dsa));
5233 cp->phys.select.sel_id = cp->target;
5234 cp->phys.select.sel_scntl3 = tp->head.wval;
5235 cp->phys.select.sel_sxfer = tp->head.sval;
5236 cp->phys.select.sel_scntl4 = tp->head.uval;
5241 cp->phys.smsg.addr = CCB_BA(cp, scsi_smsg);
5242 cp->phys.smsg.size = cpu_to_scr(msglen);
5247 cp->host_xflags = 0;
5248 cp->host_status = cp->nego_status ? HS_NEGOTIATE : HS_BUSY;
5249 cp->ssss_status = S_ILLEGAL;
5250 cp->xerr_status = 0;
5251 cp->host_flags = 0;
5252 cp->extra_bytes = 0;
5258 cp->ext_sg = -1;
5259 cp->ext_ofs = 0;
5265 return sym_setup_data_and_start(np, cmd, cp);
5290 static int sym_abort_ccb(struct sym_hcb *np, struct sym_ccb *cp, int timed_out)
5295 if (!cp || !cp->host_status || cp->host_status == HS_WAIT)
5302 if (cp->to_abort) {
5310 cp->to_abort = timed_out ? 2 : 1;
5322 struct sym_ccb *cp;
5328 cp = NULL;
5332 cp = cp2;
5337 return sym_abort_ccb(np, cp, timed_out);
5350 void sym_complete_error(struct sym_hcb *np, struct sym_ccb *cp)
5364 if (!cp || !cp->cmd)
5367 cmd = cp->cmd;
5370 dev_info(&sdev->sdev_gendev, "CCB=%p STAT=%x/%x/%x\n", cp,
5371 cp->host_status, cp->ssss_status, cp->host_flags);
5378 tp = &np->target[cp->target];
5385 if (cp->xerr_status) {
5387 sym_print_xerr(cmd, cp->xerr_status);
5388 if (cp->host_status == HS_COMPLETE)
5389 cp->host_status = HS_COMP_ERR;
5395 resid = sym_compute_residual(np, cp);
5399 cp->sv_resid = 0;
5411 i = sym_dequeue_from_squeue(np, i, cp->target, sdev->lun, -1);
5419 if (cp->host_status == HS_COMPLETE &&
5420 cp->ssss_status == S_QUEUE_FULL) {
5437 cp->host_status = HS_BUSY;
5438 cp->ssss_status = S_ILLEGAL;
5451 sym_set_cam_result_error(np, cp, resid);
5459 sym_remque(&cp->link_ccbq);
5460 sym_insque_head(&cp->link_ccbq, &np->comp_ccbq);
5485 void sym_complete_ok (struct sym_hcb *np, struct sym_ccb *cp)
5497 if (!cp || !cp->cmd)
5499 assert (cp->host_status == HS_COMPLETE);
5504 cmd = cp->cmd;
5510 tp = &np->target[cp->target];
5511 lp = sym_lp(tp, cp->lun);
5519 if (cp->phys.head.lastp != cp->goalp)
5520 resid = sym_compute_residual(np, cp);
5537 sym_set_cam_result_ok(cp, cmd, resid);
5560 sym_free_ccb (np, cp);
5803 struct sym_ccb *cp;
5820 cp = sym_que_entry(qp, struct sym_ccb, link_ccbq);
5821 sym_mfree_dma(cp, sizeof(*cp), "CCB");