]> err.no Git - linux-2.6/blobdiff - drivers/ieee1394/csr1212.c
Merge branch 'for-linus' of master.kernel.org:/pub/scm/linux/kernel/git/dtor/input
[linux-2.6] / drivers / ieee1394 / csr1212.c
index 4812d59e8976289946f7e8feaa6b01c1f31bb963..c28f639823d238c187f31daca9552f88c6ec188b 100644 (file)
 #define __D (1 << CSR1212_KV_TYPE_DIRECTORY)
 #define __L (1 << CSR1212_KV_TYPE_LEAF)
 static const u_int8_t csr1212_key_id_type_map[0x30] = {
-       0,                      /* Reserved */
+       __C,                    /* used by Apple iSight */
        __D | __L,              /* Descriptor */
        __I | __D | __L,        /* Bus_Dependent_Info */
        __I | __D | __L,        /* Vendor */
        __I,                    /* Hardware_Version */
        0, 0,                   /* Reserved */
-       __D | __L,              /* Module */
-       0, 0, 0, 0,             /* Reserved */
+       __D | __L | __I,        /* Module */
+       __I, 0, 0, 0,           /* used by Apple iSight, Reserved */
        __I,                    /* Node_Capabilities */
        __L,                    /* EUI_64 */
        0, 0, 0,                /* Reserved */
@@ -779,7 +779,7 @@ static int csr1212_append_new_cache(struct csr1212_csr *csr, size_t romsize)
        romsize = (romsize + (csr->max_rom - 1)) & ~(csr->max_rom - 1);
 
        csr_addr = csr->ops->allocate_addr_range(romsize, csr->max_rom, csr->private);
-       if (csr_addr == ~0ULL) {
+       if (csr_addr == CSR1212_INVALID_ADDR_SPACE) {
                return CSR1212_ENOMEM;
        }
        if (csr_addr < CSR1212_REGISTER_SPACE_BASE) {
@@ -1234,6 +1234,12 @@ static int csr1212_parse_bus_info_block(struct csr1212_csr *csr)
                                         csr->private);
                if (ret != CSR1212_SUCCESS)
                        return ret;
+
+               /* check ROM header's info_length */
+               if (i == 0 &&
+                   CSR1212_BE32_TO_CPU(csr->cache_head->data[0]) >> 24 !=
+                   bytes_to_quads(csr->bus_info_len) - 1)
+                       return CSR1212_EINVAL;
        }
 
        bi = (struct csr1212_bus_info_block_img*)csr->cache_head->data;
@@ -1250,9 +1256,6 @@ static int csr1212_parse_bus_info_block(struct csr1212_csr *csr)
                        return ret;
        }
 
-       if (bytes_to_quads(csr->bus_info_len - sizeof(csr1212_quad_t)) != bi->length)
-               return CSR1212_EINVAL;
-
 #if 0
        /* Apparently there are too many differnt wrong implementations of the
         * CRC algorithm that verifying them is moot. */
@@ -1618,7 +1621,8 @@ int csr1212_parse_csr(struct csr1212_csr *csr)
         * and make cache regions for them */
        for (dentry = csr->root_kv->value.directory.dentries_head;
             dentry; dentry = dentry->next) {
-               if (dentry->kv->key.id == CSR1212_KV_ID_EXTENDED_ROM) {
+               if (dentry->kv->key.id == CSR1212_KV_ID_EXTENDED_ROM &&
+                       !dentry->kv->valid) {
                        ret = _csr1212_read_keyval(csr, dentry->kv);
                        if (ret != CSR1212_SUCCESS)
                                return ret;