Commit a4c379c1 authored by Jarod Wilson's avatar Jarod Wilson Committed by Stefan Richter

firewire: fw-sbp2: increase login orb reply timeout, fix "failed to login"

Increase (and rename) the login orb reply timeout value to 20s
to match that of the old firewire stack. 2s simply didn't give
many devices enough time to spin up and reply.

Fixes inability to recognize some devices.
Failure mode was "orb reply timed out"/"failed to login".
Signed-off-by: default avatarJarod Wilson <jwilson@redhat.com>
Signed-off-by: Stefan Richter <stefanr@s5r6.in-berlin.de> (style, comments, changelog)
parent 8f9f963e
...@@ -151,9 +151,16 @@ struct sbp2_target { ...@@ -151,9 +151,16 @@ struct sbp2_target {
struct list_head lu_list; struct list_head lu_list;
}; };
#define SBP2_MAX_SG_ELEMENT_LENGTH 0xf000 /*
* Per section 7.4.8 of the SBP-2 spec, a mgt_ORB_timeout value can be
* provided in the config rom. A high timeout value really only matters
* on initial login, where we'll just use 20s rather than hassling with
* reading the config rom, since it really wouldn't buy us much.
*/
#define SBP2_LOGIN_ORB_TIMEOUT 20000 /* Timeout in ms */
#define SBP2_ORB_TIMEOUT 2000 /* Timeout in ms */ #define SBP2_ORB_TIMEOUT 2000 /* Timeout in ms */
#define SBP2_ORB_NULL 0x80000000 #define SBP2_ORB_NULL 0x80000000
#define SBP2_MAX_SG_ELEMENT_LENGTH 0xf000
#define SBP2_DIRECTION_TO_MEDIA 0x0 #define SBP2_DIRECTION_TO_MEDIA 0x0
#define SBP2_DIRECTION_FROM_MEDIA 0x1 #define SBP2_DIRECTION_FROM_MEDIA 0x1
...@@ -488,6 +495,7 @@ sbp2_send_management_orb(struct sbp2_logical_unit *lu, int node_id, ...@@ -488,6 +495,7 @@ sbp2_send_management_orb(struct sbp2_logical_unit *lu, int node_id,
{ {
struct fw_device *device = fw_device(lu->tgt->unit->device.parent); struct fw_device *device = fw_device(lu->tgt->unit->device.parent);
struct sbp2_management_orb *orb; struct sbp2_management_orb *orb;
unsigned int timeout;
int retval = -ENOMEM; int retval = -ENOMEM;
orb = kzalloc(sizeof(*orb), GFP_ATOMIC); orb = kzalloc(sizeof(*orb), GFP_ATOMIC);
...@@ -519,6 +527,9 @@ sbp2_send_management_orb(struct sbp2_logical_unit *lu, int node_id, ...@@ -519,6 +527,9 @@ sbp2_send_management_orb(struct sbp2_logical_unit *lu, int node_id,
orb->request.misc |= orb->request.misc |=
MANAGEMENT_ORB_RECONNECT(2) | MANAGEMENT_ORB_RECONNECT(2) |
MANAGEMENT_ORB_EXCLUSIVE(sbp2_param_exclusive_login); MANAGEMENT_ORB_EXCLUSIVE(sbp2_param_exclusive_login);
timeout = SBP2_LOGIN_ORB_TIMEOUT;
} else {
timeout = SBP2_ORB_TIMEOUT;
} }
fw_memcpy_to_be32(&orb->request, &orb->request, sizeof(orb->request)); fw_memcpy_to_be32(&orb->request, &orb->request, sizeof(orb->request));
...@@ -535,8 +546,7 @@ sbp2_send_management_orb(struct sbp2_logical_unit *lu, int node_id, ...@@ -535,8 +546,7 @@ sbp2_send_management_orb(struct sbp2_logical_unit *lu, int node_id,
sbp2_send_orb(&orb->base, lu, node_id, generation, sbp2_send_orb(&orb->base, lu, node_id, generation,
lu->tgt->management_agent_address); lu->tgt->management_agent_address);
wait_for_completion_timeout(&orb->done, wait_for_completion_timeout(&orb->done, msecs_to_jiffies(timeout));
msecs_to_jiffies(SBP2_ORB_TIMEOUT));
retval = -EIO; retval = -EIO;
if (sbp2_cancel_orbs(lu) == 0) { if (sbp2_cancel_orbs(lu) == 0) {
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment