firewire: core: prepare for non-core children of card devices
The IP-over-1394 driver will add child devices beneath card devices which are not of type fw_device. Hence firewire-core's callbacks in device_for_each_child() and device_find_child() need to check for the device type now. Initial version written by Jay Fenlason. Signed-off-by: Stefan Richter <stefanr@s5r6.in-berlin.de>
This commit is contained in:
parent
e034d24259
commit
099d54143e
3 changed files with 22 additions and 12 deletions
|
@ -190,12 +190,6 @@ void fw_core_remove_descriptor(struct fw_descriptor *desc)
|
|||
mutex_unlock(&card_mutex);
|
||||
}
|
||||
|
||||
static int set_broadcast_channel(struct device *dev, void *data)
|
||||
{
|
||||
fw_device_set_broadcast_channel(fw_device(dev), (long)data);
|
||||
return 0;
|
||||
}
|
||||
|
||||
static void allocate_broadcast_channel(struct fw_card *card, int generation)
|
||||
{
|
||||
int channel, bandwidth = 0;
|
||||
|
@ -205,7 +199,7 @@ static void allocate_broadcast_channel(struct fw_card *card, int generation)
|
|||
if (channel == 31) {
|
||||
card->broadcast_channel_allocated = true;
|
||||
device_for_each_child(card->device, (void *)(long)generation,
|
||||
set_broadcast_channel);
|
||||
fw_device_set_broadcast_channel);
|
||||
}
|
||||
}
|
||||
|
||||
|
|
|
@ -59,7 +59,7 @@ int fw_csr_iterator_next(struct fw_csr_iterator *ci, int *key, int *value)
|
|||
}
|
||||
EXPORT_SYMBOL(fw_csr_iterator_next);
|
||||
|
||||
static int is_fw_unit(struct device *dev);
|
||||
static bool is_fw_unit(struct device *dev);
|
||||
|
||||
static int match_unit_directory(u32 *directory, u32 match_flags,
|
||||
const struct ieee1394_device_id *id)
|
||||
|
@ -599,7 +599,7 @@ static struct device_type fw_unit_type = {
|
|||
.release = fw_unit_release,
|
||||
};
|
||||
|
||||
static int is_fw_unit(struct device *dev)
|
||||
static bool is_fw_unit(struct device *dev)
|
||||
{
|
||||
return dev->type == &fw_unit_type;
|
||||
}
|
||||
|
@ -749,6 +749,11 @@ static struct device_type fw_device_type = {
|
|||
.release = fw_device_release,
|
||||
};
|
||||
|
||||
static bool is_fw_device(struct device *dev)
|
||||
{
|
||||
return dev->type == &fw_device_type;
|
||||
}
|
||||
|
||||
static int update_unit(struct device *dev, void *data)
|
||||
{
|
||||
struct fw_unit *unit = fw_unit(dev);
|
||||
|
@ -785,6 +790,9 @@ static int lookup_existing_device(struct device *dev, void *data)
|
|||
struct fw_card *card = new->card;
|
||||
int match = 0;
|
||||
|
||||
if (!is_fw_device(dev))
|
||||
return 0;
|
||||
|
||||
down_read(&fw_device_rwsem); /* serialize config_rom access */
|
||||
spin_lock_irq(&card->lock); /* serialize node access */
|
||||
|
||||
|
@ -824,7 +832,7 @@ static int lookup_existing_device(struct device *dev, void *data)
|
|||
|
||||
enum { BC_UNKNOWN = 0, BC_UNIMPLEMENTED, BC_IMPLEMENTED, };
|
||||
|
||||
void fw_device_set_broadcast_channel(struct fw_device *device, int generation)
|
||||
static void set_broadcast_channel(struct fw_device *device, int generation)
|
||||
{
|
||||
struct fw_card *card = device->card;
|
||||
__be32 data;
|
||||
|
@ -860,6 +868,14 @@ void fw_device_set_broadcast_channel(struct fw_device *device, int generation)
|
|||
}
|
||||
}
|
||||
|
||||
int fw_device_set_broadcast_channel(struct device *dev, void *gen)
|
||||
{
|
||||
if (is_fw_device(dev))
|
||||
set_broadcast_channel(fw_device(dev), (long)gen);
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
static void fw_device_init(struct work_struct *work)
|
||||
{
|
||||
struct fw_device *device =
|
||||
|
@ -958,7 +974,7 @@ static void fw_device_init(struct work_struct *work)
|
|||
1 << device->max_speed);
|
||||
device->config_rom_retries = 0;
|
||||
|
||||
fw_device_set_broadcast_channel(device, device->generation);
|
||||
set_broadcast_channel(device, device->generation);
|
||||
}
|
||||
|
||||
/*
|
||||
|
|
|
@ -124,7 +124,7 @@ extern struct idr fw_device_idr;
|
|||
extern int fw_cdev_major;
|
||||
|
||||
struct fw_device *fw_device_get_by_devt(dev_t devt);
|
||||
void fw_device_set_broadcast_channel(struct fw_device *device, int generation);
|
||||
int fw_device_set_broadcast_channel(struct device *dev, void *gen);
|
||||
void fw_node_event(struct fw_card *card, struct fw_node *node, int event);
|
||||
|
||||
|
||||
|
|
Loading…
Reference in a new issue