*/
#include <linux/errno.h>
+#include <linux/kernel.h>
#include <linux/string.h>
#include <asm/bug.h>
#include <asm/byteorder.h>
return cpu_to_be16(crc);
}
-#if 0
-/* Microsoft computes the CRC with the bytes in reverse order. Therefore we
- * have a special version of the CRC algorithm to account for their buggy
- * software. */
+/* Microsoft computes the CRC with the bytes in reverse order. */
static u16 csr1212_msft_crc16(const u32 *buffer, size_t length)
{
int shift;
return cpu_to_be16(crc);
}
-#endif
static struct csr1212_dentry *
csr1212_find_keyval(struct csr1212_keyval *dir, struct csr1212_keyval *kv)
default:
/* Should never get here */
+ WARN_ON(1);
break;
}
break;
default:
/* Should never get here */
- break; /* GDB breakpoint */
+ WARN_ON(1);
+ break;
}
value |= (a->key.id & CSR1212_KV_KEY_ID_MASK) <<
case CSR1212_KV_TYPE_IMMEDIATE:
case CSR1212_KV_TYPE_CSR_OFFSET:
/* Should never get here */
- break; /* GDB breakpoint */
+ WARN_ON(1);
+ break;
case CSR1212_KV_TYPE_LEAF:
/* Don't copy over Extended ROM areas, they are
return ret;
}
-#if 0
- /* Apparently there are too many differnt wrong implementations of the
- * CRC algorithm that verifying them is moot. */
+ /* Apparently there are many different wrong implementations of the CRC
+ * algorithm. We don't fail, we just warn. */
if ((csr1212_crc16(bi->data, bi->crc_length) != bi->crc) &&
(csr1212_msft_crc16(bi->data, bi->crc_length) != bi->crc))
- return -EINVAL;
-#endif
+ printk(KERN_DEBUG "IEEE 1394 device has ROM CRC error\n");
cr = CSR1212_MALLOC(sizeof(*cr));
if (!cr)
CSR1212_KV_VAL(ki));
if (!k) {
ret = -ENOMEM;
- goto fail;
+ goto out;
}
k->refcnt = 0; /* Don't keep local reference when parsing. */
CSR1212_KV_VAL(ki));
if (!k) {
ret = -ENOMEM;
- goto fail;
+ goto out;
}
k->refcnt = 0; /* Don't keep local reference when parsing. */
break;
* or Directories. The Config ROM image is most likely
* messed up, so we'll just abort here. */
ret = -EIO;
- goto fail;
+ goto out;
}
k = csr1212_find_keyval_offset(dir, offset);
if (!k) {
ret = -ENOMEM;
- goto fail;
+ goto out;
}
k->refcnt = 0; /* Don't keep local reference when parsing. */
k->valid = 0; /* Contents not read yet so it's not valid. */
dir->next = k;
}
ret = csr1212_attach_keyval_to_directory(dir, k);
-
-fail:
+out:
if (ret != CSR1212_SUCCESS && k != NULL)
free_keyval(k);
return ret;
&cache->data[bytes_to_quads(kv->offset - cache->offset)];
kvi_len = be16_to_cpu(kvi->length);
-#if 0
- /* Apparently there are too many differnt wrong implementations of the
- * CRC algorithm that verifying them is moot. */
+ /* Apparently there are many different wrong implementations of the CRC
+ * algorithm. We don't fail, we just warn. */
if ((csr1212_crc16(kvi->data, kvi_len) != kvi->crc) &&
- (csr1212_msft_crc16(kvi->data, kvi_len) != kvi->crc)) {
- ret = -EINVAL;
- goto fail;
- }
-#endif
+ (csr1212_msft_crc16(kvi->data, kvi_len) != kvi->crc))
+ printk(KERN_DEBUG "IEEE 1394 device has ROM CRC error\n");
switch (kv->key.type) {
case CSR1212_KV_TYPE_DIRECTORY:
kv->value.leaf.data = CSR1212_MALLOC(size);
if (!kv->value.leaf.data) {
ret = -ENOMEM;
- goto fail;
+ goto out;
}
kv->value.leaf.len = kvi_len;
}
kv->valid = 1;
-
-fail:
+out:
return ret;
}