firewire: Let an fw_descriptor specify a leading immediate key/value pair.

This lets us break out "Juju" as the model name in the config rom.

Signed-off-by: Kristian Høgsberg <krh@redhat.com>
Signed-off-by: Stefan Richter <stefanr@s5r6.in-berlin.de>
diff --git a/drivers/firewire/fw-card.c b/drivers/firewire/fw-card.c
index 3f8661a..8d7c121 100644
--- a/drivers/firewire/fw-card.c
+++ b/drivers/firewire/fw-card.c
@@ -100,11 +100,12 @@
 	i = 5;
 	config_rom[i++] = 0;
 	config_rom[i++] = 0x0c0083c0; /* node capabilities */
-	config_rom[i++] = 0x03d00d1e; /* vendor id */
 	j = i + descriptor_count;
 
 	/* Generate root directory entries for descriptors. */
 	list_for_each_entry (desc, &descriptor_list, link) {
+		if (desc->immediate > 0)
+			config_rom[i++] = desc->immediate;
 		config_rom[i] = desc->key | (j - i);
 		i++;
 		j += desc->length;
@@ -165,6 +166,8 @@
 
 	list_add_tail (&desc->link, &descriptor_list);
 	descriptor_count++;
+	if (desc->immediate > 0)
+		descriptor_count++;
 	update_config_roms();
 
 	up_write(&fw_bus_type.subsys.rwsem);
@@ -180,6 +183,8 @@
 
 	list_del(&desc->link);
 	descriptor_count--;
+	if (desc->immediate > 0)
+		descriptor_count--;
 	update_config_roms();
 
 	up_write(&fw_bus_type.subsys.rwsem);
diff --git a/drivers/firewire/fw-transaction.c b/drivers/firewire/fw-transaction.c
index abc37fa..8e2b945 100644
--- a/drivers/firewire/fw-transaction.c
+++ b/drivers/firewire/fw-transaction.c
@@ -720,23 +720,37 @@
 MODULE_DESCRIPTION("Core IEEE1394 transaction logic");
 MODULE_LICENSE("GPL");
 
-static const u32 vendor_textual_descriptor_data[] = {
+static const u32 vendor_textual_descriptor[] = {
 	/* textual descriptor leaf () */
-	0x00080000,
+	0x00060000,
 	0x00000000,
 	0x00000000,
 	0x4c696e75,		/* L i n u */
 	0x78204669,		/* x   F i */
 	0x72657769,		/* r e w i */
-	0x72652028,		/* r e   ( */
-	0x4a554a55,		/* J U J U */
-	0x29000000,		/* )       */
+	0x72650000,		/* r e     */
 };
 
-static struct fw_descriptor vendor_textual_descriptor = {
-	.length = ARRAY_SIZE(vendor_textual_descriptor_data),
+static const u32 model_textual_descriptor[] = {
+	/* model descriptor leaf () */
+	0x00030000,
+	0x00000000,
+	0x00000000,
+	0x4a756a75,		/* J u j u */
+};
+
+static struct fw_descriptor vendor_id_descriptor = {
+	.length = ARRAY_SIZE(vendor_textual_descriptor),
+	.immediate = 0x03d00d1e,
 	.key = 0x81000000,
-	.data = vendor_textual_descriptor_data,
+	.data = vendor_textual_descriptor,
+};
+
+static struct fw_descriptor model_id_descriptor = {
+	.length = ARRAY_SIZE(model_textual_descriptor),
+	.immediate = 0x17000001,
+	.key = 0x81000000,
+	.data = model_textual_descriptor,
 };
 
 static int __init fw_core_init(void)
@@ -748,7 +762,9 @@
 		return retval;
 
 	/* Add the vendor textual descriptor. */
-	retval = fw_core_add_descriptor(&vendor_textual_descriptor);
+	retval = fw_core_add_descriptor(&vendor_id_descriptor);
+	BUG_ON(retval < 0);
+	retval = fw_core_add_descriptor(&model_id_descriptor);
 	BUG_ON(retval < 0);
 
 	return 0;
diff --git a/drivers/firewire/fw-transaction.h b/drivers/firewire/fw-transaction.h
index cbea845..552e9af 100644
--- a/drivers/firewire/fw-transaction.h
+++ b/drivers/firewire/fw-transaction.h
@@ -164,6 +164,7 @@
 struct fw_descriptor {
 	struct list_head link;
 	size_t length;
+	u32 immediate;
 	u32 key;
 	const u32 *data;
 };