diff options
author | Linus Torvalds <torvalds@linux-foundation.org> | 2009-01-29 21:09:41 -0500 |
---|---|---|
committer | Linus Torvalds <torvalds@linux-foundation.org> | 2009-01-29 21:09:41 -0500 |
commit | ceb5eb0cb3fe61d488aa76aba748409775a56daa (patch) | |
tree | 5654161d9975e88d4746174e46fe79e105ea230f /drivers/ieee1394 | |
parent | 726a6699267e36c66043a55b13dfeec3d9925452 (diff) | |
parent | 1448d7c6a2ff96d3b52ecae49e2d0f046a097fe0 (diff) |
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:
ieee1394: sbp2: add workarounds for 2nd and 3rd generation iPods
firewire: sbp2: add workarounds for 2nd and 3rd generation iPods
firewire: sbp2: fix DMA mapping leak on the failure path
firewire: sbp2: define some magic numbers as macros
firewire: sbp2: fix payload limit at S1600 and S3200
ieee1394: sbp2: don't assume zero model_id or firmware_revision if there is none
ieee1394: sbp2: fix payload limit at S1600 and S3200
ieee1394: sbp2: update a help string
ieee1394: support for speeds greater than S800
firewire: core: optimize card shutdown
ieee1394: ohci1394: increase AT req. retries, fix ack_busy_X from Panasonic camcorders and others
firewire: ohci: increase AT req. retries, fix ack_busy_X from Panasonic camcorders and others
firewire: ohci: change "context_stop: still active" log message
firewire: keep highlevel drivers attached during brief connection loss
firewire: unnecessary BM delay after generation rollover
firewire: insist on successive self ID complete events
Diffstat (limited to 'drivers/ieee1394')
-rw-r--r-- | drivers/ieee1394/ieee1394.h | 4 | ||||
-rw-r--r-- | drivers/ieee1394/ieee1394_core.c | 16 | ||||
-rw-r--r-- | drivers/ieee1394/ohci1394.h | 2 | ||||
-rw-r--r-- | drivers/ieee1394/sbp2.c | 54 |
4 files changed, 43 insertions, 33 deletions
diff --git a/drivers/ieee1394/ieee1394.h b/drivers/ieee1394/ieee1394.h index e0ae0d3d747f..af320e2c5079 100644 --- a/drivers/ieee1394/ieee1394.h +++ b/drivers/ieee1394/ieee1394.h | |||
@@ -54,9 +54,7 @@ | |||
54 | #define IEEE1394_SPEED_800 0x03 | 54 | #define IEEE1394_SPEED_800 0x03 |
55 | #define IEEE1394_SPEED_1600 0x04 | 55 | #define IEEE1394_SPEED_1600 0x04 |
56 | #define IEEE1394_SPEED_3200 0x05 | 56 | #define IEEE1394_SPEED_3200 0x05 |
57 | 57 | #define IEEE1394_SPEED_MAX IEEE1394_SPEED_3200 | |
58 | /* The current highest tested speed supported by the subsystem */ | ||
59 | #define IEEE1394_SPEED_MAX IEEE1394_SPEED_800 | ||
60 | 58 | ||
61 | /* Maps speed values above to a string representation */ | 59 | /* Maps speed values above to a string representation */ |
62 | extern const char *hpsb_speedto_str[]; | 60 | extern const char *hpsb_speedto_str[]; |
diff --git a/drivers/ieee1394/ieee1394_core.c b/drivers/ieee1394/ieee1394_core.c index dcdb71a7718d..2beb8d94f7bd 100644 --- a/drivers/ieee1394/ieee1394_core.c +++ b/drivers/ieee1394/ieee1394_core.c | |||
@@ -338,6 +338,7 @@ static void build_speed_map(struct hpsb_host *host, int nodecount) | |||
338 | u8 cldcnt[nodecount]; | 338 | u8 cldcnt[nodecount]; |
339 | u8 *map = host->speed_map; | 339 | u8 *map = host->speed_map; |
340 | u8 *speedcap = host->speed; | 340 | u8 *speedcap = host->speed; |
341 | u8 local_link_speed = host->csr.lnk_spd; | ||
341 | struct selfid *sid; | 342 | struct selfid *sid; |
342 | struct ext_selfid *esid; | 343 | struct ext_selfid *esid; |
343 | int i, j, n; | 344 | int i, j, n; |
@@ -373,8 +374,8 @@ static void build_speed_map(struct hpsb_host *host, int nodecount) | |||
373 | if (sid->port2 == SELFID_PORT_CHILD) cldcnt[n]++; | 374 | if (sid->port2 == SELFID_PORT_CHILD) cldcnt[n]++; |
374 | 375 | ||
375 | speedcap[n] = sid->speed; | 376 | speedcap[n] = sid->speed; |
376 | if (speedcap[n] > host->csr.lnk_spd) | 377 | if (speedcap[n] > local_link_speed) |
377 | speedcap[n] = host->csr.lnk_spd; | 378 | speedcap[n] = local_link_speed; |
378 | n--; | 379 | n--; |
379 | } | 380 | } |
380 | } | 381 | } |
@@ -407,12 +408,11 @@ static void build_speed_map(struct hpsb_host *host, int nodecount) | |||
407 | } | 408 | } |
408 | } | 409 | } |
409 | 410 | ||
410 | #if SELFID_SPEED_UNKNOWN != IEEE1394_SPEED_MAX | 411 | /* assume a maximum speed for 1394b PHYs, nodemgr will correct it */ |
411 | /* assume maximum speed for 1394b PHYs, nodemgr will correct it */ | 412 | if (local_link_speed > SELFID_SPEED_UNKNOWN) |
412 | for (n = 0; n < nodecount; n++) | 413 | for (i = 0; i < nodecount; i++) |
413 | if (speedcap[n] == SELFID_SPEED_UNKNOWN) | 414 | if (speedcap[i] == SELFID_SPEED_UNKNOWN) |
414 | speedcap[n] = IEEE1394_SPEED_MAX; | 415 | speedcap[i] = local_link_speed; |
415 | #endif | ||
416 | } | 416 | } |
417 | 417 | ||
418 | 418 | ||
diff --git a/drivers/ieee1394/ohci1394.h b/drivers/ieee1394/ohci1394.h index 4320bf010495..7fb8ab9780ae 100644 --- a/drivers/ieee1394/ohci1394.h +++ b/drivers/ieee1394/ohci1394.h | |||
@@ -26,7 +26,7 @@ | |||
26 | 26 | ||
27 | #define OHCI1394_DRIVER_NAME "ohci1394" | 27 | #define OHCI1394_DRIVER_NAME "ohci1394" |
28 | 28 | ||
29 | #define OHCI1394_MAX_AT_REQ_RETRIES 0x2 | 29 | #define OHCI1394_MAX_AT_REQ_RETRIES 0xf |
30 | #define OHCI1394_MAX_AT_RESP_RETRIES 0x2 | 30 | #define OHCI1394_MAX_AT_RESP_RETRIES 0x2 |
31 | #define OHCI1394_MAX_PHYS_RESP_RETRIES 0x8 | 31 | #define OHCI1394_MAX_PHYS_RESP_RETRIES 0x8 |
32 | #define OHCI1394_MAX_SELF_ID_ERRORS 16 | 32 | #define OHCI1394_MAX_SELF_ID_ERRORS 16 |
diff --git a/drivers/ieee1394/sbp2.c b/drivers/ieee1394/sbp2.c index ab1034ccb7fb..f3fd8657ce4b 100644 --- a/drivers/ieee1394/sbp2.c +++ b/drivers/ieee1394/sbp2.c | |||
@@ -115,8 +115,8 @@ | |||
115 | */ | 115 | */ |
116 | static int sbp2_max_speed = IEEE1394_SPEED_MAX; | 116 | static int sbp2_max_speed = IEEE1394_SPEED_MAX; |
117 | module_param_named(max_speed, sbp2_max_speed, int, 0644); | 117 | module_param_named(max_speed, sbp2_max_speed, int, 0644); |
118 | MODULE_PARM_DESC(max_speed, "Force max speed " | 118 | MODULE_PARM_DESC(max_speed, "Limit data transfer speed (5 <= 3200, " |
119 | "(3 = 800Mb/s, 2 = 400Mb/s, 1 = 200Mb/s, 0 = 100Mb/s)"); | 119 | "4 <= 1600, 3 <= 800, 2 <= 400, 1 <= 200, 0 = 100 Mb/s)"); |
120 | 120 | ||
121 | /* | 121 | /* |
122 | * Set serialize_io to 0 or N to use dynamically appended lists of command ORBs. | 122 | * Set serialize_io to 0 or N to use dynamically appended lists of command ORBs. |
@@ -256,7 +256,7 @@ static int sbp2_set_busy_timeout(struct sbp2_lu *); | |||
256 | static int sbp2_max_speed_and_size(struct sbp2_lu *); | 256 | static int sbp2_max_speed_and_size(struct sbp2_lu *); |
257 | 257 | ||
258 | 258 | ||
259 | static const u8 sbp2_speedto_max_payload[] = { 0x7, 0x8, 0x9, 0xA, 0xB, 0xC }; | 259 | static const u8 sbp2_speedto_max_payload[] = { 0x7, 0x8, 0x9, 0xa, 0xa, 0xa }; |
260 | 260 | ||
261 | static DEFINE_RWLOCK(sbp2_hi_logical_units_lock); | 261 | static DEFINE_RWLOCK(sbp2_hi_logical_units_lock); |
262 | 262 | ||
@@ -347,8 +347,8 @@ static struct scsi_host_template sbp2_shost_template = { | |||
347 | .sdev_attrs = sbp2_sysfs_sdev_attrs, | 347 | .sdev_attrs = sbp2_sysfs_sdev_attrs, |
348 | }; | 348 | }; |
349 | 349 | ||
350 | /* for match-all entries in sbp2_workarounds_table */ | 350 | #define SBP2_ROM_VALUE_WILDCARD ~0 /* match all */ |
351 | #define SBP2_ROM_VALUE_WILDCARD 0x1000000 | 351 | #define SBP2_ROM_VALUE_MISSING 0xff000000 /* not present in the unit dir. */ |
352 | 352 | ||
353 | /* | 353 | /* |
354 | * List of devices with known bugs. | 354 | * List of devices with known bugs. |
@@ -359,60 +359,70 @@ static struct scsi_host_template sbp2_shost_template = { | |||
359 | */ | 359 | */ |
360 | static const struct { | 360 | static const struct { |
361 | u32 firmware_revision; | 361 | u32 firmware_revision; |
362 | u32 model_id; | 362 | u32 model; |
363 | unsigned workarounds; | 363 | unsigned workarounds; |
364 | } sbp2_workarounds_table[] = { | 364 | } sbp2_workarounds_table[] = { |
365 | /* DViCO Momobay CX-1 with TSB42AA9 bridge */ { | 365 | /* DViCO Momobay CX-1 with TSB42AA9 bridge */ { |
366 | .firmware_revision = 0x002800, | 366 | .firmware_revision = 0x002800, |
367 | .model_id = 0x001010, | 367 | .model = 0x001010, |
368 | .workarounds = SBP2_WORKAROUND_INQUIRY_36 | | 368 | .workarounds = SBP2_WORKAROUND_INQUIRY_36 | |
369 | SBP2_WORKAROUND_MODE_SENSE_8 | | 369 | SBP2_WORKAROUND_MODE_SENSE_8 | |
370 | SBP2_WORKAROUND_POWER_CONDITION, | 370 | SBP2_WORKAROUND_POWER_CONDITION, |
371 | }, | 371 | }, |
372 | /* DViCO Momobay FX-3A with TSB42AA9A bridge */ { | 372 | /* DViCO Momobay FX-3A with TSB42AA9A bridge */ { |
373 | .firmware_revision = 0x002800, | 373 | .firmware_revision = 0x002800, |
374 | .model_id = 0x000000, | 374 | .model = 0x000000, |
375 | .workarounds = SBP2_WORKAROUND_DELAY_INQUIRY | | 375 | .workarounds = SBP2_WORKAROUND_DELAY_INQUIRY | |
376 | SBP2_WORKAROUND_POWER_CONDITION, | 376 | SBP2_WORKAROUND_POWER_CONDITION, |
377 | }, | 377 | }, |
378 | /* Initio bridges, actually only needed for some older ones */ { | 378 | /* Initio bridges, actually only needed for some older ones */ { |
379 | .firmware_revision = 0x000200, | 379 | .firmware_revision = 0x000200, |
380 | .model_id = SBP2_ROM_VALUE_WILDCARD, | 380 | .model = SBP2_ROM_VALUE_WILDCARD, |
381 | .workarounds = SBP2_WORKAROUND_INQUIRY_36, | 381 | .workarounds = SBP2_WORKAROUND_INQUIRY_36, |
382 | }, | 382 | }, |
383 | /* PL-3507 bridge with Prolific firmware */ { | 383 | /* PL-3507 bridge with Prolific firmware */ { |
384 | .firmware_revision = 0x012800, | 384 | .firmware_revision = 0x012800, |
385 | .model_id = SBP2_ROM_VALUE_WILDCARD, | 385 | .model = SBP2_ROM_VALUE_WILDCARD, |
386 | .workarounds = SBP2_WORKAROUND_POWER_CONDITION, | 386 | .workarounds = SBP2_WORKAROUND_POWER_CONDITION, |
387 | }, | 387 | }, |
388 | /* Symbios bridge */ { | 388 | /* Symbios bridge */ { |
389 | .firmware_revision = 0xa0b800, | 389 | .firmware_revision = 0xa0b800, |
390 | .model_id = SBP2_ROM_VALUE_WILDCARD, | 390 | .model = SBP2_ROM_VALUE_WILDCARD, |
391 | .workarounds = SBP2_WORKAROUND_128K_MAX_TRANS, | 391 | .workarounds = SBP2_WORKAROUND_128K_MAX_TRANS, |
392 | }, | 392 | }, |
393 | /* Datafab MD2-FW2 with Symbios/LSILogic SYM13FW500 bridge */ { | 393 | /* Datafab MD2-FW2 with Symbios/LSILogic SYM13FW500 bridge */ { |
394 | .firmware_revision = 0x002600, | 394 | .firmware_revision = 0x002600, |
395 | .model_id = SBP2_ROM_VALUE_WILDCARD, | 395 | .model = SBP2_ROM_VALUE_WILDCARD, |
396 | .workarounds = SBP2_WORKAROUND_128K_MAX_TRANS, | 396 | .workarounds = SBP2_WORKAROUND_128K_MAX_TRANS, |
397 | }, | 397 | }, |
398 | /* | ||
399 | * iPod 2nd generation: needs 128k max transfer size workaround | ||
400 | * iPod 3rd generation: needs fix capacity workaround | ||
401 | */ | ||
402 | { | ||
403 | .firmware_revision = 0x0a2700, | ||
404 | .model = 0x000000, | ||
405 | .workarounds = SBP2_WORKAROUND_128K_MAX_TRANS | | ||
406 | SBP2_WORKAROUND_FIX_CAPACITY, | ||
407 | }, | ||
398 | /* iPod 4th generation */ { | 408 | /* iPod 4th generation */ { |
399 | .firmware_revision = 0x0a2700, | 409 | .firmware_revision = 0x0a2700, |
400 | .model_id = 0x000021, | 410 | .model = 0x000021, |
401 | .workarounds = SBP2_WORKAROUND_FIX_CAPACITY, | 411 | .workarounds = SBP2_WORKAROUND_FIX_CAPACITY, |
402 | }, | 412 | }, |
403 | /* iPod mini */ { | 413 | /* iPod mini */ { |
404 | .firmware_revision = 0x0a2700, | 414 | .firmware_revision = 0x0a2700, |
405 | .model_id = 0x000022, | 415 | .model = 0x000022, |
406 | .workarounds = SBP2_WORKAROUND_FIX_CAPACITY, | 416 | .workarounds = SBP2_WORKAROUND_FIX_CAPACITY, |
407 | }, | 417 | }, |
408 | /* iPod mini */ { | 418 | /* iPod mini */ { |
409 | .firmware_revision = 0x0a2700, | 419 | .firmware_revision = 0x0a2700, |
410 | .model_id = 0x000023, | 420 | .model = 0x000023, |
411 | .workarounds = SBP2_WORKAROUND_FIX_CAPACITY, | 421 | .workarounds = SBP2_WORKAROUND_FIX_CAPACITY, |
412 | }, | 422 | }, |
413 | /* iPod Photo */ { | 423 | /* iPod Photo */ { |
414 | .firmware_revision = 0x0a2700, | 424 | .firmware_revision = 0x0a2700, |
415 | .model_id = 0x00007e, | 425 | .model = 0x00007e, |
416 | .workarounds = SBP2_WORKAROUND_FIX_CAPACITY, | 426 | .workarounds = SBP2_WORKAROUND_FIX_CAPACITY, |
417 | } | 427 | } |
418 | }; | 428 | }; |
@@ -1341,13 +1351,15 @@ static void sbp2_parse_unit_directory(struct sbp2_lu *lu, | |||
1341 | struct csr1212_keyval *kv; | 1351 | struct csr1212_keyval *kv; |
1342 | struct csr1212_dentry *dentry; | 1352 | struct csr1212_dentry *dentry; |
1343 | u64 management_agent_addr; | 1353 | u64 management_agent_addr; |
1344 | u32 unit_characteristics, firmware_revision; | 1354 | u32 unit_characteristics, firmware_revision, model; |
1345 | unsigned workarounds; | 1355 | unsigned workarounds; |
1346 | int i; | 1356 | int i; |
1347 | 1357 | ||
1348 | management_agent_addr = 0; | 1358 | management_agent_addr = 0; |
1349 | unit_characteristics = 0; | 1359 | unit_characteristics = 0; |
1350 | firmware_revision = 0; | 1360 | firmware_revision = SBP2_ROM_VALUE_MISSING; |
1361 | model = ud->flags & UNIT_DIRECTORY_MODEL_ID ? | ||
1362 | ud->model_id : SBP2_ROM_VALUE_MISSING; | ||
1351 | 1363 | ||
1352 | csr1212_for_each_dir_entry(ud->ne->csr, kv, ud->ud_kv, dentry) { | 1364 | csr1212_for_each_dir_entry(ud->ne->csr, kv, ud->ud_kv, dentry) { |
1353 | switch (kv->key.id) { | 1365 | switch (kv->key.id) { |
@@ -1388,9 +1400,9 @@ static void sbp2_parse_unit_directory(struct sbp2_lu *lu, | |||
1388 | sbp2_workarounds_table[i].firmware_revision != | 1400 | sbp2_workarounds_table[i].firmware_revision != |
1389 | (firmware_revision & 0xffff00)) | 1401 | (firmware_revision & 0xffff00)) |
1390 | continue; | 1402 | continue; |
1391 | if (sbp2_workarounds_table[i].model_id != | 1403 | if (sbp2_workarounds_table[i].model != |
1392 | SBP2_ROM_VALUE_WILDCARD && | 1404 | SBP2_ROM_VALUE_WILDCARD && |
1393 | sbp2_workarounds_table[i].model_id != ud->model_id) | 1405 | sbp2_workarounds_table[i].model != model) |
1394 | continue; | 1406 | continue; |
1395 | workarounds |= sbp2_workarounds_table[i].workarounds; | 1407 | workarounds |= sbp2_workarounds_table[i].workarounds; |
1396 | break; | 1408 | break; |
@@ -1403,7 +1415,7 @@ static void sbp2_parse_unit_directory(struct sbp2_lu *lu, | |||
1403 | NODE_BUS_ARGS(ud->ne->host, ud->ne->nodeid), | 1415 | NODE_BUS_ARGS(ud->ne->host, ud->ne->nodeid), |
1404 | workarounds, firmware_revision, | 1416 | workarounds, firmware_revision, |
1405 | ud->vendor_id ? ud->vendor_id : ud->ne->vendor_id, | 1417 | ud->vendor_id ? ud->vendor_id : ud->ne->vendor_id, |
1406 | ud->model_id); | 1418 | model); |
1407 | 1419 | ||
1408 | /* We would need one SCSI host template for each target to adjust | 1420 | /* We would need one SCSI host template for each target to adjust |
1409 | * max_sectors on the fly, therefore warn only. */ | 1421 | * max_sectors on the fly, therefore warn only. */ |