示例#1
0
static void nsp_message_in(Scsi_Cmnd *SCpnt)
{
    unsigned int  base = SCpnt->device->host->io_port;
    nsp_hw_data  *data = (nsp_hw_data *)SCpnt->device->host->hostdata;
    unsigned char data_reg, control_reg;
    int           ret, len;

    /*
     * XXX: NSP QUIRK
     * NSP invoke interrupts only in the case of scsi phase changes,
     * therefore we should poll the scsi phase here to catch
     * the next "msg in" if exists (no scsi phase changes).
     */
    ret = 16;
    len = 0;

    nsp_dbg(NSP_DEBUG_MSGINOCCUR, "msgin loop");
    do {
        /* read data */
        data_reg = nsp_index_read(base, SCSIDATAIN);

        /* assert ACK */
        control_reg = nsp_index_read(base, SCSIBUSCTRL);
        control_reg |= SCSI_ACK;
        nsp_index_write(base, SCSIBUSCTRL, control_reg);
        nsp_negate_signal(SCpnt, BUSMON_REQ, "msgin<REQ>");

        data->MsgBuffer[len] = data_reg;
        len++;

        /* deassert ACK */
        control_reg =  nsp_index_read(base, SCSIBUSCTRL);
        control_reg &= ~SCSI_ACK;
        nsp_index_write(base, SCSIBUSCTRL, control_reg);

        /* catch a next signal */
        ret = nsp_expect_signal(SCpnt, BUSPHASE_MESSAGE_IN, BUSMON_REQ);
    } while (ret > 0 && MSGBUF_SIZE > len);

    data->MsgLen = len;

}
static void nsp_message_in(struct scsi_cmnd *SCpnt)
{
	unsigned int  base = SCpnt->device->host->io_port;
	nsp_hw_data  *data = (nsp_hw_data *)SCpnt->device->host->hostdata;
	unsigned char data_reg, control_reg;
	int           ret, len;

	/*
                  
                                                                 
                                                          
                                                        
  */
	ret = 16;
	len = 0;

	nsp_dbg(NSP_DEBUG_MSGINOCCUR, "msgin loop");
	do {
		/*           */
		data_reg = nsp_index_read(base, SCSIDATAIN);

		/*            */
		control_reg = nsp_index_read(base, SCSIBUSCTRL);
		control_reg |= SCSI_ACK;
		nsp_index_write(base, SCSIBUSCTRL, control_reg);
		nsp_negate_signal(SCpnt, BUSMON_REQ, "msgin<REQ>");

		data->MsgBuffer[len] = data_reg; len++;

		/*              */
		control_reg =  nsp_index_read(base, SCSIBUSCTRL);
		control_reg &= ~SCSI_ACK;
		nsp_index_write(base, SCSIBUSCTRL, control_reg);

		/*                     */
		ret = nsp_expect_signal(SCpnt, BUSPHASE_MESSAGE_IN, BUSMON_REQ);
	} while (ret > 0 && MSGBUF_SIZE > len);

	data->MsgLen = len;

}
示例#3
0
文件: nsp_message.c 项目: nhanh0/hah
static void nsp_message_out(Scsi_Cmnd *SCpnt, nsp_hw_data *data)
{
	int ret = 1;
	int len = data->MsgLen;

	/*
	 * XXX: NSP QUIRK
	 * NSP invoke interrupts only in the case of scsi phase changes,
	 * therefore we should poll the scsi phase here to catch 
	 * the next "msg out" if exists (no scsi phase changes).
	 */

	DEBUG(0, " msgout loop\n");
	do {
		if (nsp_xfer(SCpnt, data, BUSPHASE_MESSAGE_OUT)) {
			printk(KERN_DEBUG " " __FUNCTION__ " msgout: xfer short\n");
		}

		/* catch a next signal */
		ret = nsp_expect_signal(SCpnt, BUSPHASE_MESSAGE_OUT, BUSMON_REQ);
	} while (ret > 0 && len-- > 0);

}
示例#4
0
static void nsp_message_out(struct scsi_cmnd *SCpnt)
{
	nsp_hw_data *data = (nsp_hw_data *)SCpnt->device->host->hostdata;
	int ret = 1;
	int len = data->MsgLen;

	/*
	 * XXX: NSP QUIRK
	 * NSP invoke interrupts only in the case of scsi phase changes,
	 * therefore we should poll the scsi phase here to catch 
	 * the next "msg out" if exists (no scsi phase changes).
	 */

	nsp_dbg(NSP_DEBUG_MSGOUTOCCUR, "msgout loop");
	do {
		if (nsp_xfer(SCpnt, BUSPHASE_MESSAGE_OUT)) {
			nsp_msg(KERN_DEBUG, "msgout: xfer short");
		}

		/* catch a next signal */
		ret = nsp_expect_signal(SCpnt, BUSPHASE_MESSAGE_OUT, BUSMON_REQ);
	} while (ret > 0 && len-- > 0);

}
static void nsp_message_out(struct scsi_cmnd *SCpnt)
{
	nsp_hw_data *data = (nsp_hw_data *)SCpnt->device->host->hostdata;
	int ret = 1;
	int len = data->MsgLen;

	/*
                  
                                                                 
                                                          
                                                         
  */

	nsp_dbg(NSP_DEBUG_MSGOUTOCCUR, "msgout loop");
	do {
		if (nsp_xfer(SCpnt, BUSPHASE_MESSAGE_OUT)) {
			nsp_msg(KERN_DEBUG, "msgout: xfer short");
		}

		/*                     */
		ret = nsp_expect_signal(SCpnt, BUSPHASE_MESSAGE_OUT, BUSMON_REQ);
	} while (ret > 0 && len-- > 0);

}