|
@@ -516,23 +516,17 @@ static void bnx2fc_recv_frame(struct sk_buff *skb)
|
|
|
skb_pull(skb, sizeof(struct fcoe_hdr));
|
|
|
fr_len = skb->len - sizeof(struct fcoe_crc_eof);
|
|
|
|
|
|
- stats = per_cpu_ptr(lport->stats, get_cpu());
|
|
|
- stats->RxFrames++;
|
|
|
- stats->RxWords += fr_len / FCOE_WORD_TO_BYTE;
|
|
|
-
|
|
|
fp = (struct fc_frame *)skb;
|
|
|
fc_frame_init(fp);
|
|
|
fr_dev(fp) = lport;
|
|
|
fr_sof(fp) = hp->fcoe_sof;
|
|
|
if (skb_copy_bits(skb, fr_len, &crc_eof, sizeof(crc_eof))) {
|
|
|
- put_cpu();
|
|
|
kfree_skb(skb);
|
|
|
return;
|
|
|
}
|
|
|
fr_eof(fp) = crc_eof.fcoe_eof;
|
|
|
fr_crc(fp) = crc_eof.fcoe_crc32;
|
|
|
if (pskb_trim(skb, fr_len)) {
|
|
|
- put_cpu();
|
|
|
kfree_skb(skb);
|
|
|
return;
|
|
|
}
|
|
@@ -544,7 +538,6 @@ static void bnx2fc_recv_frame(struct sk_buff *skb)
|
|
|
port = lport_priv(vn_port);
|
|
|
if (!ether_addr_equal(port->data_src_addr, dest_mac)) {
|
|
|
BNX2FC_HBA_DBG(lport, "fpma mismatch\n");
|
|
|
- put_cpu();
|
|
|
kfree_skb(skb);
|
|
|
return;
|
|
|
}
|
|
@@ -552,7 +545,6 @@ static void bnx2fc_recv_frame(struct sk_buff *skb)
|
|
|
if (fh->fh_r_ctl == FC_RCTL_DD_SOL_DATA &&
|
|
|
fh->fh_type == FC_TYPE_FCP) {
|
|
|
/* Drop FCP data. We dont this in L2 path */
|
|
|
- put_cpu();
|
|
|
kfree_skb(skb);
|
|
|
return;
|
|
|
}
|
|
@@ -562,7 +554,6 @@ static void bnx2fc_recv_frame(struct sk_buff *skb)
|
|
|
case ELS_LOGO:
|
|
|
if (ntoh24(fh->fh_s_id) == FC_FID_FLOGI) {
|
|
|
/* drop non-FIP LOGO */
|
|
|
- put_cpu();
|
|
|
kfree_skb(skb);
|
|
|
return;
|
|
|
}
|
|
@@ -572,22 +563,23 @@ static void bnx2fc_recv_frame(struct sk_buff *skb)
|
|
|
|
|
|
if (fh->fh_r_ctl == FC_RCTL_BA_ABTS) {
|
|
|
/* Drop incoming ABTS */
|
|
|
- put_cpu();
|
|
|
kfree_skb(skb);
|
|
|
return;
|
|
|
}
|
|
|
|
|
|
+ stats = per_cpu_ptr(lport->stats, smp_processor_id());
|
|
|
+ stats->RxFrames++;
|
|
|
+ stats->RxWords += fr_len / FCOE_WORD_TO_BYTE;
|
|
|
+
|
|
|
if (le32_to_cpu(fr_crc(fp)) !=
|
|
|
~crc32(~0, skb->data, fr_len)) {
|
|
|
if (stats->InvalidCRCCount < 5)
|
|
|
printk(KERN_WARNING PFX "dropping frame with "
|
|
|
"CRC error\n");
|
|
|
stats->InvalidCRCCount++;
|
|
|
- put_cpu();
|
|
|
kfree_skb(skb);
|
|
|
return;
|
|
|
}
|
|
|
- put_cpu();
|
|
|
fc_exch_recv(lport, fp);
|
|
|
}
|
|
|
|