Lines Matching refs: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) in sym_print_msg() argument
62 sym_print_addr(cp->cmd, "%s: ", label); in sym_print_msg()
1406 static int sym_prepare_nego(struct sym_hcb *np, struct sym_ccb *cp, u_char *msgptr) argument
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) argument
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; local
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; local
1599 cp = sym_ccb_from_dsa(np, dsa);
1600 if (cp) {
1602 sym_complete_ok (np, cp);
1631 struct sym_ccb *cp; local
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; local
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); local
2200 if (cp) {
2201 cp->host_status = hsts;
2306 struct sym_ccb *cp = sym_ccb_from_dsa(np, dsa); local
2324 if (!cp)
2338 cp->xerr_status |= XE_PARITY_ERR;
2361 sym_set_script_dp (np, cp, dsp);
2401 struct sym_ccb *cp; local
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; local
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) argument
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);
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; local
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; local
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) argument
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) argument
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) argument
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) argument
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) argument
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) argument
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) argument
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) argument
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) argument
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) argument
4357 sym_nego_default(np, tp, cp);
4361 #define sym_printk(lvl, tp, cp, fmt, v...) do { \ argument
4362 if (cp) \
4363 scmd_printk(lvl, cp->cmd, fmt, ##v); \
4375 struct sym_ccb *cp = sym_ccb_from_dsa(np, dsa); local
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,
4609 sym_print_msg(cp, "WEIRD message received", np->msgin);
4625 sym_nego_default(np, tp, cp);
4653 struct sym_ccb *cp = NULL; local
4663 cp = sym_que_entry(qp, struct sym_ccb, link_ccbq);
4697 lp->itlq_tbl[tag] = cpu_to_scr(cp->ccb_ba);
4702 cp->tags_si = lp->tags_si;
4703 ++lp->tags_sum[cp->tags_si];
4731 lp->head.itl_task_sa = cpu_to_scr(cp->ccb_ba);
4743 sym_insque_tail(&cp->link_ccbq, &np->busy_ccbq);
4746 sym_remque(&cp->link2_ccbq);
4747 sym_insque_tail(&cp->link2_ccbq, &lp->waiting_ccbq);
4751 cp->to_abort = 0;
4752 cp->odd_byte_adjustment = 0;
4753 cp->tag = tag;
4754 cp->order = tag_order;
4755 cp->target = tn;
4756 cp->lun = ln;
4759 sym_print_addr(cmd, "ccb @%p using tag %d.\n", cp, tag);
4763 return cp;
4765 sym_insque_head(&cp->link_ccbq, &np->free_ccbq);
4772 void sym_free_ccb (struct sym_hcb *np, struct sym_ccb *cp) argument
4774 struct sym_tcb *tp = &np->target[cp->target];
4775 struct sym_lcb *lp = sym_lp(tp, cp->lun);
4778 sym_print_addr(cp->cmd, "ccb @%p freeing tag %d.\n",
4779 cp, cp->tag);
4789 if (cp->tag != NO_TAG) {
4791 --lp->tags_sum[cp->tags_si];
4796 lp->cb_tags[lp->if_tag] = cp->tag;
4803 lp->itlq_tbl[cp->tag] = cpu_to_scr(np->bad_itlq_ba);
4826 if (cp == tp->nego_cp)
4834 if (cp == np->last_cp)
4841 cp->cmd = NULL;
4842 cp->host_status = HS_IDLE;
4843 sym_remque(&cp->link_ccbq);
4844 sym_insque_head(&cp->link_ccbq, &np->free_ccbq);
4848 sym_remque(&cp->link2_ccbq);
4849 sym_insque_tail(&cp->link2_ccbq, &np->dummy_ccbq);
4850 if (cp->started) {
4851 if (cp->tag != NO_TAG)
4857 cp->started = 0;
4866 struct sym_ccb *cp = NULL; local
4879 cp = sym_calloc_dma(sizeof(struct sym_ccb), "CCB");
4880 if (!cp)
4891 cp->ccb_ba = vtobus(cp);
4896 hcode = CCB_HASH_CODE(cp->ccb_ba);
4897 cp->link_ccbh = np->ccbh[hcode];
4898 np->ccbh[hcode] = cp;
4903 cp->phys.head.go.start = cpu_to_scr(SCRIPTA_BA(np, idle));
4904 cp->phys.head.go.restart = cpu_to_scr(SCRIPTB_BA(np, bad_i_t_l));
4909 cp->phys.smsg_ext.addr = cpu_to_scr(HCB_BA(np, msgin[2]));
4914 sym_insque_head(&cp->link_ccbq, &np->free_ccbq);
4920 sym_insque_head(&cp->link2_ccbq, &np->dummy_ccbq);
4922 return cp;
4924 if (cp)
4925 sym_mfree_dma(cp, sizeof(*cp), "CCB");
4935 struct sym_ccb *cp; local
4938 cp = np->ccbh[hcode];
4939 while (cp) {
4940 if (cp->ccb_ba == dsa)
4942 cp = cp->link_ccbh;
4945 return cp;
5131 int sym_queue_scsiio(struct sym_hcb *np, struct scsi_cmnd *cmd, struct sym_ccb *cp) argument
5143 cp->cmd = cmd;
5148 tp = &np->target[cp->target];
5155 can_disconnect = (cp->tag != NO_TAG) ||
5158 msgptr = cp->scsi_smsg;
5165 if (cp->tag != NO_TAG) {
5166 u_char order = cp->order;
5205 msgptr[msglen++] = cp->tag;
5207 msgptr[msglen++] = (cp->tag << 1) + 1;
5218 cp->nego_status = 0;
5222 msglen += sym_prepare_nego(np, cp, msgptr + msglen);
5228 cp->phys.head.go.start = cpu_to_scr(SCRIPTA_BA(np, select));
5229 cp->phys.head.go.restart = cpu_to_scr(SCRIPTA_BA(np, resel_dsa));
5234 cp->phys.select.sel_id = cp->target;
5235 cp->phys.select.sel_scntl3 = tp->head.wval;
5236 cp->phys.select.sel_sxfer = tp->head.sval;
5237 cp->phys.select.sel_scntl4 = tp->head.uval;
5242 cp->phys.smsg.addr = CCB_BA(cp, scsi_smsg);
5243 cp->phys.smsg.size = cpu_to_scr(msglen);
5248 cp->host_xflags = 0;
5249 cp->host_status = cp->nego_status ? HS_NEGOTIATE : HS_BUSY;
5250 cp->ssss_status = S_ILLEGAL;
5251 cp->xerr_status = 0;
5252 cp->host_flags = 0;
5253 cp->extra_bytes = 0;
5259 cp->ext_sg = -1;
5260 cp->ext_ofs = 0;
5266 return sym_setup_data_and_start(np, cmd, cp);
5291 static int sym_abort_ccb(struct sym_hcb *np, struct sym_ccb *cp, int timed_out) argument
5296 if (!cp || !cp->host_status || cp->host_status == HS_WAIT)
5303 if (cp->to_abort) {
5311 cp->to_abort = timed_out ? 2 : 1;
5323 struct sym_ccb *cp; local
5329 cp = NULL;
5333 cp = cp2;
5338 return sym_abort_ccb(np, cp, timed_out);
5351 void sym_complete_error(struct sym_hcb *np, struct sym_ccb *cp) argument
5365 if (!cp || !cp->cmd)
5368 cmd = cp->cmd;
5371 dev_info(&sdev->sdev_gendev, "CCB=%p STAT=%x/%x/%x\n", cp,
5372 cp->host_status, cp->ssss_status, cp->host_flags);
5379 tp = &np->target[cp->target];
5386 if (cp->xerr_status) {
5388 sym_print_xerr(cmd, cp->xerr_status);
5389 if (cp->host_status == HS_COMPLETE)
5390 cp->host_status = HS_COMP_ERR;
5396 resid = sym_compute_residual(np, cp);
5400 cp->sv_resid = 0;
5412 i = sym_dequeue_from_squeue(np, i, cp->target, sdev->lun, -1);
5420 if (cp->host_status == HS_COMPLETE &&
5421 cp->ssss_status == S_QUEUE_FULL) {
5438 cp->host_status = HS_BUSY;
5439 cp->ssss_status = S_ILLEGAL;
5452 sym_set_cam_result_error(np, cp, resid);
5460 sym_remque(&cp->link_ccbq);
5461 sym_insque_head(&cp->link_ccbq, &np->comp_ccbq);
5486 void sym_complete_ok (struct sym_hcb *np, struct sym_ccb *cp) argument
5498 if (!cp || !cp->cmd)
5500 assert (cp->host_status == HS_COMPLETE);
5505 cmd = cp->cmd;
5511 tp = &np->target[cp->target];
5512 lp = sym_lp(tp, cp->lun);
5520 if (cp->phys.head.lastp != cp->goalp)
5521 resid = sym_compute_residual(np, cp);
5538 sym_set_cam_result_ok(cp, cmd, resid);
5561 sym_free_ccb (np, cp);
5804 struct sym_ccb *cp; local
5821 cp = sym_que_entry(qp, struct sym_ccb, link_ccbq);
5822 sym_mfree_dma(cp, sizeof(*cp), "CCB");