Skip to content

Commit

Permalink
[SCSI] libfcoe: fip: fix non-FIP-mode FLOGI state after reset.
Browse files Browse the repository at this point in the history
When a reset is sent using fcoeadm on a non-FIP mode NIC,
there's no link flap, so the fcoe_ctlr stays in non-FIP mode.

In that case, FIP wasn't setting the flogi_oxid or map_dest flag,
causing the FLOGI to be sent with the both wrong source MAC and
the wrong destination MAC address, causing it to fail.

This leads to a non-functioning HBA until a link flap or
instance delete/create.

Signed-off-by: Joe Eykholt <jeykholt@cisco.com>
Signed-off-by: James Bottomley <James.Bottomley@HansenPartnership.com>
  • Loading branch information
Joe Eykholt authored and James Bottomley committed Jun 8, 2009
1 parent f00a332 commit 5f48f70
Showing 1 changed file with 10 additions and 5 deletions.
15 changes: 10 additions & 5 deletions drivers/scsi/fcoe/libfcoe.c
Original file line number Diff line number Diff line change
Expand Up @@ -447,14 +447,10 @@ int fcoe_ctlr_els_send(struct fcoe_ctlr *fip, struct sk_buff *skb)
u16 old_xid;
u8 op;

if (fip->state == FIP_ST_NON_FIP)
return 0;

fh = (struct fc_frame_header *)skb->data;
op = *(u8 *)(fh + 1);

switch (op) {
case ELS_FLOGI:
if (op == ELS_FLOGI) {
old_xid = fip->flogi_oxid;
fip->flogi_oxid = ntohs(fh->fh_ox_id);
if (fip->state == FIP_ST_AUTO) {
Expand All @@ -466,6 +462,15 @@ int fcoe_ctlr_els_send(struct fcoe_ctlr *fip, struct sk_buff *skb)
fip->map_dest = 1;
return 0;
}
if (fip->state == FIP_ST_NON_FIP)
fip->map_dest = 1;
}

if (fip->state == FIP_ST_NON_FIP)
return 0;

switch (op) {
case ELS_FLOGI:
op = FIP_DT_FLOGI;
break;
case ELS_FDISC:
Expand Down

0 comments on commit 5f48f70

Please sign in to comment.