Lines Matching refs:cp

59 static void sym_complete_error (struct sym_hcb *np, struct sym_ccb *cp);
60 static void sym_complete_ok (struct sym_hcb *np, struct sym_ccb *cp);
61 static int sym_compute_residual(struct sym_hcb *np, struct sym_ccb *cp);
73 static void sym_print_msg(struct sym_ccb *cp, char *label, u_char *msg) in sym_print_msg() argument
75 sym_print_addr(cp->cmd, "%s: ", label); in sym_print_msg()
1419 static int sym_prepare_nego(struct sym_hcb *np, struct sym_ccb *cp, u_char *msgptr) argument
1421 struct sym_tcb *tp = &np->target[cp->target];
1462 cp->nego_status = nego;
1465 tp->nego_cp = cp; /* Keep track a nego will be performed */
1467 sym_print_nego_msg(np, cp->target,
1480 void sym_put_start_queue(struct sym_hcb *np, struct sym_ccb *cp) argument
1499 np->last_cp = cp;
1508 cp->host_xflags |= HX_DMAP_DIRTY;
1520 np->squeue [np->squeueput] = cpu_to_scr(cp->ccb_ba);
1525 scmd_printk(KERN_DEBUG, cp->cmd, "queuepos=%d\n",
1543 struct sym_ccb *cp; local
1559 cp = sym_que_entry(qp, struct sym_ccb, link2_ccbq);
1560 if (cp->tag != NO_TAG) {
1566 lp->itlq_tbl[cp->tag] = cpu_to_scr(cp->ccb_ba);
1575 lp->head.itl_task_sa = cpu_to_scr(cp->ccb_ba);
1580 cp->started = 1;
1582 sym_put_start_queue(np, cp);
1596 struct sym_ccb *cp; local
1612 cp = sym_ccb_from_dsa(np, dsa);
1613 if (cp) {
1615 sym_complete_ok (np, cp);
1644 struct sym_ccb *cp; local
1648 cp = sym_que_entry(qp, struct sym_ccb, link_ccbq);
1649 sym_insque_tail(&cp->link_ccbq, &np->busy_ccbq);
1651 if (cp->host_status == HS_WAIT)
1653 cmd = cp->cmd;
1658 struct sym_tcb *tp = &np->target[cp->target];
1659 struct sym_lcb *lp = sym_lp(tp, cp->lun);
1661 sym_remque(&cp->link2_ccbq);
1662 sym_insque_tail(&cp->link2_ccbq,
1664 if (cp->started) {
1665 if (cp->tag != NO_TAG)
1671 cp->started = 0;
1675 sym_free_ccb(np, cp);
2036 struct sym_ccb *cp; local
2037 cp = sym_que_entry(qp, struct sym_ccb, link_ccbq);
2038 if (cp->target != target)
2040 cp->phys.select.sel_scntl3 = tp->head.wval;
2041 cp->phys.select.sel_sxfer = tp->head.sval;
2043 cp->phys.select.sel_scntl4 = tp->head.uval;
2190 struct sym_ccb *cp = sym_ccb_from_dsa(np, dsa); local
2213 if (cp) {
2214 cp->host_status = hsts;
2319 struct sym_ccb *cp = sym_ccb_from_dsa(np, dsa); local
2337 if (!cp)
2351 cp->xerr_status |= XE_PARITY_ERR;
2374 sym_set_script_dp (np, cp, dsp);
2414 struct sym_ccb *cp; local
2427 cp = sym_ccb_from_dsa(np, dsa);
2470 if (cp && (cp->phys.select.sel_scntl3 & EWS)) {
2513 cp, (unsigned)dsp, (unsigned)nxtdsp, vdsp, cmd);
2522 if (!cp) {
2534 tblp = (u32 *) ((char*) &cp->phys + oadr);
2556 sym_print_addr(cp->cmd,
2567 sym_print_addr(cp->cmd,
2587 nxtdsp = scr_to_cpu(cp->phys.pm0.ret);
2589 nxtdsp = scr_to_cpu(cp->phys.pm1.ret);
2596 pm = &cp->phys.pm0;
2600 pm = &cp->phys.pm1;
2622 if ((cmd & 7) == 1 && cp && (cp->phys.select.sel_scntl3 & EWS) &&
2632 cp->phys.wresid.addr = cpu_to_scr(tmp);
2635 cp->phys.wresid.size = cpu_to_scr((tmp&0xff000000) | 1);
2653 sym_print_addr(cp->cmd, "PM %x %x %x / %x %x %x.\n",
2663 sym_set_script_dp (np, cp, newcmd);
2715 if (cp->tag != NO_TAG && olen - rest <= 3) {
2716 cp->host_status = HS_BUSY;
2717 np->msgout[0] = IDENTIFY(0, cp->lun);
2728 struct scsi_device *dev = cp->cmd->device;
2981 struct sym_ccb *cp; local
2994 cp = sym_ccb_from_dsa(np, scr_to_cpu(np->squeue[i]));
2995 assert(cp);
2998 cp->host_flags &= ~HF_HINT_IARB;
3000 if ((target == -1 || cp->target == target) &&
3001 (lun == -1 || cp->lun == lun) &&
3002 (task == -1 || cp->tag == task)) {
3004 sym_set_cam_status(cp->cmd, DID_SOFT_ERROR);
3006 sym_set_cam_status(cp->cmd, DID_REQUEUE);
3008 sym_remque(&cp->link_ccbq);
3009 sym_insque_tail(&cp->link_ccbq, &np->comp_ccbq);
3043 static void sym_sir_bad_scsi_status(struct sym_hcb *np, int num, struct sym_ccb *cp) argument
3046 u_char s_status = cp->ssss_status;
3047 u_char h_flags = cp->host_flags;
3072 sym_print_addr(cp->cmd, "%s\n",
3076 sym_complete_error (np, cp);
3084 sym_complete_error (np, cp);
3092 sym_dequeue_from_squeue(np, i, cp->target, cp->lun, -1);
3099 cp->sv_scsi_status = cp->ssss_status;
3100 cp->sv_xerr_status = cp->xerr_status;
3101 cp->sv_resid = sym_compute_residual(np, cp);
3108 cp->scsi_smsg2[0] = IDENTIFY(0, cp->lun);
3121 cp->nego_status = 0;
3122 msglen += sym_prepare_nego(np, cp, &cp->scsi_smsg2[msglen]);
3126 cp->phys.smsg.addr = CCB_BA(cp, scsi_smsg2);
3127 cp->phys.smsg.size = cpu_to_scr(msglen);
3132 cp->phys.cmd.addr = CCB_BA(cp, sensecmd);
3133 cp->phys.cmd.size = cpu_to_scr(6);
3138 cp->sensecmd[0] = REQUEST_SENSE;
3139 cp->sensecmd[1] = 0;
3140 if (cp->cmd->device->scsi_level <= SCSI_2 && cp->lun <= 7)
3141 cp->sensecmd[1] = cp->lun << 5;
3142 cp->sensecmd[4] = SYM_SNS_BBUF_LEN;
3143 cp->data_len = SYM_SNS_BBUF_LEN;
3148 memset(cp->sns_bbuf, 0, SYM_SNS_BBUF_LEN);
3149 cp->phys.sense.addr = CCB_BA(cp, sns_bbuf);
3150 cp->phys.sense.size = cpu_to_scr(SYM_SNS_BBUF_LEN);
3157 cp->phys.head.savep = cpu_to_scr(startp);
3158 cp->phys.head.lastp = cpu_to_scr(startp);
3159 cp->startp = cpu_to_scr(startp);
3160 cp->goalp = cpu_to_scr(startp + 16);
3162 cp->host_xflags = 0;
3163 cp->host_status = cp->nego_status ? HS_NEGOTIATE : HS_BUSY;
3164 cp->ssss_status = S_ILLEGAL;
3165 cp->host_flags = (HF_SENSE|HF_DATA_IN);
3166 cp->xerr_status = 0;
3167 cp->extra_bytes = 0;
3169 cp->phys.head.go.start = cpu_to_scr(SCRIPTA_BA(np, select));
3174 sym_put_start_queue(np, cp);
3202 struct sym_ccb *cp; local
3218 cp = sym_que_entry(qp, struct sym_ccb, link_ccbq);
3219 cmd = cp->cmd;
3220 if (cp->host_status != HS_DISCONNECT ||
3221 cp->target != target ||
3222 (lun != -1 && cp->lun != lun) ||
3224 (cp->tag != NO_TAG && cp->scsi_smsg[2] != task))) {
3225 sym_insque_tail(&cp->link_ccbq, &np->busy_ccbq);
3228 sym_insque_tail(&cp->link_ccbq, &np->comp_ccbq);
3235 printf("XXXX TASK @%p CLEARED\n", cp);
3284 struct sym_ccb *cp; local
3325 cp = sym_que_entry(qp,struct sym_ccb,link_ccbq);
3326 if (cp->host_status != HS_DISCONNECT)
3328 if (cp->to_abort) {
3329 target = cp->target;
3355 cp = NULL;
3357 cp = sym_que_entry(qp, struct sym_ccb, link_ccbq);
3358 if (cp->host_status != HS_BUSY &&
3359 cp->host_status != HS_NEGOTIATE)
3361 if (!cp->to_abort)
3369 if (cp == np->last_cp) {
3370 cp->to_abort = 0;
3393 i = sym_dequeue_from_squeue(np, i, cp->target, cp->lun, -1);
3399 assert(i && sym_get_cam_status(cp->cmd) == DID_SOFT_ERROR);
3401 sym_remque(&cp->link_ccbq);
3402 sym_insque_tail(&cp->link_ccbq, &np->comp_ccbq);
3407 if (cp->to_abort == 2)
3408 sym_set_cam_status(cp->cmd, DID_TIME_OUT);
3410 sym_set_cam_status(cp->cmd, DID_ABORT);
3471 cp = NULL;
3473 cp = sym_que_entry(qp, struct sym_ccb, link_ccbq);
3474 if (cp->host_status != HS_DISCONNECT)
3476 if (cp->target != target)
3478 if (!cp->to_abort)
3501 np->abrt_msg[0] = IDENTIFY(0, cp->lun);
3509 if (cp->tag == NO_TAG) {
3513 np->abrt_msg[1] = cp->scsi_smsg[1];
3514 np->abrt_msg[2] = cp->scsi_smsg[2];
3523 if (cp->to_abort == 2)
3524 sym_set_cam_status(cp->cmd, DID_TIME_OUT);
3525 cp->to_abort = 0; /* We donnot expect to fail here */
3639 static int sym_evaluate_dp(struct sym_hcb *np, struct sym_ccb *cp, u32 scr, int *ofs) argument
3653 pm = &cp->phys.pm0;
3655 pm = &cp->phys.pm1;
3667 if (cp->host_flags & HF_SENSE) {
3678 tmp = scr_to_cpu(cp->goalp);
3682 dp_sgmin = SYM_CONF_MAX_SG - cp->segments;
3700 tmp = scr_to_cpu(cp->phys.data[dp_sg].size);
3711 tmp = scr_to_cpu(cp->phys.data[dp_sg].size);
3732 if (dp_sg > cp->ext_sg ||
3733 (dp_sg == cp->ext_sg && dp_ofs > cp->ext_ofs)) {
3734 cp->ext_sg = dp_sg;
3735 cp->ext_ofs = dp_ofs;
3757 static void sym_modify_dp(struct sym_hcb *np, struct sym_tcb *tp, struct sym_ccb *cp, int ofs) argument
3760 u32 dp_scr = sym_get_script_dp (np, cp);
3770 if (cp->host_flags & HF_SENSE)
3777 dp_sg = sym_evaluate_dp(np, cp, dp_scr, &dp_ofs);
3785 dp_ret = cpu_to_scr(cp->goalp);
3806 pm = &cp->phys.pm0;
3810 pm = &cp->phys.pm1;
3826 tmp = scr_to_cpu(cp->phys.data[dp_sg-1].addr);
3827 tmp += scr_to_cpu(cp->phys.data[dp_sg-1].size) + dp_ofs;
3832 sym_set_script_dp (np, cp, dp_scr);
3856 int sym_compute_residual(struct sym_hcb *np, struct sym_ccb *cp) argument
3868 if (cp->xerr_status & (XE_EXTRA_DATA|XE_SODL_UNRUN|XE_SWIDE_OVRUN)) {
3869 if (cp->xerr_status & XE_EXTRA_DATA)
3870 resid -= cp->extra_bytes;
3871 if (cp->xerr_status & XE_SODL_UNRUN)
3873 if (cp->xerr_status & XE_SWIDE_OVRUN)
3881 if (cp->phys.head.lastp == cp->goalp)
3888 if (cp->startp == cp->phys.head.lastp ||
3889 sym_evaluate_dp(np, cp, scr_to_cpu(cp->phys.head.lastp),
3891 return cp->data_len - cp->odd_byte_adjustment;
3897 if (cp->host_flags & HF_SENSE) {
3905 dp_sgmin = SYM_CONF_MAX_SG - cp->segments;
3906 resid = -cp->ext_ofs;
3907 for (dp_sg = cp->ext_sg; dp_sg < SYM_CONF_MAX_SG; ++dp_sg) {
3908 u_int tmp = scr_to_cpu(cp->phys.data[dp_sg].size);
3912 resid -= cp->odd_byte_adjustment;
3958 sym_sync_nego_check(struct sym_hcb *np, int req, struct sym_ccb *cp) argument
3960 int target = cp->target;
3995 sym_print_addr(cp->cmd,
4036 static void sym_sync_nego(struct sym_hcb *np, struct sym_tcb *tp, struct sym_ccb *cp) argument
4046 if (cp->nego_status && cp->nego_status != NS_SYNC)
4054 result = sym_sync_nego_check(np, req, cp);
4058 cp->nego_status = NS_SYNC;
4173 static void sym_ppr_nego(struct sym_hcb *np, struct sym_tcb *tp, struct sym_ccb *cp) argument
4183 if (cp->nego_status && cp->nego_status != NS_PPR)
4191 result = sym_ppr_nego_check(np, req, cp->target);
4195 cp->nego_status = NS_PPR;
4210 sym_wide_nego_check(struct sym_hcb *np, int req, struct sym_ccb *cp) argument
4212 int target = cp->target;
4234 sym_print_addr(cp->cmd, "wdtr: wide=%d chg=%d.\n",
4273 static void sym_wide_nego(struct sym_hcb *np, struct sym_tcb *tp, struct sym_ccb *cp) argument
4283 if (cp->nego_status && cp->nego_status != NS_WIDE)
4291 result = sym_wide_nego_check(np, req, cp);
4295 cp->nego_status = NS_WIDE;
4308 sym_print_nego_msg(np, cp->target,
4312 cp->nego_status = NS_SYNC;
4337 static void sym_nego_default(struct sym_hcb *np, struct sym_tcb *tp, struct sym_ccb *cp) argument
4339 switch (cp->nego_status) {
4342 sym_setpprot (np, cp->target, 0, 0, 0, 0, 0, 0);
4353 sym_setsync (np, cp->target, 0, 0, 0, 0);
4356 sym_setwide (np, cp->target, 0);
4361 cp->nego_status = 0;
4368 static void sym_nego_rejected(struct sym_hcb *np, struct sym_tcb *tp, struct sym_ccb *cp) argument
4370 sym_nego_default(np, tp, cp);
4381 struct sym_ccb *cp = sym_ccb_from_dsa(np, dsa); local
4403 sym_complete_error(np, cp);
4419 scmd_printk(KERN_WARNING, cp->cmd,
4427 scmd_printk(KERN_WARNING, cp->cmd,
4435 scmd_printk(KERN_WARNING, cp->cmd,
4464 scmd_printk(KERN_WARNING, cp->cmd,
4476 if (cp) {
4477 cp->xerr_status &= ~XE_PARITY_ERR;
4478 if (!cp->xerr_status)
4489 if (!cp)
4491 sym_sir_bad_scsi_status(np, num, cp);
4498 sym_print_msg(cp, "M_REJECT to send for ", np->msgin);
4508 if (cp) {
4510 cp->xerr_status |= XE_SWIDE_OVRUN;
4519 if (cp) {
4521 cp->xerr_status |= XE_SODL_UNRUN;
4531 if (cp) {
4533 cp->xerr_status |= XE_EXTRA_DATA;
4534 cp->extra_bytes += INL(np, nc_scratcha);
4541 if (cp) {
4543 cp->xerr_status |= XE_BAD_PHASE;
4550 if (!cp)
4562 sym_print_msg(cp, "extended msg ",
4566 sym_modify_dp(np, tp, cp, tmp);
4569 sym_sync_nego(np, tp, cp);
4572 sym_ppr_nego(np, tp, cp);
4575 sym_wide_nego(np, tp, cp);
4590 sym_print_msg(cp, "1 or 2 byte ", np->msgin);
4591 if (cp->host_flags & HF_SENSE)
4594 sym_modify_dp(np, tp, cp, -1);
4598 sym_nego_rejected(np, tp, cp);
4600 sym_print_addr(cp->cmd,
4615 sym_print_msg(cp, "WEIRD message received", np->msgin);
4630 sym_nego_default(np, tp, cp);
4658 struct sym_ccb *cp = NULL; local
4668 cp = sym_que_entry(qp, struct sym_ccb, link_ccbq);
4702 lp->itlq_tbl[tag] = cpu_to_scr(cp->ccb_ba);
4707 cp->tags_si = lp->tags_si;
4708 ++lp->tags_sum[cp->tags_si];
4736 lp->head.itl_task_sa = cpu_to_scr(cp->ccb_ba);
4748 sym_insque_tail(&cp->link_ccbq, &np->busy_ccbq);
4751 sym_remque(&cp->link2_ccbq);
4752 sym_insque_tail(&cp->link2_ccbq, &lp->waiting_ccbq);
4756 cp->to_abort = 0;
4757 cp->odd_byte_adjustment = 0;
4758 cp->tag = tag;
4759 cp->order = tag_order;
4760 cp->target = tn;
4761 cp->lun = ln;
4764 sym_print_addr(cmd, "ccb @%p using tag %d.\n", cp, tag);
4768 return cp;
4770 sym_insque_head(&cp->link_ccbq, &np->free_ccbq);
4777 void sym_free_ccb (struct sym_hcb *np, struct sym_ccb *cp) argument
4779 struct sym_tcb *tp = &np->target[cp->target];
4780 struct sym_lcb *lp = sym_lp(tp, cp->lun);
4783 sym_print_addr(cp->cmd, "ccb @%p freeing tag %d.\n",
4784 cp, cp->tag);
4794 if (cp->tag != NO_TAG) {
4796 --lp->tags_sum[cp->tags_si];
4801 lp->cb_tags[lp->if_tag] = cp->tag;
4808 lp->itlq_tbl[cp->tag] = cpu_to_scr(np->bad_itlq_ba);
4831 if (cp == tp->nego_cp)
4839 if (cp == np->last_cp)
4846 cp->cmd = NULL;
4847 cp->host_status = HS_IDLE;
4848 sym_remque(&cp->link_ccbq);
4849 sym_insque_head(&cp->link_ccbq, &np->free_ccbq);
4853 sym_remque(&cp->link2_ccbq);
4854 sym_insque_tail(&cp->link2_ccbq, &np->dummy_ccbq);
4855 if (cp->started) {
4856 if (cp->tag != NO_TAG)
4862 cp->started = 0;
4871 struct sym_ccb *cp = NULL; local
4884 cp = sym_calloc_dma(sizeof(struct sym_ccb), "CCB");
4885 if (!cp)
4896 cp->ccb_ba = vtobus(cp);
4901 hcode = CCB_HASH_CODE(cp->ccb_ba);
4902 cp->link_ccbh = np->ccbh[hcode];
4903 np->ccbh[hcode] = cp;
4908 cp->phys.head.go.start = cpu_to_scr(SCRIPTA_BA(np, idle));
4909 cp->phys.head.go.restart = cpu_to_scr(SCRIPTB_BA(np, bad_i_t_l));
4914 cp->phys.smsg_ext.addr = cpu_to_scr(HCB_BA(np, msgin[2]));
4919 sym_insque_head(&cp->link_ccbq, &np->free_ccbq);
4925 sym_insque_head(&cp->link2_ccbq, &np->dummy_ccbq);
4927 return cp;
4929 if (cp)
4930 sym_mfree_dma(cp, sizeof(*cp), "CCB");
4940 struct sym_ccb *cp; local
4943 cp = np->ccbh[hcode];
4944 while (cp) {
4945 if (cp->ccb_ba == dsa)
4947 cp = cp->link_ccbh;
4950 return cp;
5140 int sym_queue_scsiio(struct sym_hcb *np, struct scsi_cmnd *cmd, struct sym_ccb *cp) argument
5152 cp->cmd = cmd;
5157 tp = &np->target[cp->target];
5164 can_disconnect = (cp->tag != NO_TAG) ||
5167 msgptr = cp->scsi_smsg;
5174 if (cp->tag != NO_TAG) {
5175 u_char order = cp->order;
5214 msgptr[msglen++] = cp->tag;
5216 msgptr[msglen++] = (cp->tag << 1) + 1;
5227 cp->nego_status = 0;
5231 msglen += sym_prepare_nego(np, cp, msgptr + msglen);
5237 cp->phys.head.go.start = cpu_to_scr(SCRIPTA_BA(np, select));
5238 cp->phys.head.go.restart = cpu_to_scr(SCRIPTA_BA(np, resel_dsa));
5243 cp->phys.select.sel_id = cp->target;
5244 cp->phys.select.sel_scntl3 = tp->head.wval;
5245 cp->phys.select.sel_sxfer = tp->head.sval;
5246 cp->phys.select.sel_scntl4 = tp->head.uval;
5251 cp->phys.smsg.addr = CCB_BA(cp, scsi_smsg);
5252 cp->phys.smsg.size = cpu_to_scr(msglen);
5257 cp->host_xflags = 0;
5258 cp->host_status = cp->nego_status ? HS_NEGOTIATE : HS_BUSY;
5259 cp->ssss_status = S_ILLEGAL;
5260 cp->xerr_status = 0;
5261 cp->host_flags = 0;
5262 cp->extra_bytes = 0;
5268 cp->ext_sg = -1;
5269 cp->ext_ofs = 0;
5275 return sym_setup_data_and_start(np, cmd, cp);
5300 static int sym_abort_ccb(struct sym_hcb *np, struct sym_ccb *cp, int timed_out) argument
5305 if (!cp || !cp->host_status || cp->host_status == HS_WAIT)
5312 if (cp->to_abort) {
5320 cp->to_abort = timed_out ? 2 : 1;
5332 struct sym_ccb *cp; local
5338 cp = NULL;
5342 cp = cp2;
5347 return sym_abort_ccb(np, cp, timed_out);
5360 void sym_complete_error(struct sym_hcb *np, struct sym_ccb *cp) argument
5372 if (!cp || !cp->cmd)
5375 cmd = cp->cmd;
5378 dev_info(&sdev->sdev_gendev, "CCB=%p STAT=%x/%x/%x\n", cp,
5379 cp->host_status, cp->ssss_status, cp->host_flags);
5385 tp = &np->target[cp->target];
5391 if (cp->xerr_status) {
5393 sym_print_xerr(cmd, cp->xerr_status);
5394 if (cp->host_status == HS_COMPLETE)
5395 cp->host_status = HS_COMP_ERR;
5401 resid = sym_compute_residual(np, cp);
5405 cp->sv_resid = 0;
5417 i = sym_dequeue_from_squeue(np, i, cp->target, sdev->lun, -1);
5425 if (cp->host_status == HS_COMPLETE &&
5426 cp->ssss_status == S_QUEUE_FULL) {
5443 cp->host_status = HS_BUSY;
5444 cp->ssss_status = S_ILLEGAL;
5457 sym_set_cam_result_error(np, cp, resid);
5465 sym_remque(&cp->link_ccbq);
5466 sym_insque_head(&cp->link_ccbq, &np->comp_ccbq);
5491 void sym_complete_ok (struct sym_hcb *np, struct sym_ccb *cp) argument
5501 if (!cp || !cp->cmd)
5503 assert (cp->host_status == HS_COMPLETE);
5508 cmd = cp->cmd;
5513 tp = &np->target[cp->target];
5514 lp = sym_lp(tp, cp->lun);
5521 if (cp->phys.head.lastp != cp->goalp)
5522 resid = sym_compute_residual(np, cp);
5539 sym_set_cam_result_ok(cp, cmd, resid);
5562 sym_free_ccb (np, cp);
5806 struct sym_ccb *cp; local
5823 cp = sym_que_entry(qp, struct sym_ccb, link_ccbq);
5824 sym_mfree_dma(cp, sizeof(*cp), "CCB");