- 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 majordomo@xxxxxxxxxxxxxxx More majordomo info at http://vger.kernel.org/majordomo-info.html