2607 return 0;
2608 if (len < msgbuf[1] + 2)
2609 return 0;
2610 } else if (*msgbuf >= 0x20 && *msgbuf <= 0x2f)
2611 if (len < 2)
2612 return 0;
2613 return 1;
2614}
2615
2616
2617static inline void msgin_reject(struct AdapterCtlBlk *acb,
2618 struct ScsiReqBlk *srb)
2619{
2620 srb->msgout_buf[0] = MESSAGE_REJECT;
2621 srb->msg_count = 1;
2622 DC395x_ENABLE_MSGOUT;
2623 srb->state &= ~SRB_MSGIN;
2624 srb->state |= SRB_MSGOUT;
2625 dprintkl(KERN_INFO, "msgin_reject: 0x%02x <%02i-%i>\n",
2626 srb->msgin_buf[0],
2627 srb->dcb->target_id, srb->dcb->target_lun);
2628}
2629
2630
2631static struct ScsiReqBlk *msgin_qtag(struct AdapterCtlBlk *acb,
2632 struct DeviceCtlBlk *dcb, u8 tag)
2633{
2634 struct ScsiReqBlk *srb = NULL;
2635 struct ScsiReqBlk *i;
2636 dprintkdbg(DBG_0, "msgin_qtag: (pid#%li) tag=%i srb=%p\n",
2637 srb->cmd->serial_number, tag, srb);
2638
2639 if (!(dcb->tag_mask & (1 << tag)))
2640 dprintkl(KERN_DEBUG,
2641 "msgin_qtag: tag_mask=0x%08x does not reserve tag %i!\n",
2642 dcb->tag_mask, tag);
2643
2644 if (list_empty(&dcb->srb_going_list))
2645 goto mingx0;
2646 list_for_each_entry(i, &dcb->srb_going_list, list) {
2647 if (i->tag_number == tag) {