]> bbs.cooldavid.org Git - net-next-2.6.git/commitdiff
[SCSI] libfcoe: Set fip_flags according to fcf and lport's capability of SPMA support
authorYi Zou <yi.zou@intel.com>
Thu, 30 Jul 2009 00:03:55 +0000 (17:03 -0700)
committerJames Bottomley <James.Bottomley@suse.de>
Sat, 22 Aug 2009 22:52:02 +0000 (17:52 -0500)
When encap the els for FIP, set the fip_flags according to the FCF and lport's
capability of supporting SPMA or FPMA or both.

Signed-off-by: Yi Zou <yi.zou@intel.com>
Signed-off-by: Robert Love <robert.w.love@intel.com>
Signed-off-by: James Bottomley <James.Bottomley@HansenPartnership.com>
Signed-off-by: James Bottomley <James.Bottomley@suse.de>
drivers/scsi/fcoe/libfcoe.c

index d6ed3f8255adf9d1ebc7617891f975d2488897d7..78caa6be1130fdae2b436d71d04fd44e3184521d 100644 (file)
@@ -413,10 +413,18 @@ static int fcoe_ctlr_encaps(struct fcoe_ctlr *fip,
        struct fip_mac_desc *mac;
        struct fcoe_fcf *fcf;
        size_t dlen;
+       u16 fip_flags;
 
        fcf = fip->sel_fcf;
        if (!fcf)
                return -ENODEV;
+
+       /* set flags according to both FCF and lport's capability on SPMA */
+       fip_flags = fcf->flags;
+       fip_flags &= fip->spma ? FIP_FL_SPMA | FIP_FL_FPMA : FIP_FL_FPMA;
+       if (!fip_flags)
+               return -ENODEV;
+
        dlen = sizeof(struct fip_encaps) + skb->len;    /* len before push */
        cap = (struct fip_encaps_head *)skb_push(skb, sizeof(*cap));
 
@@ -429,9 +437,7 @@ static int fcoe_ctlr_encaps(struct fcoe_ctlr *fip,
        cap->fip.fip_op = htons(FIP_OP_LS);
        cap->fip.fip_subcode = FIP_SC_REQ;
        cap->fip.fip_dl_len = htons((dlen + sizeof(*mac)) / FIP_BPW);
-       cap->fip.fip_flags = htons(FIP_FL_FPMA);
-       if (fip->spma)
-               cap->fip.fip_flags |= htons(FIP_FL_SPMA);
+       cap->fip.fip_flags = htons(fip_flags);
 
        cap->encaps.fd_desc.fip_dtype = dtype;
        cap->encaps.fd_desc.fip_dlen = dlen / FIP_BPW;