1/*==========================================================================
2  NinjaSCSI-3 message handler
3      By: YOKOTA Hiroshi <yokota@netlab.is.tsukuba.ac.jp>
4
5   This software may be used and distributed according to the terms of
6   the GNU General Public License.
7 */
8
9/* $Id: nsp_message.c,v 1.1.1.1 2007/08/03 18:52:59 Exp $ */
10
11static void nsp_message_in(struct scsi_cmnd *SCpnt)
12{
13	unsigned int  base = SCpnt->device->host->io_port;
14	nsp_hw_data  *data = (nsp_hw_data *)SCpnt->device->host->hostdata;
15	unsigned char data_reg, control_reg;
16	int           ret, len;
17
18	ret = 16;
19	len = 0;
20
21	nsp_dbg(NSP_DEBUG_MSGINOCCUR, "msgin loop");
22	do {
23		/* read data */
24		data_reg = nsp_index_read(base, SCSIDATAIN);
25
26		/* assert ACK */
27		control_reg = nsp_index_read(base, SCSIBUSCTRL);
28		control_reg |= SCSI_ACK;
29		nsp_index_write(base, SCSIBUSCTRL, control_reg);
30		nsp_negate_signal(SCpnt, BUSMON_REQ, "msgin<REQ>");
31
32		data->MsgBuffer[len] = data_reg; len++;
33
34		/* deassert ACK */
35		control_reg =  nsp_index_read(base, SCSIBUSCTRL);
36		control_reg &= ~SCSI_ACK;
37		nsp_index_write(base, SCSIBUSCTRL, control_reg);
38
39		/* catch a next signal */
40		ret = nsp_expect_signal(SCpnt, BUSPHASE_MESSAGE_IN, BUSMON_REQ);
41	} while (ret > 0 && MSGBUF_SIZE > len);
42
43	data->MsgLen = len;
44
45}
46
47static void nsp_message_out(struct scsi_cmnd *SCpnt)
48{
49	nsp_hw_data *data = (nsp_hw_data *)SCpnt->device->host->hostdata;
50	int ret = 1;
51	int len = data->MsgLen;
52
53
54	nsp_dbg(NSP_DEBUG_MSGOUTOCCUR, "msgout loop");
55	do {
56		if (nsp_xfer(SCpnt, BUSPHASE_MESSAGE_OUT)) {
57			nsp_msg(KERN_DEBUG, "msgout: xfer short");
58		}
59
60		/* catch a next signal */
61		ret = nsp_expect_signal(SCpnt, BUSPHASE_MESSAGE_OUT, BUSMON_REQ);
62	} while (ret > 0 && len-- > 0);
63
64}
65
66/* end */
67