From: "Juergen E. Fischer" On Sat, Jan 24, 2004 at 15:02:12 +0100, Guennadi Liakhovetski wrote: > Correct and forgive me if I am wrong, it looks like you are now poking at > ports without requesting them - in *_porttest. Is it a good idea? Ouch. No, of course not, you are right. Thanks for pointing. I thought I had moved the port testing to aha152x_probe_one... Following patch cleans that up. The port test during autoconfiguration was also done without requesting the region first and there was a bug in auto configuration of a TC1550 controller (both even before the patch). --- drivers/scsi/aha152x.c | 59 ++++++++++++++++++++++++++----------------------- 1 files changed, 32 insertions(+), 27 deletions(-) diff -puN drivers/scsi/aha152x.c~aha152x-update-fix drivers/scsi/aha152x.c --- 25/drivers/scsi/aha152x.c~aha152x-update-fix 2004-01-24 10:39:41.000000000 -0800 +++ 25-akpm/drivers/scsi/aha152x.c 2004-01-24 10:39:41.000000000 -0800 @@ -3593,14 +3593,22 @@ static int checksetup(struct aha152x_set if (i == ARRAY_SIZE(ports)) return 0; + if ( request_region(setup->io_port, IO_RANGE, "aha152x")==0 ) { + printk(KERN_ERR "aha152x: io port 0x%x busy.\n", setup->io_port); + return 0; + } + if( aha152x_porttest(setup->io_port) ) { setup->tc1550=0; } else if( tc1550_porttest(setup->io_port) ) { setup->tc1550=1; } else { + release_region(setup->io_port, IO_RANGE); return 0; } + release_region(setup->io_port, IO_RANGE); + if ((setup->irq < IRQ_MIN) || (setup->irq > IRQ_MAX)) return 0; @@ -3840,45 +3848,42 @@ static int __init aha152x_init(void) if ((setup_count == 1) && (setup[0].io_port == ports[i])) continue; + if ( request_region(ports[i], IO_RANGE, "aha152x")==0 ) { + printk(KERN_ERR "aha152x: io port 0x%x busy.\n", ports[i]); + continue; + } + if (aha152x_porttest(ports[i])) { - ok++; - setup[setup_count].io_port = ports[i]; setup[setup_count].tc1550 = 0; conf.cf_port = (GETPORT(ports[i] + O_PORTA) << 8) + GETPORT(ports[i] + O_PORTB); - - setup[setup_count].irq = IRQ_MIN + conf.cf_irq; - setup[setup_count].scsiid = conf.cf_id; - setup[setup_count].reconnect = conf.cf_tardisc; - setup[setup_count].parity = !conf.cf_parity; - setup[setup_count].synchronous = conf.cf_syncneg; - setup[setup_count].delay = DELAY_DEFAULT; - setup[setup_count].ext_trans = 0; -#if defined(AHA152X_DEBUG) - setup[setup_count].debug = DEBUG_DEFAULT; -#endif - setup_count++; } else if (tc1550_porttest(ports[i])) { - ok++; - setup[setup_count].io_port = ports[i]; setup[setup_count].tc1550 = 1; conf.cf_port = - (GETPORT(ports[i] + O_PORTA) << 8) + GETPORT(ports[i] + O_PORTB); + (GETPORT(ports[i] + O_TC_PORTA) << 8) + GETPORT(ports[i] + O_TC_PORTB); + } else { + release_region(ports[i], IO_RANGE); + continue; + } - setup[setup_count].irq = IRQ_MIN + conf.cf_irq; - setup[setup_count].scsiid = conf.cf_id; - setup[setup_count].reconnect = conf.cf_tardisc; - setup[setup_count].parity = !conf.cf_parity; - setup[setup_count].synchronous = conf.cf_syncneg; - setup[setup_count].delay = DELAY_DEFAULT; - setup[setup_count].ext_trans = 0; + release_region(ports[i], IO_RANGE); + + ok++; + setup[setup_count].io_port = ports[i]; + setup[setup_count].irq = IRQ_MIN + conf.cf_irq; + setup[setup_count].scsiid = conf.cf_id; + setup[setup_count].reconnect = conf.cf_tardisc; + setup[setup_count].parity = !conf.cf_parity; + setup[setup_count].synchronous = conf.cf_syncneg; + setup[setup_count].delay = DELAY_DEFAULT; + setup[setup_count].ext_trans = 0; #if defined(AHA152X_DEBUG) - setup[setup_count].debug = DEBUG_DEFAULT; + setup[setup_count].debug = DEBUG_DEFAULT; #endif - setup_count++; - } + setup_count++; + } if (ok) _