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
This commit is contained in:
@@ -54,9 +54,7 @@
|
||||
#define IEEE1394_SPEED_800 0x03
|
||||
#define IEEE1394_SPEED_1600 0x04
|
||||
#define IEEE1394_SPEED_3200 0x05
|
||||
|
||||
/* The current highest tested speed supported by the subsystem */
|
||||
#define IEEE1394_SPEED_MAX IEEE1394_SPEED_800
|
||||
#define IEEE1394_SPEED_MAX IEEE1394_SPEED_3200
|
||||
|
||||
/* Maps speed values above to a string representation */
|
||||
extern const char *hpsb_speedto_str[];
|
||||
|
@@ -338,6 +338,7 @@ static void build_speed_map(struct hpsb_host *host, int nodecount)
|
||||
u8 cldcnt[nodecount];
|
||||
u8 *map = host->speed_map;
|
||||
u8 *speedcap = host->speed;
|
||||
u8 local_link_speed = host->csr.lnk_spd;
|
||||
struct selfid *sid;
|
||||
struct ext_selfid *esid;
|
||||
int i, j, n;
|
||||
@@ -373,8 +374,8 @@ static void build_speed_map(struct hpsb_host *host, int nodecount)
|
||||
if (sid->port2 == SELFID_PORT_CHILD) cldcnt[n]++;
|
||||
|
||||
speedcap[n] = sid->speed;
|
||||
if (speedcap[n] > host->csr.lnk_spd)
|
||||
speedcap[n] = host->csr.lnk_spd;
|
||||
if (speedcap[n] > local_link_speed)
|
||||
speedcap[n] = local_link_speed;
|
||||
n--;
|
||||
}
|
||||
}
|
||||
@@ -407,12 +408,11 @@ static void build_speed_map(struct hpsb_host *host, int nodecount)
|
||||
}
|
||||
}
|
||||
|
||||
#if SELFID_SPEED_UNKNOWN != IEEE1394_SPEED_MAX
|
||||
/* assume maximum speed for 1394b PHYs, nodemgr will correct it */
|
||||
for (n = 0; n < nodecount; n++)
|
||||
if (speedcap[n] == SELFID_SPEED_UNKNOWN)
|
||||
speedcap[n] = IEEE1394_SPEED_MAX;
|
||||
#endif
|
||||
/* assume a maximum speed for 1394b PHYs, nodemgr will correct it */
|
||||
if (local_link_speed > SELFID_SPEED_UNKNOWN)
|
||||
for (i = 0; i < nodecount; i++)
|
||||
if (speedcap[i] == SELFID_SPEED_UNKNOWN)
|
||||
speedcap[i] = local_link_speed;
|
||||
}
|
||||
|
||||
|
||||
|
@@ -26,7 +26,7 @@
|
||||
|
||||
#define OHCI1394_DRIVER_NAME "ohci1394"
|
||||
|
||||
#define OHCI1394_MAX_AT_REQ_RETRIES 0x2
|
||||
#define OHCI1394_MAX_AT_REQ_RETRIES 0xf
|
||||
#define OHCI1394_MAX_AT_RESP_RETRIES 0x2
|
||||
#define OHCI1394_MAX_PHYS_RESP_RETRIES 0x8
|
||||
#define OHCI1394_MAX_SELF_ID_ERRORS 16
|
||||
|
@@ -115,8 +115,8 @@
|
||||
*/
|
||||
static int sbp2_max_speed = IEEE1394_SPEED_MAX;
|
||||
module_param_named(max_speed, sbp2_max_speed, int, 0644);
|
||||
MODULE_PARM_DESC(max_speed, "Force max speed "
|
||||
"(3 = 800Mb/s, 2 = 400Mb/s, 1 = 200Mb/s, 0 = 100Mb/s)");
|
||||
MODULE_PARM_DESC(max_speed, "Limit data transfer speed (5 <= 3200, "
|
||||
"4 <= 1600, 3 <= 800, 2 <= 400, 1 <= 200, 0 = 100 Mb/s)");
|
||||
|
||||
/*
|
||||
* 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 *);
|
||||
static int sbp2_max_speed_and_size(struct sbp2_lu *);
|
||||
|
||||
|
||||
static const u8 sbp2_speedto_max_payload[] = { 0x7, 0x8, 0x9, 0xA, 0xB, 0xC };
|
||||
static const u8 sbp2_speedto_max_payload[] = { 0x7, 0x8, 0x9, 0xa, 0xa, 0xa };
|
||||
|
||||
static DEFINE_RWLOCK(sbp2_hi_logical_units_lock);
|
||||
|
||||
@@ -347,8 +347,8 @@ static struct scsi_host_template sbp2_shost_template = {
|
||||
.sdev_attrs = sbp2_sysfs_sdev_attrs,
|
||||
};
|
||||
|
||||
/* for match-all entries in sbp2_workarounds_table */
|
||||
#define SBP2_ROM_VALUE_WILDCARD 0x1000000
|
||||
#define SBP2_ROM_VALUE_WILDCARD ~0 /* match all */
|
||||
#define SBP2_ROM_VALUE_MISSING 0xff000000 /* not present in the unit dir. */
|
||||
|
||||
/*
|
||||
* List of devices with known bugs.
|
||||
@@ -359,60 +359,70 @@ static struct scsi_host_template sbp2_shost_template = {
|
||||
*/
|
||||
static const struct {
|
||||
u32 firmware_revision;
|
||||
u32 model_id;
|
||||
u32 model;
|
||||
unsigned workarounds;
|
||||
} sbp2_workarounds_table[] = {
|
||||
/* DViCO Momobay CX-1 with TSB42AA9 bridge */ {
|
||||
.firmware_revision = 0x002800,
|
||||
.model_id = 0x001010,
|
||||
.model = 0x001010,
|
||||
.workarounds = SBP2_WORKAROUND_INQUIRY_36 |
|
||||
SBP2_WORKAROUND_MODE_SENSE_8 |
|
||||
SBP2_WORKAROUND_POWER_CONDITION,
|
||||
},
|
||||
/* DViCO Momobay FX-3A with TSB42AA9A bridge */ {
|
||||
.firmware_revision = 0x002800,
|
||||
.model_id = 0x000000,
|
||||
.model = 0x000000,
|
||||
.workarounds = SBP2_WORKAROUND_DELAY_INQUIRY |
|
||||
SBP2_WORKAROUND_POWER_CONDITION,
|
||||
},
|
||||
/* Initio bridges, actually only needed for some older ones */ {
|
||||
.firmware_revision = 0x000200,
|
||||
.model_id = SBP2_ROM_VALUE_WILDCARD,
|
||||
.model = SBP2_ROM_VALUE_WILDCARD,
|
||||
.workarounds = SBP2_WORKAROUND_INQUIRY_36,
|
||||
},
|
||||
/* PL-3507 bridge with Prolific firmware */ {
|
||||
.firmware_revision = 0x012800,
|
||||
.model_id = SBP2_ROM_VALUE_WILDCARD,
|
||||
.model = SBP2_ROM_VALUE_WILDCARD,
|
||||
.workarounds = SBP2_WORKAROUND_POWER_CONDITION,
|
||||
},
|
||||
/* Symbios bridge */ {
|
||||
.firmware_revision = 0xa0b800,
|
||||
.model_id = SBP2_ROM_VALUE_WILDCARD,
|
||||
.model = SBP2_ROM_VALUE_WILDCARD,
|
||||
.workarounds = SBP2_WORKAROUND_128K_MAX_TRANS,
|
||||
},
|
||||
/* Datafab MD2-FW2 with Symbios/LSILogic SYM13FW500 bridge */ {
|
||||
.firmware_revision = 0x002600,
|
||||
.model_id = SBP2_ROM_VALUE_WILDCARD,
|
||||
.model = SBP2_ROM_VALUE_WILDCARD,
|
||||
.workarounds = SBP2_WORKAROUND_128K_MAX_TRANS,
|
||||
},
|
||||
/*
|
||||
* iPod 2nd generation: needs 128k max transfer size workaround
|
||||
* iPod 3rd generation: needs fix capacity workaround
|
||||
*/
|
||||
{
|
||||
.firmware_revision = 0x0a2700,
|
||||
.model = 0x000000,
|
||||
.workarounds = SBP2_WORKAROUND_128K_MAX_TRANS |
|
||||
SBP2_WORKAROUND_FIX_CAPACITY,
|
||||
},
|
||||
/* iPod 4th generation */ {
|
||||
.firmware_revision = 0x0a2700,
|
||||
.model_id = 0x000021,
|
||||
.model = 0x000021,
|
||||
.workarounds = SBP2_WORKAROUND_FIX_CAPACITY,
|
||||
},
|
||||
/* iPod mini */ {
|
||||
.firmware_revision = 0x0a2700,
|
||||
.model_id = 0x000022,
|
||||
.model = 0x000022,
|
||||
.workarounds = SBP2_WORKAROUND_FIX_CAPACITY,
|
||||
},
|
||||
/* iPod mini */ {
|
||||
.firmware_revision = 0x0a2700,
|
||||
.model_id = 0x000023,
|
||||
.model = 0x000023,
|
||||
.workarounds = SBP2_WORKAROUND_FIX_CAPACITY,
|
||||
},
|
||||
/* iPod Photo */ {
|
||||
.firmware_revision = 0x0a2700,
|
||||
.model_id = 0x00007e,
|
||||
.model = 0x00007e,
|
||||
.workarounds = SBP2_WORKAROUND_FIX_CAPACITY,
|
||||
}
|
||||
};
|
||||
@@ -1341,13 +1351,15 @@ static void sbp2_parse_unit_directory(struct sbp2_lu *lu,
|
||||
struct csr1212_keyval *kv;
|
||||
struct csr1212_dentry *dentry;
|
||||
u64 management_agent_addr;
|
||||
u32 unit_characteristics, firmware_revision;
|
||||
u32 unit_characteristics, firmware_revision, model;
|
||||
unsigned workarounds;
|
||||
int i;
|
||||
|
||||
management_agent_addr = 0;
|
||||
unit_characteristics = 0;
|
||||
firmware_revision = 0;
|
||||
firmware_revision = SBP2_ROM_VALUE_MISSING;
|
||||
model = ud->flags & UNIT_DIRECTORY_MODEL_ID ?
|
||||
ud->model_id : SBP2_ROM_VALUE_MISSING;
|
||||
|
||||
csr1212_for_each_dir_entry(ud->ne->csr, kv, ud->ud_kv, dentry) {
|
||||
switch (kv->key.id) {
|
||||
@@ -1388,9 +1400,9 @@ static void sbp2_parse_unit_directory(struct sbp2_lu *lu,
|
||||
sbp2_workarounds_table[i].firmware_revision !=
|
||||
(firmware_revision & 0xffff00))
|
||||
continue;
|
||||
if (sbp2_workarounds_table[i].model_id !=
|
||||
if (sbp2_workarounds_table[i].model !=
|
||||
SBP2_ROM_VALUE_WILDCARD &&
|
||||
sbp2_workarounds_table[i].model_id != ud->model_id)
|
||||
sbp2_workarounds_table[i].model != model)
|
||||
continue;
|
||||
workarounds |= sbp2_workarounds_table[i].workarounds;
|
||||
break;
|
||||
@@ -1403,7 +1415,7 @@ static void sbp2_parse_unit_directory(struct sbp2_lu *lu,
|
||||
NODE_BUS_ARGS(ud->ne->host, ud->ne->nodeid),
|
||||
workarounds, firmware_revision,
|
||||
ud->vendor_id ? ud->vendor_id : ud->ne->vendor_id,
|
||||
ud->model_id);
|
||||
model);
|
||||
|
||||
/* We would need one SCSI host template for each target to adjust
|
||||
* max_sectors on the fly, therefore warn only. */
|
||||
|
Reference in New Issue
Block a user