Orange Pi5 kernel

Deprecated Linux kernel 5.10.110 for OrangePi 5/5B/5+ boards

3 Commits   0 Branches   0 Tags
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   1) // SPDX-License-Identifier: GPL-2.0-only
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   2) /*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   3)  *  QLogic FCoE Offload Driver
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   4)  *  Copyright (c) 2016-2018 Cavium Inc.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   5)  */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   6) #include <linux/if_ether.h>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   7) #include <linux/if_vlan.h>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   8) #include "qedf.h"
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   9) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  10) extern const struct qed_fcoe_ops *qed_ops;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  11) /*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  12)  * FIP VLAN functions that will eventually move to libfcoe.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  13)  */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  14) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  15) void qedf_fcoe_send_vlan_req(struct qedf_ctx *qedf)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  16) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  17) 	struct sk_buff *skb;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  18) 	char *eth_fr;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  19) 	struct fip_vlan *vlan;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  20) #define MY_FIP_ALL_FCF_MACS        ((__u8[6]) { 1, 0x10, 0x18, 1, 0, 2 })
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  21) 	static u8 my_fcoe_all_fcfs[ETH_ALEN] = MY_FIP_ALL_FCF_MACS;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  22) 	unsigned long flags = 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  23) 	int rc;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  24) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  25) 	skb = dev_alloc_skb(sizeof(struct fip_vlan));
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  26) 	if (!skb) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  27) 		QEDF_ERR(&qedf->dbg_ctx,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  28) 			 "Failed to allocate skb.\n");
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  29) 		return;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  30) 	}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  31) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  32) 	eth_fr = (char *)skb->data;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  33) 	vlan = (struct fip_vlan *)eth_fr;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  34) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  35) 	memset(vlan, 0, sizeof(*vlan));
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  36) 	ether_addr_copy(vlan->eth.h_source, qedf->mac);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  37) 	ether_addr_copy(vlan->eth.h_dest, my_fcoe_all_fcfs);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  38) 	vlan->eth.h_proto = htons(ETH_P_FIP);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  39) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  40) 	vlan->fip.fip_ver = FIP_VER_ENCAPS(FIP_VER);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  41) 	vlan->fip.fip_op = htons(FIP_OP_VLAN);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  42) 	vlan->fip.fip_subcode = FIP_SC_VL_REQ;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  43) 	vlan->fip.fip_dl_len = htons(sizeof(vlan->desc) / FIP_BPW);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  44) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  45) 	vlan->desc.mac.fd_desc.fip_dtype = FIP_DT_MAC;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  46) 	vlan->desc.mac.fd_desc.fip_dlen = sizeof(vlan->desc.mac) / FIP_BPW;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  47) 	ether_addr_copy(vlan->desc.mac.fd_mac, qedf->mac);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  48) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  49) 	vlan->desc.wwnn.fd_desc.fip_dtype = FIP_DT_NAME;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  50) 	vlan->desc.wwnn.fd_desc.fip_dlen = sizeof(vlan->desc.wwnn) / FIP_BPW;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  51) 	put_unaligned_be64(qedf->lport->wwnn, &vlan->desc.wwnn.fd_wwn);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  52) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  53) 	skb_put(skb, sizeof(*vlan));
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  54) 	skb->protocol = htons(ETH_P_FIP);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  55) 	skb_reset_mac_header(skb);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  56) 	skb_reset_network_header(skb);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  57) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  58) 	QEDF_INFO(&(qedf->dbg_ctx), QEDF_LOG_DISC, "Sending FIP VLAN "
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  59) 		   "request.");
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  60) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  61) 	if (atomic_read(&qedf->link_state) != QEDF_LINK_UP) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  62) 		QEDF_WARN(&(qedf->dbg_ctx), "Cannot send vlan request "
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  63) 		    "because link is not up.\n");
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  64) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  65) 		kfree_skb(skb);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  66) 		return;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  67) 	}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  68) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  69) 	set_bit(QED_LL2_XMIT_FLAGS_FIP_DISCOVERY, &flags);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  70) 	rc = qed_ops->ll2->start_xmit(qedf->cdev, skb, flags);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  71) 	if (rc) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  72) 		QEDF_ERR(&qedf->dbg_ctx, "start_xmit failed rc = %d.\n", rc);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  73) 		kfree_skb(skb);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  74) 		return;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  75) 	}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  76) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  77) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  78) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  79) static void qedf_fcoe_process_vlan_resp(struct qedf_ctx *qedf,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  80) 	struct sk_buff *skb)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  81) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  82) 	struct fip_header *fiph;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  83) 	struct fip_desc *desc;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  84) 	u16 vid = 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  85) 	ssize_t rlen;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  86) 	size_t dlen;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  87) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  88) 	fiph = (struct fip_header *)(((void *)skb->data) + 2 * ETH_ALEN + 2);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  89) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  90) 	rlen = ntohs(fiph->fip_dl_len) * 4;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  91) 	desc = (struct fip_desc *)(fiph + 1);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  92) 	while (rlen > 0) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  93) 		dlen = desc->fip_dlen * FIP_BPW;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  94) 		switch (desc->fip_dtype) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  95) 		case FIP_DT_VLAN:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  96) 			vid = ntohs(((struct fip_vlan_desc *)desc)->fd_vlan);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  97) 			break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  98) 		}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  99) 		desc = (struct fip_desc *)((char *)desc + dlen);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 100) 		rlen -= dlen;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 101) 	}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 102) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 103) 	if (atomic_read(&qedf->link_state) == QEDF_LINK_DOWN) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 104) 		QEDF_INFO(&qedf->dbg_ctx, QEDF_LOG_DISC,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 105) 			  "Dropping VLAN response as link is down.\n");
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 106) 		return;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 107) 	}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 108) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 109) 	QEDF_INFO(&(qedf->dbg_ctx), QEDF_LOG_DISC, "VLAN response, "
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 110) 		   "vid=0x%x.\n", vid);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 111) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 112) 	if (vid > 0 && qedf->vlan_id != vid) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 113) 		qedf_set_vlan_id(qedf, vid);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 114) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 115) 		/* Inform waiter that it's ok to call fcoe_ctlr_link up() */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 116) 		if (!completion_done(&qedf->fipvlan_compl))
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 117) 			complete(&qedf->fipvlan_compl);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 118) 	}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 119) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 120) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 121) void qedf_fip_send(struct fcoe_ctlr *fip, struct sk_buff *skb)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 122) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 123) 	struct qedf_ctx *qedf = container_of(fip, struct qedf_ctx, ctlr);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 124) 	struct ethhdr *eth_hdr;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 125) 	struct fip_header *fiph;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 126) 	u16 op, vlan_tci = 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 127) 	u8 sub;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 128) 	int rc = -1;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 129) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 130) 	if (!test_bit(QEDF_LL2_STARTED, &qedf->flags)) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 131) 		QEDF_WARN(&(qedf->dbg_ctx), "LL2 not started\n");
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 132) 		kfree_skb(skb);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 133) 		return;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 134) 	}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 135) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 136) 	fiph = (struct fip_header *) ((void *)skb->data + 2 * ETH_ALEN + 2);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 137) 	eth_hdr = (struct ethhdr *)skb_mac_header(skb);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 138) 	op = ntohs(fiph->fip_op);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 139) 	sub = fiph->fip_subcode;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 140) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 141) 	/*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 142) 	 * Add VLAN tag to non-offload FIP frame based on current stored VLAN
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 143) 	 * for FIP/FCoE traffic.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 144) 	 */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 145) 	__vlan_hwaccel_put_tag(skb, htons(ETH_P_8021Q), qedf->vlan_id);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 146) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 147) 	/* Get VLAN ID from skb for printing purposes */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 148) 	__vlan_hwaccel_get_tag(skb, &vlan_tci);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 149) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 150) 	QEDF_INFO(&(qedf->dbg_ctx), QEDF_LOG_LL2, "FIP frame send: "
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 151) 	    "dest=%pM op=%x sub=%x vlan=%04x.", eth_hdr->h_dest, op, sub,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 152) 	    vlan_tci);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 153) 	if (qedf_dump_frames)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 154) 		print_hex_dump(KERN_WARNING, "fip ", DUMP_PREFIX_OFFSET, 16, 1,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 155) 		    skb->data, skb->len, false);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 156) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 157) 	rc = qed_ops->ll2->start_xmit(qedf->cdev, skb, 0);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 158) 	if (rc) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 159) 		QEDF_ERR(&qedf->dbg_ctx, "start_xmit failed rc = %d.\n", rc);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 160) 		kfree_skb(skb);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 161) 		return;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 162) 	}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 163) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 164) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 165) static u8 fcoe_all_enode[ETH_ALEN] = FIP_ALL_ENODE_MACS;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 166) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 167) /* Process incoming FIP frames. */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 168) void qedf_fip_recv(struct qedf_ctx *qedf, struct sk_buff *skb)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 169) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 170) 	struct ethhdr *eth_hdr;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 171) 	struct fip_header *fiph;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 172) 	struct fip_desc *desc;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 173) 	struct fip_mac_desc *mp;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 174) 	struct fip_wwn_desc *wp;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 175) 	struct fip_vn_desc *vp;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 176) 	size_t rlen, dlen;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 177) 	u16 op;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 178) 	u8 sub;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 179) 	bool fcf_valid = false;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 180) 	/* Default is to handle CVL regardless of fabric id descriptor */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 181) 	bool fabric_id_valid = true;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 182) 	bool fc_wwpn_valid = false;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 183) 	u64 switch_name;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 184) 	u16 vlan = 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 185) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 186) 	eth_hdr = (struct ethhdr *)skb_mac_header(skb);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 187) 	fiph = (struct fip_header *) ((void *)skb->data + 2 * ETH_ALEN + 2);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 188) 	op = ntohs(fiph->fip_op);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 189) 	sub = fiph->fip_subcode;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 190) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 191) 	QEDF_INFO(&qedf->dbg_ctx, QEDF_LOG_LL2,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 192) 		  "FIP frame received: skb=%p fiph=%p source=%pM destn=%pM op=%x sub=%x vlan=%04x",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 193) 		  skb, fiph, eth_hdr->h_source, eth_hdr->h_dest, op,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 194) 		  sub, vlan);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 195) 	if (qedf_dump_frames)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 196) 		print_hex_dump(KERN_WARNING, "fip ", DUMP_PREFIX_OFFSET, 16, 1,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 197) 		    skb->data, skb->len, false);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 198) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 199) 	if (!ether_addr_equal(eth_hdr->h_dest, qedf->mac) &&
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 200) 	    !ether_addr_equal(eth_hdr->h_dest, fcoe_all_enode) &&
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 201) 		!ether_addr_equal(eth_hdr->h_dest, qedf->data_src_addr)) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 202) 		QEDF_INFO(&qedf->dbg_ctx, QEDF_LOG_LL2,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 203) 			  "Dropping FIP type 0x%x pkt due to destination MAC mismatch dest_mac=%pM ctlr.dest_addr=%pM data_src_addr=%pM.\n",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 204) 			  op, eth_hdr->h_dest, qedf->mac,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 205) 			  qedf->data_src_addr);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 206) 		kfree_skb(skb);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 207) 		return;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 208) 	}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 209) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 210) 	/* Handle FIP VLAN resp in the driver */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 211) 	if (op == FIP_OP_VLAN && sub == FIP_SC_VL_NOTE) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 212) 		qedf_fcoe_process_vlan_resp(qedf, skb);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 213) 		kfree_skb(skb);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 214) 	} else if (op == FIP_OP_CTRL && sub == FIP_SC_CLR_VLINK) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 215) 		QEDF_INFO(&(qedf->dbg_ctx), QEDF_LOG_DISC, "Clear virtual "
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 216) 			   "link received.\n");
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 217) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 218) 		/* Check that an FCF has been selected by fcoe */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 219) 		if (qedf->ctlr.sel_fcf == NULL) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 220) 			QEDF_INFO(&(qedf->dbg_ctx), QEDF_LOG_DISC,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 221) 			    "Dropping CVL since FCF has not been selected "
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 222) 			    "yet.");
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 223) 			kfree_skb(skb);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 224) 			return;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 225) 		}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 226) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 227) 		/*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 228) 		 * We need to loop through the CVL descriptors to determine
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 229) 		 * if we want to reset the fcoe link
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 230) 		 */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 231) 		rlen = ntohs(fiph->fip_dl_len) * FIP_BPW;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 232) 		desc = (struct fip_desc *)(fiph + 1);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 233) 		while (rlen >= sizeof(*desc)) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 234) 			dlen = desc->fip_dlen * FIP_BPW;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 235) 			switch (desc->fip_dtype) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 236) 			case FIP_DT_MAC:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 237) 				mp = (struct fip_mac_desc *)desc;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 238) 				QEDF_INFO(&qedf->dbg_ctx, QEDF_LOG_DISC,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 239) 					  "Switch fd_mac=%pM.\n", mp->fd_mac);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 240) 				if (ether_addr_equal(mp->fd_mac,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 241) 				    qedf->ctlr.sel_fcf->fcf_mac))
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 242) 					fcf_valid = true;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 243) 				break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 244) 			case FIP_DT_NAME:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 245) 				wp = (struct fip_wwn_desc *)desc;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 246) 				switch_name = get_unaligned_be64(&wp->fd_wwn);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 247) 				QEDF_INFO(&qedf->dbg_ctx, QEDF_LOG_DISC,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 248) 					  "Switch fd_wwn=%016llx fcf_switch_name=%016llx.\n",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 249) 					  switch_name,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 250) 					  qedf->ctlr.sel_fcf->switch_name);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 251) 				if (switch_name ==
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 252) 				    qedf->ctlr.sel_fcf->switch_name)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 253) 					fc_wwpn_valid = true;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 254) 				break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 255) 			case FIP_DT_VN_ID:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 256) 				fabric_id_valid = false;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 257) 				vp = (struct fip_vn_desc *)desc;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 258) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 259) 				QEDF_ERR(&qedf->dbg_ctx,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 260) 					 "CVL vx_port fd_fc_id=0x%x fd_mac=%pM fd_wwpn=%016llx.\n",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 261) 					 ntoh24(vp->fd_fc_id), vp->fd_mac,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 262) 					 get_unaligned_be64(&vp->fd_wwpn));
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 263) 				/* Check for vx_port wwpn OR Check vx_port
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 264) 				 * fabric ID OR Check vx_port MAC
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 265) 				 */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 266) 				if ((get_unaligned_be64(&vp->fd_wwpn) ==
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 267) 					qedf->wwpn) ||
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 268) 				   (ntoh24(vp->fd_fc_id) ==
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 269) 					qedf->lport->port_id) ||
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 270) 				   (ether_addr_equal(vp->fd_mac,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 271) 					qedf->data_src_addr))) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 272) 					fabric_id_valid = true;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 273) 				}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 274) 				break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 275) 			default:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 276) 				/* Ignore anything else */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 277) 				break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 278) 			}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 279) 			desc = (struct fip_desc *)((char *)desc + dlen);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 280) 			rlen -= dlen;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 281) 		}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 282) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 283) 		QEDF_INFO(&qedf->dbg_ctx, QEDF_LOG_DISC,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 284) 			  "fcf_valid=%d fabric_id_valid=%d fc_wwpn_valid=%d.\n",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 285) 			  fcf_valid, fabric_id_valid, fc_wwpn_valid);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 286) 		if (fcf_valid && fabric_id_valid && fc_wwpn_valid)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 287) 			qedf_ctx_soft_reset(qedf->lport);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 288) 		kfree_skb(skb);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 289) 	} else {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 290) 		/* Everything else is handled by libfcoe */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 291) 		__skb_pull(skb, ETH_HLEN);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 292) 		fcoe_ctlr_recv(&qedf->ctlr, skb);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 293) 	}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 294) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 295) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 296) u8 *qedf_get_src_mac(struct fc_lport *lport)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 297) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 298) 	struct qedf_ctx *qedf = lport_priv(lport);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 299) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 300) 	return qedf->data_src_addr;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 301) }