/* * QLogic Fibre Channel HBA Driver * Copyright (c) 2003-2008 QLogic Corporation * * See LICENSE.qla2xxx for copyright and licensing details. */#include"qla_def.h"#include<linux/blkdev.h>#include<linux/delay.h>#include<scsi/scsi_tcq.h>staticrequest_t*qla2x00_req_pkt(structscsi_qla_host*,structreq_que*,structrsp_que*rsp);staticvoidqla2x00_isp_cmd(structscsi_qla_host*,structreq_que*);staticvoidqla25xx_set_que(srb_t*,structrsp_que**);/** * qla2x00_get_cmd_direction() - Determine control_flag data direction. * @cmd: SCSI command * * Returns the proper CF_* direction based on CDB. */staticinlineuint16_tqla2x00_get_cmd_direction(srb_t*sp){uint16_tcflags;cflags=0;/* Set transfer direction */if(sp->cmd->sc_data_direction==DMA_TO_DEVICE){cflags=CF_WRITE;sp->fcport->vha->hw->qla_stats.output_bytes+=scsi_bufflen(sp->cmd);}elseif(sp->cmd->sc_data_direction==DMA_FROM_DEVICE){cflags=CF_READ;sp->fcport->vha->hw->qla_stats.input_bytes+=scsi_bufflen(sp->cmd);}return(cflags);}/** * qla2x00_calc_iocbs_32() - Determine number of Command Type 2 and * Continuation Type 0 IOCBs to allocate. * * @dsds: number of data segment decriptors needed * * Returns the number of IOCB entries needed to store @dsds. */uint16_tqla2x00_calc_iocbs_32(uint16_tdsds){uint16_tiocbs;iocbs=1;if(dsds>3){iocbs+=(dsds-3)/7;if((dsds-3)%7)iocbs++;}return(iocbs);}/** * qla2x00_calc_iocbs_64() - Determine number of Command Type 3 and * Continuation Type 1 IOCBs to allocate. * * @dsds: number of data segment decriptors needed * * Returns the number of IOCB entries needed to store @dsds. */uint16_tqla2x00_calc_iocbs_64(uint16_tdsds){uint16_tiocbs;iocbs=1;if(dsds>2){iocbs+=(dsds-2)/5;if((dsds-2)%5)iocbs++;}return(iocbs);}/** * qla2x00_prep_cont_type0_iocb() - Initialize a Continuation Type 0 IOCB. * @ha: HA context * * Returns a pointer to the Continuation Type 0 IOCB packet. */staticinlinecont_entry_t