2005-04-17 02:20:36 +04:00
/*
* generic / default IDE host driver
*
2008-04-18 02:46:23 +04:00
* Copyright ( C ) 2004 , 2008 Bartlomiej Zolnierkiewicz
2005-04-17 02:20:36 +04:00
* This code was split off from ide . c . See it for original copyrights .
*
* May be copied or modified under the terms of the GNU General Public License .
*/
2008-04-18 02:46:23 +04:00
/*
* For special cases new interfaces may be added using sysfs , i . e .
*
* echo - n " 0x168:0x36e:10 " > / sys / class / ide_generic / add
*
* will add an interface using I / O ports 0x168 - 0x16f / 0x36e and IRQ 10.
*/
2005-04-17 02:20:36 +04:00
# include <linux/kernel.h>
# include <linux/init.h>
# include <linux/module.h>
# include <linux/ide.h>
2008-04-18 02:46:23 +04:00
# define DRV_NAME "ide_generic"
static ssize_t store_add ( struct class * cls , const char * buf , size_t n )
{
ide_hwif_t * hwif ;
unsigned int base , ctl ;
int irq ;
hw_regs_t hw ;
u8 idx [ ] = { 0xff , 0xff , 0xff , 0xff } ;
if ( sscanf ( buf , " %x:%x:%d " , & base , & ctl , & irq ) ! = 3 )
return - EINVAL ;
2008-04-26 19:36:32 +04:00
hwif = ide_find_port ( ) ;
2008-04-18 02:46:23 +04:00
if ( hwif = = NULL )
return - ENOENT ;
memset ( & hw , 0 , sizeof ( hw ) ) ;
ide_std_init_ports ( & hw , base , ctl ) ;
hw . irq = irq ;
hw . chipset = ide_generic ;
ide_init_port_hw ( hwif , & hw ) ;
idx [ 0 ] = hwif - > index ;
ide_device_add ( idx , NULL ) ;
return n ;
} ;
static struct class_attribute ide_generic_class_attrs [ ] = {
__ATTR ( add , S_IWUSR , NULL , store_add ) ,
__ATTR_NULL
} ;
static void ide_generic_class_release ( struct class * cls )
{
kfree ( cls ) ;
}
static int __init ide_generic_sysfs_init ( void )
{
struct class * cls ;
int rc ;
cls = kzalloc ( sizeof ( * cls ) , GFP_KERNEL ) ;
if ( ! cls )
return - ENOMEM ;
cls - > name = DRV_NAME ;
cls - > owner = THIS_MODULE ;
cls - > class_release = ide_generic_class_release ;
cls - > class_attrs = ide_generic_class_attrs ;
rc = class_register ( cls ) ;
if ( rc ) {
kfree ( cls ) ;
return rc ;
}
return 0 ;
}
2005-04-17 02:20:36 +04:00
static int __init ide_generic_init ( void )
{
2008-01-26 22:13:05 +03:00
u8 idx [ MAX_HWIFS ] ;
int i ;
ide-generic: probing bugfix
On Tuesday 05 February 2008, Linus Torvalds wrote:
>
> On Sat, 2 Feb 2008, Bartlomiej Zolnierkiewicz wrote:
> >
> > * next part of IDE probing code re-organization saga
> > (that would be me)
>
> This seems to cause very irritating and bogus messages for me:
>
> Probing IDE interface ide0...
> Probing IDE interface ide1...
> ide2: I/O resource 0x0-0x7 not free.
> ide2: ports already in use, skipping probe
> ide3: I/O resource 0x0-0x7 not free.
> ide3: ports already in use, skipping probe
> ide4: I/O resource 0x0-0x7 not free.
> ide4: ports already in use, skipping probe
> ide5: I/O resource 0x0-0x7 not free.
> ide5: ports already in use, skipping probe
> ide6: I/O resource 0x0-0x7 not free.
> ide6: ports already in use, skipping probe
> ide7: I/O resource 0x0-0x7 not free.
> ide7: ports already in use, skipping probe
> ide8: I/O resource 0x0-0x7 not free.
> ide8: ports already in use, skipping probe
> ide9: I/O resource 0x0-0x7 not free.
> ide9: ports already in use, skipping probe
>
> and that's just totally bogus. It shouldn't even request that region,
> since it's not been allocated!
The commit 139ddfcab50e5eabcc88341c8743a990ac1be6a2 ("ide: move handling of
I/O resources out of ide_probe_port()") changed the ordering of hwif->noprobe
check vs ide_hwif_request_regions() call (so that we now reserve I/O regions
before checking for hwif->noprobe). However ide-generic host driver depended
on hwif->noprobe to be set for skipping probing of empty ide_hwifs[] slots.
Fix it by passing only indexes of non-empty slots to ide_device_add_all()
from ide_generic_init().
Signed-off-by: Bartlomiej Zolnierkiewicz <bzolnier@gmail.com>
2008-02-06 04:57:48 +03:00
for ( i = 0 ; i < MAX_HWIFS ; i + + ) {
2008-04-26 19:36:36 +04:00
ide_hwif_t * hwif ;
2008-04-18 02:46:35 +04:00
unsigned long io_addr = ide_default_io_base ( i ) ;
hw_regs_t hw ;
2008-04-27 00:25:17 +04:00
idx [ i ] = 0xff ;
2008-04-26 19:36:36 +04:00
if ( io_addr ) {
2008-04-27 00:25:17 +04:00
if ( ! request_region ( io_addr , 8 , DRV_NAME ) ) {
printk ( KERN_ERR " %s: I/O resource 0x%lX-0x%lX "
" not free. \n " ,
DRV_NAME , io_addr , io_addr + 7 ) ;
continue ;
}
if ( ! request_region ( io_addr + 0x206 , 1 , DRV_NAME ) ) {
printk ( KERN_ERR " %s: I/O resource 0x%lX "
" not free. \n " ,
DRV_NAME , io_addr + 0x206 ) ;
release_region ( io_addr , 8 ) ;
continue ;
}
2008-04-26 19:36:36 +04:00
/*
* Skip probing if the corresponding
* slot is already occupied .
*/
hwif = ide_find_port ( ) ;
if ( hwif = = NULL | | hwif - > index ! = i ) {
idx [ i ] = 0xff ;
continue ;
}
2008-04-18 02:46:35 +04:00
memset ( & hw , 0 , sizeof ( hw ) ) ;
ide_std_init_ports ( & hw , io_addr , io_addr + 0x206 ) ;
2008-04-18 02:46:35 +04:00
hw . irq = ide_default_irq ( io_addr ) ;
2008-06-10 22:56:36 +04:00
hw . chipset = ide_generic ;
2008-04-18 02:46:35 +04:00
ide_init_port_hw ( hwif , & hw ) ;
ide-generic: probing bugfix
On Tuesday 05 February 2008, Linus Torvalds wrote:
>
> On Sat, 2 Feb 2008, Bartlomiej Zolnierkiewicz wrote:
> >
> > * next part of IDE probing code re-organization saga
> > (that would be me)
>
> This seems to cause very irritating and bogus messages for me:
>
> Probing IDE interface ide0...
> Probing IDE interface ide1...
> ide2: I/O resource 0x0-0x7 not free.
> ide2: ports already in use, skipping probe
> ide3: I/O resource 0x0-0x7 not free.
> ide3: ports already in use, skipping probe
> ide4: I/O resource 0x0-0x7 not free.
> ide4: ports already in use, skipping probe
> ide5: I/O resource 0x0-0x7 not free.
> ide5: ports already in use, skipping probe
> ide6: I/O resource 0x0-0x7 not free.
> ide6: ports already in use, skipping probe
> ide7: I/O resource 0x0-0x7 not free.
> ide7: ports already in use, skipping probe
> ide8: I/O resource 0x0-0x7 not free.
> ide8: ports already in use, skipping probe
> ide9: I/O resource 0x0-0x7 not free.
> ide9: ports already in use, skipping probe
>
> and that's just totally bogus. It shouldn't even request that region,
> since it's not been allocated!
The commit 139ddfcab50e5eabcc88341c8743a990ac1be6a2 ("ide: move handling of
I/O resources out of ide_probe_port()") changed the ordering of hwif->noprobe
check vs ide_hwif_request_regions() call (so that we now reserve I/O regions
before checking for hwif->noprobe). However ide-generic host driver depended
on hwif->noprobe to be set for skipping probing of empty ide_hwifs[] slots.
Fix it by passing only indexes of non-empty slots to ide_device_add_all()
from ide_generic_init().
Signed-off-by: Bartlomiej Zolnierkiewicz <bzolnier@gmail.com>
2008-02-06 04:57:48 +03:00
idx [ i ] = i ;
2008-04-27 00:25:17 +04:00
}
ide-generic: probing bugfix
On Tuesday 05 February 2008, Linus Torvalds wrote:
>
> On Sat, 2 Feb 2008, Bartlomiej Zolnierkiewicz wrote:
> >
> > * next part of IDE probing code re-organization saga
> > (that would be me)
>
> This seems to cause very irritating and bogus messages for me:
>
> Probing IDE interface ide0...
> Probing IDE interface ide1...
> ide2: I/O resource 0x0-0x7 not free.
> ide2: ports already in use, skipping probe
> ide3: I/O resource 0x0-0x7 not free.
> ide3: ports already in use, skipping probe
> ide4: I/O resource 0x0-0x7 not free.
> ide4: ports already in use, skipping probe
> ide5: I/O resource 0x0-0x7 not free.
> ide5: ports already in use, skipping probe
> ide6: I/O resource 0x0-0x7 not free.
> ide6: ports already in use, skipping probe
> ide7: I/O resource 0x0-0x7 not free.
> ide7: ports already in use, skipping probe
> ide8: I/O resource 0x0-0x7 not free.
> ide8: ports already in use, skipping probe
> ide9: I/O resource 0x0-0x7 not free.
> ide9: ports already in use, skipping probe
>
> and that's just totally bogus. It shouldn't even request that region,
> since it's not been allocated!
The commit 139ddfcab50e5eabcc88341c8743a990ac1be6a2 ("ide: move handling of
I/O resources out of ide_probe_port()") changed the ordering of hwif->noprobe
check vs ide_hwif_request_regions() call (so that we now reserve I/O regions
before checking for hwif->noprobe). However ide-generic host driver depended
on hwif->noprobe to be set for skipping probing of empty ide_hwifs[] slots.
Fix it by passing only indexes of non-empty slots to ide_device_add_all()
from ide_generic_init().
Signed-off-by: Bartlomiej Zolnierkiewicz <bzolnier@gmail.com>
2008-02-06 04:57:48 +03:00
}
2008-01-26 22:13:05 +03:00
2008-02-02 21:56:31 +03:00
ide_device_add_all ( idx , NULL ) ;
2005-04-17 02:20:36 +04:00
2008-04-18 02:46:23 +04:00
if ( ide_generic_sysfs_init ( ) )
printk ( KERN_ERR DRV_NAME " : failed to create ide_generic "
" class \n " ) ;
2005-04-17 02:20:36 +04:00
return 0 ;
}
module_init ( ide_generic_init ) ;
MODULE_LICENSE ( " GPL " ) ;