[SCSI] libfcoe: fip: fix non-FIP-mode FLOGI state after reset.
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>
This commit is contained in:
committed by
James Bottomley
parent
f00a3328bf
commit
5f48f70ece
@@ -447,14 +447,10 @@ int fcoe_ctlr_els_send(struct fcoe_ctlr *fip, struct sk_buff *skb)
|
|||||||
u16 old_xid;
|
u16 old_xid;
|
||||||
u8 op;
|
u8 op;
|
||||||
|
|
||||||
if (fip->state == FIP_ST_NON_FIP)
|
|
||||||
return 0;
|
|
||||||
|
|
||||||
fh = (struct fc_frame_header *)skb->data;
|
fh = (struct fc_frame_header *)skb->data;
|
||||||
op = *(u8 *)(fh + 1);
|
op = *(u8 *)(fh + 1);
|
||||||
|
|
||||||
switch (op) {
|
if (op == ELS_FLOGI) {
|
||||||
case ELS_FLOGI:
|
|
||||||
old_xid = fip->flogi_oxid;
|
old_xid = fip->flogi_oxid;
|
||||||
fip->flogi_oxid = ntohs(fh->fh_ox_id);
|
fip->flogi_oxid = ntohs(fh->fh_ox_id);
|
||||||
if (fip->state == FIP_ST_AUTO) {
|
if (fip->state == FIP_ST_AUTO) {
|
||||||
@@ -466,6 +462,15 @@ int fcoe_ctlr_els_send(struct fcoe_ctlr *fip, struct sk_buff *skb)
|
|||||||
fip->map_dest = 1;
|
fip->map_dest = 1;
|
||||||
return 0;
|
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;
|
op = FIP_DT_FLOGI;
|
||||||
break;
|
break;
|
||||||
case ELS_FDISC:
|
case ELS_FDISC:
|
||||||
|
Reference in New Issue
Block a user