Groups | Search | Server Info | Keyboard shortcuts | Login | Register [http] [https] [nntp] [nntps]
Groups > linux.kernel > #1492102 > unrolled thread
| Started by | Ondrej Zary <linux@rainbow-software.org> |
|---|---|
| First post | 2016-09-27 21:10 +0200 |
| Last post | 2016-09-29 01:00 +0200 |
| Articles | 2 — 2 participants |
Back to article view | Back to linux.kernel
This discussion starts older than the indexed window; earlier articles aren't shown. The article labeled Started by
below is the oldest one visible, not the original post.
[PATCH 2/3] g_NCR5380: Reduce overrides[] from array to struct Ondrej Zary <linux@rainbow-software.org> - 2016-09-27 21:10 +0200
Re: [PATCH 2/3] g_NCR5380: Reduce overrides[] from array to struct Finn Thain <fthain@telegraphics.com.au> - 2016-09-29 01:00 +0200
| From | Ondrej Zary <linux@rainbow-software.org> |
|---|---|
| Date | 2016-09-27 21:10 +0200 |
| Subject | [PATCH 2/3] g_NCR5380: Reduce overrides[] from array to struct |
| Message-ID | <sm5Vn-4Z0-3@gated-at.bofh.it> |
Remove compile-time card type definition GENERIC_NCR5380_OVERRIDE.
Then remove all code iterating the overrides[] array and reduce it to
struct card.
Signed-off-by: Ondrej Zary <linux@rainbow-software.org>
---
drivers/scsi/g_NCR5380.c | 351 ++++++++++++++++++++++------------------------
1 file changed, 167 insertions(+), 184 deletions(-)
diff --git a/drivers/scsi/g_NCR5380.c b/drivers/scsi/g_NCR5380.c
index 7e50b44e..5162de6 100644
--- a/drivers/scsi/g_NCR5380.c
+++ b/drivers/scsi/g_NCR5380.c
@@ -42,19 +42,12 @@ static int ncr_53c400a;
static int dtc_3181e;
static int hp_c2502;
-static struct override {
+static struct card {
NCR5380_map_type NCR5380_map_name;
int irq;
int dma;
int board; /* Use NCR53c400, Ricoh, etc. extensions ? */
-} overrides
-#ifdef GENERIC_NCR5380_OVERRIDE
-[] __initdata = GENERIC_NCR5380_OVERRIDE;
-#else
-[1] __initdata = { { 0,},};
-#endif
-
-#define NO_OVERRIDES ARRAY_SIZE(overrides)
+} card;
#ifndef SCSI_G_NCR5380_MEM
/*
@@ -85,16 +78,13 @@ static void magic_configure(int idx, u8 irq, u8 magic[])
* @tpnt: the scsi template
*
* Scan for the present of NCR5380, NCR53C400, NCR53C400A, DTC3181E
- * and DTC436(ISAPnP) controllers. If overrides have been set we use
- * them.
+ * and DTC436(ISAPnP) controllers.
*
* Locks: none
*/
static int __init generic_NCR5380_detect(struct scsi_host_template *tpnt)
{
- static int current_override;
- int count;
unsigned int *ports;
u8 *magic = NULL;
#ifndef SCSI_G_NCR5380_MEM
@@ -124,28 +114,25 @@ static int __init generic_NCR5380_detect(struct scsi_host_template *tpnt)
#endif
if (ncr_irq)
- overrides[0].irq = ncr_irq;
+ card.irq = ncr_irq;
if (ncr_dma)
- overrides[0].dma = ncr_dma;
+ card.dma = ncr_dma;
if (ncr_addr)
- overrides[0].NCR5380_map_name = (NCR5380_map_type) ncr_addr;
+ card.NCR5380_map_name = (NCR5380_map_type) ncr_addr;
if (ncr_5380)
- overrides[0].board = BOARD_NCR5380;
+ card.board = BOARD_NCR5380;
else if (ncr_53c400)
- overrides[0].board = BOARD_NCR53C400;
+ card.board = BOARD_NCR53C400;
else if (ncr_53c400a)
- overrides[0].board = BOARD_NCR53C400A;
+ card.board = BOARD_NCR53C400A;
else if (dtc_3181e)
- overrides[0].board = BOARD_DTC3181E;
+ card.board = BOARD_DTC3181E;
else if (hp_c2502)
- overrides[0].board = BOARD_HP_C2502;
+ card.board = BOARD_HP_C2502;
#ifndef SCSI_G_NCR5380_MEM
- if (!current_override && isapnp_present()) {
+ if (isapnp_present()) {
struct pnp_dev *dev = NULL;
- count = 0;
while ((dev = pnp_find_dev(NULL, ISAPNP_VENDOR('D', 'T', 'C'), ISAPNP_FUNCTION(0x436e), dev))) {
- if (count >= NO_OVERRIDES)
- break;
if (pnp_device_attach(dev) < 0)
continue;
if (pnp_activate_dev(dev) < 0) {
@@ -159,202 +146,198 @@ static int __init generic_NCR5380_detect(struct scsi_host_template *tpnt)
continue;
}
if (pnp_irq_valid(dev, 0))
- overrides[count].irq = pnp_irq(dev, 0);
+ card.irq = pnp_irq(dev, 0);
else
- overrides[count].irq = NO_IRQ;
+ card.irq = NO_IRQ;
if (pnp_dma_valid(dev, 0))
- overrides[count].dma = pnp_dma(dev, 0);
+ card.dma = pnp_dma(dev, 0);
else
- overrides[count].dma = DMA_NONE;
- overrides[count].NCR5380_map_name = (NCR5380_map_type) pnp_port_start(dev, 0);
- overrides[count].board = BOARD_DTC3181E;
- count++;
+ card.dma = DMA_NONE;
+ card.NCR5380_map_name = (NCR5380_map_type) pnp_port_start(dev, 0);
+ card.board = BOARD_DTC3181E;
+ break;
}
}
#endif
- for (count = 0; current_override < NO_OVERRIDES; ++current_override) {
- if (!(overrides[current_override].NCR5380_map_name))
- continue;
+ if (!(card.NCR5380_map_name))
+ return 0;
- ports = NULL;
- flags = 0;
- switch (overrides[current_override].board) {
- case BOARD_NCR5380:
- flags = FLAG_NO_PSEUDO_DMA | FLAG_DMA_FIXUP;
- break;
- case BOARD_NCR53C400A:
- ports = ncr_53c400a_ports;
- magic = ncr_53c400a_magic;
- break;
- case BOARD_HP_C2502:
- ports = ncr_53c400a_ports;
- magic = hp_c2502_magic;
- break;
- case BOARD_DTC3181E:
- ports = dtc_3181e_ports;
- magic = ncr_53c400a_magic;
- break;
- }
+ ports = NULL;
+ flags = 0;
+ switch (card.board) {
+ case BOARD_NCR5380:
+ flags = FLAG_NO_PSEUDO_DMA | FLAG_DMA_FIXUP;
+ break;
+ case BOARD_NCR53C400A:
+ ports = ncr_53c400a_ports;
+ magic = ncr_53c400a_magic;
+ break;
+ case BOARD_HP_C2502:
+ ports = ncr_53c400a_ports;
+ magic = hp_c2502_magic;
+ break;
+ case BOARD_DTC3181E:
+ ports = dtc_3181e_ports;
+ magic = ncr_53c400a_magic;
+ break;
+ }
#ifndef SCSI_G_NCR5380_MEM
- if (ports && magic) {
- /* wakeup sequence for the NCR53C400A and DTC3181E */
-
- /* Disable the adapter and look for a free io port */
- magic_configure(-1, 0, magic);
-
- region_size = 16;
-
- if (overrides[current_override].NCR5380_map_name != PORT_AUTO)
- for (i = 0; ports[i]; i++) {
- if (!request_region(ports[i], region_size, "ncr53c80"))
- continue;
- if (overrides[current_override].NCR5380_map_name == ports[i])
- break;
- release_region(ports[i], region_size);
- } else
- for (i = 0; ports[i]; i++) {
- if (!request_region(ports[i], region_size, "ncr53c80"))
- continue;
- if (inb(ports[i]) == 0xff)
- break;
- release_region(ports[i], region_size);
- }
- if (ports[i]) {
- /* At this point we have our region reserved */
- magic_configure(i, 0, magic); /* no IRQ yet */
- outb(0xc0, ports[i] + 9);
- if (inb(ports[i] + 9) != 0x80)
+ if (ports && magic) {
+ /* wakeup sequence for the NCR53C400A and DTC3181E */
+
+ /* Disable the adapter and look for a free io port */
+ magic_configure(-1, 0, magic);
+
+ region_size = 16;
+
+ if (card.NCR5380_map_name != PORT_AUTO)
+ for (i = 0; ports[i]; i++) {
+ if (!request_region(ports[i], region_size, "ncr53c80"))
continue;
- overrides[current_override].NCR5380_map_name = ports[i];
- port_idx = i;
- } else
- continue;
- }
- else
- {
- /* Not a 53C400A style setup - just grab */
- region_size = 8;
- if (!request_region(overrides[current_override].NCR5380_map_name,
- region_size, "ncr5380"))
- continue;
- }
+ if (card.NCR5380_map_name == ports[i])
+ break;
+ release_region(ports[i], region_size);
+ } else
+ for (i = 0; ports[i]; i++) {
+ if (!request_region(ports[i], region_size, "ncr53c80"))
+ continue;
+ if (inb(ports[i]) == 0xff)
+ break;
+ release_region(ports[i], region_size);
+ }
+ if (ports[i]) {
+ /* At this point we have our region reserved */
+ magic_configure(i, 0, magic); /* no IRQ yet */
+ outb(0xc0, ports[i] + 9);
+ if (inb(ports[i] + 9) != 0x80)
+ return 0;
+ card.NCR5380_map_name = ports[i];
+ port_idx = i;
+ } else
+ return 0;
+ }
+ else
+ {
+ /* Not a 53C400A style setup - just grab */
+ region_size = 8;
+ if (!request_region(card.NCR5380_map_name,
+ region_size, "ncr5380"))
+ return 0;
+ }
#else
- base = overrides[current_override].NCR5380_map_name;
- iomem_size = NCR53C400_region_size;
- if (!request_mem_region(base, iomem_size, "ncr5380"))
- continue;
- iomem = ioremap(base, iomem_size);
- if (!iomem) {
- release_mem_region(base, iomem_size);
- continue;
- }
+ base = card.NCR5380_map_name;
+ iomem_size = NCR53C400_region_size;
+ if (!request_mem_region(base, iomem_size, "ncr5380"))
+ return 0;
+ iomem = ioremap(base, iomem_size);
+ if (!iomem) {
+ release_mem_region(base, iomem_size);
+ return 0;
+ }
#endif
- instance = scsi_register(tpnt, sizeof(struct NCR5380_hostdata));
- if (instance == NULL)
- goto out_release;
- hostdata = shost_priv(instance);
+ instance = scsi_register(tpnt, sizeof(struct NCR5380_hostdata));
+ if (instance == NULL)
+ goto out_release;
+ hostdata = shost_priv(instance);
#ifndef SCSI_G_NCR5380_MEM
- instance->io_port = overrides[current_override].NCR5380_map_name;
- instance->n_io_port = region_size;
- hostdata->io_width = 1; /* 8-bit PDMA by default */
-
- /*
- * On NCR53C400 boards, NCR5380 registers are mapped 8 past
- * the base address.
- */
- switch (overrides[current_override].board) {
- case BOARD_NCR53C400:
- instance->io_port += 8;
- hostdata->c400_ctl_status = 0;
- hostdata->c400_blk_cnt = 1;
- hostdata->c400_host_buf = 4;
- break;
- case BOARD_DTC3181E:
- hostdata->io_width = 2; /* 16-bit PDMA */
- /* fall through */
- case BOARD_NCR53C400A:
- case BOARD_HP_C2502:
- hostdata->c400_ctl_status = 9;
- hostdata->c400_blk_cnt = 10;
- hostdata->c400_host_buf = 8;
- break;
- }
+ instance->io_port = card.NCR5380_map_name;
+ instance->n_io_port = region_size;
+ hostdata->io_width = 1; /* 8-bit PDMA by default */
+
+ /*
+ * On NCR53C400 boards, NCR5380 registers are mapped 8 past
+ * the base address.
+ */
+ switch (card.board) {
+ case BOARD_NCR53C400:
+ instance->io_port += 8;
+ hostdata->c400_ctl_status = 0;
+ hostdata->c400_blk_cnt = 1;
+ hostdata->c400_host_buf = 4;
+ break;
+ case BOARD_DTC3181E:
+ hostdata->io_width = 2; /* 16-bit PDMA */
+ /* fall through */
+ case BOARD_NCR53C400A:
+ case BOARD_HP_C2502:
+ hostdata->c400_ctl_status = 9;
+ hostdata->c400_blk_cnt = 10;
+ hostdata->c400_host_buf = 8;
+ break;
+ }
#else
- instance->base = overrides[current_override].NCR5380_map_name;
- hostdata->iomem = iomem;
- hostdata->iomem_size = iomem_size;
- switch (overrides[current_override].board) {
- case BOARD_NCR53C400:
- hostdata->c400_ctl_status = 0x100;
- hostdata->c400_blk_cnt = 0x101;
- hostdata->c400_host_buf = 0x104;
- break;
- case BOARD_DTC3181E:
- case BOARD_NCR53C400A:
- case BOARD_HP_C2502:
- pr_err(DRV_MODULE_NAME ": unknown register offsets\n");
- goto out_unregister;
- }
+ instance->base = card.NCR5380_map_name;
+ hostdata->iomem = iomem;
+ hostdata->iomem_size = iomem_size;
+ switch (card.board) {
+ case BOARD_NCR53C400:
+ hostdata->c400_ctl_status = 0x100;
+ hostdata->c400_blk_cnt = 0x101;
+ hostdata->c400_host_buf = 0x104;
+ break;
+ case BOARD_DTC3181E:
+ case BOARD_NCR53C400A:
+ case BOARD_HP_C2502:
+ pr_err(DRV_MODULE_NAME ": unknown register offsets\n");
+ goto out_unregister;
+ }
#endif
- if (NCR5380_init(instance, flags | FLAG_LATE_DMA_SETUP))
- goto out_unregister;
+ if (NCR5380_init(instance, flags | FLAG_LATE_DMA_SETUP))
+ goto out_unregister;
- switch (overrides[current_override].board) {
- case BOARD_NCR53C400:
- case BOARD_DTC3181E:
- case BOARD_NCR53C400A:
- case BOARD_HP_C2502:
- NCR5380_write(hostdata->c400_ctl_status, CSR_BASE);
- }
+ switch (card.board) {
+ case BOARD_NCR53C400:
+ case BOARD_DTC3181E:
+ case BOARD_NCR53C400A:
+ case BOARD_HP_C2502:
+ NCR5380_write(hostdata->c400_ctl_status, CSR_BASE);
+ }
- NCR5380_maybe_reset_bus(instance);
+ NCR5380_maybe_reset_bus(instance);
- if (overrides[current_override].irq != IRQ_AUTO)
- instance->irq = overrides[current_override].irq;
- else
- instance->irq = NCR5380_probe_irq(instance, 0xffff);
+ if (card.irq != IRQ_AUTO)
+ instance->irq = card.irq;
+ else
+ instance->irq = NCR5380_probe_irq(instance, 0xffff);
- /* Compatibility with documented NCR5380 kernel parameters */
- if (instance->irq == 255)
- instance->irq = NO_IRQ;
+ /* Compatibility with documented NCR5380 kernel parameters */
+ if (instance->irq == 255)
+ instance->irq = NO_IRQ;
- if (instance->irq != NO_IRQ) {
+ if (instance->irq != NO_IRQ) {
#ifndef SCSI_G_NCR5380_MEM
- /* set IRQ for HP C2502 */
- if (overrides[current_override].board == BOARD_HP_C2502)
- magic_configure(port_idx, instance->irq, magic);
+ /* set IRQ for HP C2502 */
+ if (card.board == BOARD_HP_C2502)
+ magic_configure(port_idx, instance->irq, magic);
#endif
- if (request_irq(instance->irq, generic_NCR5380_intr,
- 0, "NCR5380", instance)) {
- printk(KERN_WARNING "scsi%d : IRQ%d not free, interrupts disabled\n", instance->host_no, instance->irq);
- instance->irq = NO_IRQ;
- }
- }
-
- if (instance->irq == NO_IRQ) {
- printk(KERN_INFO "scsi%d : interrupts not enabled. for better interactive performance,\n", instance->host_no);
- printk(KERN_INFO "scsi%d : please jumper the board for a free IRQ.\n", instance->host_no);
+ if (request_irq(instance->irq, generic_NCR5380_intr,
+ 0, "NCR5380", instance)) {
+ printk(KERN_WARNING "scsi%d : IRQ%d not free, interrupts disabled\n", instance->host_no, instance->irq);
+ instance->irq = NO_IRQ;
}
+ }
- ++current_override;
- ++count;
+ if (instance->irq == NO_IRQ) {
+ printk(KERN_INFO "scsi%d : interrupts not enabled. for better interactive performance,\n", instance->host_no);
+ printk(KERN_INFO "scsi%d : please jumper the board for a free IRQ.\n", instance->host_no);
}
- return count;
+
+ return 1;
out_unregister:
scsi_unregister(instance);
out_release:
#ifndef SCSI_G_NCR5380_MEM
- release_region(overrides[current_override].NCR5380_map_name, region_size);
+ release_region(card.NCR5380_map_name, region_size);
#else
iounmap(iomem);
release_mem_region(base, iomem_size);
#endif
- return count;
+ return 0;
}
/**
--
Ondrej Zary
[toc] | [next] | [standalone]
| From | Finn Thain <fthain@telegraphics.com.au> |
|---|---|
| Date | 2016-09-29 01:00 +0200 |
| Message-ID | <smvZv-4rb-11@gated-at.bofh.it> |
| In reply to | #1492102 |
Acked-by: Finn Thain <fthain@telegraphics.com.au>
On Tue, 27 Sep 2016, Ondrej Zary wrote:
> Remove compile-time card type definition GENERIC_NCR5380_OVERRIDE.
> Then remove all code iterating the overrides[] array and reduce it to
> struct card.
>
> Signed-off-by: Ondrej Zary <linux@rainbow-software.org>
> ---
> drivers/scsi/g_NCR5380.c | 351 ++++++++++++++++++++++------------------------
> 1 file changed, 167 insertions(+), 184 deletions(-)
>
> diff --git a/drivers/scsi/g_NCR5380.c b/drivers/scsi/g_NCR5380.c
> index 7e50b44e..5162de6 100644
> --- a/drivers/scsi/g_NCR5380.c
> +++ b/drivers/scsi/g_NCR5380.c
> @@ -42,19 +42,12 @@ static int ncr_53c400a;
> static int dtc_3181e;
> static int hp_c2502;
>
> -static struct override {
> +static struct card {
> NCR5380_map_type NCR5380_map_name;
> int irq;
> int dma;
> int board; /* Use NCR53c400, Ricoh, etc. extensions ? */
> -} overrides
> -#ifdef GENERIC_NCR5380_OVERRIDE
> -[] __initdata = GENERIC_NCR5380_OVERRIDE;
> -#else
> -[1] __initdata = { { 0,},};
> -#endif
> -
> -#define NO_OVERRIDES ARRAY_SIZE(overrides)
> +} card;
>
> #ifndef SCSI_G_NCR5380_MEM
> /*
> @@ -85,16 +78,13 @@ static void magic_configure(int idx, u8 irq, u8 magic[])
> * @tpnt: the scsi template
> *
> * Scan for the present of NCR5380, NCR53C400, NCR53C400A, DTC3181E
> - * and DTC436(ISAPnP) controllers. If overrides have been set we use
> - * them.
> + * and DTC436(ISAPnP) controllers.
> *
> * Locks: none
> */
>
> static int __init generic_NCR5380_detect(struct scsi_host_template *tpnt)
> {
> - static int current_override;
> - int count;
> unsigned int *ports;
> u8 *magic = NULL;
> #ifndef SCSI_G_NCR5380_MEM
> @@ -124,28 +114,25 @@ static int __init generic_NCR5380_detect(struct scsi_host_template *tpnt)
> #endif
>
> if (ncr_irq)
> - overrides[0].irq = ncr_irq;
> + card.irq = ncr_irq;
> if (ncr_dma)
> - overrides[0].dma = ncr_dma;
> + card.dma = ncr_dma;
> if (ncr_addr)
> - overrides[0].NCR5380_map_name = (NCR5380_map_type) ncr_addr;
> + card.NCR5380_map_name = (NCR5380_map_type) ncr_addr;
> if (ncr_5380)
> - overrides[0].board = BOARD_NCR5380;
> + card.board = BOARD_NCR5380;
> else if (ncr_53c400)
> - overrides[0].board = BOARD_NCR53C400;
> + card.board = BOARD_NCR53C400;
> else if (ncr_53c400a)
> - overrides[0].board = BOARD_NCR53C400A;
> + card.board = BOARD_NCR53C400A;
> else if (dtc_3181e)
> - overrides[0].board = BOARD_DTC3181E;
> + card.board = BOARD_DTC3181E;
> else if (hp_c2502)
> - overrides[0].board = BOARD_HP_C2502;
> + card.board = BOARD_HP_C2502;
> #ifndef SCSI_G_NCR5380_MEM
> - if (!current_override && isapnp_present()) {
> + if (isapnp_present()) {
> struct pnp_dev *dev = NULL;
> - count = 0;
> while ((dev = pnp_find_dev(NULL, ISAPNP_VENDOR('D', 'T', 'C'), ISAPNP_FUNCTION(0x436e), dev))) {
> - if (count >= NO_OVERRIDES)
> - break;
> if (pnp_device_attach(dev) < 0)
> continue;
> if (pnp_activate_dev(dev) < 0) {
> @@ -159,202 +146,198 @@ static int __init generic_NCR5380_detect(struct scsi_host_template *tpnt)
> continue;
> }
> if (pnp_irq_valid(dev, 0))
> - overrides[count].irq = pnp_irq(dev, 0);
> + card.irq = pnp_irq(dev, 0);
> else
> - overrides[count].irq = NO_IRQ;
> + card.irq = NO_IRQ;
> if (pnp_dma_valid(dev, 0))
> - overrides[count].dma = pnp_dma(dev, 0);
> + card.dma = pnp_dma(dev, 0);
> else
> - overrides[count].dma = DMA_NONE;
> - overrides[count].NCR5380_map_name = (NCR5380_map_type) pnp_port_start(dev, 0);
> - overrides[count].board = BOARD_DTC3181E;
> - count++;
> + card.dma = DMA_NONE;
> + card.NCR5380_map_name = (NCR5380_map_type) pnp_port_start(dev, 0);
> + card.board = BOARD_DTC3181E;
> + break;
> }
> }
> #endif
>
> - for (count = 0; current_override < NO_OVERRIDES; ++current_override) {
> - if (!(overrides[current_override].NCR5380_map_name))
> - continue;
> + if (!(card.NCR5380_map_name))
> + return 0;
>
> - ports = NULL;
> - flags = 0;
> - switch (overrides[current_override].board) {
> - case BOARD_NCR5380:
> - flags = FLAG_NO_PSEUDO_DMA | FLAG_DMA_FIXUP;
> - break;
> - case BOARD_NCR53C400A:
> - ports = ncr_53c400a_ports;
> - magic = ncr_53c400a_magic;
> - break;
> - case BOARD_HP_C2502:
> - ports = ncr_53c400a_ports;
> - magic = hp_c2502_magic;
> - break;
> - case BOARD_DTC3181E:
> - ports = dtc_3181e_ports;
> - magic = ncr_53c400a_magic;
> - break;
> - }
> + ports = NULL;
> + flags = 0;
> + switch (card.board) {
> + case BOARD_NCR5380:
> + flags = FLAG_NO_PSEUDO_DMA | FLAG_DMA_FIXUP;
> + break;
> + case BOARD_NCR53C400A:
> + ports = ncr_53c400a_ports;
> + magic = ncr_53c400a_magic;
> + break;
> + case BOARD_HP_C2502:
> + ports = ncr_53c400a_ports;
> + magic = hp_c2502_magic;
> + break;
> + case BOARD_DTC3181E:
> + ports = dtc_3181e_ports;
> + magic = ncr_53c400a_magic;
> + break;
> + }
>
> #ifndef SCSI_G_NCR5380_MEM
> - if (ports && magic) {
> - /* wakeup sequence for the NCR53C400A and DTC3181E */
> -
> - /* Disable the adapter and look for a free io port */
> - magic_configure(-1, 0, magic);
> -
> - region_size = 16;
> -
> - if (overrides[current_override].NCR5380_map_name != PORT_AUTO)
> - for (i = 0; ports[i]; i++) {
> - if (!request_region(ports[i], region_size, "ncr53c80"))
> - continue;
> - if (overrides[current_override].NCR5380_map_name == ports[i])
> - break;
> - release_region(ports[i], region_size);
> - } else
> - for (i = 0; ports[i]; i++) {
> - if (!request_region(ports[i], region_size, "ncr53c80"))
> - continue;
> - if (inb(ports[i]) == 0xff)
> - break;
> - release_region(ports[i], region_size);
> - }
> - if (ports[i]) {
> - /* At this point we have our region reserved */
> - magic_configure(i, 0, magic); /* no IRQ yet */
> - outb(0xc0, ports[i] + 9);
> - if (inb(ports[i] + 9) != 0x80)
> + if (ports && magic) {
> + /* wakeup sequence for the NCR53C400A and DTC3181E */
> +
> + /* Disable the adapter and look for a free io port */
> + magic_configure(-1, 0, magic);
> +
> + region_size = 16;
> +
> + if (card.NCR5380_map_name != PORT_AUTO)
> + for (i = 0; ports[i]; i++) {
> + if (!request_region(ports[i], region_size, "ncr53c80"))
> continue;
> - overrides[current_override].NCR5380_map_name = ports[i];
> - port_idx = i;
> - } else
> - continue;
> - }
> - else
> - {
> - /* Not a 53C400A style setup - just grab */
> - region_size = 8;
> - if (!request_region(overrides[current_override].NCR5380_map_name,
> - region_size, "ncr5380"))
> - continue;
> - }
> + if (card.NCR5380_map_name == ports[i])
> + break;
> + release_region(ports[i], region_size);
> + } else
> + for (i = 0; ports[i]; i++) {
> + if (!request_region(ports[i], region_size, "ncr53c80"))
> + continue;
> + if (inb(ports[i]) == 0xff)
> + break;
> + release_region(ports[i], region_size);
> + }
> + if (ports[i]) {
> + /* At this point we have our region reserved */
> + magic_configure(i, 0, magic); /* no IRQ yet */
> + outb(0xc0, ports[i] + 9);
> + if (inb(ports[i] + 9) != 0x80)
> + return 0;
> + card.NCR5380_map_name = ports[i];
> + port_idx = i;
> + } else
> + return 0;
> + }
> + else
> + {
> + /* Not a 53C400A style setup - just grab */
> + region_size = 8;
> + if (!request_region(card.NCR5380_map_name,
> + region_size, "ncr5380"))
> + return 0;
> + }
> #else
> - base = overrides[current_override].NCR5380_map_name;
> - iomem_size = NCR53C400_region_size;
> - if (!request_mem_region(base, iomem_size, "ncr5380"))
> - continue;
> - iomem = ioremap(base, iomem_size);
> - if (!iomem) {
> - release_mem_region(base, iomem_size);
> - continue;
> - }
> + base = card.NCR5380_map_name;
> + iomem_size = NCR53C400_region_size;
> + if (!request_mem_region(base, iomem_size, "ncr5380"))
> + return 0;
> + iomem = ioremap(base, iomem_size);
> + if (!iomem) {
> + release_mem_region(base, iomem_size);
> + return 0;
> + }
> #endif
> - instance = scsi_register(tpnt, sizeof(struct NCR5380_hostdata));
> - if (instance == NULL)
> - goto out_release;
> - hostdata = shost_priv(instance);
> + instance = scsi_register(tpnt, sizeof(struct NCR5380_hostdata));
> + if (instance == NULL)
> + goto out_release;
> + hostdata = shost_priv(instance);
>
> #ifndef SCSI_G_NCR5380_MEM
> - instance->io_port = overrides[current_override].NCR5380_map_name;
> - instance->n_io_port = region_size;
> - hostdata->io_width = 1; /* 8-bit PDMA by default */
> -
> - /*
> - * On NCR53C400 boards, NCR5380 registers are mapped 8 past
> - * the base address.
> - */
> - switch (overrides[current_override].board) {
> - case BOARD_NCR53C400:
> - instance->io_port += 8;
> - hostdata->c400_ctl_status = 0;
> - hostdata->c400_blk_cnt = 1;
> - hostdata->c400_host_buf = 4;
> - break;
> - case BOARD_DTC3181E:
> - hostdata->io_width = 2; /* 16-bit PDMA */
> - /* fall through */
> - case BOARD_NCR53C400A:
> - case BOARD_HP_C2502:
> - hostdata->c400_ctl_status = 9;
> - hostdata->c400_blk_cnt = 10;
> - hostdata->c400_host_buf = 8;
> - break;
> - }
> + instance->io_port = card.NCR5380_map_name;
> + instance->n_io_port = region_size;
> + hostdata->io_width = 1; /* 8-bit PDMA by default */
> +
> + /*
> + * On NCR53C400 boards, NCR5380 registers are mapped 8 past
> + * the base address.
> + */
> + switch (card.board) {
> + case BOARD_NCR53C400:
> + instance->io_port += 8;
> + hostdata->c400_ctl_status = 0;
> + hostdata->c400_blk_cnt = 1;
> + hostdata->c400_host_buf = 4;
> + break;
> + case BOARD_DTC3181E:
> + hostdata->io_width = 2; /* 16-bit PDMA */
> + /* fall through */
> + case BOARD_NCR53C400A:
> + case BOARD_HP_C2502:
> + hostdata->c400_ctl_status = 9;
> + hostdata->c400_blk_cnt = 10;
> + hostdata->c400_host_buf = 8;
> + break;
> + }
> #else
> - instance->base = overrides[current_override].NCR5380_map_name;
> - hostdata->iomem = iomem;
> - hostdata->iomem_size = iomem_size;
> - switch (overrides[current_override].board) {
> - case BOARD_NCR53C400:
> - hostdata->c400_ctl_status = 0x100;
> - hostdata->c400_blk_cnt = 0x101;
> - hostdata->c400_host_buf = 0x104;
> - break;
> - case BOARD_DTC3181E:
> - case BOARD_NCR53C400A:
> - case BOARD_HP_C2502:
> - pr_err(DRV_MODULE_NAME ": unknown register offsets\n");
> - goto out_unregister;
> - }
> + instance->base = card.NCR5380_map_name;
> + hostdata->iomem = iomem;
> + hostdata->iomem_size = iomem_size;
> + switch (card.board) {
> + case BOARD_NCR53C400:
> + hostdata->c400_ctl_status = 0x100;
> + hostdata->c400_blk_cnt = 0x101;
> + hostdata->c400_host_buf = 0x104;
> + break;
> + case BOARD_DTC3181E:
> + case BOARD_NCR53C400A:
> + case BOARD_HP_C2502:
> + pr_err(DRV_MODULE_NAME ": unknown register offsets\n");
> + goto out_unregister;
> + }
> #endif
>
> - if (NCR5380_init(instance, flags | FLAG_LATE_DMA_SETUP))
> - goto out_unregister;
> + if (NCR5380_init(instance, flags | FLAG_LATE_DMA_SETUP))
> + goto out_unregister;
>
> - switch (overrides[current_override].board) {
> - case BOARD_NCR53C400:
> - case BOARD_DTC3181E:
> - case BOARD_NCR53C400A:
> - case BOARD_HP_C2502:
> - NCR5380_write(hostdata->c400_ctl_status, CSR_BASE);
> - }
> + switch (card.board) {
> + case BOARD_NCR53C400:
> + case BOARD_DTC3181E:
> + case BOARD_NCR53C400A:
> + case BOARD_HP_C2502:
> + NCR5380_write(hostdata->c400_ctl_status, CSR_BASE);
> + }
>
> - NCR5380_maybe_reset_bus(instance);
> + NCR5380_maybe_reset_bus(instance);
>
> - if (overrides[current_override].irq != IRQ_AUTO)
> - instance->irq = overrides[current_override].irq;
> - else
> - instance->irq = NCR5380_probe_irq(instance, 0xffff);
> + if (card.irq != IRQ_AUTO)
> + instance->irq = card.irq;
> + else
> + instance->irq = NCR5380_probe_irq(instance, 0xffff);
>
> - /* Compatibility with documented NCR5380 kernel parameters */
> - if (instance->irq == 255)
> - instance->irq = NO_IRQ;
> + /* Compatibility with documented NCR5380 kernel parameters */
> + if (instance->irq == 255)
> + instance->irq = NO_IRQ;
>
> - if (instance->irq != NO_IRQ) {
> + if (instance->irq != NO_IRQ) {
> #ifndef SCSI_G_NCR5380_MEM
> - /* set IRQ for HP C2502 */
> - if (overrides[current_override].board == BOARD_HP_C2502)
> - magic_configure(port_idx, instance->irq, magic);
> + /* set IRQ for HP C2502 */
> + if (card.board == BOARD_HP_C2502)
> + magic_configure(port_idx, instance->irq, magic);
> #endif
> - if (request_irq(instance->irq, generic_NCR5380_intr,
> - 0, "NCR5380", instance)) {
> - printk(KERN_WARNING "scsi%d : IRQ%d not free, interrupts disabled\n", instance->host_no, instance->irq);
> - instance->irq = NO_IRQ;
> - }
> - }
> -
> - if (instance->irq == NO_IRQ) {
> - printk(KERN_INFO "scsi%d : interrupts not enabled. for better interactive performance,\n", instance->host_no);
> - printk(KERN_INFO "scsi%d : please jumper the board for a free IRQ.\n", instance->host_no);
> + if (request_irq(instance->irq, generic_NCR5380_intr,
> + 0, "NCR5380", instance)) {
> + printk(KERN_WARNING "scsi%d : IRQ%d not free, interrupts disabled\n", instance->host_no, instance->irq);
> + instance->irq = NO_IRQ;
> }
> + }
>
> - ++current_override;
> - ++count;
> + if (instance->irq == NO_IRQ) {
> + printk(KERN_INFO "scsi%d : interrupts not enabled. for better interactive performance,\n", instance->host_no);
> + printk(KERN_INFO "scsi%d : please jumper the board for a free IRQ.\n", instance->host_no);
> }
> - return count;
> +
> + return 1;
>
> out_unregister:
> scsi_unregister(instance);
> out_release:
> #ifndef SCSI_G_NCR5380_MEM
> - release_region(overrides[current_override].NCR5380_map_name, region_size);
> + release_region(card.NCR5380_map_name, region_size);
> #else
> iounmap(iomem);
> release_mem_region(base, iomem_size);
> #endif
> - return count;
> + return 0;
> }
>
> /**
>
[toc] | [prev] | [standalone]
Back to top | Article view | linux.kernel
csiph-web