- Remove some pointless checking the driver was performing on the midlayer
- Keep an array of legacy (ISA and VLB) hosts
- Move scsi_remove_host() call to advansys_release() and kill off
advansys_remove
---
drivers/scsi/advansys.c | 121 ++++++++++------------------------------------
1 files changed, 27 insertions(+), 94 deletions(-)
diff --git a/drivers/scsi/advansys.c b/drivers/scsi/advansys.c
index 548ffcd..641bcb7 100644
--- a/drivers/scsi/advansys.c
+++ b/drivers/scsi/advansys.c
@@ -65,6 +65,7 @@
* 6. Remove internal queueing
* 7. Use scsi_transport_spi
* 8. advansys_info is not safe against multiple simultaneous callers
+ * 9. Kill boardp->id
*/
#warning this driver is still not properly converted to the DMA API
@@ -2469,7 +2470,7 @@ do { \
* --- Driver Constants and Macros
*/
-#define ASC_NUM_BOARD_SUPPORTED 16
+#define ASC_LEGACY_BOARD_SUPPORTED 8
#define ASC_NUM_IOPORT_PROBE 4
#define ASC_NUM_BUS 2
@@ -2900,15 +2901,12 @@ typedef struct asc_board {
dvc_var.adv_dvc_var)
#define adv_dvc_to_pdev(adv_dvc) to_pci_dev(adv_dvc_to_board(adv_dvc)->dev)
-/*
- * --- Driver Data
- */
-
-/* Note: All driver global data should be initialized. */
+/* Number of ISA/VLB boards detected in system. */
+static int asc_legacy_count;
+static struct Scsi_Host *asc_legacy_hosts[ASC_LEGACY_BOARD_SUPPORTED];
-/* Number of boards detected in system. */
+/* board number. Used to initialise boardp->id */
static int asc_board_count = 0;
-static struct Scsi_Host *asc_host[ASC_NUM_BOARD_SUPPORTED] = { NULL };
/* Overrun buffer used by all narrow boards. */
static uchar overrun_buf[ASC_OVERRUN_BSIZE] = { 0 };
@@ -2993,7 +2991,7 @@ static void asc_prt_hex(char *f, uchar *, int);
#ifdef CONFIG_PROC_FS
/*
- * advansys_proc_info() - /proc/scsi/advansys/[0-(ASC_NUM_BOARD_SUPPORTED-1)]
+ * advansys_proc_info() - /proc/scsi/advansys/
*
* *buffer: I/O buffer
* **start: if inout == FALSE pointer into buffer where user read should start
@@ -4625,7 +4623,6 @@ static void asc_isr_callback(ASC_DVC_VAR *asc_dvc_varp,
ASC_QDONE_INFO *qdonep)
asc_board_t *boardp;
struct scsi_cmnd *scp;
struct Scsi_Host *shost;
- int i;
ASC_DBG2(1, "asc_isr_callback: asc_dvc_varp 0x%lx, qdonep 0x%lx\n",
(ulong)asc_dvc_varp, (ulong)qdonep);
@@ -4644,23 +4641,7 @@ static void asc_isr_callback(ASC_DVC_VAR *asc_dvc_varp,
ASC_QDONE_INFO *qdonep)
}
ASC_DBG_PRT_CDB(2, scp->cmnd, scp->cmd_len);
- /*
- * If the request's host pointer is not valid, display a
- * message and return.
- */
shost = scp->device->host;
- for (i = 0; i < asc_board_count; i++) {
- if (asc_host[i] == shost) {
- break;
- }
- }
- if (i == asc_board_count) {
- ASC_PRINT2
- ("asc_isr_callback: scp 0x%lx has bad host pointer, host
0x%lx\n",
- (ulong)scp, (ulong)shost);
- return;
- }
-
ASC_STATS(shost, callback);
ASC_DBG1(1, "asc_isr_callback: shost 0x%lx\n", (ulong)shost);
@@ -4788,7 +4769,6 @@ static void adv_isr_callback(ADV_DVC_VAR *adv_dvc_varp,
ADV_SCSI_REQ_Q *scsiqp)
adv_sgblk_t *sgblkp;
struct scsi_cmnd *scp;
struct Scsi_Host *shost;
- int i;
ADV_DCNT resid_cnt;
ASC_DBG2(1, "adv_isr_callback: adv_dvc_varp 0x%lx, scsiqp 0x%lx\n",
@@ -4824,27 +4804,7 @@ static void adv_isr_callback(ADV_DVC_VAR *adv_dvc_varp,
ADV_SCSI_REQ_Q *scsiqp)
}
ASC_DBG_PRT_CDB(2, scp->cmnd, scp->cmd_len);
- /*
- * If the request's host pointer is not valid, display a message
- * and return.
- */
shost = scp->device->host;
- for (i = 0; i < asc_board_count; i++) {
- if (asc_host[i] == shost) {
- break;
- }
- }
- /*
- * Note: If the host structure is not found, the adv_req_t request
- * structure and adv_sgblk_t structure, if any, is dropped.
- */
- if (i == asc_board_count) {
- ASC_PRINT2
- ("adv_isr_callback: scp 0x%lx has bad host pointer, host
0x%lx\n",
- (ulong)scp, (ulong)shost);
- return;
- }
-
ASC_STATS(shost, callback);
ASC_DBG1(1, "adv_isr_callback: shost 0x%lx\n", (ulong)shost);
@@ -16383,13 +16343,10 @@ advansys_board_found(int iop, struct device *dev, int
bus_type)
if (!shost)
return NULL;
- /* Save a pointer to the Scsi_Host of each board found. */
- asc_host[asc_board_count++] = shost;
-
/* Initialize private per board data */
boardp = ASC_BOARDP(shost);
memset(boardp, 0, sizeof(asc_board_t));
- boardp->id = asc_board_count - 1;
+ boardp->id = asc_board_count++;
spin_lock_init(&boardp->lock);
boardp->dev = dev;
@@ -16993,7 +16950,6 @@ advansys_board_found(int iop, struct device *dev, int
bus_type)
iounmap(boardp->ioremap_addr);
err_shost:
scsi_host_put(shost);
- asc_board_count--;
return NULL;
}
@@ -17017,7 +16973,7 @@ static int __init advansys_detect(void)
ASC_DBG(1, "advansys_detect: begin\n");
- asc_board_count = 0;
+ asc_legacy_count = 0;
/*
* If I/O port probing has been modified, then verify and
@@ -17052,10 +17008,10 @@ static int __init advansys_detect(void)
bus, asc_bus_name[bus]);
iop = 0;
- while (asc_board_count < ASC_NUM_BOARD_SUPPORTED) {
+ while (asc_legacy_count < ASC_LEGACY_BOARD_SUPPORTED) {
- ASC_DBG1(2, "advansys_detect: asc_board_count %d\n",
- asc_board_count);
+ ASC_DBG1(2, "advansys_detect: asc_legacy_count %d\n",
+ asc_legacy_count);
switch (asc_bus[bus]) {
case ASC_IS_ISA:
@@ -17151,22 +17107,22 @@ static int __init advansys_detect(void)
}
ASC_DBG1(1, "advansys_detect: iop 0x%x\n", iop);
- /*
- * Adapter not found, try next bus type.
- */
- if (iop == 0) {
+ /* Adapter not found, try next bus type. */
+ if (iop == 0)
break;
- }
shost = advansys_board_found(iop, NULL, asc_bus[bus]);
- if (!shost)
+ if (shost) {
+ asc_legacy_hosts[asc_legacy_count++] = shost;
+ } else {
release_region(iop, ASC_IOADR_GAP);
+ }
}
}
- ASC_DBG1(1, "advansys_detect: done: asc_board_count %d\n",
- asc_board_count);
- return asc_board_count;
+ ASC_DBG1(1, "advansys_detect: done: asc_legacy_count %d\n",
+ asc_legacy_count);
+ return asc_legacy_count;
}
/*
@@ -17176,10 +17132,10 @@ static int __init advansys_detect(void)
*/
static int advansys_release(struct Scsi_Host *shost)
{
- asc_board_t *boardp;
+ asc_board_t *boardp = ASC_BOARDP(shost);
ASC_DBG(1, "advansys_release: begin\n");
- boardp = ASC_BOARDP(shost);
+ scsi_remove_host(shost);
free_irq(shost->irq, shost);
if (shost->dma_channel != NO_ISA_DMA) {
ASC_DBG(1, "advansys_release: free_dma()\n");
@@ -17200,29 +17156,12 @@ static int advansys_release(struct Scsi_Host *shost)
kfree(sgp);
}
}
-#ifdef CONFIG_PROC_FS
- ASC_ASSERT(boardp->prtbuf != NULL);
kfree(boardp->prtbuf);
-#endif /* CONFIG_PROC_FS */
scsi_host_put(shost);
ASC_DBG(1, "advansys_release: end\n");
return 0;
}
-static void __devexit advansys_remove(struct Scsi_Host *shost)
-{
- int i;
- scsi_remove_host(shost);
- advansys_release(shost);
-
- for (i = 0; i < asc_board_count; i++) {
- if (asc_host[i] == shost) {
- asc_host[i] = NULL;
- break;
- }
- }
-}
-
static struct eisa_device_id advansys_eisa_table[] __devinitdata = {
{ "ABP7401" },
{ "ABP7501" },
@@ -17292,7 +17231,7 @@ static __devexit int advansys_eisa_remove(struct device
*dev)
if (!shost)
continue;
ioport = shost->io_port;
- advansys_remove(data->host[i]);
+ advansys_release(data->host[i]);
release_region(ioport, ASC_IOADR_GAP);
}
@@ -17374,7 +17313,7 @@ advansys_pci_probe(struct pci_dev *pdev, const struct
pci_device_id *ent)
static void __devexit advansys_pci_remove(struct pci_dev *pdev)
{
- advansys_remove(pci_get_drvdata(pdev));
+ advansys_release(pci_get_drvdata(pdev));
pci_release_regions(pdev);
pci_disable_device(pdev);
}
@@ -17411,14 +17350,8 @@ static void __exit advansys_exit(void)
pci_unregister_driver(&advansys_pci_driver);
eisa_driver_unregister(&advansys_eisa_driver);
- for (i = 0; i < asc_board_count; i++) {
- struct Scsi_Host *host = asc_host[i];
- if (!host)
- continue;
- scsi_remove_host(host);
- advansys_release(host);
- asc_host[i] = NULL;
- }
+ for (i = 0; i < asc_legacy_count; i++)
+ advansys_release(asc_legacy_hosts[i]);
}
module_init(advansys_init);
--
1.4.4.4
-
To unsubscribe from this list: send the line "unsubscribe linux-scsi" in
the body of a message to [EMAIL PROTECTED]
More majordomo info at http://vger.kernel.org/majordomo-info.html