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.6 2003/07/26 14:21:09 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