* [PATCH] convert eata to pass pointers around
@ 2004-11-02 14:33 Christoph Hellwig
2004-11-02 14:54 ` Matthew Wilcox
0 siblings, 1 reply; 4+ messages in thread
From: Christoph Hellwig @ 2004-11-02 14:33 UTC (permalink / raw)
To: jejb; +Cc: linux-scsi
passt pointers to Scsi_Host and the private data around instead of using
indices into global arrays all over the place.
(ontop of the previous Lindenting patch)
--- drivers/scsi/eata.c~ 2004-11-02 14:48:13.825040776 +0100
+++ drivers/scsi/eata.c 2004-11-02 15:35:57.910633584 +0100
@@ -836,7 +836,7 @@
struct mssp sp; /* Local copy of sp buffer */
};
-static struct Scsi_Host *sh[MAX_BOARDS + 1];
+struct Scsi_Host *sh[MAX_BOARDS];
static const char *driver_name = "EATA";
static char sha[MAX_BOARDS];
static spinlock_t driver_lock = SPIN_LOCK_UNLOCKED;
@@ -868,9 +868,6 @@
0x0
};
-#define HD(board) ((struct hostdata *) &sh[board]->hostdata)
-#define BN(board) (HD(board)->board_name)
-
/* Device is Big Endian */
#define H2DEV(x) cpu_to_be32(x)
#define DEV2H(x) be32_to_cpu(x)
@@ -881,7 +878,7 @@
#define REG2H(x) le16_to_cpu(x)
static irqreturn_t do_interrupt_handler(int, void *, struct pt_regs *);
-static void flush_dev(struct scsi_device *, unsigned long, unsigned int,
+static void flush_dev(struct scsi_device *, unsigned long, struct hostdata *,
unsigned int);
static int do_trace = 0;
static int setup_done = 0;
@@ -944,11 +941,10 @@
static int eata2x_slave_configure(struct scsi_device *dev)
{
- int j, tqd, utqd;
+ int tqd, utqd;
char *tag_suffix, *link_suffix;
- struct Scsi_Host *host = dev->host;
-
- j = ((struct hostdata *)host->hostdata)->board_number;
+ struct Scsi_Host *shost = dev->host;
+ struct hostdata *ha = (struct hostdata *)shost->hostdata;
utqd = MAX_CMD_PER_LUN;
tqd = max_queue_depth;
@@ -980,7 +976,7 @@
link_suffix = "";
printk("%s: scsi%d, channel %d, id %d, lun %d, cmds/lun %d%s%s.\n",
- BN(j), host->host_no, dev->channel, dev->id, dev->lun,
+ ha->board_name, shost->host_no, dev->channel, dev->id, dev->lun,
dev->queue_depth, link_suffix, tag_suffix);
return 0;
@@ -1091,6 +1087,8 @@
struct pci_dev *pdev;
/* Allowed DMA channels for ISA (0 indicates reserved) */
unsigned char dma_channel_table[4] = { 5, 6, 7, 0 };
+ struct Scsi_Host *shost;
+ struct hostdata *ha;
char name[16];
sprintf(name, "%s%d", driver_name, j);
@@ -1272,35 +1270,38 @@
#endif
spin_unlock_irq(&driver_lock);
- sh[j] = scsi_register(tpnt, sizeof(struct hostdata));
+ sh[j] = shost = scsi_register(tpnt, sizeof(struct hostdata));
spin_lock_irq(&driver_lock);
- if (sh[j] == NULL) {
+ if (shost == NULL) {
printk("%s: unable to register host, detaching.\n", name);
goto freedma;
}
- sh[j]->io_port = port_base;
- sh[j]->unique_id = port_base;
- sh[j]->n_io_port = REGION_SIZE;
- sh[j]->dma_channel = dma_channel;
- sh[j]->irq = irq;
- sh[j]->sg_tablesize = (ushort) info.scatt_size;
- sh[j]->this_id = (ushort) info.host_addr[3];
- sh[j]->can_queue = (ushort) info.queue_size;
- sh[j]->cmd_per_lun = MAX_CMD_PER_LUN;
- memset(HD(j), 0, sizeof(struct hostdata));
- HD(j)->subversion = subversion;
- HD(j)->protocol_rev = protocol_rev;
- HD(j)->is_pci = is_pci;
- HD(j)->pdev = pdev;
- HD(j)->board_number = j;
+ shost->io_port = port_base;
+ shost->unique_id = port_base;
+ shost->n_io_port = REGION_SIZE;
+ shost->dma_channel = dma_channel;
+ shost->irq = irq;
+ shost->sg_tablesize = (ushort) info.scatt_size;
+ shost->this_id = (ushort) info.host_addr[3];
+ shost->can_queue = (ushort) info.queue_size;
+ shost->cmd_per_lun = MAX_CMD_PER_LUN;
+
+ ha = (struct hostdata *)shost->hostdata;
+
+ memset(ha, 0, sizeof(struct hostdata));
+ ha->subversion = subversion;
+ ha->protocol_rev = protocol_rev;
+ ha->is_pci = is_pci;
+ ha->pdev = pdev;
+ ha->board_number = j;
- if (HD(j)->subversion == ESA)
- sh[j]->unchecked_isa_dma = 0;
+ if (ha->subversion == ESA)
+ shost->unchecked_isa_dma = 0;
else {
unsigned long flags;
- sh[j]->unchecked_isa_dma = 1;
+ shost->unchecked_isa_dma = 1;
flags = claim_dma_lock();
disable_dma(dma_channel);
@@ -1311,36 +1312,36 @@
}
- strcpy(BN(j), name);
+ strcpy(ha->board_name, name);
/* DPT PM2012 does not allow to detect sg_tablesize correctly */
- if (sh[j]->sg_tablesize > MAX_SGLIST || sh[j]->sg_tablesize < 2) {
+ if (shost->sg_tablesize > MAX_SGLIST || shost->sg_tablesize < 2) {
printk("%s: detect, wrong n. of SG lists %d, fixed.\n",
- BN(j), sh[j]->sg_tablesize);
- sh[j]->sg_tablesize = MAX_SGLIST;
+ ha->board_name, shost->sg_tablesize);
+ shost->sg_tablesize = MAX_SGLIST;
}
/* DPT PM2012 does not allow to detect can_queue correctly */
- if (sh[j]->can_queue > MAX_MAILBOXES || sh[j]->can_queue < 2) {
+ if (shost->can_queue > MAX_MAILBOXES || shost->can_queue < 2) {
printk("%s: detect, wrong n. of mbox %d, fixed.\n",
- BN(j), sh[j]->can_queue);
- sh[j]->can_queue = MAX_MAILBOXES;
+ ha->board_name, shost->can_queue);
+ shost->can_queue = MAX_MAILBOXES;
}
if (protocol_rev != 'A') {
if (info.max_chan > 0 && info.max_chan < MAX_CHANNEL)
- sh[j]->max_channel = info.max_chan;
+ shost->max_channel = info.max_chan;
if (info.max_id > 7 && info.max_id < MAX_TARGET)
- sh[j]->max_id = info.max_id + 1;
+ shost->max_id = info.max_id + 1;
- if (info.large_sg && sh[j]->sg_tablesize == MAX_SGLIST)
- sh[j]->sg_tablesize = MAX_LARGE_SGLIST;
+ if (info.large_sg && shost->sg_tablesize == MAX_SGLIST)
+ shost->sg_tablesize = MAX_LARGE_SGLIST;
}
if (protocol_rev == 'C') {
if (info.max_lun > 7 && info.max_lun < MAX_LUN)
- sh[j]->max_lun = info.max_lun + 1;
+ shost->max_lun = info.max_lun + 1;
}
if (dma_channel == NO_DMA)
@@ -1350,28 +1351,28 @@
spin_unlock_irq(&driver_lock);
- for (i = 0; i < sh[j]->can_queue; i++)
- HD(j)->cp[i].cp_dma_addr = pci_map_single(HD(j)->pdev,
- &HD(j)->cp[i],
+ for (i = 0; i < shost->can_queue; i++)
+ ha->cp[i].cp_dma_addr = pci_map_single(ha->pdev,
+ &ha->cp[i],
sizeof(struct mscp),
PCI_DMA_BIDIRECTIONAL);
- for (i = 0; i < sh[j]->can_queue; i++) {
- size_t sz = sh[j]->sg_tablesize *sizeof(struct sg_list);
- unsigned int gfp_mask = (sh[j]->unchecked_isa_dma ? GFP_DMA : 0) | GFP_ATOMIC;
- (&HD(j)->cp[i])->sglist = kmalloc(sz, gfp_mask);
- if (!(&HD(j)->cp[i])->sglist) {
+ for (i = 0; i < shost->can_queue; i++) {
+ size_t sz = shost->sg_tablesize *sizeof(struct sg_list);
+ unsigned int gfp_mask = (shost->unchecked_isa_dma ? GFP_DMA : 0) | GFP_ATOMIC;
+ ha->cp[i].sglist = kmalloc(sz, gfp_mask);
+ if (!ha->cp[i].sglist) {
printk
("%s: kmalloc SGlist failed, mbox %d, detaching.\n",
- BN(j), i);
+ ha->board_name, i);
goto release;
}
}
- if (!(HD(j)->sp_cpu_addr = pci_alloc_consistent(HD(j)->pdev,
+ if (!(ha->sp_cpu_addr = pci_alloc_consistent(ha->pdev,
sizeof(struct mssp),
- &HD(j)->sp_dma_addr))) {
- printk("%s: pci_alloc_consistent failed, detaching.\n", BN(j));
+ &ha->sp_dma_addr))) {
+ printk("%s: pci_alloc_consistent failed, detaching.\n", ha->board_name);
goto release;
}
@@ -1396,18 +1397,18 @@
}
printk("%s: 2.0%c, %s 0x%03lx, IRQ %u, %s, SG %d, MB %d.\n",
- BN(j), HD(j)->protocol_rev, bus_type,
- (unsigned long)sh[j]->io_port, sh[j]->irq, dma_name,
- sh[j]->sg_tablesize, sh[j]->can_queue);
+ ha->board_name, ha->protocol_rev, bus_type,
+ (unsigned long)shost->io_port, shost->irq, dma_name,
+ shost->sg_tablesize, shost->can_queue);
- if (sh[j]->max_id > 8 || sh[j]->max_lun > 8)
+ if (shost->max_id > 8 || shost->max_lun > 8)
printk
("%s: wide SCSI support enabled, max_id %u, max_lun %u.\n",
- BN(j), sh[j]->max_id, sh[j]->max_lun);
+ ha->board_name, shost->max_id, shost->max_lun);
- for (i = 0; i <= sh[j]->max_channel; i++)
+ for (i = 0; i <= shost->max_channel; i++)
printk("%s: SCSI channel %u enabled, host target ID %d.\n",
- BN(j), i, info.host_addr[3 - i]);
+ ha->board_name, i, info.host_addr[3 - i]);
#if defined(DEBUG_DETECT)
printk("%s: Vers. 0x%x, ocs %u, tar %u, trnxfr %u, more %u, SYNC 0x%x, "
@@ -1427,11 +1428,11 @@
info.idquest, info.pci, info.eisa, info.raidnum);
#endif
- if (HD(j)->pdev) {
- pci_set_master(HD(j)->pdev);
- if (pci_set_dma_mask(HD(j)->pdev, 0xffffffff))
+ if (ha->pdev) {
+ pci_set_master(ha->pdev);
+ if (pci_set_dma_mask(ha->pdev, 0xffffffff))
printk("%s: warning, pci_set_dma_mask failed.\n",
- BN(j));
+ ha->board_name);
}
return 1;
@@ -1448,7 +1449,7 @@
return 0;
release:
- eata2x_release(sh[j]);
+ eata2x_release(shost);
return 0;
}
@@ -1578,9 +1579,6 @@
}
#endif
- for (k = 0; k < MAX_BOARDS + 1; k++)
- sh[k] = NULL;
-
for (k = MAX_INT_PARAM; io_port[k]; k++)
if (io_port[k] == SKIP)
continue;
@@ -1613,21 +1611,20 @@
return j;
}
-static void map_dma(unsigned int i, unsigned int j)
+static void map_dma(unsigned int i, struct hostdata *ha)
{
unsigned int k, count, pci_dir;
struct scatterlist *sgpnt;
struct mscp *cpp;
struct scsi_cmnd *SCpnt;
- cpp = &HD(j)->cp[i];
+ cpp = &ha->cp[i];
SCpnt = cpp->SCpnt;
pci_dir = SCpnt->sc_data_direction;
if (SCpnt->sense_buffer)
cpp->sense_addr =
- H2DEV(pci_map_single
- (HD(j)->pdev, SCpnt->sense_buffer,
+ H2DEV(pci_map_single(ha->pdev, SCpnt->sense_buffer,
sizeof SCpnt->sense_buffer, PCI_DMA_FROMDEVICE));
cpp->sense_len = sizeof SCpnt->sense_buffer;
@@ -1639,7 +1636,7 @@
pci_dir = PCI_DMA_BIDIRECTIONAL;
if (SCpnt->request_buffer)
- cpp->data_address = H2DEV(pci_map_single(HD(j)->pdev,
+ cpp->data_address = H2DEV(pci_map_single(ha->pdev,
SCpnt->
request_buffer,
SCpnt->
@@ -1651,7 +1648,7 @@
}
sgpnt = (struct scatterlist *)SCpnt->request_buffer;
- count = pci_map_sg(HD(j)->pdev, sgpnt, SCpnt->use_sg, pci_dir);
+ count = pci_map_sg(ha->pdev, sgpnt, SCpnt->use_sg, pci_dir);
for (k = 0; k < count; k++) {
cpp->sglist[k].address = H2DEV(sg_dma_address(&sgpnt[k]));
@@ -1659,68 +1656,68 @@
}
cpp->sg = 1;
- cpp->data_address = H2DEV(pci_map_single(HD(j)->pdev, cpp->sglist,
+ cpp->data_address = H2DEV(pci_map_single(ha->pdev, cpp->sglist,
SCpnt->use_sg *
sizeof(struct sg_list),
pci_dir));
cpp->data_len = H2DEV((SCpnt->use_sg * sizeof(struct sg_list)));
}
-static void unmap_dma(unsigned int i, unsigned int j)
+static void unmap_dma(unsigned int i, struct hostdata *ha)
{
unsigned int pci_dir;
struct mscp *cpp;
struct scsi_cmnd *SCpnt;
- cpp = &HD(j)->cp[i];
+ cpp = &ha->cp[i];
SCpnt = cpp->SCpnt;
pci_dir = SCpnt->sc_data_direction;
if (DEV2H(cpp->sense_addr))
- pci_unmap_single(HD(j)->pdev, DEV2H(cpp->sense_addr),
+ pci_unmap_single(ha->pdev, DEV2H(cpp->sense_addr),
DEV2H(cpp->sense_len), PCI_DMA_FROMDEVICE);
if (SCpnt->use_sg)
- pci_unmap_sg(HD(j)->pdev, SCpnt->request_buffer, SCpnt->use_sg,
+ pci_unmap_sg(ha->pdev, SCpnt->request_buffer, SCpnt->use_sg,
pci_dir);
if (!DEV2H(cpp->data_len))
pci_dir = PCI_DMA_BIDIRECTIONAL;
if (DEV2H(cpp->data_address))
- pci_unmap_single(HD(j)->pdev, DEV2H(cpp->data_address),
+ pci_unmap_single(ha->pdev, DEV2H(cpp->data_address),
DEV2H(cpp->data_len), pci_dir);
}
-static void sync_dma(unsigned int i, unsigned int j)
+static void sync_dma(unsigned int i, struct hostdata *ha)
{
unsigned int pci_dir;
struct mscp *cpp;
struct scsi_cmnd *SCpnt;
- cpp = &HD(j)->cp[i];
+ cpp = &ha->cp[i];
SCpnt = cpp->SCpnt;
pci_dir = SCpnt->sc_data_direction;
if (DEV2H(cpp->sense_addr))
- pci_dma_sync_single_for_cpu(HD(j)->pdev, DEV2H(cpp->sense_addr),
+ pci_dma_sync_single_for_cpu(ha->pdev, DEV2H(cpp->sense_addr),
DEV2H(cpp->sense_len),
PCI_DMA_FROMDEVICE);
if (SCpnt->use_sg)
- pci_dma_sync_sg_for_cpu(HD(j)->pdev, SCpnt->request_buffer,
+ pci_dma_sync_sg_for_cpu(ha->pdev, SCpnt->request_buffer,
SCpnt->use_sg, pci_dir);
if (!DEV2H(cpp->data_len))
pci_dir = PCI_DMA_BIDIRECTIONAL;
if (DEV2H(cpp->data_address))
- pci_dma_sync_single_for_cpu(HD(j)->pdev,
+ pci_dma_sync_single_for_cpu(ha->pdev,
DEV2H(cpp->data_address),
DEV2H(cpp->data_len), pci_dir);
}
-static void scsi_to_dev_dir(unsigned int i, unsigned int j)
+static void scsi_to_dev_dir(unsigned int i, struct hostdata *ha)
{
unsigned int k;
@@ -1739,7 +1736,7 @@
struct mscp *cpp;
struct scsi_cmnd *SCpnt;
- cpp = &HD(j)->cp[i];
+ cpp = &ha->cp[i];
SCpnt = cpp->SCpnt;
if (SCpnt->sc_data_direction == DMA_FROM_DEVICE) {
@@ -1757,7 +1754,8 @@
}
if (SCpnt->sc_data_direction != DMA_BIDIRECTIONAL)
- panic("%s: qcomm, invalid SCpnt->sc_data_direction.\n", BN(j));
+ panic("%s: qcomm, invalid SCpnt->sc_data_direction.\n",
+ ha->board_name);
for (k = 0; k < ARRAY_SIZE(data_out_cmds); k++)
if (SCpnt->cmnd[0] == data_out_cmds[k]) {
@@ -1777,43 +1775,40 @@
static int eata2x_queuecommand(struct scsi_cmnd *SCpnt,
void (*done) (struct scsi_cmnd *))
{
- unsigned int i, j, k;
+ struct Scsi_Host *shost = SCpnt->device->host;
+ struct hostdata *ha = (struct hostdata *)shost->hostdata;
+ unsigned int i, k;
struct mscp *cpp;
- /* j is the board number */
- j = ((struct hostdata *)SCpnt->device->host->hostdata)->board_number;
-
if (SCpnt->host_scribble)
panic("%s: qcomm, pid %ld, SCpnt %p already active.\n",
- BN(j), SCpnt->pid, SCpnt);
+ ha->board_name, SCpnt->pid, SCpnt);
/* i is the mailbox number, look for the first free mailbox
starting from last_cp_used */
- i = HD(j)->last_cp_used + 1;
-
- for (k = 0; k < sh[j]->can_queue; k++, i++) {
+ i = ha->last_cp_used + 1;
- if (i >= sh[j]->can_queue)
+ for (k = 0; k < shost->can_queue; k++, i++) {
+ if (i >= shost->can_queue)
i = 0;
-
- if (HD(j)->cp_stat[i] == FREE) {
- HD(j)->last_cp_used = i;
+ if (ha->cp_stat[i] == FREE) {
+ ha->last_cp_used = i;
break;
}
}
- if (k == sh[j]->can_queue) {
- printk("%s: qcomm, no free mailbox.\n", BN(j));
+ if (k == shost->can_queue) {
+ printk("%s: qcomm, no free mailbox.\n", ha->board_name);
return 1;
}
/* Set pointer to control packet structure */
- cpp = &HD(j)->cp[i];
+ cpp = &ha->cp[i];
memset(cpp, 0, sizeof(struct mscp) - CP_TAIL_SIZE);
/* Set pointer to status packet structure, Big Endian format */
- cpp->sp_dma_addr = H2DEV(HD(j)->sp_dma_addr);
+ cpp->sp_dma_addr = H2DEV(ha->sp_dma_addr);
SCpnt->scsi_done = done;
cpp->cpp_index = i;
@@ -1821,7 +1816,7 @@
if (do_trace)
printk("%s: qcomm, mbox %d, target %d.%d:%d, pid %ld.\n",
- BN(j), i, SCpnt->device->channel, SCpnt->device->id,
+ ha->board_name, i, SCpnt->device->channel, SCpnt->device->id,
SCpnt->device->lun, SCpnt->pid);
cpp->reqsen = 1;
@@ -1838,234 +1833,234 @@
memcpy(cpp->cdb, SCpnt->cmnd, SCpnt->cmd_len);
/* Use data transfer direction SCpnt->sc_data_direction */
- scsi_to_dev_dir(i, j);
+ scsi_to_dev_dir(i, ha);
/* Map DMA buffers and SG list */
- map_dma(i, j);
+ map_dma(i, ha);
if (linked_comm && SCpnt->device->queue_depth > 2
&& TLDEV(SCpnt->device->type)) {
- HD(j)->cp_stat[i] = READY;
- flush_dev(SCpnt->device, SCpnt->request->sector, j, 0);
+ ha->cp_stat[i] = READY;
+ flush_dev(SCpnt->device, SCpnt->request->sector, ha, 0);
return 0;
}
/* Send control packet to the board */
- if (do_dma(sh[j]->io_port, cpp->cp_dma_addr, SEND_CP_DMA)) {
- unmap_dma(i, j);
+ if (do_dma(shost->io_port, cpp->cp_dma_addr, SEND_CP_DMA)) {
+ unmap_dma(i, ha);
SCpnt->host_scribble = NULL;
printk("%s: qcomm, target %d.%d:%d, pid %ld, adapter busy.\n",
- BN(j), SCpnt->device->channel, SCpnt->device->id,
+ ha->board_name, SCpnt->device->channel, SCpnt->device->id,
SCpnt->device->lun, SCpnt->pid);
return 1;
}
- HD(j)->cp_stat[i] = IN_USE;
+ ha->cp_stat[i] = IN_USE;
return 0;
}
static int eata2x_eh_abort(struct scsi_cmnd *SCarg)
{
- unsigned int i, j;
-
- j = ((struct hostdata *)SCarg->device->host->hostdata)->board_number;
+ struct Scsi_Host *shost = SCarg->device->host;
+ struct hostdata *ha = (struct hostdata *)shost->hostdata;
+ unsigned int i;
if (SCarg->host_scribble == NULL) {
printk("%s: abort, target %d.%d:%d, pid %ld inactive.\n",
- BN(j), SCarg->device->channel, SCarg->device->id,
+ ha->board_name, SCarg->device->channel, SCarg->device->id,
SCarg->device->lun, SCarg->pid);
return SUCCESS;
}
i = *(unsigned int *)SCarg->host_scribble;
printk("%s: abort, mbox %d, target %d.%d:%d, pid %ld.\n",
- BN(j), i, SCarg->device->channel, SCarg->device->id,
+ ha->board_name, i, SCarg->device->channel, SCarg->device->id,
SCarg->device->lun, SCarg->pid);
- if (i >= sh[j]->can_queue)
- panic("%s: abort, invalid SCarg->host_scribble.\n", BN(j));
+ if (i >= shost->can_queue)
+ panic("%s: abort, invalid SCarg->host_scribble.\n", ha->board_name);
- if (wait_on_busy(sh[j]->io_port, MAXLOOP)) {
- printk("%s: abort, timeout error.\n", BN(j));
+ if (wait_on_busy(shost->io_port, MAXLOOP)) {
+ printk("%s: abort, timeout error.\n", ha->board_name);
return FAILED;
}
- if (HD(j)->cp_stat[i] == FREE) {
- printk("%s: abort, mbox %d is free.\n", BN(j), i);
+ if (ha->cp_stat[i] == FREE) {
+ printk("%s: abort, mbox %d is free.\n", ha->board_name, i);
return SUCCESS;
}
- if (HD(j)->cp_stat[i] == IN_USE) {
- printk("%s: abort, mbox %d is in use.\n", BN(j), i);
+ if (ha->cp_stat[i] == IN_USE) {
+ printk("%s: abort, mbox %d is in use.\n", ha->board_name, i);
- if (SCarg != HD(j)->cp[i].SCpnt)
+ if (SCarg != ha->cp[i].SCpnt)
panic("%s: abort, mbox %d, SCarg %p, cp SCpnt %p.\n",
- BN(j), i, SCarg, HD(j)->cp[i].SCpnt);
+ ha->board_name, i, SCarg, ha->cp[i].SCpnt);
- if (inb(sh[j]->io_port + REG_AUX_STATUS) & IRQ_ASSERTED)
+ if (inb(shost->io_port + REG_AUX_STATUS) & IRQ_ASSERTED)
printk("%s: abort, mbox %d, interrupt pending.\n",
- BN(j), i);
+ ha->board_name, i);
if (SCarg->eh_state == SCSI_STATE_TIMEOUT) {
- unmap_dma(i, j);
+ unmap_dma(i, ha);
SCarg->host_scribble = NULL;
- HD(j)->cp_stat[i] = FREE;
+ ha->cp_stat[i] = FREE;
printk
("%s, abort, mbox %d, eh_state timeout, pid %ld.\n",
- BN(j), i, SCarg->pid);
+ ha->board_name, i, SCarg->pid);
return SUCCESS;
}
return FAILED;
}
- if (HD(j)->cp_stat[i] == IN_RESET) {
- printk("%s: abort, mbox %d is in reset.\n", BN(j), i);
+ if (ha->cp_stat[i] == IN_RESET) {
+ printk("%s: abort, mbox %d is in reset.\n", ha->board_name, i);
return FAILED;
}
- if (HD(j)->cp_stat[i] == LOCKED) {
- printk("%s: abort, mbox %d is locked.\n", BN(j), i);
+ if (ha->cp_stat[i] == LOCKED) {
+ printk("%s: abort, mbox %d is locked.\n", ha->board_name, i);
return SUCCESS;
}
- if (HD(j)->cp_stat[i] == READY || HD(j)->cp_stat[i] == ABORTING) {
- unmap_dma(i, j);
+ if (ha->cp_stat[i] == READY || ha->cp_stat[i] == ABORTING) {
+ unmap_dma(i, ha);
SCarg->result = DID_ABORT << 16;
SCarg->host_scribble = NULL;
- HD(j)->cp_stat[i] = FREE;
+ ha->cp_stat[i] = FREE;
printk("%s, abort, mbox %d ready, DID_ABORT, pid %ld done.\n",
- BN(j), i, SCarg->pid);
+ ha->board_name, i, SCarg->pid);
SCarg->scsi_done(SCarg);
return SUCCESS;
}
- panic("%s: abort, mbox %d, invalid cp_stat.\n", BN(j), i);
+ panic("%s: abort, mbox %d, invalid cp_stat.\n", ha->board_name, i);
}
static int eata2x_eh_host_reset(struct scsi_cmnd *SCarg)
{
- unsigned int i, j, time, k, c, limit = 0;
+ unsigned int i, time, k, c, limit = 0;
int arg_done = 0;
struct scsi_cmnd *SCpnt;
+ struct Scsi_Host *shost = SCarg->device->host;
+ struct hostdata *ha = (struct hostdata *)shost->hostdata;
- j = ((struct hostdata *)SCarg->device->host->hostdata)->board_number;
printk("%s: reset, enter, target %d.%d:%d, pid %ld.\n",
- BN(j), SCarg->device->channel, SCarg->device->id,
+ ha->board_name, SCarg->device->channel, SCarg->device->id,
SCarg->device->lun, SCarg->pid);
if (SCarg->host_scribble == NULL)
- printk("%s: reset, pid %ld inactive.\n", BN(j), SCarg->pid);
+ printk("%s: reset, pid %ld inactive.\n", ha->board_name, SCarg->pid);
- if (HD(j)->in_reset) {
- printk("%s: reset, exit, already in reset.\n", BN(j));
+ if (ha->in_reset) {
+ printk("%s: reset, exit, already in reset.\n", ha->board_name);
return FAILED;
}
- if (wait_on_busy(sh[j]->io_port, MAXLOOP)) {
- printk("%s: reset, exit, timeout error.\n", BN(j));
+ if (wait_on_busy(shost->io_port, MAXLOOP)) {
+ printk("%s: reset, exit, timeout error.\n", ha->board_name);
return FAILED;
}
- HD(j)->retries = 0;
+ ha->retries = 0;
- for (c = 0; c <= sh[j]->max_channel; c++)
- for (k = 0; k < sh[j]->max_id; k++) {
- HD(j)->target_redo[k][c] = 1;
- HD(j)->target_to[k][c] = 0;
+ for (c = 0; c <= shost->max_channel; c++)
+ for (k = 0; k < shost->max_id; k++) {
+ ha->target_redo[k][c] = 1;
+ ha->target_to[k][c] = 0;
}
- for (i = 0; i < sh[j]->can_queue; i++) {
+ for (i = 0; i < shost->can_queue; i++) {
- if (HD(j)->cp_stat[i] == FREE)
+ if (ha->cp_stat[i] == FREE)
continue;
- if (HD(j)->cp_stat[i] == LOCKED) {
- HD(j)->cp_stat[i] = FREE;
+ if (ha->cp_stat[i] == LOCKED) {
+ ha->cp_stat[i] = FREE;
printk("%s: reset, locked mbox %d forced free.\n",
- BN(j), i);
+ ha->board_name, i);
continue;
}
- if (!(SCpnt = HD(j)->cp[i].SCpnt))
- panic("%s: reset, mbox %d, SCpnt == NULL.\n", BN(j), i);
+ if (!(SCpnt = ha->cp[i].SCpnt))
+ panic("%s: reset, mbox %d, SCpnt == NULL.\n", ha->board_name, i);
- if (HD(j)->cp_stat[i] == READY || HD(j)->cp_stat[i] == ABORTING) {
- HD(j)->cp_stat[i] = ABORTING;
+ if (ha->cp_stat[i] == READY || ha->cp_stat[i] == ABORTING) {
+ ha->cp_stat[i] = ABORTING;
printk("%s: reset, mbox %d aborting, pid %ld.\n",
- BN(j), i, SCpnt->pid);
+ ha->board_name, i, SCpnt->pid);
}
else {
- HD(j)->cp_stat[i] = IN_RESET;
+ ha->cp_stat[i] = IN_RESET;
printk("%s: reset, mbox %d in reset, pid %ld.\n",
- BN(j), i, SCpnt->pid);
+ ha->board_name, i, SCpnt->pid);
}
if (SCpnt->host_scribble == NULL)
- panic("%s: reset, mbox %d, garbled SCpnt.\n", BN(j), i);
+ panic("%s: reset, mbox %d, garbled SCpnt.\n", ha->board_name, i);
if (*(unsigned int *)SCpnt->host_scribble != i)
- panic("%s: reset, mbox %d, index mismatch.\n", BN(j),
- i);
+ panic("%s: reset, mbox %d, index mismatch.\n", ha->board_name, i);
if (SCpnt->scsi_done == NULL)
panic("%s: reset, mbox %d, SCpnt->scsi_done == NULL.\n",
- BN(j), i);
+ ha->board_name, i);
if (SCpnt == SCarg)
arg_done = 1;
}
- if (do_dma(sh[j]->io_port, 0, RESET_PIO)) {
- printk("%s: reset, cannot reset, timeout error.\n", BN(j));
+ if (do_dma(shost->io_port, 0, RESET_PIO)) {
+ printk("%s: reset, cannot reset, timeout error.\n", ha->board_name);
return FAILED;
}
- printk("%s: reset, board reset done, enabling interrupts.\n", BN(j));
+ printk("%s: reset, board reset done, enabling interrupts.\n", ha->board_name);
#if defined(DEBUG_RESET)
do_trace = 1;
#endif
- HD(j)->in_reset = 1;
+ ha->in_reset = 1;
- spin_unlock_irq(sh[j]->host_lock);
+ spin_unlock_irq(shost->host_lock);
time = jiffies;
while ((jiffies - time) < (10 * HZ) && limit++ < 200000)
udelay(100L);
- spin_lock_irq(sh[j]->host_lock);
+ spin_lock_irq(shost->host_lock);
- printk("%s: reset, interrupts disabled, loops %d.\n", BN(j), limit);
+ printk("%s: reset, interrupts disabled, loops %d.\n", ha->board_name, limit);
- for (i = 0; i < sh[j]->can_queue; i++) {
+ for (i = 0; i < shost->can_queue; i++) {
- if (HD(j)->cp_stat[i] == IN_RESET) {
- SCpnt = HD(j)->cp[i].SCpnt;
- unmap_dma(i, j);
+ if (ha->cp_stat[i] == IN_RESET) {
+ SCpnt = ha->cp[i].SCpnt;
+ unmap_dma(i, ha);
SCpnt->result = DID_RESET << 16;
SCpnt->host_scribble = NULL;
/* This mailbox is still waiting for its interrupt */
- HD(j)->cp_stat[i] = LOCKED;
+ ha->cp_stat[i] = LOCKED;
printk
("%s, reset, mbox %d locked, DID_RESET, pid %ld done.\n",
- BN(j), i, SCpnt->pid);
+ ha->board_name, i, SCpnt->pid);
}
- else if (HD(j)->cp_stat[i] == ABORTING) {
- SCpnt = HD(j)->cp[i].SCpnt;
- unmap_dma(i, j);
+ else if (ha->cp_stat[i] == ABORTING) {
+ SCpnt = ha->cp[i].SCpnt;
+ unmap_dma(i, ha);
SCpnt->result = DID_RESET << 16;
SCpnt->host_scribble = NULL;
/* This mailbox was never queued to the adapter */
- HD(j)->cp_stat[i] = FREE;
+ ha->cp_stat[i] = FREE;
printk
("%s, reset, mbox %d aborting, DID_RESET, pid %ld done.\n",
- BN(j), i, SCpnt->pid);
+ ha->board_name, i, SCpnt->pid);
}
else
@@ -2075,13 +2070,13 @@
SCpnt->scsi_done(SCpnt);
}
- HD(j)->in_reset = 0;
+ ha->in_reset = 0;
do_trace = 0;
if (arg_done)
- printk("%s: reset, exit, pid %ld done.\n", BN(j), SCarg->pid);
+ printk("%s: reset, exit, pid %ld done.\n", ha->board_name, SCarg->pid);
else
- printk("%s: reset, exit.\n", BN(j));
+ printk("%s: reset, exit.\n", ha->board_name);
return SUCCESS;
}
@@ -2135,7 +2130,7 @@
return;
}
-static int reorder(unsigned int j, unsigned long cursec,
+static int reorder(struct hostdata *ha, unsigned long cursec,
unsigned int ihdlr, unsigned int il[], unsigned int n_ready)
{
struct scsi_cmnd *SCpnt;
@@ -2164,7 +2159,7 @@
for (n = 0; n < n_ready; n++) {
k = il[n];
- cpp = &HD(j)->cp[k];
+ cpp = &ha->cp[k];
SCpnt = cpp->SCpnt;
if (!cpp->din)
@@ -2214,7 +2209,7 @@
if (!input_only)
for (n = 0; n < n_ready; n++) {
k = il[n];
- cpp = &HD(j)->cp[k];
+ cpp = &ha->cp[k];
SCpnt = cpp->SCpnt;
ll[n] = SCpnt->request->nr_sectors;
pl[n] = SCpnt->pid;
@@ -2259,7 +2254,7 @@
if (link_statistics && (overlap || !(flushcount % link_statistics)))
for (n = 0; n < n_ready; n++) {
k = il[n];
- cpp = &HD(j)->cp[k];
+ cpp = &ha->cp[k];
SCpnt = cpp->SCpnt;
printk
("%s %d.%d:%d pid %ld mb %d fc %d nr %d sec %ld ns %ld"
@@ -2277,100 +2272,100 @@
}
static void flush_dev(struct scsi_device *dev, unsigned long cursec,
- unsigned int j, unsigned int ihdlr)
+ struct hostdata *ha, unsigned int ihdlr)
{
struct scsi_cmnd *SCpnt;
struct mscp *cpp;
unsigned int k, n, n_ready = 0, il[MAX_MAILBOXES];
- for (k = 0; k < sh[j]->can_queue; k++) {
+ for (k = 0; k < dev->host->can_queue; k++) {
- if (HD(j)->cp_stat[k] != READY && HD(j)->cp_stat[k] != IN_USE)
+ if (ha->cp_stat[k] != READY && ha->cp_stat[k] != IN_USE)
continue;
- cpp = &HD(j)->cp[k];
+ cpp = &ha->cp[k];
SCpnt = cpp->SCpnt;
if (SCpnt->device != dev)
continue;
- if (HD(j)->cp_stat[k] == IN_USE)
+ if (ha->cp_stat[k] == IN_USE)
return;
il[n_ready++] = k;
}
- if (reorder(j, cursec, ihdlr, il, n_ready))
+ if (reorder(ha, cursec, ihdlr, il, n_ready))
n_ready = 1;
for (n = 0; n < n_ready; n++) {
k = il[n];
- cpp = &HD(j)->cp[k];
+ cpp = &ha->cp[k];
SCpnt = cpp->SCpnt;
- if (do_dma(sh[j]->io_port, cpp->cp_dma_addr, SEND_CP_DMA)) {
+ if (do_dma(dev->host->io_port, cpp->cp_dma_addr, SEND_CP_DMA)) {
printk
("%s: %s, target %d.%d:%d, pid %ld, mbox %d, adapter"
- " busy, will abort.\n", BN(j),
+ " busy, will abort.\n", ha->board_name,
(ihdlr ? "ihdlr" : "qcomm"),
SCpnt->device->channel, SCpnt->device->id,
SCpnt->device->lun, SCpnt->pid, k);
- HD(j)->cp_stat[k] = ABORTING;
+ ha->cp_stat[k] = ABORTING;
continue;
}
- HD(j)->cp_stat[k] = IN_USE;
+ ha->cp_stat[k] = IN_USE;
}
-
}
-static irqreturn_t ihdlr(int irq, unsigned int j)
+static irqreturn_t ihdlr(int irq, struct Scsi_Host *shost)
{
struct scsi_cmnd *SCpnt;
unsigned int i, k, c, status, tstatus, reg;
struct mssp *spp;
struct mscp *cpp;
+ struct hostdata *ha = (struct hostdata *)shost->hostdata;
- if (sh[j]->irq != irq)
- panic("%s: ihdlr, irq %d, sh[j]->irq %d.\n", BN(j), irq,
- sh[j]->irq);
+ if (shost->irq != irq)
+ panic("%s: ihdlr, irq %d, shost->irq %d.\n", ha->board_name, irq,
+ shost->irq);
/* Check if this board need to be serviced */
- if (!(inb(sh[j]->io_port + REG_AUX_STATUS) & IRQ_ASSERTED))
+ if (!(inb(shost->io_port + REG_AUX_STATUS) & IRQ_ASSERTED))
goto none;
- HD(j)->iocount++;
+ ha->iocount++;
if (do_trace)
- printk("%s: ihdlr, enter, irq %d, count %d.\n", BN(j), irq,
- HD(j)->iocount);
+ printk("%s: ihdlr, enter, irq %d, count %d.\n", ha->board_name, irq,
+ ha->iocount);
/* Check if this board is still busy */
- if (wait_on_busy(sh[j]->io_port, 20 * MAXLOOP)) {
- reg = inb(sh[j]->io_port + REG_STATUS);
+ if (wait_on_busy(shost->io_port, 20 * MAXLOOP)) {
+ reg = inb(shost->io_port + REG_STATUS);
printk
("%s: ihdlr, busy timeout error, irq %d, reg 0x%x, count %d.\n",
- BN(j), irq, reg, HD(j)->iocount);
+ ha->board_name, irq, reg, ha->iocount);
goto none;
}
- spp = &HD(j)->sp;
+ spp = &ha->sp;
/* Make a local copy just before clearing the interrupt indication */
- memcpy(spp, HD(j)->sp_cpu_addr, sizeof(struct mssp));
+ memcpy(spp, ha->sp_cpu_addr, sizeof(struct mssp));
/* Clear the completion flag and cp pointer on the dynamic copy of sp */
- memset(HD(j)->sp_cpu_addr, 0, sizeof(struct mssp));
+ memset(ha->sp_cpu_addr, 0, sizeof(struct mssp));
/* Read the status register to clear the interrupt indication */
- reg = inb(sh[j]->io_port + REG_STATUS);
+ reg = inb(shost->io_port + REG_STATUS);
#if defined (DEBUG_INTERRUPT)
{
unsigned char *bytesp;
int cnt;
bytesp = (unsigned char *)spp;
- if (HD(j)->iocount < 200) {
+ if (ha->iocount < 200) {
printk("sp[] =");
for (cnt = 0; cnt < 15; cnt++)
printk(" 0x%x", bytesp[cnt]);
@@ -2380,71 +2375,71 @@
#endif
/* Reject any sp with supspect data */
- if (spp->eoc == 0 && HD(j)->iocount > 1)
+ if (spp->eoc == 0 && ha->iocount > 1)
printk
("%s: ihdlr, spp->eoc == 0, irq %d, reg 0x%x, count %d.\n",
- BN(j), irq, reg, HD(j)->iocount);
- if (spp->cpp_index < 0 || spp->cpp_index >= sh[j]->can_queue)
+ ha->board_name, irq, reg, ha->iocount);
+ if (spp->cpp_index < 0 || spp->cpp_index >= shost->can_queue)
printk
("%s: ihdlr, bad spp->cpp_index %d, irq %d, reg 0x%x, count %d.\n",
- BN(j), spp->cpp_index, irq, reg, HD(j)->iocount);
+ ha->board_name, spp->cpp_index, irq, reg, ha->iocount);
if (spp->eoc == 0 || spp->cpp_index < 0
- || spp->cpp_index >= sh[j]->can_queue)
+ || spp->cpp_index >= shost->can_queue)
goto handled;
/* Find the mailbox to be serviced on this board */
i = spp->cpp_index;
- cpp = &(HD(j)->cp[i]);
+ cpp = &(ha->cp[i]);
#if defined(DEBUG_GENERATE_ABORTS)
- if ((HD(j)->iocount > 500) && ((HD(j)->iocount % 500) < 3))
+ if ((ha->iocount > 500) && ((ha->iocount % 500) < 3))
goto handled;
#endif
- if (HD(j)->cp_stat[i] == IGNORE) {
- HD(j)->cp_stat[i] = FREE;
+ if (ha->cp_stat[i] == IGNORE) {
+ ha->cp_stat[i] = FREE;
goto handled;
- } else if (HD(j)->cp_stat[i] == LOCKED) {
- HD(j)->cp_stat[i] = FREE;
- printk("%s: ihdlr, mbox %d unlocked, count %d.\n", BN(j), i,
- HD(j)->iocount);
+ } else if (ha->cp_stat[i] == LOCKED) {
+ ha->cp_stat[i] = FREE;
+ printk("%s: ihdlr, mbox %d unlocked, count %d.\n", ha->board_name, i,
+ ha->iocount);
goto handled;
- } else if (HD(j)->cp_stat[i] == FREE) {
- printk("%s: ihdlr, mbox %d is free, count %d.\n", BN(j), i,
- HD(j)->iocount);
+ } else if (ha->cp_stat[i] == FREE) {
+ printk("%s: ihdlr, mbox %d is free, count %d.\n", ha->board_name, i,
+ ha->iocount);
goto handled;
- } else if (HD(j)->cp_stat[i] == IN_RESET)
- printk("%s: ihdlr, mbox %d is in reset.\n", BN(j), i);
- else if (HD(j)->cp_stat[i] != IN_USE)
+ } else if (ha->cp_stat[i] == IN_RESET)
+ printk("%s: ihdlr, mbox %d is in reset.\n", ha->board_name, i);
+ else if (ha->cp_stat[i] != IN_USE)
panic("%s: ihdlr, mbox %d, invalid cp_stat: %d.\n",
- BN(j), i, HD(j)->cp_stat[i]);
+ ha->board_name, i, ha->cp_stat[i]);
- HD(j)->cp_stat[i] = FREE;
+ ha->cp_stat[i] = FREE;
SCpnt = cpp->SCpnt;
if (SCpnt == NULL)
- panic("%s: ihdlr, mbox %d, SCpnt == NULL.\n", BN(j), i);
+ panic("%s: ihdlr, mbox %d, SCpnt == NULL.\n", ha->board_name, i);
if (SCpnt->host_scribble == NULL)
- panic("%s: ihdlr, mbox %d, pid %ld, SCpnt %p garbled.\n", BN(j),
+ panic("%s: ihdlr, mbox %d, pid %ld, SCpnt %p garbled.\n", ha->board_name,
i, SCpnt->pid, SCpnt);
if (*(unsigned int *)SCpnt->host_scribble != i)
panic("%s: ihdlr, mbox %d, pid %ld, index mismatch %d.\n",
- BN(j), i, SCpnt->pid,
+ ha->board_name, i, SCpnt->pid,
*(unsigned int *)SCpnt->host_scribble);
- sync_dma(i, j);
+ sync_dma(i, ha);
if (linked_comm && SCpnt->device->queue_depth > 2
&& TLDEV(SCpnt->device->type))
- flush_dev(SCpnt->device, SCpnt->request->sector, j, 1);
+ flush_dev(SCpnt->device, SCpnt->request->sector, ha, 1);
tstatus = status_byte(spp->target_status);
#if defined(DEBUG_GENERATE_ERRORS)
- if ((HD(j)->iocount > 500) && ((HD(j)->iocount % 200) < 2))
+ if ((ha->iocount > 500) && ((ha->iocount % 200) < 2))
spp->adapter_status = 0x01;
#endif
@@ -2457,7 +2452,7 @@
/* If there was a bus reset, redo operation on each target */
else if (tstatus != GOOD && SCpnt->device->type == TYPE_DISK
- && HD(j)->target_redo[SCpnt->device->id][SCpnt->
+ && ha->target_redo[SCpnt->device->id][SCpnt->
device->
channel])
status = DID_BUS_BUSY << 16;
@@ -2472,33 +2467,33 @@
status = DID_OK << 16;
if (tstatus == GOOD)
- HD(j)->target_redo[SCpnt->device->id][SCpnt->device->
+ ha->target_redo[SCpnt->device->id][SCpnt->device->
channel] = 0;
if (spp->target_status && SCpnt->device->type == TYPE_DISK &&
- (!(tstatus == CHECK_CONDITION && HD(j)->iocount <= 1000 &&
+ (!(tstatus == CHECK_CONDITION && ha->iocount <= 1000 &&
(SCpnt->sense_buffer[2] & 0xf) == NOT_READY)))
printk("%s: ihdlr, target %d.%d:%d, pid %ld, "
- "target_status 0x%x, sense key 0x%x.\n", BN(j),
+ "target_status 0x%x, sense key 0x%x.\n",
+ ha->board_name,
SCpnt->device->channel, SCpnt->device->id,
SCpnt->device->lun, SCpnt->pid,
spp->target_status, SCpnt->sense_buffer[2]);
- HD(j)->target_to[SCpnt->device->id][SCpnt->device->channel] = 0;
+ ha->target_to[SCpnt->device->id][SCpnt->device->channel] = 0;
- if (HD(j)->last_retried_pid == SCpnt->pid)
- HD(j)->retries = 0;
+ if (ha->last_retried_pid == SCpnt->pid)
+ ha->retries = 0;
break;
case ASST: /* Selection Time Out */
case 0x02: /* Command Time Out */
- if (HD(j)->
- target_to[SCpnt->device->id][SCpnt->device->channel] > 1)
+ if (ha->target_to[SCpnt->device->id][SCpnt->device->channel] > 1)
status = DID_ERROR << 16;
else {
status = DID_TIME_OUT << 16;
- HD(j)->target_to[SCpnt->device->id][SCpnt->device->
+ ha->target_to[SCpnt->device->id][SCpnt->device->
channel]++;
}
@@ -2508,12 +2503,12 @@
case 0x03: /* SCSI Bus Reset Received */
case 0x04: /* Initial Controller Power-up */
- for (c = 0; c <= sh[j]->max_channel; c++)
- for (k = 0; k < sh[j]->max_id; k++)
- HD(j)->target_redo[k][c] = 1;
+ for (c = 0; c <= shost->max_channel; c++)
+ for (k = 0; k < shost->max_id; k++)
+ ha->target_redo[k][c] = 1;
if (SCpnt->device->type != TYPE_TAPE
- && HD(j)->retries < MAX_INTERNAL_RETRIES) {
+ && ha->retries < MAX_INTERNAL_RETRIES) {
#if defined(DID_SOFT_ERROR)
status = DID_SOFT_ERROR << 16;
@@ -2521,8 +2516,8 @@
status = DID_BUS_BUSY << 16;
#endif
- HD(j)->retries++;
- HD(j)->last_retried_pid = SCpnt->pid;
+ ha->retries++;
+ ha->last_retried_pid = SCpnt->pid;
} else
status = DID_ERROR << 16;
@@ -2545,18 +2540,18 @@
#if defined(DEBUG_INTERRUPT)
if (SCpnt->result || do_trace)
#else
- if ((spp->adapter_status != ASOK && HD(j)->iocount > 1000) ||
+ if ((spp->adapter_status != ASOK && ha->iocount > 1000) ||
(spp->adapter_status != ASOK &&
- spp->adapter_status != ASST && HD(j)->iocount <= 1000) ||
+ spp->adapter_status != ASST && ha->iocount <= 1000) ||
do_trace || msg_byte(spp->target_status))
#endif
printk("%s: ihdlr, mbox %2d, err 0x%x:%x,"
" target %d.%d:%d, pid %ld, reg 0x%x, count %d.\n",
- BN(j), i, spp->adapter_status, spp->target_status,
+ ha->board_name, i, spp->adapter_status, spp->target_status,
SCpnt->device->channel, SCpnt->device->id,
- SCpnt->device->lun, SCpnt->pid, reg, HD(j)->iocount);
+ SCpnt->device->lun, SCpnt->pid, reg, ha->iocount);
- unmap_dma(i, j);
+ unmap_dma(i, ha);
/* Set the command state to inactive */
SCpnt->host_scribble = NULL;
@@ -2564,8 +2559,8 @@
SCpnt->scsi_done(SCpnt);
if (do_trace)
- printk("%s: ihdlr, exit, irq %d, count %d.\n", BN(j), irq,
- HD(j)->iocount);
+ printk("%s: ihdlr, exit, irq %d, count %d.\n", ha->board_name,
+ irq, ha->iocount);
handled:
return IRQ_HANDLED;
@@ -2576,6 +2571,7 @@
static irqreturn_t do_interrupt_handler(int irq, void *shap,
struct pt_regs *regs)
{
+ struct Scsi_Host *shost;
unsigned int j;
unsigned long spin_flags;
irqreturn_t ret;
@@ -2583,41 +2579,38 @@
/* Check if the interrupt must be processed by this handler */
if ((j = (unsigned int)((char *)shap - sha)) >= num_boards)
return IRQ_NONE;
+ shost = sh[j];
- spin_lock_irqsave(sh[j]->host_lock, spin_flags);
- ret = ihdlr(irq, j);
- spin_unlock_irqrestore(sh[j]->host_lock, spin_flags);
+ spin_lock_irqsave(shost->host_lock, spin_flags);
+ ret = ihdlr(irq, shost);
+ spin_unlock_irqrestore(shost->host_lock, spin_flags);
return ret;
}
-static int eata2x_release(struct Scsi_Host *shpnt)
+static int eata2x_release(struct Scsi_Host *shost)
{
- unsigned int i, j;
-
- for (j = 0; sh[j] != NULL && sh[j] != shpnt; j++) ;
-
- if (sh[j] == NULL)
- panic("%s: release, invalid Scsi_Host pointer.\n", driver_name);
+ struct hostdata *ha = (struct hostdata *)shost->hostdata;
+ unsigned int i;
- for (i = 0; i < sh[j]->can_queue; i++)
- if ((&HD(j)->cp[i])->sglist)
- kfree((&HD(j)->cp[i])->sglist);
+ for (i = 0; i < shost->can_queue; i++)
+ if ((&ha->cp[i])->sglist)
+ kfree((&ha->cp[i])->sglist);
- for (i = 0; i < sh[j]->can_queue; i++)
- pci_unmap_single(HD(j)->pdev, HD(j)->cp[i].cp_dma_addr,
+ for (i = 0; i < shost->can_queue; i++)
+ pci_unmap_single(ha->pdev, ha->cp[i].cp_dma_addr,
sizeof(struct mscp), PCI_DMA_BIDIRECTIONAL);
- if (HD(j)->sp_cpu_addr)
- pci_free_consistent(HD(j)->pdev, sizeof(struct mssp),
- HD(j)->sp_cpu_addr, HD(j)->sp_dma_addr);
+ if (ha->sp_cpu_addr)
+ pci_free_consistent(ha->pdev, sizeof(struct mssp),
+ ha->sp_cpu_addr, ha->sp_dma_addr);
- free_irq(sh[j]->irq, &sha[j]);
+ free_irq(shost->irq, &sha[ha->board_number]);
- if (sh[j]->dma_channel != NO_DMA)
- free_dma(sh[j]->dma_channel);
+ if (shost->dma_channel != NO_DMA)
+ free_dma(shost->dma_channel);
- release_region(sh[j]->io_port, sh[j]->n_io_port);
- scsi_unregister(sh[j]);
+ release_region(shost->io_port, shost->n_io_port);
+ scsi_unregister(shost);
return 0;
}
^ permalink raw reply [flat|nested] 4+ messages in thread
* Re: [PATCH] convert eata to pass pointers around
2004-11-02 14:33 [PATCH] convert eata to pass pointers around Christoph Hellwig
@ 2004-11-02 14:54 ` Matthew Wilcox
2004-11-02 15:07 ` Christoph Hellwig
0 siblings, 1 reply; 4+ messages in thread
From: Matthew Wilcox @ 2004-11-02 14:54 UTC (permalink / raw)
To: Christoph Hellwig; +Cc: jejb, linux-scsi
On Tue, Nov 02, 2004 at 03:33:51PM +0100, Christoph Hellwig wrote:
> @@ -836,7 +836,7 @@
> struct mssp sp; /* Local copy of sp buffer */
> };
>
> -static struct Scsi_Host *sh[MAX_BOARDS + 1];
> +struct Scsi_Host *sh[MAX_BOARDS];
> static const char *driver_name = "EATA";
> static char sha[MAX_BOARDS];
> static spinlock_t driver_lock = SPIN_LOCK_UNLOCKED;
Did you mean to un-static 'sh'? This seems like an awfully vague
name to make kernel-global ...
--
"Next the statesmen will invent cheap lies, putting the blame upon
the nation that is attacked, and every man will be glad of those
conscience-soothing falsities, and will diligently study them, and refuse
to examine any refutations of them; and thus he will by and by convince
himself that the war is just, and will thank God for the better sleep
he enjoys after this process of grotesque self-deception." -- Mark Twain
^ permalink raw reply [flat|nested] 4+ messages in thread
* Re: [PATCH] convert eata to pass pointers around
2004-11-02 14:54 ` Matthew Wilcox
@ 2004-11-02 15:07 ` Christoph Hellwig
2004-11-03 12:59 ` Christoph Hellwig
0 siblings, 1 reply; 4+ messages in thread
From: Christoph Hellwig @ 2004-11-02 15:07 UTC (permalink / raw)
To: Matthew Wilcox; +Cc: Christoph Hellwig, jejb, linux-scsi
On Tue, Nov 02, 2004 at 02:54:18PM +0000, Matthew Wilcox wrote:
> On Tue, Nov 02, 2004 at 03:33:51PM +0100, Christoph Hellwig wrote:
> > @@ -836,7 +836,7 @@
> > struct mssp sp; /* Local copy of sp buffer */
> > };
> >
> > -static struct Scsi_Host *sh[MAX_BOARDS + 1];
> > +struct Scsi_Host *sh[MAX_BOARDS];
> > static const char *driver_name = "EATA";
> > static char sha[MAX_BOARDS];
> > static spinlock_t driver_lock = SPIN_LOCK_UNLOCKED;
>
> Did you mean to un-static 'sh'? This seems like an awfully vague
> name to make kernel-global ...
no. but it'll be gone completely in one of the next patches.
^ permalink raw reply [flat|nested] 4+ messages in thread
* Re: [PATCH] convert eata to pass pointers around
2004-11-02 15:07 ` Christoph Hellwig
@ 2004-11-03 12:59 ` Christoph Hellwig
0 siblings, 0 replies; 4+ messages in thread
From: Christoph Hellwig @ 2004-11-03 12:59 UTC (permalink / raw)
To: Matthew Wilcox; +Cc: Christoph Hellwig, jejb, linux-scsi
On Tue, Nov 02, 2004 at 02:54:18PM +0000, Matthew Wilcox wrote:
> Did you mean to un-static 'sh'? This seems like an awfully vague
> name to make kernel-global ...
Here's a patch to put it back:
--- drivers/scsi/eata.c~pointers~ 2004-11-03 12:49:58.095299872 +0100
+++ drivers/scsi/eata.c 2004-11-03 12:50:10.332439544 +0100
@@ -836,7 +836,7 @@
struct mssp sp; /* Local copy of sp buffer */
};
-struct Scsi_Host *sh[MAX_BOARDS];
+static struct Scsi_Host *sh[MAX_BOARDS];
static const char *driver_name = "EATA";
static char sha[MAX_BOARDS];
static spinlock_t driver_lock = SPIN_LOCK_UNLOCKED;
^ permalink raw reply [flat|nested] 4+ messages in thread
end of thread, other threads:[~2004-11-03 13:00 UTC | newest]
Thread overview: 4+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2004-11-02 14:33 [PATCH] convert eata to pass pointers around Christoph Hellwig
2004-11-02 14:54 ` Matthew Wilcox
2004-11-02 15:07 ` Christoph Hellwig
2004-11-03 12:59 ` Christoph Hellwig
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.