aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorRobert Love <robert.w.love@intel.com>2010-04-09 17:22:17 -0400
committerJames Bottomley <James.Bottomley@suse.de>2010-04-11 15:02:27 -0400
commit593abc0720d5639ba21834b082adf83762af39be (patch)
tree7abbe4651823fb981a6f6aef4ab8b7b11564d954
parentaea20f9540e615f158536b777f7f9ac646427f98 (diff)
[SCSI] libfcoe: Don't fill MAC desc in FLOGI if FIP negotiated FPMA
FPMA indicates that the Fabric will provide the host's N_Port's MAC address. When sending a FLOGI/FDISC frame and FPMA was negotiated through FIP discovery we still need to provide the MAC descriptor, as per the specification, but the MAC should be zero'd out since the FCF will be providing it in the FLOGI/FDISC ACC. In FC-BB-5 section 7.8.7.4.2 (Fabric login) it states: The MAC address field in the MAC address descriptor of a FIP FLOGI Request operation or a FIP NPIV FDISC Request operation shall contain: a) the proposed MAC address to use as VN_Port MAC address if the ENode is requesting to use SPMA (see table 27); b) all zeroes to indicate no MAC address is proposed if the ENode is requesting to use FPMA (see table 27); or c) the proposed MAC address to use as VN_Port MAC address if the ENode supports both SPMA and FPMA and leaves the decision of which addressing scheme to use to the FCF (i.e., if both the FP and SP bits are set to one, see table 27). This patch fixes case B. This patch also adds debug statements to illustrate whether a FPMA or SPMA MAC is added to a FLOGI/FDISC frame. Signed-off-by: Robert Love <robert.w.love@intel.com> Signed-off-by: Chris Leech <christopher.leech@intel.com> Signed-off-by: James Bottomley <James.Bottomley@suse.de>
-rw-r--r--drivers/scsi/fcoe/libfcoe.c9
1 files changed, 7 insertions, 2 deletions
diff --git a/drivers/scsi/fcoe/libfcoe.c b/drivers/scsi/fcoe/libfcoe.c
index ff5ccba3d741..de5c329cb3b4 100644
--- a/drivers/scsi/fcoe/libfcoe.c
+++ b/drivers/scsi/fcoe/libfcoe.c
@@ -442,10 +442,15 @@ static int fcoe_ctlr_encaps(struct fcoe_ctlr *fip, struct fc_lport *lport,
442 memset(mac, 0, sizeof(mac)); 442 memset(mac, 0, sizeof(mac));
443 mac->fd_desc.fip_dtype = FIP_DT_MAC; 443 mac->fd_desc.fip_dtype = FIP_DT_MAC;
444 mac->fd_desc.fip_dlen = sizeof(*mac) / FIP_BPW; 444 mac->fd_desc.fip_dlen = sizeof(*mac) / FIP_BPW;
445 if (dtype != FIP_DT_FLOGI && dtype != FIP_DT_FDISC) 445 if (dtype != FIP_DT_FLOGI && dtype != FIP_DT_FDISC) {
446 memcpy(mac->fd_mac, fip->get_src_addr(lport), ETH_ALEN); 446 memcpy(mac->fd_mac, fip->get_src_addr(lport), ETH_ALEN);
447 else if (fip->spma) 447 } else if (fip_flags & FIP_FL_SPMA) {
448 LIBFCOE_FIP_DBG(fip, "FLOGI/FDISC sent with SPMA\n");
448 memcpy(mac->fd_mac, fip->ctl_src_addr, ETH_ALEN); 449 memcpy(mac->fd_mac, fip->ctl_src_addr, ETH_ALEN);
450 } else {
451 LIBFCOE_FIP_DBG(fip, "FLOGI/FDISC sent with FPMA\n");
452 /* FPMA only FLOGI must leave the MAC desc set to all 0s */
453 }
449 454
450 skb->protocol = htons(ETH_P_FIP); 455 skb->protocol = htons(ETH_P_FIP);
451 skb_reset_mac_header(skb); 456 skb_reset_mac_header(skb);