You've already forked linux-apfs
mirror of
https://github.com/linux-apfs/linux-apfs.git
synced 2026-05-01 15:00:59 -07: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:
+15
-13
@@ -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_ */
|
||||
|
||||
+232
-118
File diff suppressed because it is too large
Load Diff
@@ -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
|
||||
|
||||
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user