Commit d84c369b authored by Vojtech Pavlik's avatar Vojtech Pavlik

Merge suse.cz:/home/vojtech/bk/linus into suse.cz:/home/vojtech/bk/input

parents 0a19ea8e b1c76c1c
...@@ -29,8 +29,8 @@ static int button_pressed; ...@@ -29,8 +29,8 @@ static int button_pressed;
static irqreturn_t power_handler(int irq, void *dev_id, struct pt_regs *regs) static irqreturn_t power_handler(int irq, void *dev_id, struct pt_regs *regs)
{ {
if (button_pressed == 0) { if (button_pressed == 0) {
wake_up(&powerd_wait);
button_pressed = 1; button_pressed = 1;
wake_up(&powerd_wait);
} }
/* FIXME: Check registers for status... */ /* FIXME: Check registers for status... */
...@@ -86,10 +86,10 @@ static int powerd(void *__unused) ...@@ -86,10 +86,10 @@ static int powerd(void *__unused)
remove_wait_queue(&powerd_wait, &wait); remove_wait_queue(&powerd_wait, &wait);
/* Ok, down we go... */ /* Ok, down we go... */
button_pressed = 0;
if (execve("/sbin/shutdown", argv, envp) < 0) { if (execve("/sbin/shutdown", argv, envp) < 0) {
printk("powerd: shutdown execution failed\n"); printk("powerd: shutdown execution failed\n");
add_wait_queue(&powerd_wait, &wait); add_wait_queue(&powerd_wait, &wait);
button_pressed = 0;
goto again; goto again;
} }
return 0; return 0;
......
...@@ -145,6 +145,8 @@ void blk_queue_activity_fn(request_queue_t *q, activity_fn *fn, void *data) ...@@ -145,6 +145,8 @@ void blk_queue_activity_fn(request_queue_t *q, activity_fn *fn, void *data)
q->activity_data = data; q->activity_data = data;
} }
EXPORT_SYMBOL(blk_queue_activity_fn);
/** /**
* blk_queue_prep_rq - set a prepare_request function for queue * blk_queue_prep_rq - set a prepare_request function for queue
* @q: queue * @q: queue
......
...@@ -296,6 +296,12 @@ config IDE_TASKFILE_IO ...@@ -296,6 +296,12 @@ config IDE_TASKFILE_IO
comment "IDE chipset support/bugfixes" comment "IDE chipset support/bugfixes"
config IDE_GENERIC
tristate "generic/default IDE chipset support"
default y
help
If unsure, say Y.
config BLK_DEV_CMD640 config BLK_DEV_CMD640
bool "CMD640 chipset bugfix/support" bool "CMD640 chipset bugfix/support"
depends on X86 depends on X86
......
...@@ -13,22 +13,38 @@ EXTRA_CFLAGS += -Idrivers/ide ...@@ -13,22 +13,38 @@ EXTRA_CFLAGS += -Idrivers/ide
obj-$(CONFIG_BLK_DEV_IDE) += pci/ obj-$(CONFIG_BLK_DEV_IDE) += pci/
ide-core-y += ide.o ide-default.o ide-io.o ide-iops.o ide-lib.o ide-probe.o \
ide-taskfile.o
ide-core-$(CONFIG_BLK_DEV_CMD640) += pci/cmd640.o
# Core IDE code - must come before legacy # Core IDE code - must come before legacy
ide-core-$(CONFIG_BLK_DEV_IDEPCI) += setup-pci.o
ide-core-$(CONFIG_BLK_DEV_IDEDMA_PCI) += ide-dma.o
ide-core-$(CONFIG_BLK_DEV_IDE_TCQ) += ide-tcq.o
ide-core-$(CONFIG_PROC_FS) += ide-proc.o
ide-core-$(CONFIG_BLK_DEV_IDEPNP) += ide-pnp.o
# built-in only drivers from legacy/
ide-core-$(CONFIG_BLK_DEV_IDE_PC9800) += legacy/pc9800.o
ide-core-$(CONFIG_BLK_DEV_BUDDHA) += legacy/buddha.o
ide-core-$(CONFIG_BLK_DEV_FALCON_IDE) += legacy/falconide.o
ide-core-$(CONFIG_BLK_DEV_GAYLE) += legacy/gayle.o
ide-core-$(CONFIG_BLK_DEV_MAC_IDE) += legacy/macide.o
ide-core-$(CONFIG_BLK_DEV_Q40IDE) += legacy/q40ide.o
# built-in only drivers from ppc/
ide-core-$(CONFIG_BLK_DEV_MPC8xx_IDE) += ppc/mpc8xx.o
ide-core-$(CONFIG_BLK_DEV_IDE_PMAC) += ppc/pmac.o
ide-core-$(CONFIG_BLK_DEV_IDE_SWARM) += ppc/swarm.o
obj-$(CONFIG_BLK_DEV_IDE) += ide-core.o
obj-$(CONFIG_IDE_GENERIC) += ide-generic.o
obj-$(CONFIG_BLK_DEV_IDE) += ide-io.o ide-probe.o ide-iops.o ide-taskfile.o ide.o ide-lib.o ide-default.o
obj-$(CONFIG_BLK_DEV_IDEDISK) += ide-disk.o obj-$(CONFIG_BLK_DEV_IDEDISK) += ide-disk.o
obj-$(CONFIG_BLK_DEV_IDECD) += ide-cd.o obj-$(CONFIG_BLK_DEV_IDECD) += ide-cd.o
obj-$(CONFIG_BLK_DEV_IDETAPE) += ide-tape.o obj-$(CONFIG_BLK_DEV_IDETAPE) += ide-tape.o
obj-$(CONFIG_BLK_DEV_IDEFLOPPY) += ide-floppy.o obj-$(CONFIG_BLK_DEV_IDEFLOPPY) += ide-floppy.o
obj-$(CONFIG_BLK_DEV_IDEPCI) += setup-pci.o obj-$(CONFIG_BLK_DEV_IDE) += legacy/ arm/
obj-$(CONFIG_BLK_DEV_IDEDMA_PCI) += ide-dma.o
obj-$(CONFIG_BLK_DEV_IDE_TCQ) += ide-tcq.o
obj-$(CONFIG_BLK_DEV_IDEPNP) += ide-pnp.o
ifeq ($(CONFIG_BLK_DEV_IDE),y)
obj-$(CONFIG_PROC_FS) += ide-proc.o
endif
obj-$(CONFIG_BLK_DEV_IDE) += legacy/ ppc/ arm/
obj-$(CONFIG_BLK_DEV_HD) += legacy/ obj-$(CONFIG_BLK_DEV_HD) += legacy/
/*
* generic/default IDE host driver
*
* Copyright (C) 2004 Bartlomiej Zolnierkiewicz
* 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.
*/
#include <linux/kernel.h>
#include <linux/init.h>
#include <linux/module.h>
#include <linux/ide.h>
static int __init ide_generic_init(void)
{
MOD_INC_USE_COUNT;
if (ide_hwifs[0].io_ports[IDE_DATA_OFFSET])
ide_get_lock(NULL, NULL); /* for atari only */
(void)ideprobe_init();
if (ide_hwifs[0].io_ports[IDE_DATA_OFFSET])
ide_release_lock(); /* for atari only */
#ifdef CONFIG_PROC_FS
create_proc_ide_interfaces();
#endif
return 0;
}
module_init(ide_generic_init);
MODULE_LICENSE("GPL");
...@@ -1323,7 +1323,6 @@ int ideprobe_init (void) ...@@ -1323,7 +1323,6 @@ int ideprobe_init (void)
unsigned int index; unsigned int index;
int probe[MAX_HWIFS]; int probe[MAX_HWIFS];
MOD_INC_USE_COUNT;
memset(probe, 0, MAX_HWIFS * sizeof(int)); memset(probe, 0, MAX_HWIFS * sizeof(int));
for (index = 0; index < MAX_HWIFS; ++index) for (index = 0; index < MAX_HWIFS; ++index)
probe[index] = !ide_hwifs[index].present; probe[index] = !ide_hwifs[index].present;
...@@ -1343,32 +1342,14 @@ int ideprobe_init (void) ...@@ -1343,32 +1342,14 @@ int ideprobe_init (void)
int unit; int unit;
if (!hwif->present) if (!hwif->present)
continue; continue;
if (hwif->chipset == ide_unknown || hwif->chipset == ide_forced)
hwif->chipset = ide_generic;
for (unit = 0; unit < MAX_DRIVES; ++unit) for (unit = 0; unit < MAX_DRIVES; ++unit)
if (hwif->drives[unit].present) if (hwif->drives[unit].present)
ata_attach(&hwif->drives[unit]); ata_attach(&hwif->drives[unit]);
} }
} }
if (!ide_probe)
ide_probe = &ideprobe_init;
MOD_DEC_USE_COUNT;
return 0; return 0;
} }
#ifdef MODULE EXPORT_SYMBOL_GPL(ideprobe_init);
int init_module (void)
{
unsigned int index;
for (index = 0; index < MAX_HWIFS; ++index)
ide_unregister(index);
ideprobe_init();
create_proc_ide_interfaces();
return 0;
}
void cleanup_module (void)
{
ide_probe = NULL;
}
MODULE_LICENSE("GPL");
#endif /* MODULE */
...@@ -348,8 +348,10 @@ static int proc_ide_read_imodel ...@@ -348,8 +348,10 @@ static int proc_ide_read_imodel
int len; int len;
const char *name; const char *name;
/*
* Neither ide_unknown nor ide_forced should be set at this point.
*/
switch (hwif->chipset) { switch (hwif->chipset) {
case ide_unknown: name = "(none)"; break;
case ide_generic: name = "generic"; break; case ide_generic: name = "generic"; break;
case ide_pci: name = "pci"; break; case ide_pci: name = "pci"; break;
case ide_cmd640: name = "cmd640"; break; case ide_cmd640: name = "cmd640"; break;
......
...@@ -153,7 +153,6 @@ ...@@ -153,7 +153,6 @@
#include <linux/cdrom.h> #include <linux/cdrom.h>
#include <linux/seq_file.h> #include <linux/seq_file.h>
#include <linux/device.h> #include <linux/device.h>
#include <linux/kmod.h>
#include <asm/byteorder.h> #include <asm/byteorder.h>
#include <asm/irq.h> #include <asm/irq.h>
...@@ -191,8 +190,6 @@ int noautodma = 1; ...@@ -191,8 +190,6 @@ int noautodma = 1;
EXPORT_SYMBOL(noautodma); EXPORT_SYMBOL(noautodma);
EXPORT_SYMBOL(ide_bus_type); EXPORT_SYMBOL(ide_bus_type);
int (*ide_probe)(void);
/* /*
* This is declared extern in ide.h, for access by other IDE modules: * This is declared extern in ide.h, for access by other IDE modules:
*/ */
...@@ -443,21 +440,6 @@ u8 ide_dump_status (ide_drive_t *drive, const char *msg, u8 stat) ...@@ -443,21 +440,6 @@ u8 ide_dump_status (ide_drive_t *drive, const char *msg, u8 stat)
EXPORT_SYMBOL(ide_dump_status); EXPORT_SYMBOL(ide_dump_status);
void ide_probe_module (void)
{
if (!ide_probe) {
#if defined(CONFIG_KMOD) && defined(CONFIG_BLK_DEV_IDE_MODULE)
(void) request_module("ide-probe-mod");
#endif /* (CONFIG_KMOD) && (CONFIG_BLK_DEV_IDE_MODULE) */
} else {
(void)ide_probe();
}
}
EXPORT_SYMBOL(ide_probe_module);
static int ide_open (struct inode * inode, struct file * filp) static int ide_open (struct inode * inode, struct file * filp)
{ {
return -ENXIO; return -ENXIO;
...@@ -1033,7 +1015,7 @@ int ide_register_hw (hw_regs_t *hw, ide_hwif_t **hwifp) ...@@ -1033,7 +1015,7 @@ int ide_register_hw (hw_regs_t *hw, ide_hwif_t **hwifp)
hwif->chipset = hw->chipset; hwif->chipset = hw->chipset;
if (!initializing) { if (!initializing) {
ide_probe_module(); probe_hwif_init(hwif);
#ifdef CONFIG_PROC_FS #ifdef CONFIG_PROC_FS
create_proc_ide_interfaces(); create_proc_ide_interfaces();
#endif #endif
...@@ -2179,7 +2161,7 @@ int __init ide_setup (char *s) ...@@ -2179,7 +2161,7 @@ int __init ide_setup (char *s)
memcpy(hwif->io_ports, hwif->hw.io_ports, sizeof(hwif->io_ports)); memcpy(hwif->io_ports, hwif->hw.io_ports, sizeof(hwif->io_ports));
hwif->irq = vals[2]; hwif->irq = vals[2];
hwif->noprobe = 0; hwif->noprobe = 0;
hwif->chipset = ide_generic; hwif->chipset = ide_forced;
goto done; goto done;
case 0: goto bad_option; case 0: goto bad_option;
...@@ -2276,28 +2258,6 @@ static void __init probe_for_hwifs (void) ...@@ -2276,28 +2258,6 @@ static void __init probe_for_hwifs (void)
#endif /* CONFIG_BLK_DEV_IDEPNP */ #endif /* CONFIG_BLK_DEV_IDEPNP */
} }
void __init ide_init_builtin_drivers (void)
{
/*
* Probe for special PCI and other "known" interface chipsets
*/
probe_for_hwifs ();
#ifdef CONFIG_BLK_DEV_IDE
if (ide_hwifs[0].io_ports[IDE_DATA_OFFSET])
ide_get_lock(NULL, NULL); /* for atari only */
(void) ideprobe_init();
if (ide_hwifs[0].io_ports[IDE_DATA_OFFSET])
ide_release_lock(); /* for atari only */
#endif /* CONFIG_BLK_DEV_IDE */
#ifdef CONFIG_PROC_FS
proc_ide_create();
#endif
}
/* /*
* Actually unregister the subdriver. Called with the * Actually unregister the subdriver. Called with the
* request lock dropped. * request lock dropped.
...@@ -2558,7 +2518,6 @@ EXPORT_SYMBOL(ide_fops); ...@@ -2558,7 +2518,6 @@ EXPORT_SYMBOL(ide_fops);
*/ */
EXPORT_SYMBOL(ide_lock); EXPORT_SYMBOL(ide_lock);
EXPORT_SYMBOL(ide_probe);
struct bus_type ide_bus_type = { struct bus_type ide_bus_type = {
.name = "ide", .name = "ide",
...@@ -2601,9 +2560,13 @@ int __init ide_init (void) ...@@ -2601,9 +2560,13 @@ int __init ide_init (void)
#endif #endif
initializing = 1; initializing = 1;
ide_init_builtin_drivers(); /* Probe for special PCI and other "known" interface chipsets. */
probe_for_hwifs();
initializing = 0; initializing = 0;
#ifdef CONFIG_PROC_FS
proc_ide_create();
#endif
return 0; return 0;
} }
......
...@@ -2,17 +2,10 @@ ...@@ -2,17 +2,10 @@
obj-$(CONFIG_BLK_DEV_ALI14XX) += ali14xx.o obj-$(CONFIG_BLK_DEV_ALI14XX) += ali14xx.o
obj-$(CONFIG_BLK_DEV_DTC2278) += dtc2278.o obj-$(CONFIG_BLK_DEV_DTC2278) += dtc2278.o
obj-$(CONFIG_BLK_DEV_HT6560B) += ht6560b.o obj-$(CONFIG_BLK_DEV_HT6560B) += ht6560b.o
obj-$(CONFIG_BLK_DEV_IDE_PC9800) += pc9800.o
obj-$(CONFIG_BLK_DEV_PDC4030) += pdc4030.o obj-$(CONFIG_BLK_DEV_PDC4030) += pdc4030.o
obj-$(CONFIG_BLK_DEV_QD65XX) += qd65xx.o obj-$(CONFIG_BLK_DEV_QD65XX) += qd65xx.o
obj-$(CONFIG_BLK_DEV_UMC8672) += umc8672.o obj-$(CONFIG_BLK_DEV_UMC8672) += umc8672.o
obj-$(CONFIG_BLK_DEV_BUDDHA) += buddha.o
obj-$(CONFIG_BLK_DEV_FALCON_IDE) += falconide.o
obj-$(CONFIG_BLK_DEV_GAYLE) += gayle.o
obj-$(CONFIG_BLK_DEV_MAC_IDE) += macide.o
obj-$(CONFIG_BLK_DEV_Q40IDE) += q40ide.o
obj-$(CONFIG_BLK_DEV_IDECS) += ide-cs.o obj-$(CONFIG_BLK_DEV_IDECS) += ide-cs.o
# Last of all # Last of all
......
...@@ -3,7 +3,6 @@ obj-$(CONFIG_BLK_DEV_ADMA100) += adma100.o ...@@ -3,7 +3,6 @@ obj-$(CONFIG_BLK_DEV_ADMA100) += adma100.o
obj-$(CONFIG_BLK_DEV_AEC62XX) += aec62xx.o obj-$(CONFIG_BLK_DEV_AEC62XX) += aec62xx.o
obj-$(CONFIG_BLK_DEV_ALI15X3) += alim15x3.o obj-$(CONFIG_BLK_DEV_ALI15X3) += alim15x3.o
obj-$(CONFIG_BLK_DEV_AMD74XX) += amd74xx.o obj-$(CONFIG_BLK_DEV_AMD74XX) += amd74xx.o
obj-$(CONFIG_BLK_DEV_CMD640) += cmd640.o
obj-$(CONFIG_BLK_DEV_CMD64X) += cmd64x.o obj-$(CONFIG_BLK_DEV_CMD64X) += cmd64x.o
obj-$(CONFIG_BLK_DEV_CS5520) += cs5520.o obj-$(CONFIG_BLK_DEV_CS5520) += cs5520.o
obj-$(CONFIG_BLK_DEV_CS5530) += cs5530.o obj-$(CONFIG_BLK_DEV_CS5530) += cs5530.o
......
...@@ -419,7 +419,7 @@ static void __init setup_device_ptrs (void) ...@@ -419,7 +419,7 @@ static void __init setup_device_ptrs (void)
cmd_hwif1 = &ide_hwifs[1]; /* default, if not found below */ cmd_hwif1 = &ide_hwifs[1]; /* default, if not found below */
for (i = 0; i < MAX_HWIFS; i++) { for (i = 0; i < MAX_HWIFS; i++) {
ide_hwif_t *hwif = &ide_hwifs[i]; ide_hwif_t *hwif = &ide_hwifs[i];
if (hwif->chipset == ide_unknown || hwif->chipset == ide_generic) { if (hwif->chipset == ide_unknown || hwif->chipset == ide_forced) {
if (hwif->io_ports[IDE_DATA_OFFSET] == 0x1f0) if (hwif->io_ports[IDE_DATA_OFFSET] == 0x1f0)
cmd_hwif0 = hwif; cmd_hwif0 = hwif;
else if (hwif->io_ports[IDE_DATA_OFFSET] == 0x170) else if (hwif->io_ports[IDE_DATA_OFFSET] == 0x170)
......
obj-$(CONFIG_BLK_DEV_MPC8xx_IDE) += mpc8xx.o
obj-$(CONFIG_BLK_DEV_IDE_PMAC) += pmac.o
obj-$(CONFIG_BLK_DEV_IDE_SWARM) += swarm.o
EXTRA_CFLAGS := -Idrivers/ide
...@@ -59,7 +59,7 @@ static ide_hwif_t *ide_match_hwif(unsigned long io_base, u8 bootable, const char ...@@ -59,7 +59,7 @@ static ide_hwif_t *ide_match_hwif(unsigned long io_base, u8 bootable, const char
for (h = 0; h < MAX_HWIFS; ++h) { for (h = 0; h < MAX_HWIFS; ++h) {
hwif = &ide_hwifs[h]; hwif = &ide_hwifs[h];
if (hwif->io_ports[IDE_DATA_OFFSET] == io_base) { if (hwif->io_ports[IDE_DATA_OFFSET] == io_base) {
if (hwif->chipset == ide_generic) if (hwif->chipset == ide_forced)
return hwif; /* a perfect match */ return hwif; /* a perfect match */
} }
} }
......
...@@ -261,30 +261,46 @@ void hpsb_register_highlevel(struct hpsb_highlevel *hl) ...@@ -261,30 +261,46 @@ void hpsb_register_highlevel(struct hpsb_highlevel *hl)
return; return;
} }
static int highlevel_for_each_host_unreg(struct hpsb_host *host, void *__data) static void __unregister_host(struct hpsb_highlevel *hl, struct hpsb_host *host)
{
struct hpsb_highlevel *hl = __data;
hl->remove_host(host);
hpsb_destroy_hostinfo(hl, host);
return 0;
}
void hpsb_unregister_highlevel(struct hpsb_highlevel *hl)
{ {
unsigned long flags;
struct list_head *lh, *next; struct list_head *lh, *next;
struct hpsb_address_serve *as; struct hpsb_address_serve *as;
unsigned long flags;
if (hl->remove_host)
hl->remove_host(host);
/* Remove any addresses that are matched for this highlevel driver
* and this particular host. */
write_lock_irqsave(&addr_space_lock, flags); write_lock_irqsave(&addr_space_lock, flags);
list_for_each_safe (lh, next, &hl->addr_list) { list_for_each_safe (lh, next, &hl->addr_list) {
as = list_entry(lh, struct hpsb_address_serve, addr_list); as = list_entry(lh, struct hpsb_address_serve, addr_list);
if (as->host != host)
continue;
if (!list_empty(&as->addr_list)) {
list_del(&as->as_list); list_del(&as->as_list);
list_del(&as->addr_list);
kfree(as); kfree(as);
} }
}
write_unlock_irqrestore(&addr_space_lock, flags); write_unlock_irqrestore(&addr_space_lock, flags);
hpsb_destroy_hostinfo(hl, host);
}
static int highlevel_for_each_host_unreg(struct hpsb_host *host, void *__data)
{
struct hpsb_highlevel *hl = __data;
__unregister_host(hl, host);
return 0;
}
void hpsb_unregister_highlevel(struct hpsb_highlevel *hl)
{
write_lock(&hl_irqs_lock); write_lock(&hl_irqs_lock);
list_del(&hl->irq_list); list_del(&hl->irq_list);
write_unlock(&hl_irqs_lock); write_unlock(&hl_irqs_lock);
...@@ -293,7 +309,6 @@ void hpsb_unregister_highlevel(struct hpsb_highlevel *hl) ...@@ -293,7 +309,6 @@ void hpsb_unregister_highlevel(struct hpsb_highlevel *hl)
list_del(&hl->hl_list); list_del(&hl->hl_list);
up_write(&hl_drivers_sem); up_write(&hl_drivers_sem);
if (hl->remove_host)
nodemgr_for_each_host(hl, highlevel_for_each_host_unreg); nodemgr_for_each_host(hl, highlevel_for_each_host_unreg);
} }
...@@ -435,29 +450,11 @@ void highlevel_add_host(struct hpsb_host *host) ...@@ -435,29 +450,11 @@ void highlevel_add_host(struct hpsb_host *host)
void highlevel_remove_host(struct hpsb_host *host) void highlevel_remove_host(struct hpsb_host *host)
{ {
struct hpsb_highlevel *hl; struct hpsb_highlevel *hl;
struct list_head *lh, *next;
struct hpsb_address_serve *as;
unsigned long flags;
down_read(&hl_drivers_sem); down_read(&hl_drivers_sem);
list_for_each_entry(hl, &hl_drivers, hl_list) { list_for_each_entry(hl, &hl_drivers, hl_list)
if (hl->remove_host) { __unregister_host(hl, host);
hl->remove_host(host);
hpsb_destroy_hostinfo(hl, host);
}
}
up_read(&hl_drivers_sem); up_read(&hl_drivers_sem);
/* Free up 1394 address space left behind by high level drivers. */
write_lock_irqsave(&addr_space_lock, flags);
list_for_each_safe (lh, next, &host->addr_space) {
as = list_entry(lh, struct hpsb_address_serve, as_list);
if (!list_empty(&as->addr_list)) {
list_del(&as->addr_list);
kfree(as);
}
}
write_unlock_irqrestore(&addr_space_lock, flags);
} }
void highlevel_host_reset(struct hpsb_host *host) void highlevel_host_reset(struct hpsb_host *host)
......
...@@ -745,6 +745,7 @@ static struct sbp2scsi_host_info *sbp2_add_host(struct hpsb_host *host) ...@@ -745,6 +745,7 @@ static struct sbp2scsi_host_info *sbp2_add_host(struct hpsb_host *host)
SBP2_ERR("failed to add scsi host"); SBP2_ERR("failed to add scsi host");
scsi_host_put(hi->scsi_host); scsi_host_put(hi->scsi_host);
hpsb_destroy_hostinfo(&sbp2_highlevel, host); hpsb_destroy_hostinfo(&sbp2_highlevel, host);
return NULL;
} }
return hi; return hi;
...@@ -990,6 +991,9 @@ static int sbp2_start_device(struct scsi_id_instance_data *scsi_id) ...@@ -990,6 +991,9 @@ static int sbp2_start_device(struct scsi_id_instance_data *scsi_id)
return PTR_ERR(sdev); return PTR_ERR(sdev);
} }
sdev->hostdata = scsi_id;
scsi_id->sdev = sdev;
return 0; return 0;
} }
...@@ -999,7 +1003,6 @@ static int sbp2_start_device(struct scsi_id_instance_data *scsi_id) ...@@ -999,7 +1003,6 @@ static int sbp2_start_device(struct scsi_id_instance_data *scsi_id)
static void sbp2_remove_device(struct scsi_id_instance_data *scsi_id) static void sbp2_remove_device(struct scsi_id_instance_data *scsi_id)
{ {
struct sbp2scsi_host_info *hi = scsi_id->hi; struct sbp2scsi_host_info *hi = scsi_id->hi;
struct scsi_device *sdev;
SBP2_DEBUG("sbp2_remove_device"); SBP2_DEBUG("sbp2_remove_device");
...@@ -1007,12 +1010,9 @@ static void sbp2_remove_device(struct scsi_id_instance_data *scsi_id) ...@@ -1007,12 +1010,9 @@ static void sbp2_remove_device(struct scsi_id_instance_data *scsi_id)
sbp2scsi_complete_all_commands(scsi_id, DID_NO_CONNECT); sbp2scsi_complete_all_commands(scsi_id, DID_NO_CONNECT);
/* Remove it from the scsi layer now */ /* Remove it from the scsi layer now */
/* XXX(hch): why can't we simply cache the scsi_device if (scsi_id->sdev) {
in struct scsi_id_instance_data? */ scsi_remove_device(scsi_id->sdev);
sdev = scsi_device_lookup(hi->scsi_host, 0, scsi_id->id, 0); scsi_device_put(scsi_id->sdev);
if (sdev) {
scsi_remove_device(sdev);
scsi_device_put(sdev);
} }
sbp2util_remove_command_orb_pool(scsi_id); sbp2util_remove_command_orb_pool(scsi_id);
...@@ -2849,6 +2849,27 @@ static const char *sbp2scsi_info (struct Scsi_Host *host) ...@@ -2849,6 +2849,27 @@ static const char *sbp2scsi_info (struct Scsi_Host *host)
return "SCSI emulation for IEEE-1394 SBP-2 Devices"; return "SCSI emulation for IEEE-1394 SBP-2 Devices";
} }
static ssize_t sbp2_sysfs_ieee1394_guid_show(struct device *dev, char *buf)
{
struct scsi_device *sdev;
struct scsi_id_instance_data *scsi_id;
if (!(sdev = to_scsi_device(dev)))
return 0;
if (!(scsi_id = sdev->hostdata))
return 0;
return sprintf(buf, "%016Lx\n", (unsigned long long)scsi_id->ne->guid);
}
static DEVICE_ATTR(ieee1394_guid, S_IRUGO, sbp2_sysfs_ieee1394_guid_show, NULL);
static struct device_attribute *sbp2_sysfs_sdev_attrs[] = {
&dev_attr_ieee1394_guid,
NULL
};
MODULE_AUTHOR("Ben Collins <bcollins@debian.org>"); MODULE_AUTHOR("Ben Collins <bcollins@debian.org>");
MODULE_DESCRIPTION("IEEE-1394 SBP-2 protocol driver"); MODULE_DESCRIPTION("IEEE-1394 SBP-2 protocol driver");
MODULE_SUPPORTED_DEVICE(SBP2_DEVICE_NAME); MODULE_SUPPORTED_DEVICE(SBP2_DEVICE_NAME);
...@@ -2871,6 +2892,7 @@ static Scsi_Host_Template scsi_driver_template = { ...@@ -2871,6 +2892,7 @@ static Scsi_Host_Template scsi_driver_template = {
.cmd_per_lun = SBP2_MAX_CMDS_PER_LUN, .cmd_per_lun = SBP2_MAX_CMDS_PER_LUN,
.can_queue = SBP2_MAX_SCSI_QUEUE, .can_queue = SBP2_MAX_SCSI_QUEUE,
.emulated = 1, .emulated = 1,
.sdev_attrs = sbp2_sysfs_sdev_attrs,
}; };
static int sbp2_module_init(void) static int sbp2_module_init(void)
......
...@@ -410,6 +410,9 @@ struct scsi_id_instance_data { ...@@ -410,6 +410,9 @@ struct scsi_id_instance_data {
/* A backlink to our host_info */ /* A backlink to our host_info */
struct sbp2scsi_host_info *hi; struct sbp2scsi_host_info *hi;
/* The scsi_device associated with this scsi_id */
struct scsi_device *sdev;
/* Device specific workarounds/brokeness */ /* Device specific workarounds/brokeness */
u32 workarounds; u32 workarounds;
}; };
......
...@@ -53,8 +53,12 @@ postcore_initcall(pcibus_class_init); ...@@ -53,8 +53,12 @@ postcore_initcall(pcibus_class_init);
static ssize_t pci_bus_show_cpuaffinity(struct class_device *class_dev, char *buf) static ssize_t pci_bus_show_cpuaffinity(struct class_device *class_dev, char *buf)
{ {
cpumask_t cpumask = pcibus_to_cpumask((to_pci_bus(class_dev))->number); cpumask_t cpumask = pcibus_to_cpumask((to_pci_bus(class_dev))->number);
int ret;
return sprintf(buf, "%lx\n", (unsigned long)cpumask); ret = cpumask_snprintf(buf, PAGE_SIZE, cpumask);
if (ret < PAGE_SIZE)
buf[ret++] = '\n';
return ret;
} }
static CLASS_DEVICE_ATTR(cpuaffinity, S_IRUGO, pci_bus_show_cpuaffinity, NULL); static CLASS_DEVICE_ATTR(cpuaffinity, S_IRUGO, pci_bus_show_cpuaffinity, NULL);
......
...@@ -3093,6 +3093,7 @@ HANDLE_IOCTL(SIOCSIFPFLAGS, dev_ifsioc) ...@@ -3093,6 +3093,7 @@ HANDLE_IOCTL(SIOCSIFPFLAGS, dev_ifsioc)
HANDLE_IOCTL(SIOCGIFPFLAGS, dev_ifsioc) HANDLE_IOCTL(SIOCGIFPFLAGS, dev_ifsioc)
HANDLE_IOCTL(SIOCGIFTXQLEN, dev_ifsioc) HANDLE_IOCTL(SIOCGIFTXQLEN, dev_ifsioc)
HANDLE_IOCTL(SIOCSIFTXQLEN, dev_ifsioc) HANDLE_IOCTL(SIOCSIFTXQLEN, dev_ifsioc)
HANDLE_IOCTL(TUNSETIFF, dev_ifsioc)
HANDLE_IOCTL(SIOCETHTOOL, ethtool_ioctl) HANDLE_IOCTL(SIOCETHTOOL, ethtool_ioctl)
HANDLE_IOCTL(SIOCBONDENSLAVE, bond_ioctl) HANDLE_IOCTL(SIOCBONDENSLAVE, bond_ioctl)
HANDLE_IOCTL(SIOCBONDRELEASE, bond_ioctl) HANDLE_IOCTL(SIOCBONDRELEASE, bond_ioctl)
......
...@@ -192,7 +192,6 @@ COMPATIBLE_IOCTL(SCSI_IOCTL_GET_PCI) ...@@ -192,7 +192,6 @@ COMPATIBLE_IOCTL(SCSI_IOCTL_GET_PCI)
/* Big T */ /* Big T */
COMPATIBLE_IOCTL(TUNSETNOCSUM) COMPATIBLE_IOCTL(TUNSETNOCSUM)
COMPATIBLE_IOCTL(TUNSETDEBUG) COMPATIBLE_IOCTL(TUNSETDEBUG)
COMPATIBLE_IOCTL(TUNSETIFF)
COMPATIBLE_IOCTL(TUNSETPERSIST) COMPATIBLE_IOCTL(TUNSETPERSIST)
COMPATIBLE_IOCTL(TUNSETOWNER) COMPATIBLE_IOCTL(TUNSETOWNER)
/* Big V */ /* Big V */
......
...@@ -279,7 +279,7 @@ typedef enum { ide_unknown, ide_generic, ide_pci, ...@@ -279,7 +279,7 @@ typedef enum { ide_unknown, ide_generic, ide_pci,
ide_pdc4030, ide_rz1000, ide_trm290, ide_pdc4030, ide_rz1000, ide_trm290,
ide_cmd646, ide_cy82c693, ide_4drives, ide_cmd646, ide_cy82c693, ide_4drives,
ide_pmac, ide_etrax100, ide_acorn, ide_pmac, ide_etrax100, ide_acorn,
ide_pc9800 ide_pc9800, ide_forced
} hwif_chipset_t; } hwif_chipset_t;
/* /*
...@@ -1231,7 +1231,6 @@ typedef struct ide_devices_s { ...@@ -1231,7 +1231,6 @@ typedef struct ide_devices_s {
*/ */
#ifndef _IDE_C #ifndef _IDE_C
extern ide_hwif_t ide_hwifs[]; /* master data repository */ extern ide_hwif_t ide_hwifs[]; /* master data repository */
extern int (*ide_probe)(void);
extern ide_devices_t *idedisk; extern ide_devices_t *idedisk;
extern ide_devices_t *idecd; extern ide_devices_t *idecd;
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment