162306a36Sopenharmony_ci/*==========================================================================
262306a36Sopenharmony_ci  NinjaSCSI-3 message handler
362306a36Sopenharmony_ci      By: YOKOTA Hiroshi <yokota@netlab.is.tsukuba.ac.jp>
462306a36Sopenharmony_ci
562306a36Sopenharmony_ci   This software may be used and distributed according to the terms of
662306a36Sopenharmony_ci   the GNU General Public License.
762306a36Sopenharmony_ci */
862306a36Sopenharmony_ci
962306a36Sopenharmony_ci/* $Id: nsp_message.c,v 1.6 2003/07/26 14:21:09 elca Exp $ */
1062306a36Sopenharmony_ci
1162306a36Sopenharmony_cistatic void nsp_message_in(struct scsi_cmnd *SCpnt)
1262306a36Sopenharmony_ci{
1362306a36Sopenharmony_ci	unsigned int  base = SCpnt->device->host->io_port;
1462306a36Sopenharmony_ci	nsp_hw_data  *data = (nsp_hw_data *)SCpnt->device->host->hostdata;
1562306a36Sopenharmony_ci	unsigned char data_reg, control_reg;
1662306a36Sopenharmony_ci	int           ret, len;
1762306a36Sopenharmony_ci
1862306a36Sopenharmony_ci	/*
1962306a36Sopenharmony_ci	 * XXX: NSP QUIRK
2062306a36Sopenharmony_ci	 * NSP invoke interrupts only in the case of scsi phase changes,
2162306a36Sopenharmony_ci	 * therefore we should poll the scsi phase here to catch
2262306a36Sopenharmony_ci	 * the next "msg in" if exists (no scsi phase changes).
2362306a36Sopenharmony_ci	 */
2462306a36Sopenharmony_ci	ret = 16;
2562306a36Sopenharmony_ci	len = 0;
2662306a36Sopenharmony_ci
2762306a36Sopenharmony_ci	nsp_dbg(NSP_DEBUG_MSGINOCCUR, "msgin loop");
2862306a36Sopenharmony_ci	do {
2962306a36Sopenharmony_ci		/* read data */
3062306a36Sopenharmony_ci		data_reg = nsp_index_read(base, SCSIDATAIN);
3162306a36Sopenharmony_ci
3262306a36Sopenharmony_ci		/* assert ACK */
3362306a36Sopenharmony_ci		control_reg = nsp_index_read(base, SCSIBUSCTRL);
3462306a36Sopenharmony_ci		control_reg |= SCSI_ACK;
3562306a36Sopenharmony_ci		nsp_index_write(base, SCSIBUSCTRL, control_reg);
3662306a36Sopenharmony_ci		nsp_negate_signal(SCpnt, BUSMON_REQ, "msgin<REQ>");
3762306a36Sopenharmony_ci
3862306a36Sopenharmony_ci		data->MsgBuffer[len] = data_reg; len++;
3962306a36Sopenharmony_ci
4062306a36Sopenharmony_ci		/* deassert ACK */
4162306a36Sopenharmony_ci		control_reg =  nsp_index_read(base, SCSIBUSCTRL);
4262306a36Sopenharmony_ci		control_reg &= ~SCSI_ACK;
4362306a36Sopenharmony_ci		nsp_index_write(base, SCSIBUSCTRL, control_reg);
4462306a36Sopenharmony_ci
4562306a36Sopenharmony_ci		/* catch a next signal */
4662306a36Sopenharmony_ci		ret = nsp_expect_signal(SCpnt, BUSPHASE_MESSAGE_IN, BUSMON_REQ);
4762306a36Sopenharmony_ci	} while (ret > 0 && MSGBUF_SIZE > len);
4862306a36Sopenharmony_ci
4962306a36Sopenharmony_ci	data->MsgLen = len;
5062306a36Sopenharmony_ci
5162306a36Sopenharmony_ci}
5262306a36Sopenharmony_ci
5362306a36Sopenharmony_cistatic void nsp_message_out(struct scsi_cmnd *SCpnt)
5462306a36Sopenharmony_ci{
5562306a36Sopenharmony_ci	nsp_hw_data *data = (nsp_hw_data *)SCpnt->device->host->hostdata;
5662306a36Sopenharmony_ci	int ret = 1;
5762306a36Sopenharmony_ci	int len = data->MsgLen;
5862306a36Sopenharmony_ci
5962306a36Sopenharmony_ci	/*
6062306a36Sopenharmony_ci	 * XXX: NSP QUIRK
6162306a36Sopenharmony_ci	 * NSP invoke interrupts only in the case of scsi phase changes,
6262306a36Sopenharmony_ci	 * therefore we should poll the scsi phase here to catch
6362306a36Sopenharmony_ci	 * the next "msg out" if exists (no scsi phase changes).
6462306a36Sopenharmony_ci	 */
6562306a36Sopenharmony_ci
6662306a36Sopenharmony_ci	nsp_dbg(NSP_DEBUG_MSGOUTOCCUR, "msgout loop");
6762306a36Sopenharmony_ci	do {
6862306a36Sopenharmony_ci		if (nsp_xfer(SCpnt, BUSPHASE_MESSAGE_OUT)) {
6962306a36Sopenharmony_ci			nsp_msg(KERN_DEBUG, "msgout: xfer short");
7062306a36Sopenharmony_ci		}
7162306a36Sopenharmony_ci
7262306a36Sopenharmony_ci		/* catch a next signal */
7362306a36Sopenharmony_ci		ret = nsp_expect_signal(SCpnt, BUSPHASE_MESSAGE_OUT, BUSMON_REQ);
7462306a36Sopenharmony_ci	} while (ret > 0 && len-- > 0);
7562306a36Sopenharmony_ci
7662306a36Sopenharmony_ci}
7762306a36Sopenharmony_ci
7862306a36Sopenharmony_ci/* end */
79