mirror of
https://git.kernel.org/pub/scm/linux/kernel/git/stable/linux.git
synced 2025-01-09 14:43:16 +00:00
Merge master.kernel.org:/pub/scm/linux/kernel/git/jejb/scsi-rc-fixes-2.6
* master.kernel.org:/pub/scm/linux/kernel/git/jejb/scsi-rc-fixes-2.6: (40 commits) [SCSI] aic79xx: Print out signalling [SCSI] aic7xxx: Remove slave_destroy [SCSI] aic79xx: set precompensation [SCSI] aic79xx: Fixup external device reset [SCSI] replace u8 and u32 with __u8 and __u32 in scsi.h for user space [SCSI] lpfc: fix printk format warning [SCSI] aic79xx: make ahd_set_tags() static [SCSI] aic7xxx: cleanups [SCSI] drivers/scsi: Handcrafted MIN/MAX macro removal [SCSI] scsi_debug: support REPORT TARGET PORT GROUPS [SCSI] qla1280 bus reset typo [SCSI] libiscsi: fix logout pdu processing [SCSI] libiscsi: fix aen support [SCSI] libiscsi: fix missed iscsi_task_put in xmit error path [SCSI] libiscsi: fix oops in connection create failure path [SCSI] iscsi class: fix slab corruption during restart [SCSI] Switch fdomain to the pci_get API [SCSI] add can_queue to host parameters [SCSI] megaraid_{mm,mbox}: 64-bit DMA capability fix [SCSI] aic94xx: Supermicro motherboards support ...
This commit is contained in:
commit
71fa0a849b
@ -70,9 +70,9 @@
|
||||
|
||||
#define FCP_CMND(SCpnt) ((fcp_cmnd *)&(SCpnt->SCp))
|
||||
#define FC_SCMND(SCpnt) ((fc_channel *)(SCpnt->device->host->hostdata[0]))
|
||||
#define SC_FCMND(fcmnd) ((Scsi_Cmnd *)((long)fcmnd - (long)&(((Scsi_Cmnd *)0)->SCp)))
|
||||
#define SC_FCMND(fcmnd) ((struct scsi_cmnd *)((long)fcmnd - (long)&(((struct scsi_cmnd *)0)->SCp)))
|
||||
|
||||
static int fcp_scsi_queue_it(fc_channel *, Scsi_Cmnd *, fcp_cmnd *, int);
|
||||
static int fcp_scsi_queue_it(fc_channel *, struct scsi_cmnd *, fcp_cmnd *, int);
|
||||
void fcp_queue_empty(fc_channel *);
|
||||
|
||||
static void fcp_scsi_insert_queue (fc_channel *fc, fcp_cmnd *fcmd)
|
||||
@ -378,14 +378,14 @@ void fcp_register(fc_channel *fc, u8 type, int unregister)
|
||||
printk ("FC: %segistering unknown type %02x\n", unregister ? "Unr" : "R", type);
|
||||
}
|
||||
|
||||
static void fcp_scsi_done(Scsi_Cmnd *SCpnt);
|
||||
static void fcp_scsi_done(struct scsi_cmnd *SCpnt);
|
||||
|
||||
static inline void fcp_scsi_receive(fc_channel *fc, int token, int status, fc_hdr *fch)
|
||||
{
|
||||
fcp_cmnd *fcmd;
|
||||
fcp_rsp *rsp;
|
||||
int host_status;
|
||||
Scsi_Cmnd *SCpnt;
|
||||
struct scsi_cmnd *SCpnt;
|
||||
int sense_len;
|
||||
int rsp_status;
|
||||
|
||||
@ -757,13 +757,14 @@ void fcp_release(fc_channel *fcchain, int count) /* count must > 0 */
|
||||
}
|
||||
|
||||
|
||||
static void fcp_scsi_done (Scsi_Cmnd *SCpnt)
|
||||
static void fcp_scsi_done(struct scsi_cmnd *SCpnt)
|
||||
{
|
||||
if (FCP_CMND(SCpnt)->done)
|
||||
FCP_CMND(SCpnt)->done(SCpnt);
|
||||
}
|
||||
|
||||
static int fcp_scsi_queue_it(fc_channel *fc, Scsi_Cmnd *SCpnt, fcp_cmnd *fcmd, int prepare)
|
||||
static int fcp_scsi_queue_it(fc_channel *fc, struct scsi_cmnd *SCpnt,
|
||||
fcp_cmnd *fcmd, int prepare)
|
||||
{
|
||||
long i;
|
||||
fcp_cmd *cmd;
|
||||
@ -837,7 +838,8 @@ static int fcp_scsi_queue_it(fc_channel *fc, Scsi_Cmnd *SCpnt, fcp_cmnd *fcmd, i
|
||||
return 0;
|
||||
}
|
||||
|
||||
int fcp_scsi_queuecommand(Scsi_Cmnd *SCpnt, void (* done)(Scsi_Cmnd *))
|
||||
int fcp_scsi_queuecommand(struct scsi_cmnd *SCpnt,
|
||||
void (* done)(struct scsi_cmnd *))
|
||||
{
|
||||
fcp_cmnd *fcmd = FCP_CMND(SCpnt);
|
||||
fc_channel *fc = FC_SCMND(SCpnt);
|
||||
@ -873,7 +875,7 @@ void fcp_queue_empty(fc_channel *fc)
|
||||
}
|
||||
}
|
||||
|
||||
int fcp_scsi_abort(Scsi_Cmnd *SCpnt)
|
||||
int fcp_scsi_abort(struct scsi_cmnd *SCpnt)
|
||||
{
|
||||
/* Internal bookkeeping only. Lose 1 cmd_slots slot. */
|
||||
fcp_cmnd *fcmd = FCP_CMND(SCpnt);
|
||||
@ -910,7 +912,7 @@ int fcp_scsi_abort(Scsi_Cmnd *SCpnt)
|
||||
}
|
||||
|
||||
#if 0
|
||||
void fcp_scsi_reset_done(Scsi_Cmnd *SCpnt)
|
||||
void fcp_scsi_reset_done(struct scsi_cmnd *SCpnt)
|
||||
{
|
||||
fc_channel *fc = FC_SCMND(SCpnt);
|
||||
|
||||
@ -921,7 +923,7 @@ void fcp_scsi_reset_done(Scsi_Cmnd *SCpnt)
|
||||
|
||||
#define FCP_RESET_TIMEOUT (2*HZ)
|
||||
|
||||
int fcp_scsi_dev_reset(Scsi_Cmnd *SCpnt)
|
||||
int fcp_scsi_dev_reset(struct scsi_cmnd *SCpnt)
|
||||
{
|
||||
#if 0 /* broken junk, but if davem wants to compile this driver, let him.. */
|
||||
unsigned long flags;
|
||||
@ -931,7 +933,7 @@ int fcp_scsi_dev_reset(Scsi_Cmnd *SCpnt)
|
||||
DECLARE_MUTEX_LOCKED(sem);
|
||||
|
||||
if (!fc->rst_pkt) {
|
||||
fc->rst_pkt = (Scsi_Cmnd *) kmalloc(sizeof(SCpnt), GFP_KERNEL);
|
||||
fc->rst_pkt = (struct scsi_cmnd *) kmalloc(sizeof(SCpnt), GFP_KERNEL);
|
||||
if (!fc->rst_pkt) return FAILED;
|
||||
|
||||
fcmd = FCP_CMND(fc->rst_pkt);
|
||||
@ -999,7 +1001,7 @@ int fcp_scsi_dev_reset(Scsi_Cmnd *SCpnt)
|
||||
return SUCCESS;
|
||||
}
|
||||
|
||||
static int __fcp_scsi_host_reset(Scsi_Cmnd *SCpnt)
|
||||
static int __fcp_scsi_host_reset(struct scsi_cmnd *SCpnt)
|
||||
{
|
||||
fc_channel *fc = FC_SCMND(SCpnt);
|
||||
fcp_cmnd *fcmd = FCP_CMND(SCpnt);
|
||||
@ -1020,7 +1022,7 @@ static int __fcp_scsi_host_reset(Scsi_Cmnd *SCpnt)
|
||||
else return FAILED;
|
||||
}
|
||||
|
||||
int fcp_scsi_host_reset(Scsi_Cmnd *SCpnt)
|
||||
int fcp_scsi_host_reset(struct scsi_cmnd *SCpnt)
|
||||
{
|
||||
unsigned long flags;
|
||||
int rc;
|
||||
|
@ -39,7 +39,7 @@ struct _fc_channel;
|
||||
typedef struct fcp_cmnd {
|
||||
struct fcp_cmnd *next;
|
||||
struct fcp_cmnd *prev;
|
||||
void (*done)(Scsi_Cmnd *);
|
||||
void (*done)(struct scsi_cmnd *);
|
||||
unsigned short proto;
|
||||
unsigned short token;
|
||||
unsigned int did;
|
||||
@ -94,14 +94,14 @@ typedef struct _fc_channel {
|
||||
long *scsi_bitmap;
|
||||
long scsi_bitmap_end;
|
||||
int scsi_free;
|
||||
int (*encode_addr)(Scsi_Cmnd *, u16 *, struct _fc_channel *, fcp_cmnd *);
|
||||
int (*encode_addr)(struct scsi_cmnd *, u16 *, struct _fc_channel *, fcp_cmnd *);
|
||||
fcp_cmnd *scsi_que;
|
||||
char scsi_name[4];
|
||||
fcp_cmnd **cmd_slots;
|
||||
int channels;
|
||||
int targets;
|
||||
long *ages;
|
||||
Scsi_Cmnd *rst_pkt;
|
||||
struct scsi_cmnd *rst_pkt;
|
||||
fcp_posmap *posmap;
|
||||
/* LOGIN stuff */
|
||||
fcp_cmnd *login;
|
||||
@ -155,9 +155,10 @@ int fc_do_prli(fc_channel *, unsigned char);
|
||||
for_each_fc_channel(fc) \
|
||||
if (fc->state == FC_STATE_ONLINE)
|
||||
|
||||
int fcp_scsi_queuecommand(Scsi_Cmnd *, void (* done)(Scsi_Cmnd *));
|
||||
int fcp_scsi_abort(Scsi_Cmnd *);
|
||||
int fcp_scsi_dev_reset(Scsi_Cmnd *);
|
||||
int fcp_scsi_host_reset(Scsi_Cmnd *);
|
||||
int fcp_scsi_queuecommand(struct scsi_cmnd *,
|
||||
void (* done) (struct scsi_cmnd *));
|
||||
int fcp_scsi_abort(struct scsi_cmnd *);
|
||||
int fcp_scsi_dev_reset(struct scsi_cmnd *);
|
||||
int fcp_scsi_host_reset(struct scsi_cmnd *);
|
||||
|
||||
#endif /* !(_FCP_SCSI_H) */
|
||||
|
@ -75,8 +75,8 @@
|
||||
#define COPYRIGHT "Copyright (c) 1999-2005 " MODULEAUTHOR
|
||||
#endif
|
||||
|
||||
#define MPT_LINUX_VERSION_COMMON "3.04.01"
|
||||
#define MPT_LINUX_PACKAGE_NAME "@(#)mptlinux-3.04.01"
|
||||
#define MPT_LINUX_VERSION_COMMON "3.04.02"
|
||||
#define MPT_LINUX_PACKAGE_NAME "@(#)mptlinux-3.04.02"
|
||||
#define WHAT_MAGIC_STRING "@" "(" "#" ")"
|
||||
|
||||
#define show_mptmod_ver(s,ver) \
|
||||
|
@ -96,6 +96,10 @@ static int mptfc_qcmd(struct scsi_cmnd *SCpnt,
|
||||
static void mptfc_target_destroy(struct scsi_target *starget);
|
||||
static void mptfc_set_rport_loss_tmo(struct fc_rport *rport, uint32_t timeout);
|
||||
static void __devexit mptfc_remove(struct pci_dev *pdev);
|
||||
static int mptfc_abort(struct scsi_cmnd *SCpnt);
|
||||
static int mptfc_dev_reset(struct scsi_cmnd *SCpnt);
|
||||
static int mptfc_bus_reset(struct scsi_cmnd *SCpnt);
|
||||
static int mptfc_host_reset(struct scsi_cmnd *SCpnt);
|
||||
|
||||
static struct scsi_host_template mptfc_driver_template = {
|
||||
.module = THIS_MODULE,
|
||||
@ -110,10 +114,10 @@ static struct scsi_host_template mptfc_driver_template = {
|
||||
.target_destroy = mptfc_target_destroy,
|
||||
.slave_destroy = mptscsih_slave_destroy,
|
||||
.change_queue_depth = mptscsih_change_queue_depth,
|
||||
.eh_abort_handler = mptscsih_abort,
|
||||
.eh_device_reset_handler = mptscsih_dev_reset,
|
||||
.eh_bus_reset_handler = mptscsih_bus_reset,
|
||||
.eh_host_reset_handler = mptscsih_host_reset,
|
||||
.eh_abort_handler = mptfc_abort,
|
||||
.eh_device_reset_handler = mptfc_dev_reset,
|
||||
.eh_bus_reset_handler = mptfc_bus_reset,
|
||||
.eh_host_reset_handler = mptfc_host_reset,
|
||||
.bios_param = mptscsih_bios_param,
|
||||
.can_queue = MPT_FC_CAN_QUEUE,
|
||||
.this_id = -1,
|
||||
@ -171,6 +175,77 @@ static struct fc_function_template mptfc_transport_functions = {
|
||||
.show_host_symbolic_name = 1,
|
||||
};
|
||||
|
||||
static int
|
||||
mptfc_block_error_handler(struct scsi_cmnd *SCpnt,
|
||||
int (*func)(struct scsi_cmnd *SCpnt),
|
||||
const char *caller)
|
||||
{
|
||||
struct scsi_device *sdev = SCpnt->device;
|
||||
struct Scsi_Host *shost = sdev->host;
|
||||
struct fc_rport *rport = starget_to_rport(scsi_target(sdev));
|
||||
unsigned long flags;
|
||||
int ready;
|
||||
|
||||
spin_lock_irqsave(shost->host_lock, flags);
|
||||
while ((ready = fc_remote_port_chkready(rport) >> 16) == DID_IMM_RETRY) {
|
||||
spin_unlock_irqrestore(shost->host_lock, flags);
|
||||
dfcprintk ((MYIOC_s_INFO_FMT
|
||||
"mptfc_block_error_handler.%d: %d:%d, port status is "
|
||||
"DID_IMM_RETRY, deferring %s recovery.\n",
|
||||
((MPT_SCSI_HOST *) shost->hostdata)->ioc->name,
|
||||
((MPT_SCSI_HOST *) shost->hostdata)->ioc->sh->host_no,
|
||||
SCpnt->device->id,SCpnt->device->lun,caller));
|
||||
msleep(1000);
|
||||
spin_lock_irqsave(shost->host_lock, flags);
|
||||
}
|
||||
spin_unlock_irqrestore(shost->host_lock, flags);
|
||||
|
||||
if (ready == DID_NO_CONNECT || !SCpnt->device->hostdata) {
|
||||
dfcprintk ((MYIOC_s_INFO_FMT
|
||||
"%s.%d: %d:%d, failing recovery, "
|
||||
"port state %d, vdev %p.\n", caller,
|
||||
((MPT_SCSI_HOST *) shost->hostdata)->ioc->name,
|
||||
((MPT_SCSI_HOST *) shost->hostdata)->ioc->sh->host_no,
|
||||
SCpnt->device->id,SCpnt->device->lun,ready,
|
||||
SCpnt->device->hostdata));
|
||||
return FAILED;
|
||||
}
|
||||
dfcprintk ((MYIOC_s_INFO_FMT
|
||||
"%s.%d: %d:%d, executing recovery.\n", caller,
|
||||
((MPT_SCSI_HOST *) shost->hostdata)->ioc->name,
|
||||
((MPT_SCSI_HOST *) shost->hostdata)->ioc->sh->host_no,
|
||||
SCpnt->device->id,SCpnt->device->lun));
|
||||
return (*func)(SCpnt);
|
||||
}
|
||||
|
||||
static int
|
||||
mptfc_abort(struct scsi_cmnd *SCpnt)
|
||||
{
|
||||
return
|
||||
mptfc_block_error_handler(SCpnt, mptscsih_abort, __FUNCTION__);
|
||||
}
|
||||
|
||||
static int
|
||||
mptfc_dev_reset(struct scsi_cmnd *SCpnt)
|
||||
{
|
||||
return
|
||||
mptfc_block_error_handler(SCpnt, mptscsih_dev_reset, __FUNCTION__);
|
||||
}
|
||||
|
||||
static int
|
||||
mptfc_bus_reset(struct scsi_cmnd *SCpnt)
|
||||
{
|
||||
return
|
||||
mptfc_block_error_handler(SCpnt, mptscsih_bus_reset, __FUNCTION__);
|
||||
}
|
||||
|
||||
static int
|
||||
mptfc_host_reset(struct scsi_cmnd *SCpnt)
|
||||
{
|
||||
return
|
||||
mptfc_block_error_handler(SCpnt, mptscsih_host_reset, __FUNCTION__);
|
||||
}
|
||||
|
||||
static void
|
||||
mptfc_set_rport_loss_tmo(struct fc_rport *rport, uint32_t timeout)
|
||||
{
|
||||
@ -562,6 +637,12 @@ mptfc_qcmd(struct scsi_cmnd *SCpnt, void (*done)(struct scsi_cmnd *))
|
||||
return 0;
|
||||
}
|
||||
|
||||
if (!SCpnt->device->hostdata) { /* vdev */
|
||||
SCpnt->result = DID_NO_CONNECT << 16;
|
||||
done(SCpnt);
|
||||
return 0;
|
||||
}
|
||||
|
||||
/* dd_data is null until finished adding target */
|
||||
ri = *((struct mptfc_rport_info **)rport->dd_data);
|
||||
if (unlikely(!ri)) {
|
||||
|
@ -107,6 +107,10 @@ zfcp_address_to_sg(void *address, struct scatterlist *list)
|
||||
(ZFCP_MAX_SBALS_PER_REQ * ZFCP_MAX_SBALES_PER_SBAL - 2)
|
||||
/* request ID + QTCB in SBALE 0 + 1 of first SBAL in chain */
|
||||
|
||||
#define ZFCP_MAX_SECTORS (ZFCP_MAX_SBALES_PER_REQ * 8)
|
||||
/* max. number of (data buffer) SBALEs in largest SBAL chain
|
||||
multiplied with number of sectors per 4k block */
|
||||
|
||||
/* FIXME(tune): free space should be one max. SBAL chain plus what? */
|
||||
#define ZFCP_QDIO_PCI_INTERVAL (QDIO_MAX_BUFFERS_PER_Q \
|
||||
- (ZFCP_MAX_SBALS_PER_REQ + 4))
|
||||
|
@ -58,6 +58,7 @@ struct zfcp_data zfcp_data = {
|
||||
.cmd_per_lun = 1,
|
||||
.use_clustering = 1,
|
||||
.sdev_attrs = zfcp_sysfs_sdev_attrs,
|
||||
.max_sectors = ZFCP_MAX_SECTORS,
|
||||
},
|
||||
.driver_version = ZFCP_VERSION,
|
||||
};
|
||||
|
@ -53,14 +53,6 @@ struct ahd_platform_data;
|
||||
struct scb_platform_data;
|
||||
|
||||
/****************************** Useful Macros *********************************/
|
||||
#ifndef MAX
|
||||
#define MAX(a,b) (((a) > (b)) ? (a) : (b))
|
||||
#endif
|
||||
|
||||
#ifndef MIN
|
||||
#define MIN(a,b) (((a) < (b)) ? (a) : (b))
|
||||
#endif
|
||||
|
||||
#ifndef TRUE
|
||||
#define TRUE 1
|
||||
#endif
|
||||
@ -972,8 +964,6 @@ int ahd_read_seeprom(struct ahd_softc *ahd, uint16_t *buf,
|
||||
|
||||
int ahd_write_seeprom(struct ahd_softc *ahd, uint16_t *buf,
|
||||
u_int start_addr, u_int count);
|
||||
int ahd_wait_seeprom(struct ahd_softc *ahd);
|
||||
int ahd_verify_vpd_cksum(struct vpd_config *vpd);
|
||||
int ahd_verify_cksum(struct seeprom_config *sc);
|
||||
int ahd_acquire_seeprom(struct ahd_softc *ahd);
|
||||
void ahd_release_seeprom(struct ahd_softc *ahd);
|
||||
@ -1320,8 +1310,6 @@ struct ahd_pci_identity {
|
||||
char *name;
|
||||
ahd_device_setup_t *setup;
|
||||
};
|
||||
extern struct ahd_pci_identity ahd_pci_ident_table [];
|
||||
extern const u_int ahd_num_pci_devs;
|
||||
|
||||
/***************************** VL/EISA Declarations ***************************/
|
||||
struct aic7770_identity {
|
||||
@ -1339,15 +1327,6 @@ extern const int ahd_num_aic7770_devs;
|
||||
/*************************** Function Declarations ****************************/
|
||||
/******************************************************************************/
|
||||
void ahd_reset_cmds_pending(struct ahd_softc *ahd);
|
||||
u_int ahd_find_busy_tcl(struct ahd_softc *ahd, u_int tcl);
|
||||
void ahd_busy_tcl(struct ahd_softc *ahd,
|
||||
u_int tcl, u_int busyid);
|
||||
static __inline void ahd_unbusy_tcl(struct ahd_softc *ahd, u_int tcl);
|
||||
static __inline void
|
||||
ahd_unbusy_tcl(struct ahd_softc *ahd, u_int tcl)
|
||||
{
|
||||
ahd_busy_tcl(ahd, tcl, SCB_LIST_NULL);
|
||||
}
|
||||
|
||||
/***************************** PCI Front End *********************************/
|
||||
struct ahd_pci_identity *ahd_find_pci_device(ahd_dev_softc_t);
|
||||
@ -1356,7 +1335,6 @@ int ahd_pci_config(struct ahd_softc *,
|
||||
int ahd_pci_test_register_access(struct ahd_softc *);
|
||||
|
||||
/************************** SCB and SCB queue management **********************/
|
||||
int ahd_probe_scbs(struct ahd_softc *);
|
||||
void ahd_qinfifo_requeue_tail(struct ahd_softc *ahd,
|
||||
struct scb *scb);
|
||||
int ahd_match_scb(struct ahd_softc *ahd, struct scb *scb,
|
||||
@ -1374,33 +1352,20 @@ int ahd_parse_vpddata(struct ahd_softc *ahd,
|
||||
int ahd_parse_cfgdata(struct ahd_softc *ahd,
|
||||
struct seeprom_config *sc);
|
||||
void ahd_intr_enable(struct ahd_softc *ahd, int enable);
|
||||
void ahd_update_coalescing_values(struct ahd_softc *ahd,
|
||||
u_int timer,
|
||||
u_int maxcmds,
|
||||
u_int mincmds);
|
||||
void ahd_enable_coalescing(struct ahd_softc *ahd,
|
||||
int enable);
|
||||
void ahd_pause_and_flushwork(struct ahd_softc *ahd);
|
||||
int ahd_suspend(struct ahd_softc *ahd);
|
||||
int ahd_resume(struct ahd_softc *ahd);
|
||||
void ahd_set_unit(struct ahd_softc *, int);
|
||||
void ahd_set_name(struct ahd_softc *, char *);
|
||||
struct scb *ahd_get_scb(struct ahd_softc *ahd, u_int col_idx);
|
||||
void ahd_free_scb(struct ahd_softc *ahd, struct scb *scb);
|
||||
void ahd_alloc_scbs(struct ahd_softc *ahd);
|
||||
void ahd_free(struct ahd_softc *ahd);
|
||||
int ahd_reset(struct ahd_softc *ahd, int reinit);
|
||||
void ahd_shutdown(void *arg);
|
||||
int ahd_write_flexport(struct ahd_softc *ahd,
|
||||
u_int addr, u_int value);
|
||||
int ahd_read_flexport(struct ahd_softc *ahd, u_int addr,
|
||||
uint8_t *value);
|
||||
int ahd_wait_flexport(struct ahd_softc *ahd);
|
||||
|
||||
/*************************** Interrupt Services *******************************/
|
||||
void ahd_pci_intr(struct ahd_softc *ahd);
|
||||
void ahd_clear_intstat(struct ahd_softc *ahd);
|
||||
void ahd_flush_qoutfifo(struct ahd_softc *ahd);
|
||||
void ahd_run_qoutfifo(struct ahd_softc *ahd);
|
||||
#ifdef AHD_TARGET_MODE
|
||||
void ahd_run_tqinfifo(struct ahd_softc *ahd, int paused);
|
||||
@ -1409,7 +1374,6 @@ void ahd_handle_hwerrint(struct ahd_softc *ahd);
|
||||
void ahd_handle_seqint(struct ahd_softc *ahd, u_int intstat);
|
||||
void ahd_handle_scsiint(struct ahd_softc *ahd,
|
||||
u_int intstat);
|
||||
void ahd_clear_critical_section(struct ahd_softc *ahd);
|
||||
|
||||
/***************************** Error Recovery *********************************/
|
||||
typedef enum {
|
||||
@ -1426,23 +1390,9 @@ int ahd_search_disc_list(struct ahd_softc *ahd, int target,
|
||||
char channel, int lun, u_int tag,
|
||||
int stop_on_first, int remove,
|
||||
int save_state);
|
||||
void ahd_freeze_devq(struct ahd_softc *ahd, struct scb *scb);
|
||||
int ahd_reset_channel(struct ahd_softc *ahd, char channel,
|
||||
int initiate_reset);
|
||||
int ahd_abort_scbs(struct ahd_softc *ahd, int target,
|
||||
char channel, int lun, u_int tag,
|
||||
role_t role, uint32_t status);
|
||||
void ahd_restart(struct ahd_softc *ahd);
|
||||
void ahd_clear_fifo(struct ahd_softc *ahd, u_int fifo);
|
||||
void ahd_handle_scb_status(struct ahd_softc *ahd,
|
||||
struct scb *scb);
|
||||
void ahd_handle_scsi_status(struct ahd_softc *ahd,
|
||||
struct scb *scb);
|
||||
void ahd_calc_residual(struct ahd_softc *ahd,
|
||||
struct scb *scb);
|
||||
/*************************** Utility Functions ********************************/
|
||||
struct ahd_phase_table_entry*
|
||||
ahd_lookup_phase_entry(int phase);
|
||||
void ahd_compile_devinfo(struct ahd_devinfo *devinfo,
|
||||
u_int our_id, u_int target,
|
||||
u_int lun, char channel,
|
||||
@ -1450,14 +1400,6 @@ void ahd_compile_devinfo(struct ahd_devinfo *devinfo,
|
||||
/************************** Transfer Negotiation ******************************/
|
||||
void ahd_find_syncrate(struct ahd_softc *ahd, u_int *period,
|
||||
u_int *ppr_options, u_int maxsync);
|
||||
void ahd_validate_offset(struct ahd_softc *ahd,
|
||||
struct ahd_initiator_tinfo *tinfo,
|
||||
u_int period, u_int *offset,
|
||||
int wide, role_t role);
|
||||
void ahd_validate_width(struct ahd_softc *ahd,
|
||||
struct ahd_initiator_tinfo *tinfo,
|
||||
u_int *bus_width,
|
||||
role_t role);
|
||||
/*
|
||||
* Negotiation types. These are used to qualify if we should renegotiate
|
||||
* even if our goal and current transport parameters are identical.
|
||||
@ -1486,11 +1428,6 @@ typedef enum {
|
||||
AHD_QUEUE_TAGGED
|
||||
} ahd_queue_alg;
|
||||
|
||||
void ahd_set_tags(struct ahd_softc *ahd,
|
||||
struct scsi_cmnd *cmd,
|
||||
struct ahd_devinfo *devinfo,
|
||||
ahd_queue_alg alg);
|
||||
|
||||
/**************************** Target Mode *************************************/
|
||||
#ifdef AHD_TARGET_MODE
|
||||
void ahd_send_lstate_events(struct ahd_softc *,
|
||||
@ -1528,10 +1465,8 @@ extern uint32_t ahd_debug;
|
||||
#define AHD_SHOW_INT_COALESCING 0x10000
|
||||
#define AHD_DEBUG_SEQUENCER 0x20000
|
||||
#endif
|
||||
void ahd_print_scb(struct scb *scb);
|
||||
void ahd_print_devinfo(struct ahd_softc *ahd,
|
||||
struct ahd_devinfo *devinfo);
|
||||
void ahd_dump_sglist(struct scb *scb);
|
||||
void ahd_dump_card_state(struct ahd_softc *ahd);
|
||||
int ahd_print_register(ahd_reg_parse_entry_t *table,
|
||||
u_int num_entries,
|
||||
@ -1540,5 +1475,4 @@ int ahd_print_register(ahd_reg_parse_entry_t *table,
|
||||
u_int value,
|
||||
u_int *cur_column,
|
||||
u_int wrap_point);
|
||||
void ahd_dump_scbs(struct ahd_softc *ahd);
|
||||
#endif /* _AIC79XX_H_ */
|
||||
|
@ -52,7 +52,7 @@
|
||||
|
||||
|
||||
/***************************** Lookup Tables **********************************/
|
||||
char *ahd_chip_names[] =
|
||||
static char *ahd_chip_names[] =
|
||||
{
|
||||
"NONE",
|
||||
"aic7901",
|
||||
@ -237,10 +237,33 @@ static int ahd_handle_target_cmd(struct ahd_softc *ahd,
|
||||
struct target_cmd *cmd);
|
||||
#endif
|
||||
|
||||
static int ahd_abort_scbs(struct ahd_softc *ahd, int target,
|
||||
char channel, int lun, u_int tag,
|
||||
role_t role, uint32_t status);
|
||||
static void ahd_alloc_scbs(struct ahd_softc *ahd);
|
||||
static void ahd_busy_tcl(struct ahd_softc *ahd, u_int tcl,
|
||||
u_int scbid);
|
||||
static void ahd_calc_residual(struct ahd_softc *ahd,
|
||||
struct scb *scb);
|
||||
static void ahd_clear_critical_section(struct ahd_softc *ahd);
|
||||
static void ahd_clear_intstat(struct ahd_softc *ahd);
|
||||
static void ahd_enable_coalescing(struct ahd_softc *ahd,
|
||||
int enable);
|
||||
static u_int ahd_find_busy_tcl(struct ahd_softc *ahd, u_int tcl);
|
||||
static void ahd_freeze_devq(struct ahd_softc *ahd,
|
||||
struct scb *scb);
|
||||
static void ahd_handle_scb_status(struct ahd_softc *ahd,
|
||||
struct scb *scb);
|
||||
static struct ahd_phase_table_entry* ahd_lookup_phase_entry(int phase);
|
||||
static void ahd_shutdown(void *arg);
|
||||
static void ahd_update_coalescing_values(struct ahd_softc *ahd,
|
||||
u_int timer,
|
||||
u_int maxcmds,
|
||||
u_int mincmds);
|
||||
static int ahd_verify_vpd_cksum(struct vpd_config *vpd);
|
||||
static int ahd_wait_seeprom(struct ahd_softc *ahd);
|
||||
|
||||
/******************************** Private Inlines *****************************/
|
||||
static __inline void ahd_assert_atn(struct ahd_softc *ahd);
|
||||
static __inline int ahd_currently_packetized(struct ahd_softc *ahd);
|
||||
static __inline int ahd_set_active_fifo(struct ahd_softc *ahd);
|
||||
|
||||
static __inline void
|
||||
ahd_assert_atn(struct ahd_softc *ahd)
|
||||
@ -294,11 +317,44 @@ ahd_set_active_fifo(struct ahd_softc *ahd)
|
||||
}
|
||||
}
|
||||
|
||||
static __inline void
|
||||
ahd_unbusy_tcl(struct ahd_softc *ahd, u_int tcl)
|
||||
{
|
||||
ahd_busy_tcl(ahd, tcl, SCB_LIST_NULL);
|
||||
}
|
||||
|
||||
/*
|
||||
* Determine whether the sequencer reported a residual
|
||||
* for this SCB/transaction.
|
||||
*/
|
||||
static __inline void
|
||||
ahd_update_residual(struct ahd_softc *ahd, struct scb *scb)
|
||||
{
|
||||
uint32_t sgptr;
|
||||
|
||||
sgptr = ahd_le32toh(scb->hscb->sgptr);
|
||||
if ((sgptr & SG_STATUS_VALID) != 0)
|
||||
ahd_calc_residual(ahd, scb);
|
||||
}
|
||||
|
||||
static __inline void
|
||||
ahd_complete_scb(struct ahd_softc *ahd, struct scb *scb)
|
||||
{
|
||||
uint32_t sgptr;
|
||||
|
||||
sgptr = ahd_le32toh(scb->hscb->sgptr);
|
||||
if ((sgptr & SG_STATUS_VALID) != 0)
|
||||
ahd_handle_scb_status(ahd, scb);
|
||||
else
|
||||
ahd_done(ahd, scb);
|
||||
}
|
||||
|
||||
|
||||
/************************* Sequencer Execution Control ************************/
|
||||
/*
|
||||
* Restart the sequencer program from address zero
|
||||
*/
|
||||
void
|
||||
static void
|
||||
ahd_restart(struct ahd_softc *ahd)
|
||||
{
|
||||
|
||||
@ -342,7 +398,7 @@ ahd_restart(struct ahd_softc *ahd)
|
||||
ahd_unpause(ahd);
|
||||
}
|
||||
|
||||
void
|
||||
static void
|
||||
ahd_clear_fifo(struct ahd_softc *ahd, u_int fifo)
|
||||
{
|
||||
ahd_mode_state saved_modes;
|
||||
@ -366,7 +422,7 @@ ahd_clear_fifo(struct ahd_softc *ahd, u_int fifo)
|
||||
* Flush and completed commands that are sitting in the command
|
||||
* complete queues down on the chip but have yet to be dma'ed back up.
|
||||
*/
|
||||
void
|
||||
static void
|
||||
ahd_flush_qoutfifo(struct ahd_softc *ahd)
|
||||
{
|
||||
struct scb *scb;
|
||||
@ -905,6 +961,51 @@ ahd_handle_hwerrint(struct ahd_softc *ahd)
|
||||
ahd_free(ahd);
|
||||
}
|
||||
|
||||
#ifdef AHD_DEBUG
|
||||
static void
|
||||
ahd_dump_sglist(struct scb *scb)
|
||||
{
|
||||
int i;
|
||||
|
||||
if (scb->sg_count > 0) {
|
||||
if ((scb->ahd_softc->flags & AHD_64BIT_ADDRESSING) != 0) {
|
||||
struct ahd_dma64_seg *sg_list;
|
||||
|
||||
sg_list = (struct ahd_dma64_seg*)scb->sg_list;
|
||||
for (i = 0; i < scb->sg_count; i++) {
|
||||
uint64_t addr;
|
||||
uint32_t len;
|
||||
|
||||
addr = ahd_le64toh(sg_list[i].addr);
|
||||
len = ahd_le32toh(sg_list[i].len);
|
||||
printf("sg[%d] - Addr 0x%x%x : Length %d%s\n",
|
||||
i,
|
||||
(uint32_t)((addr >> 32) & 0xFFFFFFFF),
|
||||
(uint32_t)(addr & 0xFFFFFFFF),
|
||||
sg_list[i].len & AHD_SG_LEN_MASK,
|
||||
(sg_list[i].len & AHD_DMA_LAST_SEG)
|
||||
? " Last" : "");
|
||||
}
|
||||
} else {
|
||||
struct ahd_dma_seg *sg_list;
|
||||
|
||||
sg_list = (struct ahd_dma_seg*)scb->sg_list;
|
||||
for (i = 0; i < scb->sg_count; i++) {
|
||||
uint32_t len;
|
||||
|
||||
len = ahd_le32toh(sg_list[i].len);
|
||||
printf("sg[%d] - Addr 0x%x%x : Length %d%s\n",
|
||||
i,
|
||||
(len & AHD_SG_HIGH_ADDR_MASK) >> 24,
|
||||
ahd_le32toh(sg_list[i].addr),
|
||||
len & AHD_SG_LEN_MASK,
|
||||
len & AHD_DMA_LAST_SEG ? " Last" : "");
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
#endif /* AHD_DEBUG */
|
||||
|
||||
void
|
||||
ahd_handle_seqint(struct ahd_softc *ahd, u_int intstat)
|
||||
{
|
||||
@ -1053,10 +1154,12 @@ ahd_handle_seqint(struct ahd_softc *ahd, u_int intstat)
|
||||
* If a target takes us into the command phase
|
||||
* assume that it has been externally reset and
|
||||
* has thus lost our previous packetized negotiation
|
||||
* agreement.
|
||||
* Revert to async/narrow transfers until we
|
||||
* can renegotiate with the device and notify
|
||||
* the OSM about the reset.
|
||||
* agreement. Since we have not sent an identify
|
||||
* message and may not have fully qualified the
|
||||
* connection, we change our command to TUR, assert
|
||||
* ATN and ABORT the task when we go to message in
|
||||
* phase. The OSM will see the REQUEUE_REQUEST
|
||||
* status and retry the command.
|
||||
*/
|
||||
scbid = ahd_get_scbptr(ahd);
|
||||
scb = ahd_lookup_scb(ahd, scbid);
|
||||
@ -1083,7 +1186,28 @@ ahd_handle_seqint(struct ahd_softc *ahd, u_int intstat)
|
||||
ahd_set_syncrate(ahd, &devinfo, /*period*/0,
|
||||
/*offset*/0, /*ppr_options*/0,
|
||||
AHD_TRANS_ACTIVE, /*paused*/TRUE);
|
||||
scb->flags |= SCB_EXTERNAL_RESET;
|
||||
/* Hand-craft TUR command */
|
||||
ahd_outb(ahd, SCB_CDB_STORE, 0);
|
||||
ahd_outb(ahd, SCB_CDB_STORE+1, 0);
|
||||
ahd_outb(ahd, SCB_CDB_STORE+2, 0);
|
||||
ahd_outb(ahd, SCB_CDB_STORE+3, 0);
|
||||
ahd_outb(ahd, SCB_CDB_STORE+4, 0);
|
||||
ahd_outb(ahd, SCB_CDB_STORE+5, 0);
|
||||
ahd_outb(ahd, SCB_CDB_LEN, 6);
|
||||
scb->hscb->control &= ~(TAG_ENB|SCB_TAG_TYPE);
|
||||
scb->hscb->control |= MK_MESSAGE;
|
||||
ahd_outb(ahd, SCB_CONTROL, scb->hscb->control);
|
||||
ahd_outb(ahd, MSG_OUT, HOST_MSG);
|
||||
ahd_outb(ahd, SAVED_SCSIID, scb->hscb->scsiid);
|
||||
/*
|
||||
* The lun is 0, regardless of the SCB's lun
|
||||
* as we have not sent an identify message.
|
||||
*/
|
||||
ahd_outb(ahd, SAVED_LUN, 0);
|
||||
ahd_outb(ahd, SEQ_FLAGS, 0);
|
||||
ahd_assert_atn(ahd);
|
||||
scb->flags &= ~SCB_PACKETIZED;
|
||||
scb->flags |= SCB_ABORT|SCB_EXTERNAL_RESET;
|
||||
ahd_freeze_devq(ahd, scb);
|
||||
ahd_set_transaction_status(scb, CAM_REQUEUE_REQ);
|
||||
ahd_freeze_scb(scb);
|
||||
@ -1519,8 +1643,10 @@ ahd_handle_scsiint(struct ahd_softc *ahd, u_int intstat)
|
||||
/*
|
||||
* Ignore external resets after a bus reset.
|
||||
*/
|
||||
if (((status & SCSIRSTI) != 0) && (ahd->flags & AHD_BUS_RESET_ACTIVE))
|
||||
if (((status & SCSIRSTI) != 0) && (ahd->flags & AHD_BUS_RESET_ACTIVE)) {
|
||||
ahd_outb(ahd, CLRSINT1, CLRSCSIRSTI);
|
||||
return;
|
||||
}
|
||||
|
||||
/*
|
||||
* Clear bus reset flag
|
||||
@ -2200,6 +2326,22 @@ ahd_handle_nonpkt_busfree(struct ahd_softc *ahd)
|
||||
if (sent_msg == MSG_ABORT_TAG)
|
||||
tag = SCB_GET_TAG(scb);
|
||||
|
||||
if ((scb->flags & SCB_EXTERNAL_RESET) != 0) {
|
||||
/*
|
||||
* This abort is in response to an
|
||||
* unexpected switch to command phase
|
||||
* for a packetized connection. Since
|
||||
* the identify message was never sent,
|
||||
* "saved lun" is 0. We really want to
|
||||
* abort only the SCB that encountered
|
||||
* this error, which could have a different
|
||||
* lun. The SCB will be retried so the OS
|
||||
* will see the UA after renegotiating to
|
||||
* packetized.
|
||||
*/
|
||||
tag = SCB_GET_TAG(scb);
|
||||
saved_lun = scb->hscb->lun;
|
||||
}
|
||||
found = ahd_abort_scbs(ahd, target, 'A', saved_lun,
|
||||
tag, ROLE_INITIATOR,
|
||||
CAM_REQ_ABORTED);
|
||||
@ -2523,7 +2665,7 @@ ahd_force_renegotiation(struct ahd_softc *ahd, struct ahd_devinfo *devinfo)
|
||||
}
|
||||
|
||||
#define AHD_MAX_STEPS 2000
|
||||
void
|
||||
static void
|
||||
ahd_clear_critical_section(struct ahd_softc *ahd)
|
||||
{
|
||||
ahd_mode_state saved_modes;
|
||||
@ -2646,7 +2788,7 @@ ahd_clear_critical_section(struct ahd_softc *ahd)
|
||||
/*
|
||||
* Clear any pending interrupt status.
|
||||
*/
|
||||
void
|
||||
static void
|
||||
ahd_clear_intstat(struct ahd_softc *ahd)
|
||||
{
|
||||
AHD_ASSERT_MODES(ahd, ~(AHD_MODE_UNKNOWN_MSK|AHD_MODE_CFG_MSK),
|
||||
@ -2677,6 +2819,8 @@ ahd_clear_intstat(struct ahd_softc *ahd)
|
||||
#ifdef AHD_DEBUG
|
||||
uint32_t ahd_debug = AHD_DEBUG_OPTS;
|
||||
#endif
|
||||
|
||||
#if 0
|
||||
void
|
||||
ahd_print_scb(struct scb *scb)
|
||||
{
|
||||
@ -2701,49 +2845,7 @@ ahd_print_scb(struct scb *scb)
|
||||
SCB_GET_TAG(scb));
|
||||
ahd_dump_sglist(scb);
|
||||
}
|
||||
|
||||
void
|
||||
ahd_dump_sglist(struct scb *scb)
|
||||
{
|
||||
int i;
|
||||
|
||||
if (scb->sg_count > 0) {
|
||||
if ((scb->ahd_softc->flags & AHD_64BIT_ADDRESSING) != 0) {
|
||||
struct ahd_dma64_seg *sg_list;
|
||||
|
||||
sg_list = (struct ahd_dma64_seg*)scb->sg_list;
|
||||
for (i = 0; i < scb->sg_count; i++) {
|
||||
uint64_t addr;
|
||||
uint32_t len;
|
||||
|
||||
addr = ahd_le64toh(sg_list[i].addr);
|
||||
len = ahd_le32toh(sg_list[i].len);
|
||||
printf("sg[%d] - Addr 0x%x%x : Length %d%s\n",
|
||||
i,
|
||||
(uint32_t)((addr >> 32) & 0xFFFFFFFF),
|
||||
(uint32_t)(addr & 0xFFFFFFFF),
|
||||
sg_list[i].len & AHD_SG_LEN_MASK,
|
||||
(sg_list[i].len & AHD_DMA_LAST_SEG)
|
||||
? " Last" : "");
|
||||
}
|
||||
} else {
|
||||
struct ahd_dma_seg *sg_list;
|
||||
|
||||
sg_list = (struct ahd_dma_seg*)scb->sg_list;
|
||||
for (i = 0; i < scb->sg_count; i++) {
|
||||
uint32_t len;
|
||||
|
||||
len = ahd_le32toh(sg_list[i].len);
|
||||
printf("sg[%d] - Addr 0x%x%x : Length %d%s\n",
|
||||
i,
|
||||
(len & AHD_SG_HIGH_ADDR_MASK) >> 24,
|
||||
ahd_le32toh(sg_list[i].addr),
|
||||
len & AHD_SG_LEN_MASK,
|
||||
len & AHD_DMA_LAST_SEG ? " Last" : "");
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
#endif /* 0 */
|
||||
|
||||
/************************* Transfer Negotiation *******************************/
|
||||
/*
|
||||
@ -2850,14 +2952,14 @@ ahd_devlimited_syncrate(struct ahd_softc *ahd,
|
||||
transinfo = &tinfo->goal;
|
||||
*ppr_options &= (transinfo->ppr_options|MSG_EXT_PPR_PCOMP_EN);
|
||||
if (transinfo->width == MSG_EXT_WDTR_BUS_8_BIT) {
|
||||
maxsync = MAX(maxsync, AHD_SYNCRATE_ULTRA2);
|
||||
maxsync = max(maxsync, (u_int)AHD_SYNCRATE_ULTRA2);
|
||||
*ppr_options &= ~MSG_EXT_PPR_DT_REQ;
|
||||
}
|
||||
if (transinfo->period == 0) {
|
||||
*period = 0;
|
||||
*ppr_options = 0;
|
||||
} else {
|
||||
*period = MAX(*period, transinfo->period);
|
||||
*period = max(*period, (u_int)transinfo->period);
|
||||
ahd_find_syncrate(ahd, period, ppr_options, maxsync);
|
||||
}
|
||||
}
|
||||
@ -2906,7 +3008,7 @@ ahd_find_syncrate(struct ahd_softc *ahd, u_int *period,
|
||||
* Truncate the given synchronous offset to a value the
|
||||
* current adapter type and syncrate are capable of.
|
||||
*/
|
||||
void
|
||||
static void
|
||||
ahd_validate_offset(struct ahd_softc *ahd,
|
||||
struct ahd_initiator_tinfo *tinfo,
|
||||
u_int period, u_int *offset, int wide,
|
||||
@ -2924,12 +3026,12 @@ ahd_validate_offset(struct ahd_softc *ahd,
|
||||
maxoffset = MAX_OFFSET_PACED;
|
||||
} else
|
||||
maxoffset = MAX_OFFSET_NON_PACED;
|
||||
*offset = MIN(*offset, maxoffset);
|
||||
*offset = min(*offset, maxoffset);
|
||||
if (tinfo != NULL) {
|
||||
if (role == ROLE_TARGET)
|
||||
*offset = MIN(*offset, tinfo->user.offset);
|
||||
*offset = min(*offset, (u_int)tinfo->user.offset);
|
||||
else
|
||||
*offset = MIN(*offset, tinfo->goal.offset);
|
||||
*offset = min(*offset, (u_int)tinfo->goal.offset);
|
||||
}
|
||||
}
|
||||
|
||||
@ -2937,7 +3039,7 @@ ahd_validate_offset(struct ahd_softc *ahd,
|
||||
* Truncate the given transfer width parameter to a value the
|
||||
* current adapter type is capable of.
|
||||
*/
|
||||
void
|
||||
static void
|
||||
ahd_validate_width(struct ahd_softc *ahd, struct ahd_initiator_tinfo *tinfo,
|
||||
u_int *bus_width, role_t role)
|
||||
{
|
||||
@ -2955,9 +3057,9 @@ ahd_validate_width(struct ahd_softc *ahd, struct ahd_initiator_tinfo *tinfo,
|
||||
}
|
||||
if (tinfo != NULL) {
|
||||
if (role == ROLE_TARGET)
|
||||
*bus_width = MIN(tinfo->user.width, *bus_width);
|
||||
*bus_width = min((u_int)tinfo->user.width, *bus_width);
|
||||
else
|
||||
*bus_width = MIN(tinfo->goal.width, *bus_width);
|
||||
*bus_width = min((u_int)tinfo->goal.width, *bus_width);
|
||||
}
|
||||
}
|
||||
|
||||
@ -3210,7 +3312,7 @@ ahd_set_width(struct ahd_softc *ahd, struct ahd_devinfo *devinfo,
|
||||
/*
|
||||
* Update the current state of tagged queuing for a given target.
|
||||
*/
|
||||
void
|
||||
static void
|
||||
ahd_set_tags(struct ahd_softc *ahd, struct scsi_cmnd *cmd,
|
||||
struct ahd_devinfo *devinfo, ahd_queue_alg alg)
|
||||
{
|
||||
@ -3466,7 +3568,7 @@ ahd_print_devinfo(struct ahd_softc *ahd, struct ahd_devinfo *devinfo)
|
||||
devinfo->target, devinfo->lun);
|
||||
}
|
||||
|
||||
struct ahd_phase_table_entry*
|
||||
static struct ahd_phase_table_entry*
|
||||
ahd_lookup_phase_entry(int phase)
|
||||
{
|
||||
struct ahd_phase_table_entry *entry;
|
||||
@ -5351,7 +5453,7 @@ ahd_free(struct ahd_softc *ahd)
|
||||
return;
|
||||
}
|
||||
|
||||
void
|
||||
static void
|
||||
ahd_shutdown(void *arg)
|
||||
{
|
||||
struct ahd_softc *ahd;
|
||||
@ -5480,7 +5582,7 @@ ahd_reset(struct ahd_softc *ahd, int reinit)
|
||||
/*
|
||||
* Determine the number of SCBs available on the controller
|
||||
*/
|
||||
int
|
||||
static int
|
||||
ahd_probe_scbs(struct ahd_softc *ahd) {
|
||||
int i;
|
||||
|
||||
@ -5929,7 +6031,7 @@ ahd_free_scb(struct ahd_softc *ahd, struct scb *scb)
|
||||
ahd_platform_scb_free(ahd, scb);
|
||||
}
|
||||
|
||||
void
|
||||
static void
|
||||
ahd_alloc_scbs(struct ahd_softc *ahd)
|
||||
{
|
||||
struct scb_data *scb_data;
|
||||
@ -6057,9 +6159,9 @@ ahd_alloc_scbs(struct ahd_softc *ahd)
|
||||
#endif
|
||||
}
|
||||
|
||||
newcount = MIN(scb_data->sense_left, scb_data->scbs_left);
|
||||
newcount = MIN(newcount, scb_data->sgs_left);
|
||||
newcount = MIN(newcount, (AHD_SCB_MAX_ALLOC - scb_data->numscbs));
|
||||
newcount = min(scb_data->sense_left, scb_data->scbs_left);
|
||||
newcount = min(newcount, scb_data->sgs_left);
|
||||
newcount = min(newcount, (AHD_SCB_MAX_ALLOC - scb_data->numscbs));
|
||||
for (i = 0; i < newcount; i++) {
|
||||
struct scb_platform_data *pdata;
|
||||
u_int col_tag;
|
||||
@ -6982,7 +7084,7 @@ ahd_intr_enable(struct ahd_softc *ahd, int enable)
|
||||
ahd_outb(ahd, HCNTRL, hcntrl);
|
||||
}
|
||||
|
||||
void
|
||||
static void
|
||||
ahd_update_coalescing_values(struct ahd_softc *ahd, u_int timer, u_int maxcmds,
|
||||
u_int mincmds)
|
||||
{
|
||||
@ -7000,7 +7102,7 @@ ahd_update_coalescing_values(struct ahd_softc *ahd, u_int timer, u_int maxcmds,
|
||||
ahd_outb(ahd, INT_COALESCING_MINCMDS, -mincmds);
|
||||
}
|
||||
|
||||
void
|
||||
static void
|
||||
ahd_enable_coalescing(struct ahd_softc *ahd, int enable)
|
||||
{
|
||||
|
||||
@ -7070,6 +7172,7 @@ ahd_pause_and_flushwork(struct ahd_softc *ahd)
|
||||
ahd->flags &= ~AHD_ALL_INTERRUPTS;
|
||||
}
|
||||
|
||||
#if 0
|
||||
int
|
||||
ahd_suspend(struct ahd_softc *ahd)
|
||||
{
|
||||
@ -7083,7 +7186,9 @@ ahd_suspend(struct ahd_softc *ahd)
|
||||
ahd_shutdown(ahd);
|
||||
return (0);
|
||||
}
|
||||
#endif /* 0 */
|
||||
|
||||
#if 0
|
||||
int
|
||||
ahd_resume(struct ahd_softc *ahd)
|
||||
{
|
||||
@ -7093,6 +7198,7 @@ ahd_resume(struct ahd_softc *ahd)
|
||||
ahd_restart(ahd);
|
||||
return (0);
|
||||
}
|
||||
#endif /* 0 */
|
||||
|
||||
/************************** Busy Target Table *********************************/
|
||||
/*
|
||||
@ -7125,7 +7231,7 @@ ahd_index_busy_tcl(struct ahd_softc *ahd, u_int *saved_scbid, u_int tcl)
|
||||
/*
|
||||
* Return the untagged transaction id for a given target/channel lun.
|
||||
*/
|
||||
u_int
|
||||
static u_int
|
||||
ahd_find_busy_tcl(struct ahd_softc *ahd, u_int tcl)
|
||||
{
|
||||
u_int scbid;
|
||||
@ -7138,7 +7244,7 @@ ahd_find_busy_tcl(struct ahd_softc *ahd, u_int tcl)
|
||||
return (scbid);
|
||||
}
|
||||
|
||||
void
|
||||
static void
|
||||
ahd_busy_tcl(struct ahd_softc *ahd, u_int tcl, u_int scbid)
|
||||
{
|
||||
u_int scb_offset;
|
||||
@ -7186,7 +7292,7 @@ ahd_match_scb(struct ahd_softc *ahd, struct scb *scb, int target,
|
||||
return match;
|
||||
}
|
||||
|
||||
void
|
||||
static void
|
||||
ahd_freeze_devq(struct ahd_softc *ahd, struct scb *scb)
|
||||
{
|
||||
int target;
|
||||
@ -7690,7 +7796,7 @@ ahd_add_scb_to_free_list(struct ahd_softc *ahd, u_int scbid)
|
||||
* been modified from CAM_REQ_INPROG. This routine assumes that the sequencer
|
||||
* is paused before it is called.
|
||||
*/
|
||||
int
|
||||
static int
|
||||
ahd_abort_scbs(struct ahd_softc *ahd, int target, char channel,
|
||||
int lun, u_int tag, role_t role, uint32_t status)
|
||||
{
|
||||
@ -7919,6 +8025,11 @@ ahd_reset_channel(struct ahd_softc *ahd, char channel, int initiate_reset)
|
||||
ahd_clear_fifo(ahd, 0);
|
||||
ahd_clear_fifo(ahd, 1);
|
||||
|
||||
/*
|
||||
* Clear SCSI interrupt status
|
||||
*/
|
||||
ahd_outb(ahd, CLRSINT1, CLRSCSIRSTI);
|
||||
|
||||
/*
|
||||
* Reenable selections
|
||||
*/
|
||||
@ -7952,10 +8063,6 @@ ahd_reset_channel(struct ahd_softc *ahd, char channel, int initiate_reset)
|
||||
}
|
||||
}
|
||||
#endif
|
||||
/* Notify the XPT that a bus reset occurred */
|
||||
ahd_send_async(ahd, devinfo.channel, CAM_TARGET_WILDCARD,
|
||||
CAM_LUN_WILDCARD, AC_BUS_RESET);
|
||||
|
||||
/*
|
||||
* Revert to async/narrow transfers until we renegotiate.
|
||||
*/
|
||||
@ -7977,6 +8084,10 @@ ahd_reset_channel(struct ahd_softc *ahd, char channel, int initiate_reset)
|
||||
}
|
||||
}
|
||||
|
||||
/* Notify the XPT that a bus reset occurred */
|
||||
ahd_send_async(ahd, devinfo.channel, CAM_TARGET_WILDCARD,
|
||||
CAM_LUN_WILDCARD, AC_BUS_RESET);
|
||||
|
||||
ahd_restart(ahd);
|
||||
|
||||
return (found);
|
||||
@ -8019,18 +8130,8 @@ ahd_stat_timer(void *arg)
|
||||
}
|
||||
|
||||
/****************************** Status Processing *****************************/
|
||||
void
|
||||
ahd_handle_scb_status(struct ahd_softc *ahd, struct scb *scb)
|
||||
{
|
||||
if (scb->hscb->shared_data.istatus.scsi_status != 0) {
|
||||
ahd_handle_scsi_status(ahd, scb);
|
||||
} else {
|
||||
ahd_calc_residual(ahd, scb);
|
||||
ahd_done(ahd, scb);
|
||||
}
|
||||
}
|
||||
|
||||
void
|
||||
static void
|
||||
ahd_handle_scsi_status(struct ahd_softc *ahd, struct scb *scb)
|
||||
{
|
||||
struct hardware_scb *hscb;
|
||||
@ -8238,10 +8339,21 @@ ahd_handle_scsi_status(struct ahd_softc *ahd, struct scb *scb)
|
||||
}
|
||||
}
|
||||
|
||||
static void
|
||||
ahd_handle_scb_status(struct ahd_softc *ahd, struct scb *scb)
|
||||
{
|
||||
if (scb->hscb->shared_data.istatus.scsi_status != 0) {
|
||||
ahd_handle_scsi_status(ahd, scb);
|
||||
} else {
|
||||
ahd_calc_residual(ahd, scb);
|
||||
ahd_done(ahd, scb);
|
||||
}
|
||||
}
|
||||
|
||||
/*
|
||||
* Calculate the residual for a just completed SCB.
|
||||
*/
|
||||
void
|
||||
static void
|
||||
ahd_calc_residual(struct ahd_softc *ahd, struct scb *scb)
|
||||
{
|
||||
struct hardware_scb *hscb;
|
||||
@ -8668,7 +8780,7 @@ ahd_resolve_seqaddr(struct ahd_softc *ahd, u_int address)
|
||||
if (skip_addr > i) {
|
||||
int end_addr;
|
||||
|
||||
end_addr = MIN(address, skip_addr);
|
||||
end_addr = min(address, skip_addr);
|
||||
address_offset += end_addr - i;
|
||||
i = skip_addr;
|
||||
} else {
|
||||
@ -9092,6 +9204,7 @@ ahd_dump_card_state(struct ahd_softc *ahd)
|
||||
ahd_unpause(ahd);
|
||||
}
|
||||
|
||||
#if 0
|
||||
void
|
||||
ahd_dump_scbs(struct ahd_softc *ahd)
|
||||
{
|
||||
@ -9117,6 +9230,7 @@ ahd_dump_scbs(struct ahd_softc *ahd)
|
||||
ahd_set_scbptr(ahd, saved_scb_index);
|
||||
ahd_restore_modes(ahd, saved_modes);
|
||||
}
|
||||
#endif /* 0 */
|
||||
|
||||
/**************************** Flexport Logic **********************************/
|
||||
/*
|
||||
@ -9219,7 +9333,7 @@ ahd_write_seeprom(struct ahd_softc *ahd, uint16_t *buf,
|
||||
/*
|
||||
* Wait ~100us for the serial eeprom to satisfy our request.
|
||||
*/
|
||||
int
|
||||
static int
|
||||
ahd_wait_seeprom(struct ahd_softc *ahd)
|
||||
{
|
||||
int cnt;
|
||||
@ -9237,7 +9351,7 @@ ahd_wait_seeprom(struct ahd_softc *ahd)
|
||||
* Validate the two checksums in the per_channel
|
||||
* vital product data struct.
|
||||
*/
|
||||
int
|
||||
static int
|
||||
ahd_verify_vpd_cksum(struct vpd_config *vpd)
|
||||
{
|
||||
int i;
|
||||
@ -9316,6 +9430,24 @@ ahd_release_seeprom(struct ahd_softc *ahd)
|
||||
/* Currently a no-op */
|
||||
}
|
||||
|
||||
/*
|
||||
* Wait at most 2 seconds for flexport arbitration to succeed.
|
||||
*/
|
||||
static int
|
||||
ahd_wait_flexport(struct ahd_softc *ahd)
|
||||
{
|
||||
int cnt;
|
||||
|
||||
AHD_ASSERT_MODES(ahd, AHD_MODE_SCSI_MSK, AHD_MODE_SCSI_MSK);
|
||||
cnt = 1000000 * 2 / 5;
|
||||
while ((ahd_inb(ahd, BRDCTL) & FLXARBACK) == 0 && --cnt)
|
||||
ahd_delay(5);
|
||||
|
||||
if (cnt == 0)
|
||||
return (ETIMEDOUT);
|
||||
return (0);
|
||||
}
|
||||
|
||||
int
|
||||
ahd_write_flexport(struct ahd_softc *ahd, u_int addr, u_int value)
|
||||
{
|
||||
@ -9357,24 +9489,6 @@ ahd_read_flexport(struct ahd_softc *ahd, u_int addr, uint8_t *value)
|
||||
return (0);
|
||||
}
|
||||
|
||||
/*
|
||||
* Wait at most 2 seconds for flexport arbitration to succeed.
|
||||
*/
|
||||
int
|
||||
ahd_wait_flexport(struct ahd_softc *ahd)
|
||||
{
|
||||
int cnt;
|
||||
|
||||
AHD_ASSERT_MODES(ahd, AHD_MODE_SCSI_MSK, AHD_MODE_SCSI_MSK);
|
||||
cnt = 1000000 * 2 / 5;
|
||||
while ((ahd_inb(ahd, BRDCTL) & FLXARBACK) == 0 && --cnt)
|
||||
ahd_delay(5);
|
||||
|
||||
if (cnt == 0)
|
||||
return (ETIMEDOUT);
|
||||
return (0);
|
||||
}
|
||||
|
||||
/************************* Target Mode ****************************************/
|
||||
#ifdef AHD_TARGET_MODE
|
||||
cam_status
|
||||
|
@ -418,10 +418,6 @@ ahd_targetcmd_offset(struct ahd_softc *ahd, u_int index)
|
||||
}
|
||||
|
||||
/*********************** Miscelaneous Support Functions ***********************/
|
||||
static __inline void ahd_complete_scb(struct ahd_softc *ahd,
|
||||
struct scb *scb);
|
||||
static __inline void ahd_update_residual(struct ahd_softc *ahd,
|
||||
struct scb *scb);
|
||||
static __inline struct ahd_initiator_tinfo *
|
||||
ahd_fetch_transinfo(struct ahd_softc *ahd,
|
||||
char channel, u_int our_id,
|
||||
@ -467,32 +463,6 @@ static __inline uint32_t
|
||||
ahd_get_sense_bufaddr(struct ahd_softc *ahd,
|
||||
struct scb *scb);
|
||||
|
||||
static __inline void
|
||||
ahd_complete_scb(struct ahd_softc *ahd, struct scb *scb)
|
||||
{
|
||||
uint32_t sgptr;
|
||||
|
||||
sgptr = ahd_le32toh(scb->hscb->sgptr);
|
||||
if ((sgptr & SG_STATUS_VALID) != 0)
|
||||
ahd_handle_scb_status(ahd, scb);
|
||||
else
|
||||
ahd_done(ahd, scb);
|
||||
}
|
||||
|
||||
/*
|
||||
* Determine whether the sequencer reported a residual
|
||||
* for this SCB/transaction.
|
||||
*/
|
||||
static __inline void
|
||||
ahd_update_residual(struct ahd_softc *ahd, struct scb *scb)
|
||||
{
|
||||
uint32_t sgptr;
|
||||
|
||||
sgptr = ahd_le32toh(scb->hscb->sgptr);
|
||||
if ((sgptr & SG_STATUS_VALID) != 0)
|
||||
ahd_calc_residual(ahd, scb);
|
||||
}
|
||||
|
||||
/*
|
||||
* Return pointers to the transfer negotiation information
|
||||
* for the specified our_id/remote_id pair.
|
||||
|
@ -293,7 +293,7 @@ static uint32_t aic79xx_seltime;
|
||||
* force all outstanding transactions to be serviced prior to a new
|
||||
* transaction.
|
||||
*/
|
||||
uint32_t aic79xx_periodic_otag;
|
||||
static uint32_t aic79xx_periodic_otag;
|
||||
|
||||
/* Some storage boxes are using an LSI chip which has a bug making it
|
||||
* impossible to use aic79xx Rev B chip in 320 speeds. The following
|
||||
@ -773,6 +773,7 @@ struct scsi_host_template aic79xx_driver_template = {
|
||||
#endif
|
||||
.can_queue = AHD_MAX_QUEUE,
|
||||
.this_id = -1,
|
||||
.max_sectors = 8192,
|
||||
.cmd_per_lun = 2,
|
||||
.use_clustering = ENABLE_CLUSTERING,
|
||||
.slave_alloc = ahd_linux_slave_alloc,
|
||||
@ -1813,9 +1814,9 @@ ahd_linux_handle_scsi_status(struct ahd_softc *ahd,
|
||||
u_int sense_offset;
|
||||
|
||||
if (scb->flags & SCB_SENSE) {
|
||||
sense_size = MIN(sizeof(struct scsi_sense_data)
|
||||
sense_size = min(sizeof(struct scsi_sense_data)
|
||||
- ahd_get_sense_residual(scb),
|
||||
sizeof(cmd->sense_buffer));
|
||||
(u_long)sizeof(cmd->sense_buffer));
|
||||
sense_offset = 0;
|
||||
} else {
|
||||
/*
|
||||
@ -1824,7 +1825,8 @@ ahd_linux_handle_scsi_status(struct ahd_softc *ahd,
|
||||
*/
|
||||
siu = (struct scsi_status_iu_header *)
|
||||
scb->sense_data;
|
||||
sense_size = MIN(scsi_4btoul(siu->sense_length),
|
||||
sense_size = min_t(size_t,
|
||||
scsi_4btoul(siu->sense_length),
|
||||
sizeof(cmd->sense_buffer));
|
||||
sense_offset = SIU_SENSE_OFFSET(siu);
|
||||
}
|
||||
@ -2634,8 +2636,22 @@ static void ahd_linux_set_pcomp_en(struct scsi_target *starget, int pcomp)
|
||||
pcomp ? "Enable" : "Disable");
|
||||
#endif
|
||||
|
||||
if (pcomp)
|
||||
if (pcomp) {
|
||||
uint8_t precomp;
|
||||
|
||||
if (ahd->unit < ARRAY_SIZE(aic79xx_iocell_info)) {
|
||||
struct ahd_linux_iocell_opts *iocell_opts;
|
||||
|
||||
iocell_opts = &aic79xx_iocell_info[ahd->unit];
|
||||
precomp = iocell_opts->precomp;
|
||||
} else {
|
||||
precomp = AIC79XX_DEFAULT_PRECOMP;
|
||||
}
|
||||
ppr_options |= MSG_EXT_PPR_PCOMP_EN;
|
||||
AHD_SET_PRECOMP(ahd, precomp);
|
||||
} else {
|
||||
AHD_SET_PRECOMP(ahd, 0);
|
||||
}
|
||||
|
||||
ahd_compile_devinfo(&devinfo, shost->this_id, starget->id, 0,
|
||||
starget->channel + 'A', ROLE_INITIATOR);
|
||||
@ -2678,7 +2694,25 @@ static void ahd_linux_set_hold_mcs(struct scsi_target *starget, int hold)
|
||||
ahd_unlock(ahd, &flags);
|
||||
}
|
||||
|
||||
static void ahd_linux_get_signalling(struct Scsi_Host *shost)
|
||||
{
|
||||
struct ahd_softc *ahd = *(struct ahd_softc **)shost->hostdata;
|
||||
unsigned long flags;
|
||||
u8 mode;
|
||||
|
||||
ahd_lock(ahd, &flags);
|
||||
ahd_pause(ahd);
|
||||
mode = ahd_inb(ahd, SBLKCTL);
|
||||
ahd_unpause(ahd);
|
||||
ahd_unlock(ahd, &flags);
|
||||
|
||||
if (mode & ENAB40)
|
||||
spi_signalling(shost) = SPI_SIGNAL_LVD;
|
||||
else if (mode & ENAB20)
|
||||
spi_signalling(shost) = SPI_SIGNAL_SE;
|
||||
else
|
||||
spi_signalling(shost) = SPI_SIGNAL_UNKNOWN;
|
||||
}
|
||||
|
||||
static struct spi_function_template ahd_linux_transport_functions = {
|
||||
.set_offset = ahd_linux_set_offset,
|
||||
@ -2703,6 +2737,7 @@ static struct spi_function_template ahd_linux_transport_functions = {
|
||||
.show_pcomp_en = 1,
|
||||
.set_hold_mcs = ahd_linux_set_hold_mcs,
|
||||
.show_hold_mcs = 1,
|
||||
.get_signalling = ahd_linux_get_signalling,
|
||||
};
|
||||
|
||||
static int __init
|
||||
|
@ -506,9 +506,6 @@ struct info_str {
|
||||
int pos;
|
||||
};
|
||||
|
||||
void ahd_format_transinfo(struct info_str *info,
|
||||
struct ahd_transinfo *tinfo);
|
||||
|
||||
/******************************** Locking *************************************/
|
||||
static __inline void
|
||||
ahd_lockinit(struct ahd_softc *ahd)
|
||||
@ -582,8 +579,6 @@ ahd_unlock(struct ahd_softc *ahd, unsigned long *flags)
|
||||
#define PCIXM_STATUS_MAXCRDS 0x1C00 /* Maximum Cumulative Read Size */
|
||||
#define PCIXM_STATUS_RCVDSCEM 0x2000 /* Received a Split Comp w/Error msg */
|
||||
|
||||
extern struct pci_driver aic79xx_pci_driver;
|
||||
|
||||
typedef enum
|
||||
{
|
||||
AHD_POWER_STATE_D0,
|
||||
|
@ -82,7 +82,7 @@ static struct pci_device_id ahd_linux_pci_id_table[] = {
|
||||
|
||||
MODULE_DEVICE_TABLE(pci, ahd_linux_pci_id_table);
|
||||
|
||||
struct pci_driver aic79xx_pci_driver = {
|
||||
static struct pci_driver aic79xx_pci_driver = {
|
||||
.name = "aic79xx",
|
||||
.probe = ahd_linux_pci_dev_probe,
|
||||
.remove = ahd_linux_pci_dev_remove,
|
||||
|
@ -97,7 +97,7 @@ static ahd_device_setup_t ahd_aic7901A_setup;
|
||||
static ahd_device_setup_t ahd_aic7902_setup;
|
||||
static ahd_device_setup_t ahd_aic790X_setup;
|
||||
|
||||
struct ahd_pci_identity ahd_pci_ident_table [] =
|
||||
static struct ahd_pci_identity ahd_pci_ident_table [] =
|
||||
{
|
||||
/* aic7901 based controllers */
|
||||
{
|
||||
@ -201,7 +201,7 @@ struct ahd_pci_identity ahd_pci_ident_table [] =
|
||||
}
|
||||
};
|
||||
|
||||
const u_int ahd_num_pci_devs = ARRAY_SIZE(ahd_pci_ident_table);
|
||||
static const u_int ahd_num_pci_devs = ARRAY_SIZE(ahd_pci_ident_table);
|
||||
|
||||
#define DEVCONFIG 0x40
|
||||
#define PCIXINITPAT 0x0000E000ul
|
||||
@ -245,6 +245,7 @@ static int ahd_check_extport(struct ahd_softc *ahd);
|
||||
static void ahd_configure_termination(struct ahd_softc *ahd,
|
||||
u_int adapter_control);
|
||||
static void ahd_pci_split_intr(struct ahd_softc *ahd, u_int intstat);
|
||||
static void ahd_pci_intr(struct ahd_softc *ahd);
|
||||
|
||||
struct ahd_pci_identity *
|
||||
ahd_find_pci_device(ahd_dev_softc_t pci)
|
||||
@ -757,7 +758,7 @@ static const char *pci_status_strings[] =
|
||||
"%s: Address or Write Phase Parity Error Detected in %s.\n"
|
||||
};
|
||||
|
||||
void
|
||||
static void
|
||||
ahd_pci_intr(struct ahd_softc *ahd)
|
||||
{
|
||||
uint8_t pci_status[8];
|
||||
|
@ -136,7 +136,7 @@ copy_info(struct info_str *info, char *fmt, ...)
|
||||
return (len);
|
||||
}
|
||||
|
||||
void
|
||||
static void
|
||||
ahd_format_transinfo(struct info_str *info, struct ahd_transinfo *tinfo)
|
||||
{
|
||||
u_int speed;
|
||||
|
@ -54,14 +54,6 @@ struct scb_platform_data;
|
||||
struct seeprom_descriptor;
|
||||
|
||||
/****************************** Useful Macros *********************************/
|
||||
#ifndef MAX
|
||||
#define MAX(a,b) (((a) > (b)) ? (a) : (b))
|
||||
#endif
|
||||
|
||||
#ifndef MIN
|
||||
#define MIN(a,b) (((a) < (b)) ? (a) : (b))
|
||||
#endif
|
||||
|
||||
#ifndef TRUE
|
||||
#define TRUE 1
|
||||
#endif
|
||||
@ -1135,8 +1127,6 @@ struct ahc_pci_identity {
|
||||
char *name;
|
||||
ahc_device_setup_t *setup;
|
||||
};
|
||||
extern struct ahc_pci_identity ahc_pci_ident_table[];
|
||||
extern const u_int ahc_num_pci_devs;
|
||||
|
||||
/***************************** VL/EISA Declarations ***************************/
|
||||
struct aic7770_identity {
|
||||
@ -1289,6 +1279,7 @@ typedef enum {
|
||||
} ahc_queue_alg;
|
||||
|
||||
void ahc_set_tags(struct ahc_softc *ahc,
|
||||
struct scsi_cmnd *cmd,
|
||||
struct ahc_devinfo *devinfo,
|
||||
ahc_queue_alg alg);
|
||||
|
||||
|
@ -1671,7 +1671,7 @@ ahc_devlimited_syncrate(struct ahc_softc *ahc,
|
||||
transinfo = &tinfo->goal;
|
||||
*ppr_options &= transinfo->ppr_options;
|
||||
if (transinfo->width == MSG_EXT_WDTR_BUS_8_BIT) {
|
||||
maxsync = MAX(maxsync, AHC_SYNCRATE_ULTRA2);
|
||||
maxsync = max(maxsync, (u_int)AHC_SYNCRATE_ULTRA2);
|
||||
*ppr_options &= ~MSG_EXT_PPR_DT_REQ;
|
||||
}
|
||||
if (transinfo->period == 0) {
|
||||
@ -1679,7 +1679,7 @@ ahc_devlimited_syncrate(struct ahc_softc *ahc,
|
||||
*ppr_options = 0;
|
||||
return (NULL);
|
||||
}
|
||||
*period = MAX(*period, transinfo->period);
|
||||
*period = max(*period, (u_int)transinfo->period);
|
||||
return (ahc_find_syncrate(ahc, period, ppr_options, maxsync));
|
||||
}
|
||||
|
||||
@ -1804,12 +1804,12 @@ ahc_validate_offset(struct ahc_softc *ahc,
|
||||
else
|
||||
maxoffset = MAX_OFFSET_8BIT;
|
||||
}
|
||||
*offset = MIN(*offset, maxoffset);
|
||||
*offset = min(*offset, maxoffset);
|
||||
if (tinfo != NULL) {
|
||||
if (role == ROLE_TARGET)
|
||||
*offset = MIN(*offset, tinfo->user.offset);
|
||||
*offset = min(*offset, (u_int)tinfo->user.offset);
|
||||
else
|
||||
*offset = MIN(*offset, tinfo->goal.offset);
|
||||
*offset = min(*offset, (u_int)tinfo->goal.offset);
|
||||
}
|
||||
}
|
||||
|
||||
@ -1835,9 +1835,9 @@ ahc_validate_width(struct ahc_softc *ahc, struct ahc_initiator_tinfo *tinfo,
|
||||
}
|
||||
if (tinfo != NULL) {
|
||||
if (role == ROLE_TARGET)
|
||||
*bus_width = MIN(tinfo->user.width, *bus_width);
|
||||
*bus_width = min((u_int)tinfo->user.width, *bus_width);
|
||||
else
|
||||
*bus_width = MIN(tinfo->goal.width, *bus_width);
|
||||
*bus_width = min((u_int)tinfo->goal.width, *bus_width);
|
||||
}
|
||||
}
|
||||
|
||||
@ -1986,7 +1986,7 @@ ahc_set_syncrate(struct ahc_softc *ahc, struct ahc_devinfo *devinfo,
|
||||
tinfo->curr.ppr_options = ppr_options;
|
||||
|
||||
ahc_send_async(ahc, devinfo->channel, devinfo->target,
|
||||
CAM_LUN_WILDCARD, AC_TRANSFER_NEG, NULL);
|
||||
CAM_LUN_WILDCARD, AC_TRANSFER_NEG);
|
||||
if (bootverbose) {
|
||||
if (offset != 0) {
|
||||
printf("%s: target %d synchronous at %sMHz%s, "
|
||||
@ -2056,7 +2056,7 @@ ahc_set_width(struct ahc_softc *ahc, struct ahc_devinfo *devinfo,
|
||||
tinfo->curr.width = width;
|
||||
|
||||
ahc_send_async(ahc, devinfo->channel, devinfo->target,
|
||||
CAM_LUN_WILDCARD, AC_TRANSFER_NEG, NULL);
|
||||
CAM_LUN_WILDCARD, AC_TRANSFER_NEG);
|
||||
if (bootverbose) {
|
||||
printf("%s: target %d using %dbit transfers\n",
|
||||
ahc_name(ahc), devinfo->target,
|
||||
@ -2074,12 +2074,14 @@ ahc_set_width(struct ahc_softc *ahc, struct ahc_devinfo *devinfo,
|
||||
* Update the current state of tagged queuing for a given target.
|
||||
*/
|
||||
void
|
||||
ahc_set_tags(struct ahc_softc *ahc, struct ahc_devinfo *devinfo,
|
||||
ahc_queue_alg alg)
|
||||
ahc_set_tags(struct ahc_softc *ahc, struct scsi_cmnd *cmd,
|
||||
struct ahc_devinfo *devinfo, ahc_queue_alg alg)
|
||||
{
|
||||
ahc_platform_set_tags(ahc, devinfo, alg);
|
||||
struct scsi_device *sdev = cmd->device;
|
||||
|
||||
ahc_platform_set_tags(ahc, sdev, devinfo, alg);
|
||||
ahc_send_async(ahc, devinfo->channel, devinfo->target,
|
||||
devinfo->lun, AC_TRANSFER_NEG, &alg);
|
||||
devinfo->lun, AC_TRANSFER_NEG);
|
||||
}
|
||||
|
||||
/*
|
||||
@ -3489,7 +3491,7 @@ ahc_handle_msg_reject(struct ahc_softc *ahc, struct ahc_devinfo *devinfo)
|
||||
printf("(%s:%c:%d:%d): refuses tagged commands. "
|
||||
"Performing non-tagged I/O\n", ahc_name(ahc),
|
||||
devinfo->channel, devinfo->target, devinfo->lun);
|
||||
ahc_set_tags(ahc, devinfo, AHC_QUEUE_NONE);
|
||||
ahc_set_tags(ahc, scb->io_ctx, devinfo, AHC_QUEUE_NONE);
|
||||
mask = ~0x23;
|
||||
} else {
|
||||
printf("(%s:%c:%d:%d): refuses %s tagged commands. "
|
||||
@ -3497,7 +3499,7 @@ ahc_handle_msg_reject(struct ahc_softc *ahc, struct ahc_devinfo *devinfo)
|
||||
ahc_name(ahc), devinfo->channel, devinfo->target,
|
||||
devinfo->lun, tag_type == MSG_ORDERED_TASK
|
||||
? "ordered" : "head of queue");
|
||||
ahc_set_tags(ahc, devinfo, AHC_QUEUE_BASIC);
|
||||
ahc_set_tags(ahc, scb->io_ctx, devinfo, AHC_QUEUE_BASIC);
|
||||
mask = ~0x03;
|
||||
}
|
||||
|
||||
@ -3763,7 +3765,7 @@ ahc_handle_devreset(struct ahc_softc *ahc, struct ahc_devinfo *devinfo,
|
||||
|
||||
if (status != CAM_SEL_TIMEOUT)
|
||||
ahc_send_async(ahc, devinfo->channel, devinfo->target,
|
||||
CAM_LUN_WILDCARD, AC_SENT_BDR, NULL);
|
||||
CAM_LUN_WILDCARD, AC_SENT_BDR);
|
||||
|
||||
if (message != NULL
|
||||
&& (verbose_level <= bootverbose))
|
||||
@ -4406,7 +4408,7 @@ ahc_alloc_scbs(struct ahc_softc *ahc)
|
||||
physaddr = sg_map->sg_physaddr;
|
||||
|
||||
newcount = (PAGE_SIZE / (AHC_NSEG * sizeof(struct ahc_dma_seg)));
|
||||
newcount = MIN(newcount, (AHC_SCB_MAX_ALLOC - scb_data->numscbs));
|
||||
newcount = min(newcount, (AHC_SCB_MAX_ALLOC - scb_data->numscbs));
|
||||
for (i = 0; i < newcount; i++) {
|
||||
struct scb_platform_data *pdata;
|
||||
#ifndef __linux__
|
||||
@ -6018,7 +6020,7 @@ ahc_reset_channel(struct ahc_softc *ahc, char channel, int initiate_reset)
|
||||
#endif
|
||||
/* Notify the XPT that a bus reset occurred */
|
||||
ahc_send_async(ahc, devinfo.channel, CAM_TARGET_WILDCARD,
|
||||
CAM_LUN_WILDCARD, AC_BUS_RESET, NULL);
|
||||
CAM_LUN_WILDCARD, AC_BUS_RESET);
|
||||
|
||||
/*
|
||||
* Revert to async/narrow transfers until we renegotiate.
|
||||
@ -6442,7 +6444,7 @@ ahc_download_instr(struct ahc_softc *ahc, u_int instrptr, uint8_t *dconsts)
|
||||
if (skip_addr > i) {
|
||||
int end_addr;
|
||||
|
||||
end_addr = MIN(address, skip_addr);
|
||||
end_addr = min(address, skip_addr);
|
||||
address_offset += end_addr - i;
|
||||
i = skip_addr;
|
||||
} else {
|
||||
|
@ -328,7 +328,7 @@ static uint32_t aic7xxx_seltime;
|
||||
* force all outstanding transactions to be serviced prior to a new
|
||||
* transaction.
|
||||
*/
|
||||
uint32_t aic7xxx_periodic_otag;
|
||||
static uint32_t aic7xxx_periodic_otag;
|
||||
|
||||
/*
|
||||
* Module information and settable options.
|
||||
@ -512,7 +512,6 @@ ahc_linux_target_alloc(struct scsi_target *starget)
|
||||
struct seeprom_config *sc = ahc->seep_config;
|
||||
unsigned long flags;
|
||||
struct scsi_target **ahc_targp = ahc_linux_target_in_softc(starget);
|
||||
struct ahc_linux_target *targ = scsi_transport_target_data(starget);
|
||||
unsigned short scsirate;
|
||||
struct ahc_devinfo devinfo;
|
||||
struct ahc_initiator_tinfo *tinfo;
|
||||
@ -533,7 +532,6 @@ ahc_linux_target_alloc(struct scsi_target *starget)
|
||||
BUG_ON(*ahc_targp != NULL);
|
||||
|
||||
*ahc_targp = starget;
|
||||
memset(targ, 0, sizeof(*targ));
|
||||
|
||||
if (sc) {
|
||||
int maxsync = AHC_SYNCRATE_DT;
|
||||
@ -594,14 +592,11 @@ ahc_linux_slave_alloc(struct scsi_device *sdev)
|
||||
struct ahc_softc *ahc =
|
||||
*((struct ahc_softc **)sdev->host->hostdata);
|
||||
struct scsi_target *starget = sdev->sdev_target;
|
||||
struct ahc_linux_target *targ = scsi_transport_target_data(starget);
|
||||
struct ahc_linux_device *dev;
|
||||
|
||||
if (bootverbose)
|
||||
printf("%s: Slave Alloc %d\n", ahc_name(ahc), sdev->id);
|
||||
|
||||
BUG_ON(targ->sdev[sdev->lun] != NULL);
|
||||
|
||||
dev = scsi_transport_device_data(sdev);
|
||||
memset(dev, 0, sizeof(*dev));
|
||||
|
||||
@ -618,8 +613,6 @@ ahc_linux_slave_alloc(struct scsi_device *sdev)
|
||||
*/
|
||||
dev->maxtags = 0;
|
||||
|
||||
targ->sdev[sdev->lun] = sdev;
|
||||
|
||||
spi_period(starget) = 0;
|
||||
|
||||
return 0;
|
||||
@ -644,22 +637,6 @@ ahc_linux_slave_configure(struct scsi_device *sdev)
|
||||
return 0;
|
||||
}
|
||||
|
||||
static void
|
||||
ahc_linux_slave_destroy(struct scsi_device *sdev)
|
||||
{
|
||||
struct ahc_softc *ahc;
|
||||
struct ahc_linux_device *dev = scsi_transport_device_data(sdev);
|
||||
struct ahc_linux_target *targ = scsi_transport_target_data(sdev->sdev_target);
|
||||
|
||||
ahc = *((struct ahc_softc **)sdev->host->hostdata);
|
||||
if (bootverbose)
|
||||
printf("%s: Slave Destroy %d\n", ahc_name(ahc), sdev->id);
|
||||
|
||||
BUG_ON(dev->active);
|
||||
|
||||
targ->sdev[sdev->lun] = NULL;
|
||||
}
|
||||
|
||||
#if defined(__i386__)
|
||||
/*
|
||||
* Return the disk geometry for the given SCSI device.
|
||||
@ -777,11 +754,11 @@ struct scsi_host_template aic7xxx_driver_template = {
|
||||
#endif
|
||||
.can_queue = AHC_MAX_QUEUE,
|
||||
.this_id = -1,
|
||||
.max_sectors = 8192,
|
||||
.cmd_per_lun = 2,
|
||||
.use_clustering = ENABLE_CLUSTERING,
|
||||
.slave_alloc = ahc_linux_slave_alloc,
|
||||
.slave_configure = ahc_linux_slave_configure,
|
||||
.slave_destroy = ahc_linux_slave_destroy,
|
||||
.target_alloc = ahc_linux_target_alloc,
|
||||
.target_destroy = ahc_linux_target_destroy,
|
||||
};
|
||||
@ -1203,21 +1180,13 @@ void
|
||||
ahc_platform_free(struct ahc_softc *ahc)
|
||||
{
|
||||
struct scsi_target *starget;
|
||||
int i, j;
|
||||
int i;
|
||||
|
||||
if (ahc->platform_data != NULL) {
|
||||
/* destroy all of the device and target objects */
|
||||
for (i = 0; i < AHC_NUM_TARGETS; i++) {
|
||||
starget = ahc->platform_data->starget[i];
|
||||
if (starget != NULL) {
|
||||
for (j = 0; j < AHC_NUM_LUNS; j++) {
|
||||
struct ahc_linux_target *targ =
|
||||
scsi_transport_target_data(starget);
|
||||
|
||||
if (targ->sdev[j] == NULL)
|
||||
continue;
|
||||
targ->sdev[j] = NULL;
|
||||
}
|
||||
ahc->platform_data->starget[i] = NULL;
|
||||
}
|
||||
}
|
||||
@ -1251,24 +1220,13 @@ ahc_platform_freeze_devq(struct ahc_softc *ahc, struct scb *scb)
|
||||
}
|
||||
|
||||
void
|
||||
ahc_platform_set_tags(struct ahc_softc *ahc, struct ahc_devinfo *devinfo,
|
||||
ahc_queue_alg alg)
|
||||
ahc_platform_set_tags(struct ahc_softc *ahc, struct scsi_device *sdev,
|
||||
struct ahc_devinfo *devinfo, ahc_queue_alg alg)
|
||||
{
|
||||
struct scsi_target *starget;
|
||||
struct ahc_linux_target *targ;
|
||||
struct ahc_linux_device *dev;
|
||||
struct scsi_device *sdev;
|
||||
u_int target_offset;
|
||||
int was_queuing;
|
||||
int now_queuing;
|
||||
|
||||
target_offset = devinfo->target;
|
||||
if (devinfo->channel != 'A')
|
||||
target_offset += 8;
|
||||
starget = ahc->platform_data->starget[target_offset];
|
||||
targ = scsi_transport_target_data(starget);
|
||||
BUG_ON(targ == NULL);
|
||||
sdev = targ->sdev[devinfo->lun];
|
||||
if (sdev == NULL)
|
||||
return;
|
||||
dev = scsi_transport_device_data(sdev);
|
||||
@ -1401,11 +1359,15 @@ ahc_linux_device_queue_depth(struct scsi_device *sdev)
|
||||
tags = ahc_linux_user_tagdepth(ahc, &devinfo);
|
||||
if (tags != 0 && sdev->tagged_supported != 0) {
|
||||
|
||||
ahc_set_tags(ahc, &devinfo, AHC_QUEUE_TAGGED);
|
||||
ahc_platform_set_tags(ahc, sdev, &devinfo, AHC_QUEUE_TAGGED);
|
||||
ahc_send_async(ahc, devinfo.channel, devinfo.target,
|
||||
devinfo.lun, AC_TRANSFER_NEG);
|
||||
ahc_print_devinfo(ahc, &devinfo);
|
||||
printf("Tagged Queuing enabled. Depth %d\n", tags);
|
||||
} else {
|
||||
ahc_set_tags(ahc, &devinfo, AHC_QUEUE_NONE);
|
||||
ahc_platform_set_tags(ahc, sdev, &devinfo, AHC_QUEUE_NONE);
|
||||
ahc_send_async(ahc, devinfo.channel, devinfo.target,
|
||||
devinfo.lun, AC_TRANSFER_NEG);
|
||||
}
|
||||
}
|
||||
|
||||
@ -1629,7 +1591,7 @@ ahc_platform_flushwork(struct ahc_softc *ahc)
|
||||
|
||||
void
|
||||
ahc_send_async(struct ahc_softc *ahc, char channel,
|
||||
u_int target, u_int lun, ac_code code, void *arg)
|
||||
u_int target, u_int lun, ac_code code)
|
||||
{
|
||||
switch (code) {
|
||||
case AC_TRANSFER_NEG:
|
||||
@ -1875,9 +1837,9 @@ ahc_linux_handle_scsi_status(struct ahc_softc *ahc,
|
||||
if (scb->flags & SCB_SENSE) {
|
||||
u_int sense_size;
|
||||
|
||||
sense_size = MIN(sizeof(struct scsi_sense_data)
|
||||
sense_size = min(sizeof(struct scsi_sense_data)
|
||||
- ahc_get_sense_residual(scb),
|
||||
sizeof(cmd->sense_buffer));
|
||||
(u_long)sizeof(cmd->sense_buffer));
|
||||
memcpy(cmd->sense_buffer,
|
||||
ahc_get_sense_buf(ahc, scb), sense_size);
|
||||
if (sense_size < sizeof(cmd->sense_buffer))
|
||||
@ -1946,7 +1908,7 @@ ahc_linux_handle_scsi_status(struct ahc_softc *ahc,
|
||||
}
|
||||
ahc_set_transaction_status(scb, CAM_REQUEUE_REQ);
|
||||
ahc_set_scsi_status(scb, SCSI_STATUS_OK);
|
||||
ahc_platform_set_tags(ahc, &devinfo,
|
||||
ahc_platform_set_tags(ahc, sdev, &devinfo,
|
||||
(dev->flags & AHC_DEV_Q_BASIC)
|
||||
? AHC_QUEUE_BASIC : AHC_QUEUE_TAGGED);
|
||||
break;
|
||||
@ -1957,7 +1919,7 @@ ahc_linux_handle_scsi_status(struct ahc_softc *ahc,
|
||||
*/
|
||||
dev->openings = 1;
|
||||
ahc_set_scsi_status(scb, SCSI_STATUS_BUSY);
|
||||
ahc_platform_set_tags(ahc, &devinfo,
|
||||
ahc_platform_set_tags(ahc, sdev, &devinfo,
|
||||
(dev->flags & AHC_DEV_Q_BASIC)
|
||||
? AHC_QUEUE_BASIC : AHC_QUEUE_TAGGED);
|
||||
break;
|
||||
@ -2599,8 +2561,6 @@ ahc_linux_init(void)
|
||||
if (!ahc_linux_transport_template)
|
||||
return -ENODEV;
|
||||
|
||||
scsi_transport_reserve_target(ahc_linux_transport_template,
|
||||
sizeof(struct ahc_linux_target));
|
||||
scsi_transport_reserve_device(ahc_linux_transport_template,
|
||||
sizeof(struct ahc_linux_device));
|
||||
|
||||
|
@ -256,7 +256,6 @@ typedef enum {
|
||||
AHC_DEV_PERIODIC_OTAG = 0x40, /* Send OTAG to prevent starvation */
|
||||
} ahc_linux_dev_flags;
|
||||
|
||||
struct ahc_linux_target;
|
||||
struct ahc_linux_device {
|
||||
/*
|
||||
* The number of transactions currently
|
||||
@ -329,12 +328,6 @@ struct ahc_linux_device {
|
||||
#define AHC_OTAG_THRESH 500
|
||||
};
|
||||
|
||||
struct ahc_linux_target {
|
||||
struct scsi_device *sdev[AHC_NUM_LUNS];
|
||||
struct ahc_transinfo last_tinfo;
|
||||
struct ahc_softc *ahc;
|
||||
};
|
||||
|
||||
/********************* Definitions Required by the Core ***********************/
|
||||
/*
|
||||
* Number of SG segments we require. So long as the S/G segments for
|
||||
@ -533,8 +526,6 @@ ahc_unlock(struct ahc_softc *ahc, unsigned long *flags)
|
||||
#define PCIR_SUBVEND_0 0x2c
|
||||
#define PCIR_SUBDEV_0 0x2e
|
||||
|
||||
extern struct pci_driver aic7xxx_pci_driver;
|
||||
|
||||
typedef enum
|
||||
{
|
||||
AHC_POWER_STATE_D0,
|
||||
@ -824,7 +815,7 @@ ahc_freeze_scb(struct scb *scb)
|
||||
}
|
||||
}
|
||||
|
||||
void ahc_platform_set_tags(struct ahc_softc *ahc,
|
||||
void ahc_platform_set_tags(struct ahc_softc *ahc, struct scsi_device *sdev,
|
||||
struct ahc_devinfo *devinfo, ahc_queue_alg);
|
||||
int ahc_platform_abort_scbs(struct ahc_softc *ahc, int target,
|
||||
char channel, int lun, u_int tag,
|
||||
@ -834,7 +825,7 @@ irqreturn_t
|
||||
void ahc_platform_flushwork(struct ahc_softc *ahc);
|
||||
void ahc_done(struct ahc_softc*, struct scb*);
|
||||
void ahc_send_async(struct ahc_softc *, char channel,
|
||||
u_int target, u_int lun, ac_code, void *);
|
||||
u_int target, u_int lun, ac_code);
|
||||
void ahc_print_path(struct ahc_softc *, struct scb *);
|
||||
void ahc_platform_dump_card_state(struct ahc_softc *ahc);
|
||||
|
||||
|
@ -130,7 +130,7 @@ static struct pci_device_id ahc_linux_pci_id_table[] = {
|
||||
|
||||
MODULE_DEVICE_TABLE(pci, ahc_linux_pci_id_table);
|
||||
|
||||
struct pci_driver aic7xxx_pci_driver = {
|
||||
static struct pci_driver aic7xxx_pci_driver = {
|
||||
.name = "aic7xxx",
|
||||
.probe = ahc_linux_pci_dev_probe,
|
||||
.remove = ahc_linux_pci_dev_remove,
|
||||
|
@ -168,7 +168,7 @@ static ahc_device_setup_t ahc_aha394XX_setup;
|
||||
static ahc_device_setup_t ahc_aha494XX_setup;
|
||||
static ahc_device_setup_t ahc_aha398XX_setup;
|
||||
|
||||
struct ahc_pci_identity ahc_pci_ident_table [] =
|
||||
static struct ahc_pci_identity ahc_pci_ident_table [] =
|
||||
{
|
||||
/* aic7850 based controllers */
|
||||
{
|
||||
@ -559,7 +559,7 @@ struct ahc_pci_identity ahc_pci_ident_table [] =
|
||||
}
|
||||
};
|
||||
|
||||
const u_int ahc_num_pci_devs = ARRAY_SIZE(ahc_pci_ident_table);
|
||||
static const u_int ahc_num_pci_devs = ARRAY_SIZE(ahc_pci_ident_table);
|
||||
|
||||
#define AHC_394X_SLOT_CHANNEL_A 4
|
||||
#define AHC_394X_SLOT_CHANNEL_B 5
|
||||
|
@ -182,7 +182,6 @@ ahc_dump_target_state(struct ahc_softc *ahc, struct info_str *info,
|
||||
u_int our_id, char channel, u_int target_id,
|
||||
u_int target_offset)
|
||||
{
|
||||
struct ahc_linux_target *targ;
|
||||
struct scsi_target *starget;
|
||||
struct ahc_initiator_tinfo *tinfo;
|
||||
struct ahc_tmode_tstate *tstate;
|
||||
@ -198,7 +197,6 @@ ahc_dump_target_state(struct ahc_softc *ahc, struct info_str *info,
|
||||
starget = ahc->platform_data->starget[target_offset];
|
||||
if (!starget)
|
||||
return;
|
||||
targ = scsi_transport_target_data(starget);
|
||||
|
||||
copy_info(info, "\tGoal: ");
|
||||
ahc_format_transinfo(info, &tinfo->goal);
|
||||
@ -208,7 +206,7 @@ ahc_dump_target_state(struct ahc_softc *ahc, struct info_str *info,
|
||||
for (lun = 0; lun < AHC_NUM_LUNS; lun++) {
|
||||
struct scsi_device *sdev;
|
||||
|
||||
sdev = targ->sdev[lun];
|
||||
sdev = scsi_device_lookup_by_target(starget, lun);
|
||||
|
||||
if (sdev == NULL)
|
||||
continue;
|
||||
@ -383,11 +381,11 @@ ahc_linux_proc_info(struct Scsi_Host *shost, char *buffer, char **start,
|
||||
}
|
||||
copy_info(&info, "\n");
|
||||
|
||||
max_targ = 15;
|
||||
max_targ = 16;
|
||||
if ((ahc->features & (AHC_WIDE|AHC_TWIN)) == 0)
|
||||
max_targ = 7;
|
||||
max_targ = 8;
|
||||
|
||||
for (i = 0; i <= max_targ; i++) {
|
||||
for (i = 0; i < max_targ; i++) {
|
||||
u_int our_id;
|
||||
u_int target_id;
|
||||
char channel;
|
||||
|
@ -2646,7 +2646,7 @@ static void aic7xxx_done_cmds_complete(struct aic7xxx_host *p)
|
||||
|
||||
while (p->completeq.head != NULL) {
|
||||
cmd = p->completeq.head;
|
||||
p->completeq.head = (struct scsi_Cmnd *) cmd->host_scribble;
|
||||
p->completeq.head = (struct scsi_cmnd *) cmd->host_scribble;
|
||||
cmd->host_scribble = NULL;
|
||||
cmd->scsi_done(cmd);
|
||||
}
|
||||
|
@ -46,6 +46,7 @@
|
||||
#define PCI_DEVICE_ID_ADAPTEC2_RAZOR10 0x410
|
||||
#define PCI_DEVICE_ID_ADAPTEC2_RAZOR12 0x412
|
||||
#define PCI_DEVICE_ID_ADAPTEC2_RAZOR1E 0x41E
|
||||
#define PCI_DEVICE_ID_ADAPTEC2_RAZOR1F 0x41F
|
||||
#define PCI_DEVICE_ID_ADAPTEC2_RAZOR30 0x430
|
||||
#define PCI_DEVICE_ID_ADAPTEC2_RAZOR32 0x432
|
||||
#define PCI_DEVICE_ID_ADAPTEC2_RAZOR3E 0x43E
|
||||
|
@ -814,6 +814,8 @@ static const struct pci_device_id aic94xx_pci_table[] __devinitdata = {
|
||||
0, 0, 1},
|
||||
{PCI_DEVICE(PCI_VENDOR_ID_ADAPTEC2, PCI_DEVICE_ID_ADAPTEC2_RAZOR1E),
|
||||
0, 0, 1},
|
||||
{PCI_DEVICE(PCI_VENDOR_ID_ADAPTEC2, PCI_DEVICE_ID_ADAPTEC2_RAZOR1F),
|
||||
0, 0, 1},
|
||||
{PCI_DEVICE(PCI_VENDOR_ID_ADAPTEC2, PCI_DEVICE_ID_ADAPTEC2_RAZOR30),
|
||||
0, 0, 2},
|
||||
{PCI_DEVICE(PCI_VENDOR_ID_ADAPTEC2, PCI_DEVICE_ID_ADAPTEC2_RAZOR32),
|
||||
|
@ -630,10 +630,6 @@ static int asd_flash_getid(struct asd_ha_struct *asd_ha)
|
||||
|
||||
reg = asd_read_reg_dword(asd_ha, EXSICNFGR);
|
||||
|
||||
if (!(reg & FLASHEX)) {
|
||||
ASD_DPRINTK("flash doesn't exist\n");
|
||||
return -ENOENT;
|
||||
}
|
||||
if (pci_read_config_dword(asd_ha->pcidev, PCI_CONF_FLSH_BAR,
|
||||
&asd_ha->hw_prof.flash.bar)) {
|
||||
asd_printk("couldn't read PCI_CONF_FLSH_BAR of %s\n",
|
||||
|
@ -387,6 +387,7 @@ static void __iomem * bios_mem;
|
||||
static int bios_major;
|
||||
static int bios_minor;
|
||||
static int PCI_bus;
|
||||
static struct pci_dev *PCI_dev;
|
||||
static int Quantum; /* Quantum board variant */
|
||||
static int interrupt_level;
|
||||
static volatile int in_command;
|
||||
@ -812,9 +813,10 @@ static int fdomain_pci_bios_detect( int *irq, int *iobase, struct pci_dev **ret_
|
||||
PCI_DEVICE_ID_FD_36C70 );
|
||||
#endif
|
||||
|
||||
if ((pdev = pci_find_device(PCI_VENDOR_ID_FD, PCI_DEVICE_ID_FD_36C70, pdev)) == NULL)
|
||||
if ((pdev = pci_get_device(PCI_VENDOR_ID_FD, PCI_DEVICE_ID_FD_36C70, pdev)) == NULL)
|
||||
return 0;
|
||||
if (pci_enable_device(pdev)) return 0;
|
||||
if (pci_enable_device(pdev))
|
||||
goto fail;
|
||||
|
||||
#if DEBUG_DETECT
|
||||
printk( "scsi: <fdomain> TMC-3260 detect:"
|
||||
@ -831,7 +833,7 @@ static int fdomain_pci_bios_detect( int *irq, int *iobase, struct pci_dev **ret_
|
||||
pci_irq = pdev->irq;
|
||||
|
||||
if (!request_region( pci_base, 0x10, "fdomain" ))
|
||||
return 0;
|
||||
goto fail;
|
||||
|
||||
/* Now we have the I/O base address and interrupt from the PCI
|
||||
configuration registers. */
|
||||
@ -848,17 +850,22 @@ static int fdomain_pci_bios_detect( int *irq, int *iobase, struct pci_dev **ret_
|
||||
if (!fdomain_is_valid_port(pci_base)) {
|
||||
printk(KERN_ERR "scsi: <fdomain> PCI card detected, but driver not loaded (invalid port)\n" );
|
||||
release_region(pci_base, 0x10);
|
||||
return 0;
|
||||
goto fail;
|
||||
}
|
||||
|
||||
/* Fill in a few global variables. Ugh. */
|
||||
bios_major = bios_minor = -1;
|
||||
PCI_bus = 1;
|
||||
PCI_dev = pdev;
|
||||
Quantum = 0;
|
||||
bios_base = 0;
|
||||
|
||||
return 1;
|
||||
fail:
|
||||
pci_dev_put(pdev);
|
||||
return 0;
|
||||
}
|
||||
|
||||
#endif
|
||||
|
||||
struct Scsi_Host *__fdomain_16x0_detect(struct scsi_host_template *tpnt )
|
||||
@ -909,8 +916,7 @@ struct Scsi_Host *__fdomain_16x0_detect(struct scsi_host_template *tpnt )
|
||||
if (setup_called) {
|
||||
printk(KERN_ERR "scsi: <fdomain> Bad LILO/INSMOD parameters?\n");
|
||||
}
|
||||
release_region(port_base, 0x10);
|
||||
return NULL;
|
||||
goto fail;
|
||||
}
|
||||
|
||||
if (this_id) {
|
||||
@ -942,8 +948,7 @@ struct Scsi_Host *__fdomain_16x0_detect(struct scsi_host_template *tpnt )
|
||||
/* Log IRQ with kernel */
|
||||
if (!interrupt_level) {
|
||||
printk(KERN_ERR "scsi: <fdomain> Card Detected, but driver not loaded (no IRQ)\n" );
|
||||
release_region(port_base, 0x10);
|
||||
return NULL;
|
||||
goto fail;
|
||||
} else {
|
||||
/* Register the IRQ with the kernel */
|
||||
|
||||
@ -964,11 +969,14 @@ struct Scsi_Host *__fdomain_16x0_detect(struct scsi_host_template *tpnt )
|
||||
printk(KERN_ERR " Send mail to faith@acm.org\n" );
|
||||
}
|
||||
printk(KERN_ERR "scsi: <fdomain> Detected, but driver not loaded (IRQ)\n" );
|
||||
release_region(port_base, 0x10);
|
||||
return NULL;
|
||||
goto fail;
|
||||
}
|
||||
}
|
||||
return shpnt;
|
||||
fail:
|
||||
pci_dev_put(pdev);
|
||||
release_region(port_base, 0x10);
|
||||
return NULL;
|
||||
}
|
||||
|
||||
static int fdomain_16x0_detect(struct scsi_host_template *tpnt)
|
||||
@ -1714,6 +1722,8 @@ static int fdomain_16x0_release(struct Scsi_Host *shpnt)
|
||||
free_irq(shpnt->irq, shpnt);
|
||||
if (shpnt->io_port && shpnt->n_io_port)
|
||||
release_region(shpnt->io_port, shpnt->n_io_port);
|
||||
if (PCI_bus)
|
||||
pci_dev_put(PCI_dev);
|
||||
return 0;
|
||||
}
|
||||
|
||||
|
@ -1213,7 +1213,7 @@ void ibmvscsi_handle_crq(struct viosrp_crq *crq,
|
||||
"ibmvscsi: Re-enabling adapter!\n");
|
||||
purge_requests(hostdata, DID_REQUEUE);
|
||||
if ((ibmvscsi_reenable_crq_queue(&hostdata->queue,
|
||||
hostdata) == 0) ||
|
||||
hostdata)) ||
|
||||
(ibmvscsi_send_crq(hostdata,
|
||||
0xC001000000000000LL, 0))) {
|
||||
atomic_set(&hostdata->request_limit,
|
||||
|
@ -481,8 +481,8 @@ int __iscsi_complete_pdu(struct iscsi_conn *conn, struct iscsi_hdr *hdr,
|
||||
break;
|
||||
case ISCSI_OP_ASYNC_EVENT:
|
||||
conn->exp_statsn = be32_to_cpu(hdr->statsn) + 1;
|
||||
/* we need sth like iscsi_async_event_rsp() */
|
||||
rc = ISCSI_ERR_BAD_OPCODE;
|
||||
if (iscsi_recv_pdu(conn->cls_conn, hdr, data, datalen))
|
||||
rc = ISCSI_ERR_CONN_FAILED;
|
||||
break;
|
||||
default:
|
||||
rc = ISCSI_ERR_BAD_OPCODE;
|
||||
@ -578,6 +578,27 @@ void iscsi_conn_failure(struct iscsi_conn *conn, enum iscsi_err err)
|
||||
}
|
||||
EXPORT_SYMBOL_GPL(iscsi_conn_failure);
|
||||
|
||||
static int iscsi_xmit_imm_task(struct iscsi_conn *conn)
|
||||
{
|
||||
struct iscsi_hdr *hdr = conn->mtask->hdr;
|
||||
int rc, was_logout = 0;
|
||||
|
||||
if ((hdr->opcode & ISCSI_OPCODE_MASK) == ISCSI_OP_LOGOUT) {
|
||||
conn->session->state = ISCSI_STATE_IN_RECOVERY;
|
||||
iscsi_block_session(session_to_cls(conn->session));
|
||||
was_logout = 1;
|
||||
}
|
||||
rc = conn->session->tt->xmit_mgmt_task(conn, conn->mtask);
|
||||
if (rc)
|
||||
return rc;
|
||||
|
||||
if (was_logout) {
|
||||
set_bit(ISCSI_SUSPEND_BIT, &conn->suspend_tx);
|
||||
return -ENODATA;
|
||||
}
|
||||
return 0;
|
||||
}
|
||||
|
||||
/**
|
||||
* iscsi_data_xmit - xmit any command into the scheduled connection
|
||||
* @conn: iscsi connection
|
||||
@ -623,7 +644,7 @@ static int iscsi_data_xmit(struct iscsi_conn *conn)
|
||||
conn->ctask = NULL;
|
||||
}
|
||||
if (conn->mtask) {
|
||||
rc = tt->xmit_mgmt_task(conn, conn->mtask);
|
||||
rc = iscsi_xmit_imm_task(conn);
|
||||
if (rc)
|
||||
goto again;
|
||||
/* done with this in-progress mtask */
|
||||
@ -638,7 +659,7 @@ static int iscsi_data_xmit(struct iscsi_conn *conn)
|
||||
list_add_tail(&conn->mtask->running,
|
||||
&conn->mgmt_run_list);
|
||||
spin_unlock_bh(&conn->session->lock);
|
||||
rc = tt->xmit_mgmt_task(conn, conn->mtask);
|
||||
rc = iscsi_xmit_imm_task(conn);
|
||||
if (rc)
|
||||
goto again;
|
||||
}
|
||||
@ -661,8 +682,6 @@ static int iscsi_data_xmit(struct iscsi_conn *conn)
|
||||
spin_unlock_bh(&conn->session->lock);
|
||||
|
||||
rc = tt->xmit_cmd_task(conn, conn->ctask);
|
||||
if (rc)
|
||||
goto again;
|
||||
|
||||
spin_lock_bh(&conn->session->lock);
|
||||
__iscsi_put_ctask(conn->ctask);
|
||||
@ -778,6 +797,10 @@ int iscsi_queuecommand(struct scsi_cmnd *sc, void (*done)(struct scsi_cmnd *))
|
||||
}
|
||||
|
||||
conn = session->leadconn;
|
||||
if (!conn) {
|
||||
reason = FAILURE_SESSION_FREED;
|
||||
goto fault;
|
||||
}
|
||||
|
||||
if (!__kfifo_get(session->cmdpool.queue, (void*)&ctask,
|
||||
sizeof(void*))) {
|
||||
@ -1377,7 +1400,6 @@ iscsi_session_setup(struct iscsi_transport *iscsit,
|
||||
}
|
||||
|
||||
spin_lock_init(&session->lock);
|
||||
INIT_LIST_HEAD(&session->connections);
|
||||
|
||||
/* initialize immediate command pool */
|
||||
if (iscsi_pool_init(&session->mgmtpool, session->mgmtpool_max,
|
||||
@ -1580,16 +1602,11 @@ void iscsi_conn_teardown(struct iscsi_cls_conn *cls_conn)
|
||||
kfree(conn->persistent_address);
|
||||
__kfifo_put(session->mgmtpool.queue, (void*)&conn->login_mtask,
|
||||
sizeof(void*));
|
||||
list_del(&conn->item);
|
||||
if (list_empty(&session->connections))
|
||||
if (session->leadconn == conn) {
|
||||
session->leadconn = NULL;
|
||||
if (session->leadconn && session->leadconn == conn)
|
||||
session->leadconn = container_of(session->connections.next,
|
||||
struct iscsi_conn, item);
|
||||
|
||||
if (session->leadconn == NULL)
|
||||
/* no connections exits.. reset sequencing */
|
||||
session->cmdsn = session->max_cmdsn = session->exp_cmdsn = 1;
|
||||
}
|
||||
spin_unlock_bh(&session->lock);
|
||||
|
||||
kfifo_free(conn->immqueue);
|
||||
@ -1777,32 +1794,12 @@ int iscsi_conn_bind(struct iscsi_cls_session *cls_session,
|
||||
struct iscsi_cls_conn *cls_conn, int is_leading)
|
||||
{
|
||||
struct iscsi_session *session = class_to_transport_session(cls_session);
|
||||
struct iscsi_conn *tmp = ERR_PTR(-EEXIST), *conn = cls_conn->dd_data;
|
||||
struct iscsi_conn *conn = cls_conn->dd_data;
|
||||
|
||||
/* lookup for existing connection */
|
||||
spin_lock_bh(&session->lock);
|
||||
list_for_each_entry(tmp, &session->connections, item) {
|
||||
if (tmp == conn) {
|
||||
if (conn->c_stage != ISCSI_CONN_STOPPED ||
|
||||
conn->stop_stage == STOP_CONN_TERM) {
|
||||
printk(KERN_ERR "iscsi: can't bind "
|
||||
"non-stopped connection (%d:%d)\n",
|
||||
conn->c_stage, conn->stop_stage);
|
||||
spin_unlock_bh(&session->lock);
|
||||
return -EIO;
|
||||
}
|
||||
break;
|
||||
}
|
||||
}
|
||||
if (tmp != conn) {
|
||||
/* bind new iSCSI connection to session */
|
||||
conn->session = session;
|
||||
list_add(&conn->item, &session->connections);
|
||||
}
|
||||
spin_unlock_bh(&session->lock);
|
||||
|
||||
if (is_leading)
|
||||
session->leadconn = conn;
|
||||
spin_unlock_bh(&session->lock);
|
||||
|
||||
/*
|
||||
* Unblock xmitworker(), Login Phase will pass through.
|
||||
|
@ -594,7 +594,8 @@ lpfc_soft_wwpn_show(struct class_device *cdev, char *buf)
|
||||
{
|
||||
struct Scsi_Host *host = class_to_shost(cdev);
|
||||
struct lpfc_hba *phba = (struct lpfc_hba*)host->hostdata;
|
||||
return snprintf(buf, PAGE_SIZE, "0x%llx\n", phba->cfg_soft_wwpn);
|
||||
return snprintf(buf, PAGE_SIZE, "0x%llx\n",
|
||||
(unsigned long long)phba->cfg_soft_wwpn);
|
||||
}
|
||||
|
||||
|
||||
|
@ -188,7 +188,8 @@ lpfc_alloc_ct_rsp(struct lpfc_hba * phba, int cmdcode, struct ulp_bde64 * bpl,
|
||||
|
||||
if (!mp->virt) {
|
||||
kfree(mp);
|
||||
lpfc_free_ct_rsp(phba, mlist);
|
||||
if (mlist)
|
||||
lpfc_free_ct_rsp(phba, mlist);
|
||||
return NULL;
|
||||
}
|
||||
|
||||
|
@ -183,7 +183,7 @@ static void nsp_cs_dmessage(const char *func, int line, int mask, char *fmt, ...
|
||||
* Clenaup parameters and call done() functions.
|
||||
* You must be set SCpnt->result before call this function.
|
||||
*/
|
||||
static void nsp_scsi_done(Scsi_Cmnd *SCpnt)
|
||||
static void nsp_scsi_done(struct scsi_cmnd *SCpnt)
|
||||
{
|
||||
nsp_hw_data *data = (nsp_hw_data *)SCpnt->device->host->hostdata;
|
||||
|
||||
@ -192,7 +192,8 @@ static void nsp_scsi_done(Scsi_Cmnd *SCpnt)
|
||||
SCpnt->scsi_done(SCpnt);
|
||||
}
|
||||
|
||||
static int nsp_queuecommand(Scsi_Cmnd *SCpnt, void (*done)(Scsi_Cmnd *))
|
||||
static int nsp_queuecommand(struct scsi_cmnd *SCpnt,
|
||||
void (*done)(struct scsi_cmnd *))
|
||||
{
|
||||
#ifdef NSP_DEBUG
|
||||
/*unsigned int host_id = SCpnt->device->host->this_id;*/
|
||||
@ -365,7 +366,7 @@ static int nsphw_init(nsp_hw_data *data)
|
||||
/*
|
||||
* Start selection phase
|
||||
*/
|
||||
static int nsphw_start_selection(Scsi_Cmnd *SCpnt)
|
||||
static int nsphw_start_selection(struct scsi_cmnd *SCpnt)
|
||||
{
|
||||
unsigned int host_id = SCpnt->device->host->this_id;
|
||||
unsigned int base = SCpnt->device->host->io_port;
|
||||
@ -446,7 +447,7 @@ static struct nsp_sync_table nsp_sync_table_20M[] = {
|
||||
/*
|
||||
* setup synchronous data transfer mode
|
||||
*/
|
||||
static int nsp_analyze_sdtr(Scsi_Cmnd *SCpnt)
|
||||
static int nsp_analyze_sdtr(struct scsi_cmnd *SCpnt)
|
||||
{
|
||||
unsigned char target = scmd_id(SCpnt);
|
||||
// unsigned char lun = SCpnt->device->lun;
|
||||
@ -504,7 +505,7 @@ static int nsp_analyze_sdtr(Scsi_Cmnd *SCpnt)
|
||||
/*
|
||||
* start ninja hardware timer
|
||||
*/
|
||||
static void nsp_start_timer(Scsi_Cmnd *SCpnt, int time)
|
||||
static void nsp_start_timer(struct scsi_cmnd *SCpnt, int time)
|
||||
{
|
||||
unsigned int base = SCpnt->device->host->io_port;
|
||||
nsp_hw_data *data = (nsp_hw_data *)SCpnt->device->host->hostdata;
|
||||
@ -517,7 +518,8 @@ static void nsp_start_timer(Scsi_Cmnd *SCpnt, int time)
|
||||
/*
|
||||
* wait for bus phase change
|
||||
*/
|
||||
static int nsp_negate_signal(Scsi_Cmnd *SCpnt, unsigned char mask, char *str)
|
||||
static int nsp_negate_signal(struct scsi_cmnd *SCpnt, unsigned char mask,
|
||||
char *str)
|
||||
{
|
||||
unsigned int base = SCpnt->device->host->io_port;
|
||||
unsigned char reg;
|
||||
@ -544,9 +546,9 @@ static int nsp_negate_signal(Scsi_Cmnd *SCpnt, unsigned char mask, char *str)
|
||||
/*
|
||||
* expect Ninja Irq
|
||||
*/
|
||||
static int nsp_expect_signal(Scsi_Cmnd *SCpnt,
|
||||
unsigned char current_phase,
|
||||
unsigned char mask)
|
||||
static int nsp_expect_signal(struct scsi_cmnd *SCpnt,
|
||||
unsigned char current_phase,
|
||||
unsigned char mask)
|
||||
{
|
||||
unsigned int base = SCpnt->device->host->io_port;
|
||||
int time_out;
|
||||
@ -579,7 +581,7 @@ static int nsp_expect_signal(Scsi_Cmnd *SCpnt,
|
||||
/*
|
||||
* transfer SCSI message
|
||||
*/
|
||||
static int nsp_xfer(Scsi_Cmnd *SCpnt, int phase)
|
||||
static int nsp_xfer(struct scsi_cmnd *SCpnt, int phase)
|
||||
{
|
||||
unsigned int base = SCpnt->device->host->io_port;
|
||||
nsp_hw_data *data = (nsp_hw_data *)SCpnt->device->host->hostdata;
|
||||
@ -619,7 +621,7 @@ static int nsp_xfer(Scsi_Cmnd *SCpnt, int phase)
|
||||
/*
|
||||
* get extra SCSI data from fifo
|
||||
*/
|
||||
static int nsp_dataphase_bypass(Scsi_Cmnd *SCpnt)
|
||||
static int nsp_dataphase_bypass(struct scsi_cmnd *SCpnt)
|
||||
{
|
||||
nsp_hw_data *data = (nsp_hw_data *)SCpnt->device->host->hostdata;
|
||||
unsigned int count;
|
||||
@ -651,7 +653,7 @@ static int nsp_dataphase_bypass(Scsi_Cmnd *SCpnt)
|
||||
/*
|
||||
* accept reselection
|
||||
*/
|
||||
static int nsp_reselected(Scsi_Cmnd *SCpnt)
|
||||
static int nsp_reselected(struct scsi_cmnd *SCpnt)
|
||||
{
|
||||
unsigned int base = SCpnt->device->host->io_port;
|
||||
unsigned int host_id = SCpnt->device->host->this_id;
|
||||
@ -690,7 +692,7 @@ static int nsp_reselected(Scsi_Cmnd *SCpnt)
|
||||
/*
|
||||
* count how many data transferd
|
||||
*/
|
||||
static int nsp_fifo_count(Scsi_Cmnd *SCpnt)
|
||||
static int nsp_fifo_count(struct scsi_cmnd *SCpnt)
|
||||
{
|
||||
unsigned int base = SCpnt->device->host->io_port;
|
||||
unsigned int count;
|
||||
@ -717,7 +719,7 @@ static int nsp_fifo_count(Scsi_Cmnd *SCpnt)
|
||||
/*
|
||||
* read data in DATA IN phase
|
||||
*/
|
||||
static void nsp_pio_read(Scsi_Cmnd *SCpnt)
|
||||
static void nsp_pio_read(struct scsi_cmnd *SCpnt)
|
||||
{
|
||||
unsigned int base = SCpnt->device->host->io_port;
|
||||
unsigned long mmio_base = SCpnt->device->host->base;
|
||||
@ -812,7 +814,7 @@ static void nsp_pio_read(Scsi_Cmnd *SCpnt)
|
||||
/*
|
||||
* write data in DATA OUT phase
|
||||
*/
|
||||
static void nsp_pio_write(Scsi_Cmnd *SCpnt)
|
||||
static void nsp_pio_write(struct scsi_cmnd *SCpnt)
|
||||
{
|
||||
unsigned int base = SCpnt->device->host->io_port;
|
||||
unsigned long mmio_base = SCpnt->device->host->base;
|
||||
@ -905,7 +907,7 @@ static void nsp_pio_write(Scsi_Cmnd *SCpnt)
|
||||
/*
|
||||
* setup synchronous/asynchronous data transfer mode
|
||||
*/
|
||||
static int nsp_nexus(Scsi_Cmnd *SCpnt)
|
||||
static int nsp_nexus(struct scsi_cmnd *SCpnt)
|
||||
{
|
||||
unsigned int base = SCpnt->device->host->io_port;
|
||||
unsigned char target = scmd_id(SCpnt);
|
||||
@ -952,7 +954,7 @@ static irqreturn_t nspintr(int irq, void *dev_id)
|
||||
{
|
||||
unsigned int base;
|
||||
unsigned char irq_status, irq_phase, phase;
|
||||
Scsi_Cmnd *tmpSC;
|
||||
struct scsi_cmnd *tmpSC;
|
||||
unsigned char target, lun;
|
||||
unsigned int *sync_neg;
|
||||
int i, tmp;
|
||||
@ -1530,7 +1532,7 @@ nsp_proc_info(
|
||||
/*---------------------------------------------------------------*/
|
||||
|
||||
/*
|
||||
static int nsp_eh_abort(Scsi_Cmnd *SCpnt)
|
||||
static int nsp_eh_abort(struct scsi_cmnd *SCpnt)
|
||||
{
|
||||
nsp_dbg(NSP_DEBUG_BUSRESET, "SCpnt=0x%p", SCpnt);
|
||||
|
||||
@ -1558,7 +1560,7 @@ static int nsp_bus_reset(nsp_hw_data *data)
|
||||
return SUCCESS;
|
||||
}
|
||||
|
||||
static int nsp_eh_bus_reset(Scsi_Cmnd *SCpnt)
|
||||
static int nsp_eh_bus_reset(struct scsi_cmnd *SCpnt)
|
||||
{
|
||||
nsp_hw_data *data = (nsp_hw_data *)SCpnt->device->host->hostdata;
|
||||
|
||||
@ -1567,7 +1569,7 @@ static int nsp_eh_bus_reset(Scsi_Cmnd *SCpnt)
|
||||
return nsp_bus_reset(data);
|
||||
}
|
||||
|
||||
static int nsp_eh_host_reset(Scsi_Cmnd *SCpnt)
|
||||
static int nsp_eh_host_reset(struct scsi_cmnd *SCpnt)
|
||||
{
|
||||
nsp_hw_data *data = (nsp_hw_data *)SCpnt->device->host->hostdata;
|
||||
|
||||
|
@ -266,7 +266,7 @@ typedef struct _nsp_hw_data {
|
||||
|
||||
int TimerCount;
|
||||
int SelectionTimeOut;
|
||||
Scsi_Cmnd *CurrentSC;
|
||||
struct scsi_cmnd *CurrentSC;
|
||||
//int CurrnetTarget;
|
||||
|
||||
int FifoCount;
|
||||
@ -319,30 +319,34 @@ static int nsp_proc_info (
|
||||
int hostno,
|
||||
#endif
|
||||
int inout);
|
||||
static int nsp_queuecommand(Scsi_Cmnd *SCpnt, void (* done)(Scsi_Cmnd *SCpnt));
|
||||
static int nsp_queuecommand(struct scsi_cmnd *SCpnt,
|
||||
void (* done)(struct scsi_cmnd *SCpnt));
|
||||
|
||||
/* Error handler */
|
||||
/*static int nsp_eh_abort (Scsi_Cmnd *SCpnt);*/
|
||||
/*static int nsp_eh_device_reset(Scsi_Cmnd *SCpnt);*/
|
||||
static int nsp_eh_bus_reset (Scsi_Cmnd *SCpnt);
|
||||
static int nsp_eh_host_reset (Scsi_Cmnd *SCpnt);
|
||||
/*static int nsp_eh_abort (struct scsi_cmnd *SCpnt);*/
|
||||
/*static int nsp_eh_device_reset(struct scsi_cmnd *SCpnt);*/
|
||||
static int nsp_eh_bus_reset (struct scsi_cmnd *SCpnt);
|
||||
static int nsp_eh_host_reset (struct scsi_cmnd *SCpnt);
|
||||
static int nsp_bus_reset (nsp_hw_data *data);
|
||||
|
||||
/* */
|
||||
static int nsphw_init (nsp_hw_data *data);
|
||||
static int nsphw_start_selection(Scsi_Cmnd *SCpnt);
|
||||
static void nsp_start_timer (Scsi_Cmnd *SCpnt, int time);
|
||||
static int nsp_fifo_count (Scsi_Cmnd *SCpnt);
|
||||
static void nsp_pio_read (Scsi_Cmnd *SCpnt);
|
||||
static void nsp_pio_write (Scsi_Cmnd *SCpnt);
|
||||
static int nsp_nexus (Scsi_Cmnd *SCpnt);
|
||||
static void nsp_scsi_done (Scsi_Cmnd *SCpnt);
|
||||
static int nsp_analyze_sdtr (Scsi_Cmnd *SCpnt);
|
||||
static int nsp_negate_signal (Scsi_Cmnd *SCpnt, unsigned char mask, char *str);
|
||||
static int nsp_expect_signal (Scsi_Cmnd *SCpnt, unsigned char current_phase, unsigned char mask);
|
||||
static int nsp_xfer (Scsi_Cmnd *SCpnt, int phase);
|
||||
static int nsp_dataphase_bypass (Scsi_Cmnd *SCpnt);
|
||||
static int nsp_reselected (Scsi_Cmnd *SCpnt);
|
||||
static int nsphw_start_selection(struct scsi_cmnd *SCpnt);
|
||||
static void nsp_start_timer (struct scsi_cmnd *SCpnt, int time);
|
||||
static int nsp_fifo_count (struct scsi_cmnd *SCpnt);
|
||||
static void nsp_pio_read (struct scsi_cmnd *SCpnt);
|
||||
static void nsp_pio_write (struct scsi_cmnd *SCpnt);
|
||||
static int nsp_nexus (struct scsi_cmnd *SCpnt);
|
||||
static void nsp_scsi_done (struct scsi_cmnd *SCpnt);
|
||||
static int nsp_analyze_sdtr (struct scsi_cmnd *SCpnt);
|
||||
static int nsp_negate_signal (struct scsi_cmnd *SCpnt,
|
||||
unsigned char mask, char *str);
|
||||
static int nsp_expect_signal (struct scsi_cmnd *SCpnt,
|
||||
unsigned char current_phase,
|
||||
unsigned char mask);
|
||||
static int nsp_xfer (struct scsi_cmnd *SCpnt, int phase);
|
||||
static int nsp_dataphase_bypass (struct scsi_cmnd *SCpnt);
|
||||
static int nsp_reselected (struct scsi_cmnd *SCpnt);
|
||||
static struct Scsi_Host *nsp_detect(struct scsi_host_template *sht);
|
||||
|
||||
/* Interrupt handler */
|
||||
@ -355,8 +359,8 @@ static void __exit nsp_cs_exit(void);
|
||||
|
||||
/* Debug */
|
||||
#ifdef NSP_DEBUG
|
||||
static void show_command (Scsi_Cmnd *SCpnt);
|
||||
static void show_phase (Scsi_Cmnd *SCpnt);
|
||||
static void show_command (struct scsi_cmnd *SCpnt);
|
||||
static void show_phase (struct scsi_cmnd *SCpnt);
|
||||
static void show_busphase(unsigned char stat);
|
||||
static void show_message (nsp_hw_data *data);
|
||||
#else
|
||||
|
@ -138,12 +138,12 @@ static void print_commandk (unsigned char *command)
|
||||
printk("\n");
|
||||
}
|
||||
|
||||
static void show_command(Scsi_Cmnd *SCpnt)
|
||||
static void show_command(struct scsi_cmnd *SCpnt)
|
||||
{
|
||||
print_commandk(SCpnt->cmnd);
|
||||
}
|
||||
|
||||
static void show_phase(Scsi_Cmnd *SCpnt)
|
||||
static void show_phase(struct scsi_cmnd *SCpnt)
|
||||
{
|
||||
int i = SCpnt->SCp.phase;
|
||||
|
||||
|
@ -8,7 +8,7 @@
|
||||
|
||||
/* $Id: nsp_message.c,v 1.6 2003/07/26 14:21:09 elca Exp $ */
|
||||
|
||||
static void nsp_message_in(Scsi_Cmnd *SCpnt)
|
||||
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;
|
||||
@ -50,7 +50,7 @@ static void nsp_message_in(Scsi_Cmnd *SCpnt)
|
||||
|
||||
}
|
||||
|
||||
static void nsp_message_out(Scsi_Cmnd *SCpnt)
|
||||
static void nsp_message_out(struct scsi_cmnd *SCpnt)
|
||||
{
|
||||
nsp_hw_data *data = (nsp_hw_data *)SCpnt->device->host->hostdata;
|
||||
int ret = 1;
|
||||
|
@ -87,11 +87,11 @@ typedef struct
|
||||
{
|
||||
USHORT ports[13];
|
||||
OUR_DEVICE device[8];
|
||||
Scsi_Cmnd *pSCmnd;
|
||||
struct scsi_cmnd *pSCmnd;
|
||||
IDE_STRUCT ide;
|
||||
ULONG startSector;
|
||||
USHORT sectorCount;
|
||||
Scsi_Cmnd *SCpnt;
|
||||
struct scsi_cmnd *SCpnt;
|
||||
VOID *buffer;
|
||||
USHORT expectingIRQ;
|
||||
} ADAPTER240I, *PADAPTER240I;
|
||||
@ -253,12 +253,12 @@ static ULONG DecodeError (struct Scsi_Host *pshost, UCHAR status)
|
||||
****************************************************************/
|
||||
static void Irq_Handler (int irq, void *dev_id)
|
||||
{
|
||||
struct Scsi_Host *shost; // Pointer to host data block
|
||||
PADAPTER240I padapter; // Pointer to adapter control structure
|
||||
USHORT *pports; // I/O port array
|
||||
Scsi_Cmnd *SCpnt;
|
||||
UCHAR status;
|
||||
int z;
|
||||
struct Scsi_Host *shost; // Pointer to host data block
|
||||
PADAPTER240I padapter; // Pointer to adapter control structure
|
||||
USHORT *pports; // I/O port array
|
||||
struct scsi_cmnd *SCpnt;
|
||||
UCHAR status;
|
||||
int z;
|
||||
|
||||
DEB(printk ("\npsi240i received interrupt\n"));
|
||||
|
||||
@ -389,12 +389,17 @@ static irqreturn_t do_Irq_Handler (int irq, void *dev_id)
|
||||
* Returns: Status code.
|
||||
*
|
||||
****************************************************************/
|
||||
static int Psi240i_QueueCommand (Scsi_Cmnd *SCpnt, void (*done)(Scsi_Cmnd *))
|
||||
static int Psi240i_QueueCommand(struct scsi_cmnd *SCpnt,
|
||||
void (*done)(struct scsi_cmnd *))
|
||||
{
|
||||
UCHAR *cdb = (UCHAR *)SCpnt->cmnd; // Pointer to SCSI CDB
|
||||
PADAPTER240I padapter = HOSTDATA (SCpnt->device->host); // Pointer to adapter control structure
|
||||
POUR_DEVICE pdev = &padapter->device [SCpnt->device->id];// Pointer to device information
|
||||
UCHAR rc; // command return code
|
||||
UCHAR *cdb = (UCHAR *)SCpnt->cmnd;
|
||||
// Pointer to SCSI CDB
|
||||
PADAPTER240I padapter = HOSTDATA (SCpnt->device->host);
|
||||
// Pointer to adapter control structure
|
||||
POUR_DEVICE pdev = &padapter->device [SCpnt->device->id];
|
||||
// Pointer to device information
|
||||
UCHAR rc;
|
||||
// command return code
|
||||
|
||||
SCpnt->scsi_done = done;
|
||||
padapter->ide.ide.ides.spigot = pdev->spigot;
|
||||
|
@ -309,7 +309,7 @@ typedef struct _IDENTIFY_DATA2 {
|
||||
#endif // PSI_EIDE_SCSIOP
|
||||
|
||||
// function prototypes
|
||||
int Psi240i_Command (Scsi_Cmnd *SCpnt);
|
||||
int Psi240i_Abort (Scsi_Cmnd *SCpnt);
|
||||
int Psi240i_Reset (Scsi_Cmnd *SCpnt, unsigned int flags);
|
||||
int Psi240i_Command(struct scsi_cmnd *SCpnt);
|
||||
int Psi240i_Abort(struct scsi_cmnd *SCpnt);
|
||||
int Psi240i_Reset(struct scsi_cmnd *SCpnt, unsigned int flags);
|
||||
#endif
|
||||
|
@ -931,11 +931,10 @@ qla1280_error_action(struct scsi_cmnd *cmd, enum action action)
|
||||
|
||||
case BUS_RESET:
|
||||
if (qla1280_verbose)
|
||||
printk(KERN_INFO "qla1280(%ld:%d): Issuing BUS "
|
||||
"DEVICE RESET\n", ha->host_no, bus);
|
||||
if (qla1280_bus_reset(ha, bus == 0))
|
||||
printk(KERN_INFO "qla1280(%ld:%d): Issued bus "
|
||||
"reset.\n", ha->host_no, bus);
|
||||
if (qla1280_bus_reset(ha, bus) == 0)
|
||||
result = SUCCESS;
|
||||
|
||||
break;
|
||||
|
||||
case ADAPTER_RESET:
|
||||
|
@ -379,21 +379,37 @@ static struct bin_attribute sysfs_sfp_attr = {
|
||||
.read = qla2x00_sysfs_read_sfp,
|
||||
};
|
||||
|
||||
static struct sysfs_entry {
|
||||
char *name;
|
||||
struct bin_attribute *attr;
|
||||
int is4GBp_only;
|
||||
} bin_file_entries[] = {
|
||||
{ "fw_dump", &sysfs_fw_dump_attr, },
|
||||
{ "nvram", &sysfs_nvram_attr, },
|
||||
{ "optrom", &sysfs_optrom_attr, },
|
||||
{ "optrom_ctl", &sysfs_optrom_ctl_attr, },
|
||||
{ "vpd", &sysfs_vpd_attr, 1 },
|
||||
{ "sfp", &sysfs_sfp_attr, 1 },
|
||||
{ 0 },
|
||||
};
|
||||
|
||||
void
|
||||
qla2x00_alloc_sysfs_attr(scsi_qla_host_t *ha)
|
||||
{
|
||||
struct Scsi_Host *host = ha->host;
|
||||
struct sysfs_entry *iter;
|
||||
int ret;
|
||||
|
||||
sysfs_create_bin_file(&host->shost_gendev.kobj, &sysfs_fw_dump_attr);
|
||||
sysfs_create_bin_file(&host->shost_gendev.kobj, &sysfs_nvram_attr);
|
||||
sysfs_create_bin_file(&host->shost_gendev.kobj, &sysfs_optrom_attr);
|
||||
sysfs_create_bin_file(&host->shost_gendev.kobj,
|
||||
&sysfs_optrom_ctl_attr);
|
||||
if (IS_QLA24XX(ha) || IS_QLA54XX(ha)) {
|
||||
sysfs_create_bin_file(&host->shost_gendev.kobj,
|
||||
&sysfs_vpd_attr);
|
||||
sysfs_create_bin_file(&host->shost_gendev.kobj,
|
||||
&sysfs_sfp_attr);
|
||||
for (iter = bin_file_entries; iter->name; iter++) {
|
||||
if (iter->is4GBp_only && (!IS_QLA24XX(ha) && !IS_QLA54XX(ha)))
|
||||
continue;
|
||||
|
||||
ret = sysfs_create_bin_file(&host->shost_gendev.kobj,
|
||||
iter->attr);
|
||||
if (ret)
|
||||
qla_printk(KERN_INFO, ha,
|
||||
"Unable to create sysfs %s binary attribute "
|
||||
"(%d).\n", iter->name, ret);
|
||||
}
|
||||
}
|
||||
|
||||
@ -401,17 +417,14 @@ void
|
||||
qla2x00_free_sysfs_attr(scsi_qla_host_t *ha)
|
||||
{
|
||||
struct Scsi_Host *host = ha->host;
|
||||
struct sysfs_entry *iter;
|
||||
|
||||
for (iter = bin_file_entries; iter->name; iter++) {
|
||||
if (iter->is4GBp_only && (!IS_QLA24XX(ha) && !IS_QLA54XX(ha)))
|
||||
continue;
|
||||
|
||||
sysfs_remove_bin_file(&host->shost_gendev.kobj, &sysfs_fw_dump_attr);
|
||||
sysfs_remove_bin_file(&host->shost_gendev.kobj, &sysfs_nvram_attr);
|
||||
sysfs_remove_bin_file(&host->shost_gendev.kobj, &sysfs_optrom_attr);
|
||||
sysfs_remove_bin_file(&host->shost_gendev.kobj,
|
||||
&sysfs_optrom_ctl_attr);
|
||||
if (IS_QLA24XX(ha) || IS_QLA54XX(ha)) {
|
||||
sysfs_remove_bin_file(&host->shost_gendev.kobj,
|
||||
&sysfs_vpd_attr);
|
||||
sysfs_remove_bin_file(&host->shost_gendev.kobj,
|
||||
&sysfs_sfp_attr);
|
||||
iter->attr);
|
||||
}
|
||||
|
||||
if (ha->beacon_blink_led == 1)
|
||||
|
@ -38,7 +38,7 @@
|
||||
* Macros use for debugging the driver.
|
||||
*/
|
||||
|
||||
#define DEBUG(x) do { if (qla2_extended_error_logging) { x; } } while (0)
|
||||
#define DEBUG(x) do { if (ql2xextended_error_logging) { x; } } while (0)
|
||||
|
||||
#if defined(QL_DEBUG_LEVEL_1)
|
||||
#define DEBUG1(x) do {x;} while (0)
|
||||
@ -46,12 +46,12 @@
|
||||
#define DEBUG1(x) do {} while (0)
|
||||
#endif
|
||||
|
||||
#define DEBUG2(x) do { if (qla2_extended_error_logging) { x; } } while (0)
|
||||
#define DEBUG2_3(x) do { if (qla2_extended_error_logging) { x; } } while (0)
|
||||
#define DEBUG2_3_11(x) do { if (qla2_extended_error_logging) { x; } } while (0)
|
||||
#define DEBUG2_9_10(x) do { if (qla2_extended_error_logging) { x; } } while (0)
|
||||
#define DEBUG2_11(x) do { if (qla2_extended_error_logging) { x; } } while (0)
|
||||
#define DEBUG2_13(x) do { if (qla2_extended_error_logging) { x; } } while (0)
|
||||
#define DEBUG2(x) do { if (ql2xextended_error_logging) { x; } } while (0)
|
||||
#define DEBUG2_3(x) do { if (ql2xextended_error_logging) { x; } } while (0)
|
||||
#define DEBUG2_3_11(x) do { if (ql2xextended_error_logging) { x; } } while (0)
|
||||
#define DEBUG2_9_10(x) do { if (ql2xextended_error_logging) { x; } } while (0)
|
||||
#define DEBUG2_11(x) do { if (ql2xextended_error_logging) { x; } } while (0)
|
||||
#define DEBUG2_13(x) do { if (ql2xextended_error_logging) { x; } } while (0)
|
||||
|
||||
#if defined(QL_DEBUG_LEVEL_3)
|
||||
#define DEBUG3(x) do {x;} while (0)
|
||||
|
@ -1545,6 +1545,9 @@ typedef struct fc_port {
|
||||
spinlock_t rport_lock;
|
||||
struct fc_rport *rport, *drport;
|
||||
u32 supported_classes;
|
||||
|
||||
unsigned long last_queue_full;
|
||||
unsigned long last_ramp_up;
|
||||
} fc_port_t;
|
||||
|
||||
/*
|
||||
@ -2255,6 +2258,7 @@ typedef struct scsi_qla_host {
|
||||
uint16_t mgmt_svr_loop_id;
|
||||
|
||||
uint32_t login_retry_count;
|
||||
int max_q_depth;
|
||||
|
||||
/* Fibre Channel Device List. */
|
||||
struct list_head fcports;
|
||||
|
@ -48,6 +48,7 @@ extern void qla2x00_update_fcport(scsi_qla_host_t *, fc_port_t *);
|
||||
extern void qla2x00_reg_remote_port(scsi_qla_host_t *, fc_port_t *);
|
||||
|
||||
extern void qla2x00_alloc_fw_dump(scsi_qla_host_t *);
|
||||
extern void qla2x00_try_to_stop_firmware(scsi_qla_host_t *);
|
||||
|
||||
/*
|
||||
* Global Data in qla_os.c source file.
|
||||
@ -60,7 +61,8 @@ extern int ql2xplogiabsentdevice;
|
||||
extern int ql2xloginretrycount;
|
||||
extern int ql2xfdmienable;
|
||||
extern int ql2xallocfwdump;
|
||||
extern int qla2_extended_error_logging;
|
||||
extern int ql2xextended_error_logging;
|
||||
extern int ql2xqfullrampup;
|
||||
|
||||
extern void qla2x00_sp_compl(scsi_qla_host_t *, srb_t *);
|
||||
|
||||
|
@ -1644,7 +1644,7 @@ qla2x00_nvram_config(scsi_qla_host_t *ha)
|
||||
* Set host adapter parameters.
|
||||
*/
|
||||
if (nv->host_p[0] & BIT_7)
|
||||
qla2_extended_error_logging = 1;
|
||||
ql2xextended_error_logging = 1;
|
||||
ha->flags.disable_risc_code_load = ((nv->host_p[0] & BIT_4) ? 1 : 0);
|
||||
/* Always load RISC code on non ISP2[12]00 chips. */
|
||||
if (!IS_QLA2100(ha) && !IS_QLA2200(ha))
|
||||
@ -3948,3 +3948,24 @@ qla24xx_load_risc(scsi_qla_host_t *ha, uint32_t *srisc_addr)
|
||||
fail_fw_integrity:
|
||||
return QLA_FUNCTION_FAILED;
|
||||
}
|
||||
|
||||
void
|
||||
qla2x00_try_to_stop_firmware(scsi_qla_host_t *ha)
|
||||
{
|
||||
int ret, retries;
|
||||
|
||||
if (!IS_QLA24XX(ha) && !IS_QLA54XX(ha))
|
||||
return;
|
||||
|
||||
ret = qla2x00_stop_firmware(ha);
|
||||
for (retries = 5; ret != QLA_SUCCESS && retries ; retries--) {
|
||||
qla2x00_reset_chip(ha);
|
||||
if (qla2x00_chip_diag(ha) != QLA_SUCCESS)
|
||||
continue;
|
||||
if (qla2x00_setup_chip(ha) != QLA_SUCCESS)
|
||||
continue;
|
||||
qla_printk(KERN_INFO, ha,
|
||||
"Attempting retry of stop-firmware command...\n");
|
||||
ret = qla2x00_stop_firmware(ha);
|
||||
}
|
||||
}
|
||||
|
@ -6,6 +6,8 @@
|
||||
*/
|
||||
#include "qla_def.h"
|
||||
|
||||
#include <scsi/scsi_tcq.h>
|
||||
|
||||
static void qla2x00_mbx_completion(scsi_qla_host_t *, uint16_t);
|
||||
static void qla2x00_async_event(scsi_qla_host_t *, uint16_t *);
|
||||
static void qla2x00_process_completed_request(struct scsi_qla_host *, uint32_t);
|
||||
@ -593,6 +595,67 @@ qla2x00_async_event(scsi_qla_host_t *ha, uint16_t *mb)
|
||||
}
|
||||
}
|
||||
|
||||
static void
|
||||
qla2x00_adjust_sdev_qdepth_up(struct scsi_device *sdev, void *data)
|
||||
{
|
||||
fc_port_t *fcport = data;
|
||||
|
||||
if (fcport->ha->max_q_depth <= sdev->queue_depth)
|
||||
return;
|
||||
|
||||
if (sdev->ordered_tags)
|
||||
scsi_adjust_queue_depth(sdev, MSG_ORDERED_TAG,
|
||||
sdev->queue_depth + 1);
|
||||
else
|
||||
scsi_adjust_queue_depth(sdev, MSG_SIMPLE_TAG,
|
||||
sdev->queue_depth + 1);
|
||||
|
||||
fcport->last_ramp_up = jiffies;
|
||||
|
||||
DEBUG2(qla_printk(KERN_INFO, fcport->ha,
|
||||
"scsi(%ld:%d:%d:%d): Queue depth adjusted-up to %d.\n",
|
||||
fcport->ha->host_no, sdev->channel, sdev->id, sdev->lun,
|
||||
sdev->queue_depth));
|
||||
}
|
||||
|
||||
static void
|
||||
qla2x00_adjust_sdev_qdepth_down(struct scsi_device *sdev, void *data)
|
||||
{
|
||||
fc_port_t *fcport = data;
|
||||
|
||||
if (!scsi_track_queue_full(sdev, sdev->queue_depth - 1))
|
||||
return;
|
||||
|
||||
DEBUG2(qla_printk(KERN_INFO, fcport->ha,
|
||||
"scsi(%ld:%d:%d:%d): Queue depth adjusted-down to %d.\n",
|
||||
fcport->ha->host_no, sdev->channel, sdev->id, sdev->lun,
|
||||
sdev->queue_depth));
|
||||
}
|
||||
|
||||
static inline void
|
||||
qla2x00_ramp_up_queue_depth(scsi_qla_host_t *ha, srb_t *sp)
|
||||
{
|
||||
fc_port_t *fcport;
|
||||
struct scsi_device *sdev;
|
||||
|
||||
sdev = sp->cmd->device;
|
||||
if (sdev->queue_depth >= ha->max_q_depth)
|
||||
return;
|
||||
|
||||
fcport = sp->fcport;
|
||||
if (time_before(jiffies,
|
||||
fcport->last_ramp_up + ql2xqfullrampup * HZ))
|
||||
return;
|
||||
if (time_before(jiffies,
|
||||
fcport->last_queue_full + ql2xqfullrampup * HZ))
|
||||
return;
|
||||
|
||||
spin_unlock_irq(&ha->hardware_lock);
|
||||
starget_for_each_device(sdev->sdev_target, fcport,
|
||||
qla2x00_adjust_sdev_qdepth_up);
|
||||
spin_lock_irq(&ha->hardware_lock);
|
||||
}
|
||||
|
||||
/**
|
||||
* qla2x00_process_completed_request() - Process a Fast Post response.
|
||||
* @ha: SCSI driver HA context
|
||||
@ -624,6 +687,8 @@ qla2x00_process_completed_request(struct scsi_qla_host *ha, uint32_t index)
|
||||
|
||||
/* Save ISP completion status */
|
||||
sp->cmd->result = DID_OK << 16;
|
||||
|
||||
qla2x00_ramp_up_queue_depth(ha, sp);
|
||||
qla2x00_sp_compl(ha, sp);
|
||||
} else {
|
||||
DEBUG2(printk("scsi(%ld): Invalid ISP SCSI completion handle\n",
|
||||
@ -823,6 +888,7 @@ qla2x00_status_entry(scsi_qla_host_t *ha, void *pkt)
|
||||
*/
|
||||
switch (comp_status) {
|
||||
case CS_COMPLETE:
|
||||
case CS_QUEUE_FULL:
|
||||
if (scsi_status == 0) {
|
||||
cp->result = DID_OK << 16;
|
||||
break;
|
||||
@ -849,6 +915,20 @@ qla2x00_status_entry(scsi_qla_host_t *ha, void *pkt)
|
||||
}
|
||||
cp->result = DID_OK << 16 | lscsi_status;
|
||||
|
||||
if (lscsi_status == SAM_STAT_TASK_SET_FULL) {
|
||||
DEBUG2(printk(KERN_INFO
|
||||
"scsi(%ld): QUEUE FULL status detected "
|
||||
"0x%x-0x%x.\n", ha->host_no, comp_status,
|
||||
scsi_status));
|
||||
|
||||
/* Adjust queue depth for all luns on the port. */
|
||||
fcport->last_queue_full = jiffies;
|
||||
spin_unlock_irq(&ha->hardware_lock);
|
||||
starget_for_each_device(cp->device->sdev_target,
|
||||
fcport, qla2x00_adjust_sdev_qdepth_down);
|
||||
spin_lock_irq(&ha->hardware_lock);
|
||||
break;
|
||||
}
|
||||
if (lscsi_status != SS_CHECK_CONDITION)
|
||||
break;
|
||||
|
||||
@ -1066,17 +1146,6 @@ qla2x00_status_entry(scsi_qla_host_t *ha, void *pkt)
|
||||
qla2x00_mark_device_lost(ha, fcport, 1, 1);
|
||||
break;
|
||||
|
||||
case CS_QUEUE_FULL:
|
||||
DEBUG2(printk(KERN_INFO
|
||||
"scsi(%ld): QUEUE FULL status detected 0x%x-0x%x.\n",
|
||||
ha->host_no, comp_status, scsi_status));
|
||||
|
||||
/* SCSI Mid-Layer handles device queue full */
|
||||
|
||||
cp->result = DID_OK << 16 | lscsi_status;
|
||||
|
||||
break;
|
||||
|
||||
default:
|
||||
DEBUG3(printk("scsi(%ld): Error detected (unknown status) "
|
||||
"0x%x-0x%x.\n", ha->host_no, comp_status, scsi_status));
|
||||
|
@ -61,9 +61,9 @@ MODULE_PARM_DESC(ql2xallocfwdump,
|
||||
"during HBA initialization. Memory allocation requirements "
|
||||
"vary by ISP type. Default is 1 - allocate memory.");
|
||||
|
||||
int qla2_extended_error_logging;
|
||||
module_param(qla2_extended_error_logging, int, S_IRUGO|S_IRUSR);
|
||||
MODULE_PARM_DESC(qla2_extended_error_logging,
|
||||
int ql2xextended_error_logging;
|
||||
module_param(ql2xextended_error_logging, int, S_IRUGO|S_IRUSR);
|
||||
MODULE_PARM_DESC(ql2xextended_error_logging,
|
||||
"Option to enable extended error logging, "
|
||||
"Default is 0 - no logging. 1 - log errors.");
|
||||
|
||||
@ -77,6 +77,19 @@ MODULE_PARM_DESC(ql2xfdmienable,
|
||||
"Enables FDMI registratons "
|
||||
"Default is 0 - no FDMI. 1 - perfom FDMI.");
|
||||
|
||||
#define MAX_Q_DEPTH 32
|
||||
static int ql2xmaxqdepth = MAX_Q_DEPTH;
|
||||
module_param(ql2xmaxqdepth, int, S_IRUGO|S_IWUSR);
|
||||
MODULE_PARM_DESC(ql2xmaxqdepth,
|
||||
"Maximum queue depth to report for target devices.");
|
||||
|
||||
int ql2xqfullrampup = 120;
|
||||
module_param(ql2xqfullrampup, int, S_IRUGO|S_IWUSR);
|
||||
MODULE_PARM_DESC(ql2xqfullrampup,
|
||||
"Number of seconds to wait to begin to ramp-up the queue "
|
||||
"depth for a device after a queue-full condition has been "
|
||||
"detected. Default is 120 seconds.");
|
||||
|
||||
/*
|
||||
* SCSI host template entry points
|
||||
*/
|
||||
@ -1104,9 +1117,9 @@ qla2xxx_slave_configure(struct scsi_device *sdev)
|
||||
struct fc_rport *rport = starget_to_rport(sdev->sdev_target);
|
||||
|
||||
if (sdev->tagged_supported)
|
||||
scsi_activate_tcq(sdev, 32);
|
||||
scsi_activate_tcq(sdev, ha->max_q_depth);
|
||||
else
|
||||
scsi_deactivate_tcq(sdev, 32);
|
||||
scsi_deactivate_tcq(sdev, ha->max_q_depth);
|
||||
|
||||
rport->dev_loss_tmo = ha->port_down_retry_count + 5;
|
||||
|
||||
@ -1413,6 +1426,10 @@ qla2x00_probe_one(struct pci_dev *pdev, const struct pci_device_id *id)
|
||||
ha->link_data_rate = PORT_SPEED_UNKNOWN;
|
||||
ha->optrom_size = OPTROM_SIZE_2300;
|
||||
|
||||
ha->max_q_depth = MAX_Q_DEPTH;
|
||||
if (ql2xmaxqdepth != 0 && ql2xmaxqdepth <= 0xffffU)
|
||||
ha->max_q_depth = ql2xmaxqdepth;
|
||||
|
||||
/* Assign ISP specific operations. */
|
||||
ha->isp_ops.pci_config = qla2100_pci_config;
|
||||
ha->isp_ops.reset_chip = qla2x00_reset_chip;
|
||||
@ -1712,8 +1729,10 @@ qla2x00_free_device(scsi_qla_host_t *ha)
|
||||
if (ha->eft)
|
||||
qla2x00_trace_control(ha, TC_DISABLE, 0, 0);
|
||||
|
||||
ha->flags.online = 0;
|
||||
|
||||
/* Stop currently executing firmware. */
|
||||
qla2x00_stop_firmware(ha);
|
||||
qla2x00_try_to_stop_firmware(ha);
|
||||
|
||||
/* turn-off interrupts on the card */
|
||||
if (ha->interrupts_on)
|
||||
@ -1721,8 +1740,6 @@ qla2x00_free_device(scsi_qla_host_t *ha)
|
||||
|
||||
qla2x00_mem_free(ha);
|
||||
|
||||
ha->flags.online = 0;
|
||||
|
||||
/* Detach interrupts */
|
||||
if (ha->host->irq)
|
||||
free_irq(ha->host->irq, ha);
|
||||
@ -2697,7 +2714,7 @@ qla2x00_module_init(void)
|
||||
|
||||
/* Derive version string. */
|
||||
strcpy(qla2x00_version_str, QLA2XXX_VERSION);
|
||||
if (qla2_extended_error_logging)
|
||||
if (ql2xextended_error_logging)
|
||||
strcat(qla2x00_version_str, "-debug");
|
||||
|
||||
qla2xxx_transport_template =
|
||||
|
@ -7,7 +7,7 @@
|
||||
/*
|
||||
* Driver version
|
||||
*/
|
||||
#define QLA2XXX_VERSION "8.01.07-k2"
|
||||
#define QLA2XXX_VERSION "8.01.07-k3"
|
||||
|
||||
#define QLA_DRIVER_MAJOR_VER 8
|
||||
#define QLA_DRIVER_MINOR_VER 1
|
||||
|
@ -22,14 +22,14 @@
|
||||
#endif
|
||||
|
||||
#if defined(QL_DEBUG_LEVEL_2)
|
||||
#define DEBUG2(x) do {if(qla4_extended_error_logging == 2) x;} while (0);
|
||||
#define DEBUG2(x) do {if(ql4xextended_error_logging == 2) x;} while (0);
|
||||
#define DEBUG2_3(x) do {x;} while (0);
|
||||
#else /* */
|
||||
#define DEBUG2(x) do {} while (0);
|
||||
#endif /* */
|
||||
|
||||
#if defined(QL_DEBUG_LEVEL_3)
|
||||
#define DEBUG3(x) do {if(qla4_extended_error_logging == 3) x;} while (0);
|
||||
#define DEBUG3(x) do {if(ql4xextended_error_logging == 3) x;} while (0);
|
||||
#else /* */
|
||||
#define DEBUG3(x) do {} while (0);
|
||||
#if !defined(QL_DEBUG_LEVEL_2)
|
||||
|
@ -72,7 +72,7 @@ int qla4xxx_reinitialize_ddb_list(struct scsi_qla_host * ha);
|
||||
int qla4xxx_process_ddb_changed(struct scsi_qla_host * ha,
|
||||
uint32_t fw_ddb_index, uint32_t state);
|
||||
|
||||
extern int qla4_extended_error_logging;
|
||||
extern int ql4xextended_error_logging;
|
||||
extern int ql4xdiscoverywait;
|
||||
extern int ql4xdontresethba;
|
||||
#endif /* _QLA4x_GBL_H */
|
||||
|
@ -701,7 +701,7 @@ void qla4xxx_get_conn_event_log(struct scsi_qla_host * ha)
|
||||
DEBUG3(printk("scsi%ld: Connection Event Log Dump (%d entries):\n",
|
||||
ha->host_no, num_valid_entries));
|
||||
|
||||
if (qla4_extended_error_logging == 3) {
|
||||
if (ql4xextended_error_logging == 3) {
|
||||
if (oldest_entry == 0) {
|
||||
/* Circular Buffer has not wrapped around */
|
||||
for (i=0; i < num_valid_entries; i++) {
|
||||
|
@ -34,9 +34,9 @@ MODULE_PARM_DESC(ql4xdontresethba,
|
||||
" default it will reset hba :0"
|
||||
" set to 1 to avoid resetting HBA");
|
||||
|
||||
int qla4_extended_error_logging = 0; /* 0 = off, 1 = log errors */
|
||||
module_param(qla4_extended_error_logging, int, S_IRUGO | S_IRUSR);
|
||||
MODULE_PARM_DESC(qla4_extended_error_logging,
|
||||
int ql4xextended_error_logging = 0; /* 0 = off, 1 = log errors */
|
||||
module_param(ql4xextended_error_logging, int, S_IRUGO | S_IRUSR);
|
||||
MODULE_PARM_DESC(ql4xextended_error_logging,
|
||||
"Option to enable extended error logging, "
|
||||
"Default is 0 - no logging, 1 - debug logging");
|
||||
|
||||
@ -1714,7 +1714,7 @@ static int __init qla4xxx_module_init(void)
|
||||
|
||||
/* Derive version string. */
|
||||
strcpy(qla4xxx_version_str, QLA4XXX_DRIVER_VERSION);
|
||||
if (qla4_extended_error_logging)
|
||||
if (ql4xextended_error_logging)
|
||||
strcat(qla4xxx_version_str, "-debug");
|
||||
|
||||
qla4xxx_scsi_transport =
|
||||
@ -1724,13 +1724,13 @@ static int __init qla4xxx_module_init(void)
|
||||
goto release_srb_cache;
|
||||
}
|
||||
|
||||
printk(KERN_INFO "QLogic iSCSI HBA Driver\n");
|
||||
ret = pci_register_driver(&qla4xxx_pci_driver);
|
||||
if (ret)
|
||||
goto unregister_transport;
|
||||
|
||||
printk(KERN_INFO "QLogic iSCSI HBA Driver\n");
|
||||
return 0;
|
||||
|
||||
unregister_transport:
|
||||
iscsi_unregister_transport(&qla4xxx_iscsi_transport);
|
||||
release_srb_cache:
|
||||
|
@ -209,7 +209,7 @@ static int ql_wai(struct qlogicfas408_priv *priv)
|
||||
* caller must hold host lock
|
||||
*/
|
||||
|
||||
static void ql_icmd(Scsi_Cmnd * cmd)
|
||||
static void ql_icmd(struct scsi_cmnd *cmd)
|
||||
{
|
||||
struct qlogicfas408_priv *priv = get_priv_by_cmd(cmd);
|
||||
int qbase = priv->qbase;
|
||||
@ -256,7 +256,7 @@ static void ql_icmd(Scsi_Cmnd * cmd)
|
||||
* Process scsi command - usually after interrupt
|
||||
*/
|
||||
|
||||
static unsigned int ql_pcmd(Scsi_Cmnd * cmd)
|
||||
static unsigned int ql_pcmd(struct scsi_cmnd *cmd)
|
||||
{
|
||||
unsigned int i, j;
|
||||
unsigned long k;
|
||||
@ -407,7 +407,7 @@ static unsigned int ql_pcmd(Scsi_Cmnd * cmd)
|
||||
|
||||
static void ql_ihandl(void *dev_id)
|
||||
{
|
||||
Scsi_Cmnd *icmd;
|
||||
struct scsi_cmnd *icmd;
|
||||
struct Scsi_Host *host = dev_id;
|
||||
struct qlogicfas408_priv *priv = get_priv_by_host(host);
|
||||
int qbase = priv->qbase;
|
||||
@ -447,7 +447,8 @@ irqreturn_t qlogicfas408_ihandl(int irq, void *dev_id)
|
||||
* Queued command
|
||||
*/
|
||||
|
||||
int qlogicfas408_queuecommand(Scsi_Cmnd * cmd, void (*done) (Scsi_Cmnd *))
|
||||
int qlogicfas408_queuecommand(struct scsi_cmnd *cmd,
|
||||
void (*done) (struct scsi_cmnd *))
|
||||
{
|
||||
struct qlogicfas408_priv *priv = get_priv_by_cmd(cmd);
|
||||
if (scmd_id(cmd) == priv->qinitid) {
|
||||
@ -470,9 +471,8 @@ int qlogicfas408_queuecommand(Scsi_Cmnd * cmd, void (*done) (Scsi_Cmnd *))
|
||||
* Return bios parameters
|
||||
*/
|
||||
|
||||
int qlogicfas408_biosparam(struct scsi_device * disk,
|
||||
struct block_device *dev,
|
||||
sector_t capacity, int ip[])
|
||||
int qlogicfas408_biosparam(struct scsi_device *disk, struct block_device *dev,
|
||||
sector_t capacity, int ip[])
|
||||
{
|
||||
/* This should mimic the DOS Qlogic driver's behavior exactly */
|
||||
ip[0] = 0x40;
|
||||
@ -494,7 +494,7 @@ int qlogicfas408_biosparam(struct scsi_device * disk,
|
||||
* Abort a command in progress
|
||||
*/
|
||||
|
||||
int qlogicfas408_abort(Scsi_Cmnd * cmd)
|
||||
int qlogicfas408_abort(struct scsi_cmnd *cmd)
|
||||
{
|
||||
struct qlogicfas408_priv *priv = get_priv_by_cmd(cmd);
|
||||
priv->qabort = 1;
|
||||
@ -508,7 +508,7 @@ int qlogicfas408_abort(Scsi_Cmnd * cmd)
|
||||
* the PCMCIA qlogic_stub code. This wants fixing
|
||||
*/
|
||||
|
||||
int qlogicfas408_bus_reset(Scsi_Cmnd * cmd)
|
||||
int qlogicfas408_bus_reset(struct scsi_cmnd *cmd)
|
||||
{
|
||||
struct qlogicfas408_priv *priv = get_priv_by_cmd(cmd);
|
||||
unsigned long flags;
|
||||
|
@ -75,15 +75,15 @@
|
||||
/*----------------------------------------------------------------*/
|
||||
|
||||
struct qlogicfas408_priv {
|
||||
int qbase; /* Port */
|
||||
int qinitid; /* initiator ID */
|
||||
int qabort; /* Flag to cause an abort */
|
||||
int qlirq; /* IRQ being used */
|
||||
int int_type; /* type of irq, 2 for ISA board, 0 for PCMCIA */
|
||||
char qinfo[80]; /* description */
|
||||
Scsi_Cmnd *qlcmd; /* current command being processed */
|
||||
struct Scsi_Host *shost; /* pointer back to host */
|
||||
struct qlogicfas408_priv *next; /* next private struct */
|
||||
int qbase; /* Port */
|
||||
int qinitid; /* initiator ID */
|
||||
int qabort; /* Flag to cause an abort */
|
||||
int qlirq; /* IRQ being used */
|
||||
int int_type; /* type of irq, 2 for ISA board, 0 for PCMCIA */
|
||||
char qinfo[80]; /* description */
|
||||
struct scsi_cmnd *qlcmd; /* current command being processed */
|
||||
struct Scsi_Host *shost; /* pointer back to host */
|
||||
struct qlogicfas408_priv *next; /* next private struct */
|
||||
};
|
||||
|
||||
/* The qlogic card uses two register maps - These macros select which one */
|
||||
@ -103,12 +103,13 @@ struct qlogicfas408_priv {
|
||||
#define get_priv_by_host(x) (struct qlogicfas408_priv *)&((x)->hostdata[0])
|
||||
|
||||
irqreturn_t qlogicfas408_ihandl(int irq, void *dev_id);
|
||||
int qlogicfas408_queuecommand(Scsi_Cmnd * cmd, void (*done) (Scsi_Cmnd *));
|
||||
int qlogicfas408_queuecommand(struct scsi_cmnd * cmd,
|
||||
void (*done) (struct scsi_cmnd *));
|
||||
int qlogicfas408_biosparam(struct scsi_device * disk,
|
||||
struct block_device *dev,
|
||||
sector_t capacity, int ip[]);
|
||||
int qlogicfas408_abort(Scsi_Cmnd * cmd);
|
||||
int qlogicfas408_bus_reset(Scsi_Cmnd * cmd);
|
||||
struct block_device *dev,
|
||||
sector_t capacity, int ip[]);
|
||||
int qlogicfas408_abort(struct scsi_cmnd * cmd);
|
||||
int qlogicfas408_bus_reset(struct scsi_cmnd * cmd);
|
||||
const char *qlogicfas408_info(struct Scsi_Host *host);
|
||||
int qlogicfas408_get_chip_type(int qbase, int int_type);
|
||||
void qlogicfas408_setup(int qbase, int id, int int_type);
|
||||
|
@ -52,7 +52,7 @@
|
||||
#include "scsi_debug.h"
|
||||
|
||||
#define SCSI_DEBUG_VERSION "1.80"
|
||||
static const char * scsi_debug_version_date = "20060914";
|
||||
static const char * scsi_debug_version_date = "20061018";
|
||||
|
||||
/* Additional Sense Code (ASC) used */
|
||||
#define NO_ADDITIONAL_SENSE 0x0
|
||||
@ -254,6 +254,8 @@ static int resp_requests(struct scsi_cmnd * SCpnt,
|
||||
struct sdebug_dev_info * devip);
|
||||
static int resp_start_stop(struct scsi_cmnd * scp,
|
||||
struct sdebug_dev_info * devip);
|
||||
static int resp_report_tgtpgs(struct scsi_cmnd * scp,
|
||||
struct sdebug_dev_info * devip);
|
||||
static int resp_readcap(struct scsi_cmnd * SCpnt,
|
||||
struct sdebug_dev_info * devip);
|
||||
static int resp_readcap16(struct scsi_cmnd * SCpnt,
|
||||
@ -287,9 +289,9 @@ static void __init sdebug_build_parts(unsigned char * ramp);
|
||||
static void __init init_all_queued(void);
|
||||
static void stop_all_queued(void);
|
||||
static int stop_queued_cmnd(struct scsi_cmnd * cmnd);
|
||||
static int inquiry_evpd_83(unsigned char * arr, int target_dev_id,
|
||||
int dev_id_num, const char * dev_id_str,
|
||||
int dev_id_str_len);
|
||||
static int inquiry_evpd_83(unsigned char * arr, int port_group_id,
|
||||
int target_dev_id, int dev_id_num,
|
||||
const char * dev_id_str, int dev_id_str_len);
|
||||
static int inquiry_evpd_88(unsigned char * arr, int target_dev_id);
|
||||
static int do_create_driverfs_files(void);
|
||||
static void do_remove_driverfs_files(void);
|
||||
@ -422,6 +424,15 @@ int scsi_debug_queuecommand(struct scsi_cmnd * SCpnt, done_funct_t done)
|
||||
}
|
||||
errsts = resp_readcap16(SCpnt, devip);
|
||||
break;
|
||||
case MAINTENANCE_IN:
|
||||
if (MI_REPORT_TARGET_PGS != cmd[1]) {
|
||||
mk_sense_buffer(devip, ILLEGAL_REQUEST,
|
||||
INVALID_OPCODE, 0);
|
||||
errsts = check_condition_result;
|
||||
break;
|
||||
}
|
||||
errsts = resp_report_tgtpgs(SCpnt, devip);
|
||||
break;
|
||||
case READ_16:
|
||||
case READ_12:
|
||||
case READ_10:
|
||||
@ -665,8 +676,9 @@ static const char * inq_vendor_id = "Linux ";
|
||||
static const char * inq_product_id = "scsi_debug ";
|
||||
static const char * inq_product_rev = "0004";
|
||||
|
||||
static int inquiry_evpd_83(unsigned char * arr, int target_dev_id,
|
||||
int dev_id_num, const char * dev_id_str,
|
||||
static int inquiry_evpd_83(unsigned char * arr, int port_group_id,
|
||||
int target_dev_id, int dev_id_num,
|
||||
const char * dev_id_str,
|
||||
int dev_id_str_len)
|
||||
{
|
||||
int num, port_a;
|
||||
@ -720,6 +732,15 @@ static int inquiry_evpd_83(unsigned char * arr, int target_dev_id,
|
||||
arr[num++] = (port_a >> 16) & 0xff;
|
||||
arr[num++] = (port_a >> 8) & 0xff;
|
||||
arr[num++] = port_a & 0xff;
|
||||
/* NAA-5, Target port group identifier */
|
||||
arr[num++] = 0x61; /* proto=sas, binary */
|
||||
arr[num++] = 0x95; /* piv=1, target port group id */
|
||||
arr[num++] = 0x0;
|
||||
arr[num++] = 0x4;
|
||||
arr[num++] = 0;
|
||||
arr[num++] = 0;
|
||||
arr[num++] = (port_group_id >> 8) & 0xff;
|
||||
arr[num++] = port_group_id & 0xff;
|
||||
/* NAA-5, Target device identifier */
|
||||
arr[num++] = 0x61; /* proto=sas, binary */
|
||||
arr[num++] = 0xa3; /* piv=1, target device, naa */
|
||||
@ -928,12 +949,12 @@ static int resp_inquiry(struct scsi_cmnd * scp, int target,
|
||||
struct sdebug_dev_info * devip)
|
||||
{
|
||||
unsigned char pq_pdt;
|
||||
unsigned char arr[SDEBUG_MAX_INQ_ARR_SZ];
|
||||
unsigned char * arr;
|
||||
unsigned char *cmd = (unsigned char *)scp->cmnd;
|
||||
int alloc_len, n;
|
||||
int alloc_len, n, ret;
|
||||
|
||||
alloc_len = (cmd[3] << 8) + cmd[4];
|
||||
memset(arr, 0, SDEBUG_MAX_INQ_ARR_SZ);
|
||||
arr = kzalloc(SDEBUG_MAX_INQ_ARR_SZ, GFP_KERNEL);
|
||||
if (devip->wlun)
|
||||
pq_pdt = 0x1e; /* present, wlun */
|
||||
else if (scsi_debug_no_lun_0 && (0 == devip->lun))
|
||||
@ -944,12 +965,15 @@ static int resp_inquiry(struct scsi_cmnd * scp, int target,
|
||||
if (0x2 & cmd[1]) { /* CMDDT bit set */
|
||||
mk_sense_buffer(devip, ILLEGAL_REQUEST, INVALID_FIELD_IN_CDB,
|
||||
0);
|
||||
kfree(arr);
|
||||
return check_condition_result;
|
||||
} else if (0x1 & cmd[1]) { /* EVPD bit set */
|
||||
int lu_id_num, target_dev_id, len;
|
||||
int lu_id_num, port_group_id, target_dev_id, len;
|
||||
char lu_id_str[6];
|
||||
int host_no = devip->sdbg_host->shost->host_no;
|
||||
|
||||
port_group_id = (((host_no + 1) & 0x7f) << 8) +
|
||||
(devip->channel & 0x7f);
|
||||
if (0 == scsi_debug_vpd_use_hostno)
|
||||
host_no = 0;
|
||||
lu_id_num = devip->wlun ? -1 : (((host_no + 1) * 2000) +
|
||||
@ -977,8 +1001,9 @@ static int resp_inquiry(struct scsi_cmnd * scp, int target,
|
||||
memcpy(&arr[4], lu_id_str, len);
|
||||
} else if (0x83 == cmd[2]) { /* device identification */
|
||||
arr[1] = cmd[2]; /*sanity */
|
||||
arr[3] = inquiry_evpd_83(&arr[4], target_dev_id,
|
||||
lu_id_num, lu_id_str, len);
|
||||
arr[3] = inquiry_evpd_83(&arr[4], port_group_id,
|
||||
target_dev_id, lu_id_num,
|
||||
lu_id_str, len);
|
||||
} else if (0x84 == cmd[2]) { /* Software interface ident. */
|
||||
arr[1] = cmd[2]; /*sanity */
|
||||
arr[3] = inquiry_evpd_84(&arr[4]);
|
||||
@ -1012,17 +1037,22 @@ static int resp_inquiry(struct scsi_cmnd * scp, int target,
|
||||
/* Illegal request, invalid field in cdb */
|
||||
mk_sense_buffer(devip, ILLEGAL_REQUEST,
|
||||
INVALID_FIELD_IN_CDB, 0);
|
||||
kfree(arr);
|
||||
return check_condition_result;
|
||||
}
|
||||
len = min(((arr[2] << 8) + arr[3]) + 4, alloc_len);
|
||||
return fill_from_dev_buffer(scp, arr,
|
||||
ret = fill_from_dev_buffer(scp, arr,
|
||||
min(len, SDEBUG_MAX_INQ_ARR_SZ));
|
||||
kfree(arr);
|
||||
return ret;
|
||||
}
|
||||
/* drops through here for a standard inquiry */
|
||||
arr[1] = DEV_REMOVEABLE(target) ? 0x80 : 0; /* Removable disk */
|
||||
arr[2] = scsi_debug_scsi_level;
|
||||
arr[3] = 2; /* response_data_format==2 */
|
||||
arr[4] = SDEBUG_LONG_INQ_SZ - 5;
|
||||
if (0 == scsi_debug_vpd_use_hostno)
|
||||
arr[5] = 0x10; /* claim: implicit TGPS */
|
||||
arr[6] = 0x10; /* claim: MultiP */
|
||||
/* arr[6] |= 0x40; ... claim: EncServ (enclosure services) */
|
||||
arr[7] = 0xa; /* claim: LINKED + CMDQUE */
|
||||
@ -1039,8 +1069,10 @@ static int resp_inquiry(struct scsi_cmnd * scp, int target,
|
||||
arr[n++] = 0x3; arr[n++] = 0x60; /* SSC-2 no version */
|
||||
}
|
||||
arr[n++] = 0xc; arr[n++] = 0xf; /* SAS-1.1 rev 10 */
|
||||
return fill_from_dev_buffer(scp, arr,
|
||||
ret = fill_from_dev_buffer(scp, arr,
|
||||
min(alloc_len, SDEBUG_LONG_INQ_SZ));
|
||||
kfree(arr);
|
||||
return ret;
|
||||
}
|
||||
|
||||
static int resp_requests(struct scsi_cmnd * scp,
|
||||
@ -1171,6 +1203,87 @@ static int resp_readcap16(struct scsi_cmnd * scp,
|
||||
min(alloc_len, SDEBUG_READCAP16_ARR_SZ));
|
||||
}
|
||||
|
||||
#define SDEBUG_MAX_TGTPGS_ARR_SZ 1412
|
||||
|
||||
static int resp_report_tgtpgs(struct scsi_cmnd * scp,
|
||||
struct sdebug_dev_info * devip)
|
||||
{
|
||||
unsigned char *cmd = (unsigned char *)scp->cmnd;
|
||||
unsigned char * arr;
|
||||
int host_no = devip->sdbg_host->shost->host_no;
|
||||
int n, ret, alen, rlen;
|
||||
int port_group_a, port_group_b, port_a, port_b;
|
||||
|
||||
alen = ((cmd[6] << 24) + (cmd[7] << 16) + (cmd[8] << 8)
|
||||
+ cmd[9]);
|
||||
|
||||
arr = kzalloc(SDEBUG_MAX_TGTPGS_ARR_SZ, GFP_KERNEL);
|
||||
/*
|
||||
* EVPD page 0x88 states we have two ports, one
|
||||
* real and a fake port with no device connected.
|
||||
* So we create two port groups with one port each
|
||||
* and set the group with port B to unavailable.
|
||||
*/
|
||||
port_a = 0x1; /* relative port A */
|
||||
port_b = 0x2; /* relative port B */
|
||||
port_group_a = (((host_no + 1) & 0x7f) << 8) +
|
||||
(devip->channel & 0x7f);
|
||||
port_group_b = (((host_no + 1) & 0x7f) << 8) +
|
||||
(devip->channel & 0x7f) + 0x80;
|
||||
|
||||
/*
|
||||
* The asymmetric access state is cycled according to the host_id.
|
||||
*/
|
||||
n = 4;
|
||||
if (0 == scsi_debug_vpd_use_hostno) {
|
||||
arr[n++] = host_no % 3; /* Asymm access state */
|
||||
arr[n++] = 0x0F; /* claim: all states are supported */
|
||||
} else {
|
||||
arr[n++] = 0x0; /* Active/Optimized path */
|
||||
arr[n++] = 0x01; /* claim: only support active/optimized paths */
|
||||
}
|
||||
arr[n++] = (port_group_a >> 8) & 0xff;
|
||||
arr[n++] = port_group_a & 0xff;
|
||||
arr[n++] = 0; /* Reserved */
|
||||
arr[n++] = 0; /* Status code */
|
||||
arr[n++] = 0; /* Vendor unique */
|
||||
arr[n++] = 0x1; /* One port per group */
|
||||
arr[n++] = 0; /* Reserved */
|
||||
arr[n++] = 0; /* Reserved */
|
||||
arr[n++] = (port_a >> 8) & 0xff;
|
||||
arr[n++] = port_a & 0xff;
|
||||
arr[n++] = 3; /* Port unavailable */
|
||||
arr[n++] = 0x08; /* claim: only unavailalbe paths are supported */
|
||||
arr[n++] = (port_group_b >> 8) & 0xff;
|
||||
arr[n++] = port_group_b & 0xff;
|
||||
arr[n++] = 0; /* Reserved */
|
||||
arr[n++] = 0; /* Status code */
|
||||
arr[n++] = 0; /* Vendor unique */
|
||||
arr[n++] = 0x1; /* One port per group */
|
||||
arr[n++] = 0; /* Reserved */
|
||||
arr[n++] = 0; /* Reserved */
|
||||
arr[n++] = (port_b >> 8) & 0xff;
|
||||
arr[n++] = port_b & 0xff;
|
||||
|
||||
rlen = n - 4;
|
||||
arr[0] = (rlen >> 24) & 0xff;
|
||||
arr[1] = (rlen >> 16) & 0xff;
|
||||
arr[2] = (rlen >> 8) & 0xff;
|
||||
arr[3] = rlen & 0xff;
|
||||
|
||||
/*
|
||||
* Return the smallest value of either
|
||||
* - The allocated length
|
||||
* - The constructed command length
|
||||
* - The maximum array size
|
||||
*/
|
||||
rlen = min(alen,n);
|
||||
ret = fill_from_dev_buffer(scp, arr,
|
||||
min(rlen, SDEBUG_MAX_TGTPGS_ARR_SZ));
|
||||
kfree(arr);
|
||||
return ret;
|
||||
}
|
||||
|
||||
/* <<Following mode page info copied from ST318451LW>> */
|
||||
|
||||
static int resp_err_recov_pg(unsigned char * p, int pcontrol, int target)
|
||||
|
@ -1084,7 +1084,7 @@ static void scsi_setup_blk_pc_cmnd(struct scsi_cmnd *cmd)
|
||||
{
|
||||
struct request *req = cmd->request;
|
||||
|
||||
BUG_ON(sizeof(req->cmd) > sizeof(cmd->cmnd));
|
||||
BUILD_BUG_ON(sizeof(req->cmd) > sizeof(cmd->cmnd));
|
||||
memcpy(cmd->cmnd, req->cmd, sizeof(cmd->cmnd));
|
||||
cmd->cmd_len = req->cmd_len;
|
||||
if (!req->data_len)
|
||||
|
@ -192,6 +192,7 @@ static CLASS_DEVICE_ATTR(state, S_IRUGO | S_IWUSR, show_shost_state, store_shost
|
||||
shost_rd_attr(unique_id, "%u\n");
|
||||
shost_rd_attr(host_busy, "%hu\n");
|
||||
shost_rd_attr(cmd_per_lun, "%hd\n");
|
||||
shost_rd_attr(can_queue, "%hd\n");
|
||||
shost_rd_attr(sg_tablesize, "%hu\n");
|
||||
shost_rd_attr(unchecked_isa_dma, "%d\n");
|
||||
shost_rd_attr2(proc_name, hostt->proc_name, "%s\n");
|
||||
@ -200,6 +201,7 @@ static struct class_device_attribute *scsi_sysfs_shost_attrs[] = {
|
||||
&class_device_attr_unique_id,
|
||||
&class_device_attr_host_busy,
|
||||
&class_device_attr_cmd_per_lun,
|
||||
&class_device_attr_can_queue,
|
||||
&class_device_attr_sg_tablesize,
|
||||
&class_device_attr_unchecked_isa_dma,
|
||||
&class_device_attr_proc_name,
|
||||
|
@ -21,7 +21,6 @@
|
||||
* Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
|
||||
*/
|
||||
#include <linux/module.h>
|
||||
#include <linux/mempool.h>
|
||||
#include <linux/mutex.h>
|
||||
#include <net/tcp.h>
|
||||
#include <scsi/scsi.h>
|
||||
@ -149,30 +148,6 @@ static DECLARE_TRANSPORT_CLASS(iscsi_connection_class,
|
||||
static struct sock *nls;
|
||||
static DEFINE_MUTEX(rx_queue_mutex);
|
||||
|
||||
struct mempool_zone {
|
||||
mempool_t *pool;
|
||||
atomic_t allocated;
|
||||
int size;
|
||||
int hiwat;
|
||||
struct list_head freequeue;
|
||||
spinlock_t freelock;
|
||||
};
|
||||
|
||||
static struct mempool_zone *z_reply;
|
||||
|
||||
/*
|
||||
* Z_MAX_* - actual mempool size allocated at the mempool_zone_init() time
|
||||
* Z_HIWAT_* - zone's high watermark when if_error bit will be set to -ENOMEM
|
||||
* so daemon will notice OOM on NETLINK tranposrt level and will
|
||||
* be able to predict or change operational behavior
|
||||
*/
|
||||
#define Z_MAX_REPLY 8
|
||||
#define Z_HIWAT_REPLY 6
|
||||
#define Z_MAX_PDU 8
|
||||
#define Z_HIWAT_PDU 6
|
||||
#define Z_MAX_ERROR 16
|
||||
#define Z_HIWAT_ERROR 12
|
||||
|
||||
static LIST_HEAD(sesslist);
|
||||
static DEFINE_SPINLOCK(sesslock);
|
||||
static LIST_HEAD(connlist);
|
||||
@ -414,59 +389,11 @@ int iscsi_destroy_session(struct iscsi_cls_session *session)
|
||||
}
|
||||
EXPORT_SYMBOL_GPL(iscsi_destroy_session);
|
||||
|
||||
static void mempool_zone_destroy(struct mempool_zone *zp)
|
||||
{
|
||||
mempool_destroy(zp->pool);
|
||||
kfree(zp);
|
||||
}
|
||||
|
||||
static void*
|
||||
mempool_zone_alloc_skb(gfp_t gfp_mask, void *pool_data)
|
||||
{
|
||||
struct mempool_zone *zone = pool_data;
|
||||
|
||||
return alloc_skb(zone->size, gfp_mask);
|
||||
}
|
||||
|
||||
static void
|
||||
mempool_zone_free_skb(void *element, void *pool_data)
|
||||
{
|
||||
kfree_skb(element);
|
||||
}
|
||||
|
||||
static struct mempool_zone *
|
||||
mempool_zone_init(unsigned max, unsigned size, unsigned hiwat)
|
||||
{
|
||||
struct mempool_zone *zp;
|
||||
|
||||
zp = kzalloc(sizeof(*zp), GFP_KERNEL);
|
||||
if (!zp)
|
||||
return NULL;
|
||||
|
||||
zp->size = size;
|
||||
zp->hiwat = hiwat;
|
||||
INIT_LIST_HEAD(&zp->freequeue);
|
||||
spin_lock_init(&zp->freelock);
|
||||
atomic_set(&zp->allocated, 0);
|
||||
|
||||
zp->pool = mempool_create(max, mempool_zone_alloc_skb,
|
||||
mempool_zone_free_skb, zp);
|
||||
if (!zp->pool) {
|
||||
kfree(zp);
|
||||
return NULL;
|
||||
}
|
||||
|
||||
return zp;
|
||||
}
|
||||
|
||||
static void iscsi_conn_release(struct device *dev)
|
||||
{
|
||||
struct iscsi_cls_conn *conn = iscsi_dev_to_conn(dev);
|
||||
struct device *parent = conn->dev.parent;
|
||||
|
||||
mempool_zone_destroy(conn->z_pdu);
|
||||
mempool_zone_destroy(conn->z_error);
|
||||
|
||||
kfree(conn);
|
||||
put_device(parent);
|
||||
}
|
||||
@ -476,31 +403,6 @@ static int iscsi_is_conn_dev(const struct device *dev)
|
||||
return dev->release == iscsi_conn_release;
|
||||
}
|
||||
|
||||
static int iscsi_create_event_pools(struct iscsi_cls_conn *conn)
|
||||
{
|
||||
conn->z_pdu = mempool_zone_init(Z_MAX_PDU,
|
||||
NLMSG_SPACE(sizeof(struct iscsi_uevent) +
|
||||
sizeof(struct iscsi_hdr) +
|
||||
DEFAULT_MAX_RECV_DATA_SEGMENT_LENGTH),
|
||||
Z_HIWAT_PDU);
|
||||
if (!conn->z_pdu) {
|
||||
dev_printk(KERN_ERR, &conn->dev, "iscsi: can not allocate "
|
||||
"pdu zone for new conn\n");
|
||||
return -ENOMEM;
|
||||
}
|
||||
|
||||
conn->z_error = mempool_zone_init(Z_MAX_ERROR,
|
||||
NLMSG_SPACE(sizeof(struct iscsi_uevent)),
|
||||
Z_HIWAT_ERROR);
|
||||
if (!conn->z_error) {
|
||||
dev_printk(KERN_ERR, &conn->dev, "iscsi: can not allocate "
|
||||
"error zone for new conn\n");
|
||||
mempool_zone_destroy(conn->z_pdu);
|
||||
return -ENOMEM;
|
||||
}
|
||||
return 0;
|
||||
}
|
||||
|
||||
/**
|
||||
* iscsi_create_conn - create iscsi class connection
|
||||
* @session: iscsi cls session
|
||||
@ -533,12 +435,9 @@ iscsi_create_conn(struct iscsi_cls_session *session, uint32_t cid)
|
||||
conn->transport = transport;
|
||||
conn->cid = cid;
|
||||
|
||||
if (iscsi_create_event_pools(conn))
|
||||
goto free_conn;
|
||||
|
||||
/* this is released in the dev's release function */
|
||||
if (!get_device(&session->dev))
|
||||
goto free_conn_pools;
|
||||
goto free_conn;
|
||||
|
||||
snprintf(conn->dev.bus_id, BUS_ID_SIZE, "connection%d:%u",
|
||||
session->sid, cid);
|
||||
@ -555,8 +454,6 @@ iscsi_create_conn(struct iscsi_cls_session *session, uint32_t cid)
|
||||
|
||||
release_parent_ref:
|
||||
put_device(&session->dev);
|
||||
free_conn_pools:
|
||||
|
||||
free_conn:
|
||||
kfree(conn);
|
||||
return NULL;
|
||||
@ -599,81 +496,31 @@ iscsi_if_transport_lookup(struct iscsi_transport *tt)
|
||||
return NULL;
|
||||
}
|
||||
|
||||
static inline struct list_head *skb_to_lh(struct sk_buff *skb)
|
||||
{
|
||||
return (struct list_head *)&skb->cb;
|
||||
}
|
||||
|
||||
static void
|
||||
mempool_zone_complete(struct mempool_zone *zone)
|
||||
{
|
||||
unsigned long flags;
|
||||
struct list_head *lh, *n;
|
||||
|
||||
spin_lock_irqsave(&zone->freelock, flags);
|
||||
list_for_each_safe(lh, n, &zone->freequeue) {
|
||||
struct sk_buff *skb = (struct sk_buff *)((char *)lh -
|
||||
offsetof(struct sk_buff, cb));
|
||||
if (!skb_shared(skb)) {
|
||||
list_del(skb_to_lh(skb));
|
||||
mempool_free(skb, zone->pool);
|
||||
atomic_dec(&zone->allocated);
|
||||
}
|
||||
}
|
||||
spin_unlock_irqrestore(&zone->freelock, flags);
|
||||
}
|
||||
|
||||
static struct sk_buff*
|
||||
mempool_zone_get_skb(struct mempool_zone *zone)
|
||||
{
|
||||
struct sk_buff *skb;
|
||||
|
||||
skb = mempool_alloc(zone->pool, GFP_ATOMIC);
|
||||
if (skb)
|
||||
atomic_inc(&zone->allocated);
|
||||
return skb;
|
||||
}
|
||||
|
||||
static int
|
||||
iscsi_broadcast_skb(struct mempool_zone *zone, struct sk_buff *skb, gfp_t gfp)
|
||||
iscsi_broadcast_skb(struct sk_buff *skb, gfp_t gfp)
|
||||
{
|
||||
unsigned long flags;
|
||||
int rc;
|
||||
|
||||
skb_get(skb);
|
||||
rc = netlink_broadcast(nls, skb, 0, 1, gfp);
|
||||
if (rc < 0) {
|
||||
mempool_free(skb, zone->pool);
|
||||
printk(KERN_ERR "iscsi: can not broadcast skb (%d)\n", rc);
|
||||
return rc;
|
||||
}
|
||||
|
||||
spin_lock_irqsave(&zone->freelock, flags);
|
||||
INIT_LIST_HEAD(skb_to_lh(skb));
|
||||
list_add(skb_to_lh(skb), &zone->freequeue);
|
||||
spin_unlock_irqrestore(&zone->freelock, flags);
|
||||
return 0;
|
||||
}
|
||||
|
||||
static int
|
||||
iscsi_unicast_skb(struct mempool_zone *zone, struct sk_buff *skb, int pid)
|
||||
iscsi_unicast_skb(struct sk_buff *skb, int pid)
|
||||
{
|
||||
unsigned long flags;
|
||||
int rc;
|
||||
|
||||
skb_get(skb);
|
||||
rc = netlink_unicast(nls, skb, pid, MSG_DONTWAIT);
|
||||
if (rc < 0) {
|
||||
mempool_free(skb, zone->pool);
|
||||
printk(KERN_ERR "iscsi: can not unicast skb (%d)\n", rc);
|
||||
return rc;
|
||||
}
|
||||
|
||||
spin_lock_irqsave(&zone->freelock, flags);
|
||||
INIT_LIST_HEAD(skb_to_lh(skb));
|
||||
list_add(skb_to_lh(skb), &zone->freequeue);
|
||||
spin_unlock_irqrestore(&zone->freelock, flags);
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
@ -692,9 +539,7 @@ int iscsi_recv_pdu(struct iscsi_cls_conn *conn, struct iscsi_hdr *hdr,
|
||||
if (!priv)
|
||||
return -EINVAL;
|
||||
|
||||
mempool_zone_complete(conn->z_pdu);
|
||||
|
||||
skb = mempool_zone_get_skb(conn->z_pdu);
|
||||
skb = alloc_skb(len, GFP_ATOMIC);
|
||||
if (!skb) {
|
||||
iscsi_conn_error(conn, ISCSI_ERR_CONN_FAILED);
|
||||
dev_printk(KERN_ERR, &conn->dev, "iscsi: can not deliver "
|
||||
@ -707,15 +552,13 @@ int iscsi_recv_pdu(struct iscsi_cls_conn *conn, struct iscsi_hdr *hdr,
|
||||
memset(ev, 0, sizeof(*ev));
|
||||
ev->transport_handle = iscsi_handle(conn->transport);
|
||||
ev->type = ISCSI_KEVENT_RECV_PDU;
|
||||
if (atomic_read(&conn->z_pdu->allocated) >= conn->z_pdu->hiwat)
|
||||
ev->iferror = -ENOMEM;
|
||||
ev->r.recv_req.cid = conn->cid;
|
||||
ev->r.recv_req.sid = iscsi_conn_get_sid(conn);
|
||||
pdu = (char*)ev + sizeof(*ev);
|
||||
memcpy(pdu, hdr, sizeof(struct iscsi_hdr));
|
||||
memcpy(pdu + sizeof(struct iscsi_hdr), data, data_size);
|
||||
|
||||
return iscsi_unicast_skb(conn->z_pdu, skb, priv->daemon_pid);
|
||||
return iscsi_unicast_skb(skb, priv->daemon_pid);
|
||||
}
|
||||
EXPORT_SYMBOL_GPL(iscsi_recv_pdu);
|
||||
|
||||
@ -731,9 +574,7 @@ void iscsi_conn_error(struct iscsi_cls_conn *conn, enum iscsi_err error)
|
||||
if (!priv)
|
||||
return;
|
||||
|
||||
mempool_zone_complete(conn->z_error);
|
||||
|
||||
skb = mempool_zone_get_skb(conn->z_error);
|
||||
skb = alloc_skb(len, GFP_ATOMIC);
|
||||
if (!skb) {
|
||||
dev_printk(KERN_ERR, &conn->dev, "iscsi: gracefully ignored "
|
||||
"conn error (%d)\n", error);
|
||||
@ -744,13 +585,11 @@ void iscsi_conn_error(struct iscsi_cls_conn *conn, enum iscsi_err error)
|
||||
ev = NLMSG_DATA(nlh);
|
||||
ev->transport_handle = iscsi_handle(conn->transport);
|
||||
ev->type = ISCSI_KEVENT_CONN_ERROR;
|
||||
if (atomic_read(&conn->z_error->allocated) >= conn->z_error->hiwat)
|
||||
ev->iferror = -ENOMEM;
|
||||
ev->r.connerror.error = error;
|
||||
ev->r.connerror.cid = conn->cid;
|
||||
ev->r.connerror.sid = iscsi_conn_get_sid(conn);
|
||||
|
||||
iscsi_broadcast_skb(conn->z_error, skb, GFP_ATOMIC);
|
||||
iscsi_broadcast_skb(skb, GFP_ATOMIC);
|
||||
|
||||
dev_printk(KERN_INFO, &conn->dev, "iscsi: detected conn error (%d)\n",
|
||||
error);
|
||||
@ -767,9 +606,7 @@ iscsi_if_send_reply(int pid, int seq, int type, int done, int multi,
|
||||
int flags = multi ? NLM_F_MULTI : 0;
|
||||
int t = done ? NLMSG_DONE : type;
|
||||
|
||||
mempool_zone_complete(z_reply);
|
||||
|
||||
skb = mempool_zone_get_skb(z_reply);
|
||||
skb = alloc_skb(len, GFP_ATOMIC);
|
||||
/*
|
||||
* FIXME:
|
||||
* user is supposed to react on iferror == -ENOMEM;
|
||||
@ -780,7 +617,7 @@ iscsi_if_send_reply(int pid, int seq, int type, int done, int multi,
|
||||
nlh = __nlmsg_put(skb, pid, seq, t, (len - sizeof(*nlh)), 0);
|
||||
nlh->nlmsg_flags = flags;
|
||||
memcpy(NLMSG_DATA(nlh), payload, size);
|
||||
return iscsi_unicast_skb(z_reply, skb, pid);
|
||||
return iscsi_unicast_skb(skb, pid);
|
||||
}
|
||||
|
||||
static int
|
||||
@ -810,9 +647,7 @@ iscsi_if_get_stats(struct iscsi_transport *transport, struct nlmsghdr *nlh)
|
||||
do {
|
||||
int actual_size;
|
||||
|
||||
mempool_zone_complete(conn->z_pdu);
|
||||
|
||||
skbstat = mempool_zone_get_skb(conn->z_pdu);
|
||||
skbstat = alloc_skb(len, GFP_ATOMIC);
|
||||
if (!skbstat) {
|
||||
dev_printk(KERN_ERR, &conn->dev, "iscsi: can not "
|
||||
"deliver stats: OOM\n");
|
||||
@ -825,8 +660,6 @@ iscsi_if_get_stats(struct iscsi_transport *transport, struct nlmsghdr *nlh)
|
||||
memset(evstat, 0, sizeof(*evstat));
|
||||
evstat->transport_handle = iscsi_handle(conn->transport);
|
||||
evstat->type = nlh->nlmsg_type;
|
||||
if (atomic_read(&conn->z_pdu->allocated) >= conn->z_pdu->hiwat)
|
||||
evstat->iferror = -ENOMEM;
|
||||
evstat->u.get_stats.cid =
|
||||
ev->u.get_stats.cid;
|
||||
evstat->u.get_stats.sid =
|
||||
@ -845,7 +678,7 @@ iscsi_if_get_stats(struct iscsi_transport *transport, struct nlmsghdr *nlh)
|
||||
skb_trim(skbstat, NLMSG_ALIGN(actual_size));
|
||||
nlhstat->nlmsg_len = actual_size;
|
||||
|
||||
err = iscsi_unicast_skb(conn->z_pdu, skbstat, priv->daemon_pid);
|
||||
err = iscsi_unicast_skb(skbstat, priv->daemon_pid);
|
||||
} while (err < 0 && err != -ECONNREFUSED);
|
||||
|
||||
return err;
|
||||
@ -876,9 +709,7 @@ int iscsi_if_destroy_session_done(struct iscsi_cls_conn *conn)
|
||||
session = iscsi_dev_to_session(conn->dev.parent);
|
||||
shost = iscsi_session_to_shost(session);
|
||||
|
||||
mempool_zone_complete(conn->z_pdu);
|
||||
|
||||
skb = mempool_zone_get_skb(conn->z_pdu);
|
||||
skb = alloc_skb(len, GFP_KERNEL);
|
||||
if (!skb) {
|
||||
dev_printk(KERN_ERR, &conn->dev, "Cannot notify userspace of "
|
||||
"session creation event\n");
|
||||
@ -896,7 +727,7 @@ int iscsi_if_destroy_session_done(struct iscsi_cls_conn *conn)
|
||||
* this will occur if the daemon is not up, so we just warn
|
||||
* the user and when the daemon is restarted it will handle it
|
||||
*/
|
||||
rc = iscsi_broadcast_skb(conn->z_pdu, skb, GFP_KERNEL);
|
||||
rc = iscsi_broadcast_skb(skb, GFP_KERNEL);
|
||||
if (rc < 0)
|
||||
dev_printk(KERN_ERR, &conn->dev, "Cannot notify userspace of "
|
||||
"session destruction event. Check iscsi daemon\n");
|
||||
@ -939,9 +770,7 @@ int iscsi_if_create_session_done(struct iscsi_cls_conn *conn)
|
||||
session = iscsi_dev_to_session(conn->dev.parent);
|
||||
shost = iscsi_session_to_shost(session);
|
||||
|
||||
mempool_zone_complete(conn->z_pdu);
|
||||
|
||||
skb = mempool_zone_get_skb(conn->z_pdu);
|
||||
skb = alloc_skb(len, GFP_KERNEL);
|
||||
if (!skb) {
|
||||
dev_printk(KERN_ERR, &conn->dev, "Cannot notify userspace of "
|
||||
"session creation event\n");
|
||||
@ -959,7 +788,7 @@ int iscsi_if_create_session_done(struct iscsi_cls_conn *conn)
|
||||
* this will occur if the daemon is not up, so we just warn
|
||||
* the user and when the daemon is restarted it will handle it
|
||||
*/
|
||||
rc = iscsi_broadcast_skb(conn->z_pdu, skb, GFP_KERNEL);
|
||||
rc = iscsi_broadcast_skb(skb, GFP_KERNEL);
|
||||
if (rc < 0)
|
||||
dev_printk(KERN_ERR, &conn->dev, "Cannot notify userspace of "
|
||||
"session creation event. Check iscsi daemon\n");
|
||||
@ -1278,9 +1107,6 @@ iscsi_if_rx(struct sock *sk, int len)
|
||||
err = iscsi_if_send_reply(
|
||||
NETLINK_CREDS(skb)->pid, nlh->nlmsg_seq,
|
||||
nlh->nlmsg_type, 0, 0, ev, sizeof(*ev));
|
||||
if (atomic_read(&z_reply->allocated) >=
|
||||
z_reply->hiwat)
|
||||
ev->iferror = -ENOMEM;
|
||||
} while (err < 0 && err != -ECONNREFUSED);
|
||||
skb_pull(skb, rlen);
|
||||
}
|
||||
@ -1584,32 +1410,6 @@ int iscsi_unregister_transport(struct iscsi_transport *tt)
|
||||
}
|
||||
EXPORT_SYMBOL_GPL(iscsi_unregister_transport);
|
||||
|
||||
static int
|
||||
iscsi_rcv_nl_event(struct notifier_block *this, unsigned long event, void *ptr)
|
||||
{
|
||||
struct netlink_notify *n = ptr;
|
||||
|
||||
if (event == NETLINK_URELEASE &&
|
||||
n->protocol == NETLINK_ISCSI && n->pid) {
|
||||
struct iscsi_cls_conn *conn;
|
||||
unsigned long flags;
|
||||
|
||||
mempool_zone_complete(z_reply);
|
||||
spin_lock_irqsave(&connlock, flags);
|
||||
list_for_each_entry(conn, &connlist, conn_list) {
|
||||
mempool_zone_complete(conn->z_error);
|
||||
mempool_zone_complete(conn->z_pdu);
|
||||
}
|
||||
spin_unlock_irqrestore(&connlock, flags);
|
||||
}
|
||||
|
||||
return NOTIFY_DONE;
|
||||
}
|
||||
|
||||
static struct notifier_block iscsi_nl_notifier = {
|
||||
.notifier_call = iscsi_rcv_nl_event,
|
||||
};
|
||||
|
||||
static __init int iscsi_transport_init(void)
|
||||
{
|
||||
int err;
|
||||
@ -1633,25 +1433,15 @@ static __init int iscsi_transport_init(void)
|
||||
if (err)
|
||||
goto unregister_conn_class;
|
||||
|
||||
err = netlink_register_notifier(&iscsi_nl_notifier);
|
||||
if (err)
|
||||
goto unregister_session_class;
|
||||
|
||||
nls = netlink_kernel_create(NETLINK_ISCSI, 1, iscsi_if_rx,
|
||||
THIS_MODULE);
|
||||
if (!nls) {
|
||||
err = -ENOBUFS;
|
||||
goto unregister_notifier;
|
||||
goto unregister_session_class;
|
||||
}
|
||||
|
||||
z_reply = mempool_zone_init(Z_MAX_REPLY,
|
||||
NLMSG_SPACE(sizeof(struct iscsi_uevent)), Z_HIWAT_REPLY);
|
||||
if (z_reply)
|
||||
return 0;
|
||||
return 0;
|
||||
|
||||
sock_release(nls->sk_socket);
|
||||
unregister_notifier:
|
||||
netlink_unregister_notifier(&iscsi_nl_notifier);
|
||||
unregister_session_class:
|
||||
transport_class_unregister(&iscsi_session_class);
|
||||
unregister_conn_class:
|
||||
@ -1665,9 +1455,7 @@ unregister_transport_class:
|
||||
|
||||
static void __exit iscsi_transport_exit(void)
|
||||
{
|
||||
mempool_zone_destroy(z_reply);
|
||||
sock_release(nls->sk_socket);
|
||||
netlink_unregister_notifier(&iscsi_nl_notifier);
|
||||
transport_class_unregister(&iscsi_connection_class);
|
||||
transport_class_unregister(&iscsi_session_class);
|
||||
transport_class_unregister(&iscsi_host_class);
|
||||
|
@ -1177,7 +1177,10 @@ static int st_open(struct inode *inode, struct file *filp)
|
||||
goto err_out;
|
||||
if ((filp->f_flags & O_NONBLOCK) == 0 &&
|
||||
retval != CHKRES_READY) {
|
||||
retval = (-EIO);
|
||||
if (STp->ready == NO_TAPE)
|
||||
retval = (-ENOMEDIUM);
|
||||
else
|
||||
retval = (-EIO);
|
||||
goto err_out;
|
||||
}
|
||||
return 0;
|
||||
|
@ -266,8 +266,8 @@ static struct scsi_host_template *the_template = NULL;
|
||||
(struct NCR5380_hostdata *)(in)->hostdata
|
||||
#define HOSTDATA(in) ((struct NCR5380_hostdata *)(in)->hostdata)
|
||||
|
||||
#define NEXT(cmd) ((Scsi_Cmnd *)((cmd)->host_scribble))
|
||||
#define NEXTADDR(cmd) ((Scsi_Cmnd **)&((cmd)->host_scribble))
|
||||
#define NEXT(cmd) ((struct scsi_cmnd *)((cmd)->host_scribble))
|
||||
#define NEXTADDR(cmd) ((struct scsi_cmnd **)&((cmd)->host_scribble))
|
||||
|
||||
#define HOSTNO instance->host_no
|
||||
#define H_NO(cmd) (cmd)->device->host->host_no
|
||||
@ -360,7 +360,7 @@ static void __init init_tags( void )
|
||||
* conditions.
|
||||
*/
|
||||
|
||||
static int is_lun_busy( Scsi_Cmnd *cmd, int should_be_tagged )
|
||||
static int is_lun_busy(struct scsi_cmnd *cmd, int should_be_tagged)
|
||||
{
|
||||
SETUP_HOSTDATA(cmd->device->host);
|
||||
|
||||
@ -384,7 +384,7 @@ static int is_lun_busy( Scsi_Cmnd *cmd, int should_be_tagged )
|
||||
* untagged.
|
||||
*/
|
||||
|
||||
static void cmd_get_tag( Scsi_Cmnd *cmd, int should_be_tagged )
|
||||
static void cmd_get_tag(struct scsi_cmnd *cmd, int should_be_tagged)
|
||||
{
|
||||
SETUP_HOSTDATA(cmd->device->host);
|
||||
|
||||
@ -416,7 +416,7 @@ static void cmd_get_tag( Scsi_Cmnd *cmd, int should_be_tagged )
|
||||
* unlock the LUN.
|
||||
*/
|
||||
|
||||
static void cmd_free_tag( Scsi_Cmnd *cmd )
|
||||
static void cmd_free_tag(struct scsi_cmnd *cmd)
|
||||
{
|
||||
SETUP_HOSTDATA(cmd->device->host);
|
||||
|
||||
@ -460,18 +460,18 @@ static void free_all_tags( void )
|
||||
|
||||
|
||||
/*
|
||||
* Function: void merge_contiguous_buffers( Scsi_Cmnd *cmd )
|
||||
* Function: void merge_contiguous_buffers(struct scsi_cmnd *cmd)
|
||||
*
|
||||
* Purpose: Try to merge several scatter-gather requests into one DMA
|
||||
* transfer. This is possible if the scatter buffers lie on
|
||||
* physical contiguous addresses.
|
||||
*
|
||||
* Parameters: Scsi_Cmnd *cmd
|
||||
* Parameters: struct scsi_cmnd *cmd
|
||||
* The command to work on. The first scatter buffer's data are
|
||||
* assumed to be already transfered into ptr/this_residual.
|
||||
*/
|
||||
|
||||
static void merge_contiguous_buffers( Scsi_Cmnd *cmd )
|
||||
static void merge_contiguous_buffers(struct scsi_cmnd *cmd)
|
||||
{
|
||||
unsigned long endaddr;
|
||||
#if (NDEBUG & NDEBUG_MERGING)
|
||||
@ -501,15 +501,15 @@ static void merge_contiguous_buffers( Scsi_Cmnd *cmd )
|
||||
}
|
||||
|
||||
/*
|
||||
* Function : void initialize_SCp(Scsi_Cmnd *cmd)
|
||||
* Function : void initialize_SCp(struct scsi_cmnd *cmd)
|
||||
*
|
||||
* Purpose : initialize the saved data pointers for cmd to point to the
|
||||
* start of the buffer.
|
||||
*
|
||||
* Inputs : cmd - Scsi_Cmnd structure to have pointers reset.
|
||||
* Inputs : cmd - struct scsi_cmnd structure to have pointers reset.
|
||||
*/
|
||||
|
||||
static __inline__ void initialize_SCp(Scsi_Cmnd *cmd)
|
||||
static __inline__ void initialize_SCp(struct scsi_cmnd *cmd)
|
||||
{
|
||||
/*
|
||||
* Initialize the Scsi Pointer field so that all of the commands in the
|
||||
@ -753,14 +753,15 @@ static void NCR5380_print_status (struct Scsi_Host *instance)
|
||||
do { if (pos + strlen(fmt) + 20 /* slop */ < buffer + length) \
|
||||
pos += sprintf(pos, fmt , ## args); } while(0)
|
||||
static
|
||||
char *lprint_Scsi_Cmnd (Scsi_Cmnd *cmd, char *pos, char *buffer, int length);
|
||||
char *lprint_Scsi_Cmnd(struct scsi_cmnd *cmd, char *pos, char *buffer,
|
||||
int length);
|
||||
|
||||
static int NCR5380_proc_info (struct Scsi_Host *instance, char *buffer, char **start,
|
||||
off_t offset, int length, int inout)
|
||||
static int NCR5380_proc_info(struct Scsi_Host *instance, char *buffer,
|
||||
char **start, off_t offset, int length, int inout)
|
||||
{
|
||||
char *pos = buffer;
|
||||
struct NCR5380_hostdata *hostdata;
|
||||
Scsi_Cmnd *ptr;
|
||||
struct scsi_cmnd *ptr;
|
||||
unsigned long flags;
|
||||
off_t begin = 0;
|
||||
#define check_offset() \
|
||||
@ -784,18 +785,19 @@ static int NCR5380_proc_info (struct Scsi_Host *instance, char *buffer, char **s
|
||||
if (!hostdata->connected)
|
||||
SPRINTF("scsi%d: no currently connected command\n", HOSTNO);
|
||||
else
|
||||
pos = lprint_Scsi_Cmnd ((Scsi_Cmnd *) hostdata->connected,
|
||||
pos = lprint_Scsi_Cmnd ((struct scsi_cmnd *) hostdata->connected,
|
||||
pos, buffer, length);
|
||||
SPRINTF("scsi%d: issue_queue\n", HOSTNO);
|
||||
check_offset();
|
||||
for (ptr = (Scsi_Cmnd *) hostdata->issue_queue; ptr; ptr = NEXT(ptr)) {
|
||||
for (ptr = (struct scsi_cmnd *) hostdata->issue_queue; ptr; ptr = NEXT(ptr))
|
||||
{
|
||||
pos = lprint_Scsi_Cmnd (ptr, pos, buffer, length);
|
||||
check_offset();
|
||||
}
|
||||
|
||||
SPRINTF("scsi%d: disconnected_queue\n", HOSTNO);
|
||||
check_offset();
|
||||
for (ptr = (Scsi_Cmnd *) hostdata->disconnected_queue; ptr;
|
||||
for (ptr = (struct scsi_cmnd *) hostdata->disconnected_queue; ptr;
|
||||
ptr = NEXT(ptr)) {
|
||||
pos = lprint_Scsi_Cmnd (ptr, pos, buffer, length);
|
||||
check_offset();
|
||||
@ -810,8 +812,8 @@ static int NCR5380_proc_info (struct Scsi_Host *instance, char *buffer, char **s
|
||||
return length;
|
||||
}
|
||||
|
||||
static char *
|
||||
lprint_Scsi_Cmnd (Scsi_Cmnd *cmd, char *pos, char *buffer, int length)
|
||||
static char *lprint_Scsi_Cmnd(struct scsi_cmnd *cmd, char *pos, char *buffer,
|
||||
int length)
|
||||
{
|
||||
int i, s;
|
||||
unsigned char *command;
|
||||
@ -888,8 +890,8 @@ static int NCR5380_init (struct Scsi_Host *instance, int flags)
|
||||
}
|
||||
|
||||
/*
|
||||
* Function : int NCR5380_queue_command (Scsi_Cmnd *cmd,
|
||||
* void (*done)(Scsi_Cmnd *))
|
||||
* Function : int NCR5380_queue_command (struct scsi_cmnd *cmd,
|
||||
* void (*done)(struct scsi_cmnd *))
|
||||
*
|
||||
* Purpose : enqueues a SCSI command
|
||||
*
|
||||
@ -906,10 +908,11 @@ static int NCR5380_init (struct Scsi_Host *instance, int flags)
|
||||
*/
|
||||
|
||||
/* Only make static if a wrapper function is used */
|
||||
static int NCR5380_queue_command (Scsi_Cmnd *cmd, void (*done)(Scsi_Cmnd *))
|
||||
static int NCR5380_queue_command(struct scsi_cmnd *cmd,
|
||||
void (*done)(struct scsi_cmnd *))
|
||||
{
|
||||
SETUP_HOSTDATA(cmd->device->host);
|
||||
Scsi_Cmnd *tmp;
|
||||
struct scsi_cmnd *tmp;
|
||||
unsigned long flags;
|
||||
|
||||
#if (NDEBUG & NDEBUG_NO_WRITE)
|
||||
@ -990,7 +993,7 @@ static int NCR5380_queue_command (Scsi_Cmnd *cmd, void (*done)(Scsi_Cmnd *))
|
||||
NEXT(cmd) = hostdata->issue_queue;
|
||||
hostdata->issue_queue = cmd;
|
||||
} else {
|
||||
for (tmp = (Scsi_Cmnd *)hostdata->issue_queue;
|
||||
for (tmp = (struct scsi_cmnd *)hostdata->issue_queue;
|
||||
NEXT(tmp); tmp = NEXT(tmp))
|
||||
;
|
||||
LIST(cmd, tmp);
|
||||
@ -1030,7 +1033,7 @@ static int NCR5380_queue_command (Scsi_Cmnd *cmd, void (*done)(Scsi_Cmnd *))
|
||||
|
||||
static void NCR5380_main (void *bl)
|
||||
{
|
||||
Scsi_Cmnd *tmp, *prev;
|
||||
struct scsi_cmnd *tmp, *prev;
|
||||
struct Scsi_Host *instance = first_instance;
|
||||
struct NCR5380_hostdata *hostdata = HOSTDATA(instance);
|
||||
int done;
|
||||
@ -1073,12 +1076,12 @@ static void NCR5380_main (void *bl)
|
||||
* for a target that's not busy.
|
||||
*/
|
||||
#if (NDEBUG & NDEBUG_LISTS)
|
||||
for (tmp = (Scsi_Cmnd *) hostdata->issue_queue, prev = NULL;
|
||||
for (tmp = (struct scsi_cmnd *) hostdata->issue_queue, prev = NULL;
|
||||
tmp && (tmp != prev); prev = tmp, tmp = NEXT(tmp))
|
||||
;
|
||||
if ((tmp == prev) && tmp) printk(" LOOP\n");/* else printk("\n");*/
|
||||
#endif
|
||||
for (tmp = (Scsi_Cmnd *) hostdata->issue_queue,
|
||||
for (tmp = (struct scsi_cmnd *) hostdata->issue_queue,
|
||||
prev = NULL; tmp; prev = tmp, tmp = NEXT(tmp) ) {
|
||||
|
||||
#if (NDEBUG & NDEBUG_LISTS)
|
||||
@ -1339,7 +1342,8 @@ static irqreturn_t NCR5380_intr (int irq, void *dev_id)
|
||||
}
|
||||
|
||||
#ifdef NCR5380_STATS
|
||||
static void collect_stats(struct NCR5380_hostdata* hostdata, Scsi_Cmnd* cmd)
|
||||
static void collect_stats(struct NCR5380_hostdata *hostdata,
|
||||
struct scsi_cmnd *cmd)
|
||||
{
|
||||
# ifdef NCR5380_STAT_LIMIT
|
||||
if (cmd->request_bufflen > NCR5380_STAT_LIMIT)
|
||||
@ -1365,8 +1369,8 @@ static void collect_stats(struct NCR5380_hostdata* hostdata, Scsi_Cmnd* cmd)
|
||||
#endif
|
||||
|
||||
/*
|
||||
* Function : int NCR5380_select (struct Scsi_Host *instance, Scsi_Cmnd *cmd,
|
||||
* int tag);
|
||||
* Function : int NCR5380_select(struct Scsi_Host *instance,
|
||||
* struct scsi_cmnd *cmd, int tag);
|
||||
*
|
||||
* Purpose : establishes I_T_L or I_T_L_Q nexus for new or existing command,
|
||||
* including ARBITRATION, SELECTION, and initial message out for
|
||||
@ -1395,7 +1399,8 @@ static void collect_stats(struct NCR5380_hostdata* hostdata, Scsi_Cmnd* cmd)
|
||||
* cmd->result host byte set to DID_BAD_TARGET.
|
||||
*/
|
||||
|
||||
static int NCR5380_select (struct Scsi_Host *instance, Scsi_Cmnd *cmd, int tag)
|
||||
static int NCR5380_select(struct Scsi_Host *instance, struct scsi_cmnd *cmd,
|
||||
int tag)
|
||||
{
|
||||
SETUP_HOSTDATA(instance);
|
||||
unsigned char tmp[3], phase;
|
||||
@ -1985,7 +1990,7 @@ static void NCR5380_information_transfer (struct Scsi_Host *instance)
|
||||
#endif
|
||||
unsigned char *data;
|
||||
unsigned char phase, tmp, extended_msg[10], old_phase=0xff;
|
||||
Scsi_Cmnd *cmd = (Scsi_Cmnd *) hostdata->connected;
|
||||
struct scsi_cmnd *cmd = (struct scsi_cmnd *) hostdata->connected;
|
||||
|
||||
#ifdef SUN3_SCSI_VME
|
||||
dregs->csr |= CSR_INTR;
|
||||
@ -2272,7 +2277,7 @@ static void NCR5380_information_transfer (struct Scsi_Host *instance)
|
||||
local_irq_save(flags);
|
||||
LIST(cmd,hostdata->issue_queue);
|
||||
NEXT(cmd) = hostdata->issue_queue;
|
||||
hostdata->issue_queue = (Scsi_Cmnd *) cmd;
|
||||
hostdata->issue_queue = (struct scsi_cmnd *) cmd;
|
||||
local_irq_restore(flags);
|
||||
QU_PRINTK("scsi%d: REQUEST SENSE added to head of "
|
||||
"issue queue\n", H_NO(cmd));
|
||||
@ -2502,7 +2507,7 @@ static void NCR5380_information_transfer (struct Scsi_Host *instance)
|
||||
* Function : void NCR5380_reselect (struct Scsi_Host *instance)
|
||||
*
|
||||
* Purpose : does reselection, initializing the instance->connected
|
||||
* field to point to the Scsi_Cmnd for which the I_T_L or I_T_L_Q
|
||||
* field to point to the struct scsi_cmnd for which the I_T_L or I_T_L_Q
|
||||
* nexus has been reestablished,
|
||||
*
|
||||
* Inputs : instance - this instance of the NCR5380.
|
||||
@ -2521,7 +2526,7 @@ static void NCR5380_reselect (struct Scsi_Host *instance)
|
||||
unsigned char tag;
|
||||
#endif
|
||||
unsigned char msg[3];
|
||||
Scsi_Cmnd *tmp = NULL, *prev;
|
||||
struct scsi_cmnd *tmp = NULL, *prev;
|
||||
/* unsigned long flags; */
|
||||
|
||||
/*
|
||||
@ -2577,7 +2582,7 @@ static void NCR5380_reselect (struct Scsi_Host *instance)
|
||||
* just reestablished, and remove it from the disconnected queue.
|
||||
*/
|
||||
|
||||
for (tmp = (Scsi_Cmnd *) hostdata->disconnected_queue, prev = NULL;
|
||||
for (tmp = (struct scsi_cmnd *) hostdata->disconnected_queue, prev = NULL;
|
||||
tmp; prev = tmp, tmp = NEXT(tmp) ) {
|
||||
if ((target_mask == (1 << tmp->device->id)) && (lun == tmp->device->lun)
|
||||
#ifdef SUPPORT_TAGS
|
||||
@ -2668,11 +2673,11 @@ static void NCR5380_reselect (struct Scsi_Host *instance)
|
||||
|
||||
|
||||
/*
|
||||
* Function : int NCR5380_abort (Scsi_Cmnd *cmd)
|
||||
* Function : int NCR5380_abort(struct scsi_cmnd *cmd)
|
||||
*
|
||||
* Purpose : abort a command
|
||||
*
|
||||
* Inputs : cmd - the Scsi_Cmnd to abort, code - code to set the
|
||||
* Inputs : cmd - the struct scsi_cmnd to abort, code - code to set the
|
||||
* host byte of the result field to, if zero DID_ABORTED is
|
||||
* used.
|
||||
*
|
||||
@ -2684,11 +2689,11 @@ static void NCR5380_reselect (struct Scsi_Host *instance)
|
||||
* called where the loop started in NCR5380_main().
|
||||
*/
|
||||
|
||||
static int NCR5380_abort (Scsi_Cmnd *cmd)
|
||||
static int NCR5380_abort(struct scsi_cmnd *cmd)
|
||||
{
|
||||
struct Scsi_Host *instance = cmd->device->host;
|
||||
SETUP_HOSTDATA(instance);
|
||||
Scsi_Cmnd *tmp, **prev;
|
||||
struct scsi_cmnd *tmp, **prev;
|
||||
unsigned long flags;
|
||||
|
||||
printk(KERN_NOTICE "scsi%d: aborting command\n", HOSTNO);
|
||||
@ -2753,9 +2758,9 @@ static int NCR5380_abort (Scsi_Cmnd *cmd)
|
||||
* Case 2 : If the command hasn't been issued yet, we simply remove it
|
||||
* from the issue queue.
|
||||
*/
|
||||
for (prev = (Scsi_Cmnd **) &(hostdata->issue_queue),
|
||||
tmp = (Scsi_Cmnd *) hostdata->issue_queue;
|
||||
tmp; prev = NEXTADDR(tmp), tmp = NEXT(tmp) )
|
||||
for (prev = (struct scsi_cmnd **) &(hostdata->issue_queue),
|
||||
tmp = (struct scsi_cmnd *) hostdata->issue_queue;
|
||||
tmp; prev = NEXTADDR(tmp), tmp = NEXT(tmp))
|
||||
if (cmd == tmp) {
|
||||
REMOVE(5, *prev, tmp, NEXT(tmp));
|
||||
(*prev) = NEXT(tmp);
|
||||
@ -2812,7 +2817,7 @@ static int NCR5380_abort (Scsi_Cmnd *cmd)
|
||||
* it from the disconnected queue.
|
||||
*/
|
||||
|
||||
for (tmp = (Scsi_Cmnd *) hostdata->disconnected_queue; tmp;
|
||||
for (tmp = (struct scsi_cmnd *) hostdata->disconnected_queue; tmp;
|
||||
tmp = NEXT(tmp))
|
||||
if (cmd == tmp) {
|
||||
local_irq_restore(flags);
|
||||
@ -2826,8 +2831,8 @@ static int NCR5380_abort (Scsi_Cmnd *cmd)
|
||||
do_abort (instance);
|
||||
|
||||
local_irq_save(flags);
|
||||
for (prev = (Scsi_Cmnd **) &(hostdata->disconnected_queue),
|
||||
tmp = (Scsi_Cmnd *) hostdata->disconnected_queue;
|
||||
for (prev = (struct scsi_cmnd **) &(hostdata->disconnected_queue),
|
||||
tmp = (struct scsi_cmnd *) hostdata->disconnected_queue;
|
||||
tmp; prev = NEXTADDR(tmp), tmp = NEXT(tmp) )
|
||||
if (cmd == tmp) {
|
||||
REMOVE(5, *prev, tmp, NEXT(tmp));
|
||||
@ -2868,7 +2873,7 @@ static int NCR5380_abort (Scsi_Cmnd *cmd)
|
||||
|
||||
|
||||
/*
|
||||
* Function : int NCR5380_bus_reset (Scsi_Cmnd *cmd)
|
||||
* Function : int NCR5380_bus_reset(struct scsi_cmnd *cmd)
|
||||
*
|
||||
* Purpose : reset the SCSI bus.
|
||||
*
|
||||
@ -2876,13 +2881,13 @@ static int NCR5380_abort (Scsi_Cmnd *cmd)
|
||||
*
|
||||
*/
|
||||
|
||||
static int NCR5380_bus_reset( Scsi_Cmnd *cmd)
|
||||
static int NCR5380_bus_reset(struct scsi_cmnd *cmd)
|
||||
{
|
||||
SETUP_HOSTDATA(cmd->device->host);
|
||||
int i;
|
||||
unsigned long flags;
|
||||
#if 1
|
||||
Scsi_Cmnd *connected, *disconnected_queue;
|
||||
struct scsi_cmnd *connected, *disconnected_queue;
|
||||
#endif
|
||||
|
||||
|
||||
@ -2914,9 +2919,9 @@ static int NCR5380_bus_reset( Scsi_Cmnd *cmd)
|
||||
* remembered in local variables first.
|
||||
*/
|
||||
local_irq_save(flags);
|
||||
connected = (Scsi_Cmnd *)hostdata->connected;
|
||||
connected = (struct scsi_cmnd *)hostdata->connected;
|
||||
hostdata->connected = NULL;
|
||||
disconnected_queue = (Scsi_Cmnd *)hostdata->disconnected_queue;
|
||||
disconnected_queue = (struct scsi_cmnd *)hostdata->disconnected_queue;
|
||||
hostdata->disconnected_queue = NULL;
|
||||
#ifdef SUPPORT_TAGS
|
||||
free_all_tags();
|
||||
|
@ -119,7 +119,7 @@ module_param(setup_use_tagged_queuing, int, 0);
|
||||
static int setup_hostid = -1;
|
||||
module_param(setup_hostid, int, 0);
|
||||
|
||||
static Scsi_Cmnd *sun3_dma_setup_done = NULL;
|
||||
static struct scsi_cmnd *sun3_dma_setup_done = NULL;
|
||||
|
||||
#define AFTER_RESET_DELAY (HZ/2)
|
||||
|
||||
@ -521,8 +521,9 @@ static inline unsigned long sun3scsi_dma_residual(struct Scsi_Host *instance)
|
||||
return last_residual;
|
||||
}
|
||||
|
||||
static inline unsigned long sun3scsi_dma_xfer_len(unsigned long wanted, Scsi_Cmnd *cmd,
|
||||
int write_flag)
|
||||
static inline unsigned long sun3scsi_dma_xfer_len(unsigned long wanted,
|
||||
struct scsi_cmnd *cmd,
|
||||
int write_flag)
|
||||
{
|
||||
if(blk_fs_request(cmd->request))
|
||||
return wanted;
|
||||
|
@ -47,11 +47,12 @@
|
||||
|
||||
#define IOBASE_SUN3_VMESCSI 0xff200000
|
||||
|
||||
static int sun3scsi_abort (Scsi_Cmnd *);
|
||||
static int sun3scsi_abort(struct scsi_cmnd *);
|
||||
static int sun3scsi_detect (struct scsi_host_template *);
|
||||
static const char *sun3scsi_info (struct Scsi_Host *);
|
||||
static int sun3scsi_bus_reset(Scsi_Cmnd *);
|
||||
static int sun3scsi_queue_command (Scsi_Cmnd *, void (*done)(Scsi_Cmnd *));
|
||||
static int sun3scsi_bus_reset(struct scsi_cmnd *);
|
||||
static int sun3scsi_queue_command(struct scsi_cmnd *,
|
||||
void (*done)(struct scsi_cmnd *));
|
||||
static int sun3scsi_release (struct Scsi_Host *);
|
||||
|
||||
#ifndef CMD_PER_LUN
|
||||
|
@ -84,7 +84,7 @@ module_param(setup_use_tagged_queuing, int, 0);
|
||||
static int setup_hostid = -1;
|
||||
module_param(setup_hostid, int, 0);
|
||||
|
||||
static Scsi_Cmnd *sun3_dma_setup_done = NULL;
|
||||
static struct scsi_cmnd *sun3_dma_setup_done = NULL;
|
||||
|
||||
#define AFTER_RESET_DELAY (HZ/2)
|
||||
|
||||
@ -455,8 +455,9 @@ static inline unsigned long sun3scsi_dma_residual(struct Scsi_Host *instance)
|
||||
return last_residual;
|
||||
}
|
||||
|
||||
static inline unsigned long sun3scsi_dma_xfer_len(unsigned long wanted, Scsi_Cmnd *cmd,
|
||||
int write_flag)
|
||||
static inline unsigned long sun3scsi_dma_xfer_len(unsigned long wanted,
|
||||
struct scsi_cmnd *cmd,
|
||||
int write_flag)
|
||||
{
|
||||
if(blk_fs_request(cmd->request))
|
||||
return wanted;
|
||||
|
@ -2304,6 +2304,7 @@ static struct scsi_host_template driver_template = {
|
||||
.sg_tablesize = SG_ALL,
|
||||
.cmd_per_lun = 1,
|
||||
.use_clustering = ENABLE_CLUSTERING,
|
||||
.max_sectors = 0x4000, /* 8MiB = 16 * 1024 * 512 */
|
||||
};
|
||||
|
||||
/***********************************************************************
|
||||
|
@ -136,7 +136,6 @@ struct iscsi_conn {
|
||||
|
||||
/* control data */
|
||||
int id; /* CID */
|
||||
struct list_head item; /* maintains list of conns */
|
||||
int c_stage; /* connection state */
|
||||
/*
|
||||
* Preallocated buffer for pdus that have data but do not
|
||||
@ -235,10 +234,8 @@ struct iscsi_session {
|
||||
* - mgmtpool, *
|
||||
* - r2tpool */
|
||||
int state; /* session state */
|
||||
struct list_head item;
|
||||
int age; /* counts session re-opens */
|
||||
|
||||
struct list_head connections; /* list of connections */
|
||||
int cmds_max; /* size of cmds array */
|
||||
struct iscsi_cmd_task **cmds; /* Original Cmds arr */
|
||||
struct iscsi_queue cmdpool; /* PDU's pool */
|
||||
|
@ -97,6 +97,7 @@ extern const unsigned char scsi_command_size[8];
|
||||
#define PERSISTENT_RESERVE_IN 0x5e
|
||||
#define PERSISTENT_RESERVE_OUT 0x5f
|
||||
#define REPORT_LUNS 0xa0
|
||||
#define MAINTENANCE_IN 0xa3
|
||||
#define MOVE_MEDIUM 0xa5
|
||||
#define EXCHANGE_MEDIUM 0xa6
|
||||
#define READ_12 0xa8
|
||||
@ -114,6 +115,8 @@ extern const unsigned char scsi_command_size[8];
|
||||
#define SERVICE_ACTION_IN 0x9e
|
||||
/* values for service action in */
|
||||
#define SAI_READ_CAPACITY_16 0x10
|
||||
/* values for maintenance in */
|
||||
#define MI_REPORT_TARGET_PGS 0x0a
|
||||
|
||||
/* Values for T10/04-262r7 */
|
||||
#define ATA_16 0x85 /* 16-byte pass-thru */
|
||||
@ -430,7 +433,7 @@ struct scsi_lun {
|
||||
#define SCSI_IOCTL_GET_PCI 0x5387
|
||||
|
||||
/* Pull a u32 out of a SCSI message (using BE SCSI conventions) */
|
||||
static inline u32 scsi_to_u32(u8 *ptr)
|
||||
static inline __u32 scsi_to_u32(__u8 *ptr)
|
||||
{
|
||||
return (ptr[0]<<24) + (ptr[1]<<16) + (ptr[2]<<8) + ptr[3];
|
||||
}
|
||||
|
@ -29,7 +29,6 @@
|
||||
struct scsi_transport_template;
|
||||
struct iscsi_transport;
|
||||
struct Scsi_Host;
|
||||
struct mempool_zone;
|
||||
struct iscsi_cls_conn;
|
||||
struct iscsi_conn;
|
||||
struct iscsi_cmd_task;
|
||||
@ -157,9 +156,6 @@ struct iscsi_cls_conn {
|
||||
|
||||
int active; /* must be accessed with the connlock */
|
||||
struct device dev; /* sysfs transport/container device */
|
||||
struct mempool_zone *z_error;
|
||||
struct mempool_zone *z_pdu;
|
||||
struct list_head freequeue;
|
||||
};
|
||||
|
||||
#define iscsi_dev_to_conn(_dev) \
|
||||
|
Loading…
x
Reference in New Issue
Block a user