Commit 849c529f authored by Linus Torvalds's avatar Linus Torvalds

Merge branch 'for-linus' of git://git.kernel.org/pub/scm/linux/kernel/git/ieee1394/linux1394-2.6

* 'for-linus' of git://git.kernel.org/pub/scm/linux/kernel/git/ieee1394/linux1394-2.6:
  firewire: don't respond to broadcast write requests
  firewire: clean up fw_card reference counting
  firewire: clean up some includes
  firewire: remove unused struct members
  firewire: implement broadcast_channel CSR for 1394a compliance
  ieee1394: dump mmapped iso buffers in core files
  ieee1394: raw1394: Push the BKL down into the driver ioctls
  ieee1394: video1394: reorder module init, prepare BKL removal
  ieee1394: reduce log noise about config ROM CRC errors
parents b9d2252c a7ea6782
...@@ -16,12 +16,15 @@ ...@@ -16,12 +16,15 @@
* Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. * Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
*/ */
#include <linux/module.h> #include <linux/completion.h>
#include <linux/errno.h> #include <linux/crc-itu-t.h>
#include <linux/delay.h> #include <linux/delay.h>
#include <linux/device.h> #include <linux/device.h>
#include <linux/errno.h>
#include <linux/kref.h>
#include <linux/module.h>
#include <linux/mutex.h> #include <linux/mutex.h>
#include <linux/crc-itu-t.h>
#include "fw-transaction.h" #include "fw-transaction.h"
#include "fw-topology.h" #include "fw-topology.h"
#include "fw-device.h" #include "fw-device.h"
...@@ -396,14 +399,16 @@ fw_card_initialize(struct fw_card *card, const struct fw_card_driver *driver, ...@@ -396,14 +399,16 @@ fw_card_initialize(struct fw_card *card, const struct fw_card_driver *driver,
{ {
static atomic_t index = ATOMIC_INIT(-1); static atomic_t index = ATOMIC_INIT(-1);
atomic_set(&card->device_count, 0);
card->index = atomic_inc_return(&index); card->index = atomic_inc_return(&index);
card->driver = driver; card->driver = driver;
card->device = device; card->device = device;
card->current_tlabel = 0; card->current_tlabel = 0;
card->tlabel_mask = 0; card->tlabel_mask = 0;
card->color = 0; card->color = 0;
card->broadcast_channel = BROADCAST_CHANNEL_INITIAL;
kref_init(&card->kref);
init_completion(&card->done);
INIT_LIST_HEAD(&card->transaction_list); INIT_LIST_HEAD(&card->transaction_list);
spin_lock_init(&card->lock); spin_lock_init(&card->lock);
setup_timer(&card->flush_timer, setup_timer(&card->flush_timer,
...@@ -496,7 +501,6 @@ dummy_enable_phys_dma(struct fw_card *card, ...@@ -496,7 +501,6 @@ dummy_enable_phys_dma(struct fw_card *card,
} }
static struct fw_card_driver dummy_driver = { static struct fw_card_driver dummy_driver = {
.name = "dummy",
.enable = dummy_enable, .enable = dummy_enable,
.update_phy_reg = dummy_update_phy_reg, .update_phy_reg = dummy_update_phy_reg,
.set_config_rom = dummy_set_config_rom, .set_config_rom = dummy_set_config_rom,
...@@ -506,6 +510,14 @@ static struct fw_card_driver dummy_driver = { ...@@ -506,6 +510,14 @@ static struct fw_card_driver dummy_driver = {
.enable_phys_dma = dummy_enable_phys_dma, .enable_phys_dma = dummy_enable_phys_dma,
}; };
void
fw_card_release(struct kref *kref)
{
struct fw_card *card = container_of(kref, struct fw_card, kref);
complete(&card->done);
}
void void
fw_core_remove_card(struct fw_card *card) fw_core_remove_card(struct fw_card *card)
{ {
...@@ -521,12 +533,10 @@ fw_core_remove_card(struct fw_card *card) ...@@ -521,12 +533,10 @@ fw_core_remove_card(struct fw_card *card)
card->driver = &dummy_driver; card->driver = &dummy_driver;
fw_destroy_nodes(card); fw_destroy_nodes(card);
/*
* Wait for all device workqueue jobs to finish. Otherwise the /* Wait for all users, especially device workqueue jobs, to finish. */
* firewire-core module could be unloaded before the jobs ran. fw_card_put(card);
*/ wait_for_completion(&card->done);
while (atomic_read(&card->device_count) > 0)
msleep(100);
cancel_delayed_work_sync(&card->work); cancel_delayed_work_sync(&card->work);
fw_flush_transactions(card); fw_flush_transactions(card);
......
...@@ -168,7 +168,7 @@ static void fw_device_release(struct device *dev) ...@@ -168,7 +168,7 @@ static void fw_device_release(struct device *dev)
fw_node_put(device->node); fw_node_put(device->node);
kfree(device->config_rom); kfree(device->config_rom);
kfree(device); kfree(device);
atomic_dec(&card->device_count); fw_card_put(card);
} }
int fw_device_enable_phys_dma(struct fw_device *device) int fw_device_enable_phys_dma(struct fw_device *device)
...@@ -946,8 +946,7 @@ void fw_node_event(struct fw_card *card, struct fw_node *node, int event) ...@@ -946,8 +946,7 @@ void fw_node_event(struct fw_card *card, struct fw_node *node, int event)
*/ */
device_initialize(&device->device); device_initialize(&device->device);
atomic_set(&device->state, FW_DEVICE_INITIALIZING); atomic_set(&device->state, FW_DEVICE_INITIALIZING);
atomic_inc(&card->device_count); device->card = fw_card_get(card);
device->card = card;
device->node = fw_node_get(node); device->node = fw_node_get(node);
device->node_id = node->node_id; device->node_id = node->node_id;
device->generation = card->generation; device->generation = card->generation;
......
...@@ -62,7 +62,6 @@ struct fw_device { ...@@ -62,7 +62,6 @@ struct fw_device {
bool cmc; bool cmc;
struct fw_card *card; struct fw_card *card;
struct device device; struct device device;
struct list_head link;
struct list_head client_list; struct list_head client_list;
u32 *config_rom; u32 *config_rom;
size_t config_rom_length; size_t config_rom_length;
......
...@@ -2292,7 +2292,6 @@ ohci_queue_iso(struct fw_iso_context *base, ...@@ -2292,7 +2292,6 @@ ohci_queue_iso(struct fw_iso_context *base,
} }
static const struct fw_card_driver ohci_driver = { static const struct fw_card_driver ohci_driver = {
.name = ohci_driver_name,
.enable = ohci_enable, .enable = ohci_enable,
.update_phy_reg = ohci_update_phy_reg, .update_phy_reg = ohci_update_phy_reg,
.set_config_rom = ohci_set_config_rom, .set_config_rom = ohci_set_config_rom,
......
...@@ -55,6 +55,9 @@ ...@@ -55,6 +55,9 @@
#define HEADER_GET_DATA_LENGTH(q) (((q) >> 16) & 0xffff) #define HEADER_GET_DATA_LENGTH(q) (((q) >> 16) & 0xffff)
#define HEADER_GET_EXTENDED_TCODE(q) (((q) >> 0) & 0xffff) #define HEADER_GET_EXTENDED_TCODE(q) (((q) >> 0) & 0xffff)
#define HEADER_DESTINATION_IS_BROADCAST(q) \
(((q) & HEADER_DESTINATION(0x3f)) == HEADER_DESTINATION(0x3f))
#define PHY_CONFIG_GAP_COUNT(gap_count) (((gap_count) << 16) | (1 << 22)) #define PHY_CONFIG_GAP_COUNT(gap_count) (((gap_count) << 16) | (1 << 22))
#define PHY_CONFIG_ROOT_ID(node_id) ((((node_id) & 0x3f) << 24) | (1 << 23)) #define PHY_CONFIG_ROOT_ID(node_id) ((((node_id) & 0x3f) << 24) | (1 << 23))
#define PHY_IDENTIFIER(id) ((id) << 30) #define PHY_IDENTIFIER(id) ((id) << 30)
...@@ -624,12 +627,9 @@ allocate_request(struct fw_packet *p) ...@@ -624,12 +627,9 @@ allocate_request(struct fw_packet *p)
void void
fw_send_response(struct fw_card *card, struct fw_request *request, int rcode) fw_send_response(struct fw_card *card, struct fw_request *request, int rcode)
{ {
/* /* unified transaction or broadcast transaction: don't respond */
* Broadcast packets are reported as ACK_COMPLETE, so this if (request->ack != ACK_PENDING ||
* check is sufficient to ensure we don't send response to HEADER_DESTINATION_IS_BROADCAST(request->request_header[0])) {
* broadcast packets or posted writes.
*/
if (request->ack != ACK_PENDING) {
kfree(request); kfree(request);
return; return;
} }
...@@ -817,12 +817,13 @@ handle_registers(struct fw_card *card, struct fw_request *request, ...@@ -817,12 +817,13 @@ handle_registers(struct fw_card *card, struct fw_request *request,
int reg = offset & ~CSR_REGISTER_BASE; int reg = offset & ~CSR_REGISTER_BASE;
unsigned long long bus_time; unsigned long long bus_time;
__be32 *data = payload; __be32 *data = payload;
int rcode = RCODE_COMPLETE;
switch (reg) { switch (reg) {
case CSR_CYCLE_TIME: case CSR_CYCLE_TIME:
case CSR_BUS_TIME: case CSR_BUS_TIME:
if (!TCODE_IS_READ_REQUEST(tcode) || length != 4) { if (!TCODE_IS_READ_REQUEST(tcode) || length != 4) {
fw_send_response(card, request, RCODE_TYPE_ERROR); rcode = RCODE_TYPE_ERROR;
break; break;
} }
...@@ -831,7 +832,17 @@ handle_registers(struct fw_card *card, struct fw_request *request, ...@@ -831,7 +832,17 @@ handle_registers(struct fw_card *card, struct fw_request *request,
*data = cpu_to_be32(bus_time); *data = cpu_to_be32(bus_time);
else else
*data = cpu_to_be32(bus_time >> 25); *data = cpu_to_be32(bus_time >> 25);
fw_send_response(card, request, RCODE_COMPLETE); break;
case CSR_BROADCAST_CHANNEL:
if (tcode == TCODE_READ_QUADLET_REQUEST)
*data = cpu_to_be32(card->broadcast_channel);
else if (tcode == TCODE_WRITE_QUADLET_REQUEST)
card->broadcast_channel =
(be32_to_cpu(*data) & BROADCAST_CHANNEL_VALID) |
BROADCAST_CHANNEL_INITIAL;
else
rcode = RCODE_TYPE_ERROR;
break; break;
case CSR_BUS_MANAGER_ID: case CSR_BUS_MANAGER_ID:
...@@ -850,10 +861,13 @@ handle_registers(struct fw_card *card, struct fw_request *request, ...@@ -850,10 +861,13 @@ handle_registers(struct fw_card *card, struct fw_request *request,
case CSR_BUSY_TIMEOUT: case CSR_BUSY_TIMEOUT:
/* FIXME: Implement this. */ /* FIXME: Implement this. */
default: default:
fw_send_response(card, request, RCODE_ADDRESS_ERROR); rcode = RCODE_ADDRESS_ERROR;
break; break;
} }
fw_send_response(card, request, rcode);
} }
static struct fw_address_handler registers = { static struct fw_address_handler registers = {
......
...@@ -19,14 +19,15 @@ ...@@ -19,14 +19,15 @@
#ifndef __fw_transaction_h #ifndef __fw_transaction_h
#define __fw_transaction_h #define __fw_transaction_h
#include <linux/completion.h>
#include <linux/device.h> #include <linux/device.h>
#include <linux/timer.h>
#include <linux/interrupt.h>
#include <linux/list.h>
#include <linux/fs.h>
#include <linux/dma-mapping.h> #include <linux/dma-mapping.h>
#include <linux/firewire-constants.h> #include <linux/firewire-constants.h>
#include <asm/atomic.h> #include <linux/kref.h>
#include <linux/list.h>
#include <linux/spinlock_types.h>
#include <linux/timer.h>
#include <linux/workqueue.h>
#define TCODE_IS_READ_REQUEST(tcode) (((tcode) & ~1) == 4) #define TCODE_IS_READ_REQUEST(tcode) (((tcode) & ~1) == 4)
#define TCODE_IS_BLOCK_PACKET(tcode) (((tcode) & 1) != 0) #define TCODE_IS_BLOCK_PACKET(tcode) (((tcode) & 1) != 0)
...@@ -80,6 +81,9 @@ ...@@ -80,6 +81,9 @@
#define CSR_SPEED_MAP 0x2000 #define CSR_SPEED_MAP 0x2000
#define CSR_SPEED_MAP_END 0x3000 #define CSR_SPEED_MAP_END 0x3000
#define BROADCAST_CHANNEL_INITIAL (1 << 31 | 31)
#define BROADCAST_CHANNEL_VALID (1 << 30)
#define fw_notify(s, args...) printk(KERN_NOTICE KBUILD_MODNAME ": " s, ## args) #define fw_notify(s, args...) printk(KERN_NOTICE KBUILD_MODNAME ": " s, ## args)
#define fw_error(s, args...) printk(KERN_ERR KBUILD_MODNAME ": " s, ## args) #define fw_error(s, args...) printk(KERN_ERR KBUILD_MODNAME ": " s, ## args)
...@@ -216,7 +220,8 @@ extern struct bus_type fw_bus_type; ...@@ -216,7 +220,8 @@ extern struct bus_type fw_bus_type;
struct fw_card { struct fw_card {
const struct fw_card_driver *driver; const struct fw_card_driver *driver;
struct device *device; struct device *device;
atomic_t device_count; struct kref kref;
struct completion done;
int node_id; int node_id;
int generation; int generation;
...@@ -236,6 +241,7 @@ struct fw_card { ...@@ -236,6 +241,7 @@ struct fw_card {
*/ */
int self_id_count; int self_id_count;
u32 topology_map[252 + 3]; u32 topology_map[252 + 3];
u32 broadcast_channel;
spinlock_t lock; /* Take this lock when handling the lists in spinlock_t lock; /* Take this lock when handling the lists in
* this struct. */ * this struct. */
...@@ -256,6 +262,20 @@ struct fw_card { ...@@ -256,6 +262,20 @@ struct fw_card {
int bm_generation; int bm_generation;
}; };
static inline struct fw_card *fw_card_get(struct fw_card *card)
{
kref_get(&card->kref);
return card;
}
void fw_card_release(struct kref *kref);
static inline void fw_card_put(struct fw_card *card)
{
kref_put(&card->kref, fw_card_release);
}
/* /*
* The iso packet format allows for an immediate header/payload part * The iso packet format allows for an immediate header/payload part
* stored in 'header' immediately after the packet info plus an * stored in 'header' immediately after the packet info plus an
...@@ -348,8 +368,6 @@ int ...@@ -348,8 +368,6 @@ int
fw_iso_context_stop(struct fw_iso_context *ctx); fw_iso_context_stop(struct fw_iso_context *ctx);
struct fw_card_driver { struct fw_card_driver {
const char *name;
/* /*
* Enable the given card with the given initial config rom. * Enable the given card with the given initial config rom.
* This function is expected to activate the card, and either * This function is expected to activate the card, and either
......
...@@ -1049,6 +1049,24 @@ int csr1212_read(struct csr1212_csr *csr, u32 offset, void *buffer, u32 len) ...@@ -1049,6 +1049,24 @@ int csr1212_read(struct csr1212_csr *csr, u32 offset, void *buffer, u32 len)
return -ENOENT; return -ENOENT;
} }
/*
* Apparently there are many different wrong implementations of the CRC
* algorithm. We don't fail, we just warn... approximately once per GUID.
*/
static void
csr1212_check_crc(const u32 *buffer, size_t length, u16 crc, __be32 *guid)
{
static u64 last_bad_eui64;
u64 eui64 = ((u64)be32_to_cpu(guid[0]) << 32) | be32_to_cpu(guid[1]);
if (csr1212_crc16(buffer, length) == crc ||
csr1212_msft_crc16(buffer, length) == crc ||
eui64 == last_bad_eui64)
return;
printk(KERN_DEBUG "ieee1394: config ROM CRC error\n");
last_bad_eui64 = eui64;
}
/* Parse a chunk of data as a Config ROM */ /* Parse a chunk of data as a Config ROM */
...@@ -1092,11 +1110,8 @@ static int csr1212_parse_bus_info_block(struct csr1212_csr *csr) ...@@ -1092,11 +1110,8 @@ static int csr1212_parse_bus_info_block(struct csr1212_csr *csr)
return ret; return ret;
} }
/* Apparently there are many different wrong implementations of the CRC csr1212_check_crc(bi->data, bi->crc_length, bi->crc,
* algorithm. We don't fail, we just warn. */ &csr->bus_info_data[3]);
if ((csr1212_crc16(bi->data, bi->crc_length) != bi->crc) &&
(csr1212_msft_crc16(bi->data, bi->crc_length) != bi->crc))
printk(KERN_DEBUG "IEEE 1394 device has ROM CRC error\n");
cr = CSR1212_MALLOC(sizeof(*cr)); cr = CSR1212_MALLOC(sizeof(*cr));
if (!cr) if (!cr)
...@@ -1205,11 +1220,8 @@ int csr1212_parse_keyval(struct csr1212_keyval *kv, ...@@ -1205,11 +1220,8 @@ int csr1212_parse_keyval(struct csr1212_keyval *kv,
&cache->data[bytes_to_quads(kv->offset - cache->offset)]; &cache->data[bytes_to_quads(kv->offset - cache->offset)];
kvi_len = be16_to_cpu(kvi->length); kvi_len = be16_to_cpu(kvi->length);
/* Apparently there are many different wrong implementations of the CRC /* GUID is wrong in here in case of extended ROM. We don't care. */
* algorithm. We don't fail, we just warn. */ csr1212_check_crc(kvi->data, kvi_len, kvi->crc, &cache->data[3]);
if ((csr1212_crc16(kvi->data, kvi_len) != kvi->crc) &&
(csr1212_msft_crc16(kvi->data, kvi_len) != kvi->crc))
printk(KERN_DEBUG "IEEE 1394 device has ROM CRC error\n");
switch (kv->key.type) { switch (kv->key.type) {
case CSR1212_KV_TYPE_DIRECTORY: case CSR1212_KV_TYPE_DIRECTORY:
......
...@@ -274,7 +274,7 @@ int dma_region_mmap(struct dma_region *dma, struct file *file, ...@@ -274,7 +274,7 @@ int dma_region_mmap(struct dma_region *dma, struct file *file,
vma->vm_ops = &dma_region_vm_ops; vma->vm_ops = &dma_region_vm_ops;
vma->vm_private_data = dma; vma->vm_private_data = dma;
vma->vm_file = file; vma->vm_file = file;
vma->vm_flags |= VM_RESERVED; vma->vm_flags |= VM_RESERVED | VM_ALWAYSDUMP;
return 0; return 0;
} }
......
...@@ -228,10 +228,8 @@ void hpsb_register_highlevel(struct hpsb_highlevel *hl) ...@@ -228,10 +228,8 @@ void hpsb_register_highlevel(struct hpsb_highlevel *hl)
{ {
unsigned long flags; unsigned long flags;
hpsb_init_highlevel(hl);
INIT_LIST_HEAD(&hl->addr_list); INIT_LIST_HEAD(&hl->addr_list);
INIT_LIST_HEAD(&hl->host_info_list);
rwlock_init(&hl->host_info_lock);
down_write(&hl_drivers_sem); down_write(&hl_drivers_sem);
list_add_tail(&hl->hl_list, &hl_drivers); list_add_tail(&hl->hl_list, &hl_drivers);
......
...@@ -2,7 +2,7 @@ ...@@ -2,7 +2,7 @@
#define IEEE1394_HIGHLEVEL_H #define IEEE1394_HIGHLEVEL_H
#include <linux/list.h> #include <linux/list.h>
#include <linux/spinlock_types.h> #include <linux/spinlock.h>
#include <linux/types.h> #include <linux/types.h>
struct module; struct module;
...@@ -103,6 +103,17 @@ int highlevel_lock64(struct hpsb_host *host, int nodeid, octlet_t *store, ...@@ -103,6 +103,17 @@ int highlevel_lock64(struct hpsb_host *host, int nodeid, octlet_t *store,
void highlevel_fcp_request(struct hpsb_host *host, int nodeid, int direction, void highlevel_fcp_request(struct hpsb_host *host, int nodeid, int direction,
void *data, size_t length); void *data, size_t length);
/**
* hpsb_init_highlevel - initialize a struct hpsb_highlevel
*
* This is only necessary if hpsb_get_hostinfo_bykey can be called
* before hpsb_register_highlevel.
*/
static inline void hpsb_init_highlevel(struct hpsb_highlevel *hl)
{
rwlock_init(&hl->host_info_lock);
INIT_LIST_HEAD(&hl->host_info_list);
}
void hpsb_register_highlevel(struct hpsb_highlevel *hl); void hpsb_register_highlevel(struct hpsb_highlevel *hl);
void hpsb_unregister_highlevel(struct hpsb_highlevel *hl); void hpsb_unregister_highlevel(struct hpsb_highlevel *hl);
......
...@@ -2549,8 +2549,8 @@ static int raw1394_mmap(struct file *file, struct vm_area_struct *vma) ...@@ -2549,8 +2549,8 @@ static int raw1394_mmap(struct file *file, struct vm_area_struct *vma)
} }
/* ioctl is only used for rawiso operations */ /* ioctl is only used for rawiso operations */
static int raw1394_ioctl(struct inode *inode, struct file *file, static long do_raw1394_ioctl(struct file *file, unsigned int cmd,
unsigned int cmd, unsigned long arg) unsigned long arg)
{ {
struct file_info *fi = file->private_data; struct file_info *fi = file->private_data;
void __user *argp = (void __user *)arg; void __user *argp = (void __user *)arg;
...@@ -2656,6 +2656,16 @@ static int raw1394_ioctl(struct inode *inode, struct file *file, ...@@ -2656,6 +2656,16 @@ static int raw1394_ioctl(struct inode *inode, struct file *file,
return -EINVAL; return -EINVAL;
} }
static long raw1394_ioctl(struct file *file, unsigned int cmd,
unsigned long arg)
{
long ret;
lock_kernel();
ret = do_raw1394_ioctl(file, cmd, arg);
unlock_kernel();
return ret;
}
#ifdef CONFIG_COMPAT #ifdef CONFIG_COMPAT
struct raw1394_iso_packets32 { struct raw1394_iso_packets32 {
__u32 n_packets; __u32 n_packets;
...@@ -2690,7 +2700,7 @@ static long raw1394_iso_xmit_recv_packets32(struct file *file, unsigned int cmd, ...@@ -2690,7 +2700,7 @@ static long raw1394_iso_xmit_recv_packets32(struct file *file, unsigned int cmd,
!copy_from_user(&infos32, &arg->infos, sizeof infos32)) { !copy_from_user(&infos32, &arg->infos, sizeof infos32)) {
infos = compat_ptr(infos32); infos = compat_ptr(infos32);
if (!copy_to_user(&dst->infos, &infos, sizeof infos)) if (!copy_to_user(&dst->infos, &infos, sizeof infos))
err = raw1394_ioctl(NULL, file, cmd, (unsigned long)dst); err = do_raw1394_ioctl(file, cmd, (unsigned long)dst);
} }
return err; return err;
} }
...@@ -2731,7 +2741,7 @@ static long raw1394_compat_ioctl(struct file *file, ...@@ -2731,7 +2741,7 @@ static long raw1394_compat_ioctl(struct file *file,
case RAW1394_IOC_ISO_GET_STATUS: case RAW1394_IOC_ISO_GET_STATUS:
case RAW1394_IOC_ISO_SHUTDOWN: case RAW1394_IOC_ISO_SHUTDOWN:
case RAW1394_IOC_ISO_QUEUE_ACTIVITY: case RAW1394_IOC_ISO_QUEUE_ACTIVITY:
err = raw1394_ioctl(NULL, file, cmd, arg); err = do_raw1394_ioctl(file, cmd, arg);
break; break;
/* These request have different format. */ /* These request have different format. */
case RAW1394_IOC_ISO_RECV_PACKETS32: case RAW1394_IOC_ISO_RECV_PACKETS32:
...@@ -2984,7 +2994,7 @@ static const struct file_operations raw1394_fops = { ...@@ -2984,7 +2994,7 @@ static const struct file_operations raw1394_fops = {
.read = raw1394_read, .read = raw1394_read,
.write = raw1394_write, .write = raw1394_write,
.mmap = raw1394_mmap, .mmap = raw1394_mmap,
.ioctl = raw1394_ioctl, .unlocked_ioctl = raw1394_ioctl,
#ifdef CONFIG_COMPAT #ifdef CONFIG_COMPAT
.compat_ioctl = raw1394_compat_ioctl, .compat_ioctl = raw1394_compat_ioctl,
#endif #endif
......
...@@ -1503,6 +1503,8 @@ static int __init video1394_init_module (void) ...@@ -1503,6 +1503,8 @@ static int __init video1394_init_module (void)
{ {
int ret; int ret;
hpsb_init_highlevel(&video1394_highlevel);
cdev_init(&video1394_cdev, &video1394_fops); cdev_init(&video1394_cdev, &video1394_fops);
video1394_cdev.owner = THIS_MODULE; video1394_cdev.owner = THIS_MODULE;
ret = cdev_add(&video1394_cdev, IEEE1394_VIDEO1394_DEV, 16); ret = cdev_add(&video1394_cdev, IEEE1394_VIDEO1394_DEV, 16);
......
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