diff options
Diffstat (limited to 'drivers/scsi/fnic/fnic_fcs.c')
| -rw-r--r-- | drivers/scsi/fnic/fnic_fcs.c | 79 | 
1 files changed, 69 insertions, 10 deletions
diff --git a/drivers/scsi/fnic/fnic_fcs.c b/drivers/scsi/fnic/fnic_fcs.c index 006fa92a02d..1b948f633fc 100644 --- a/drivers/scsi/fnic/fnic_fcs.c +++ b/drivers/scsi/fnic/fnic_fcs.c @@ -66,19 +66,35 @@ void fnic_handle_link(struct work_struct *work)  	fnic->link_down_cnt = vnic_dev_link_down_cnt(fnic->vdev);  	if (old_link_status == fnic->link_status) { -		if (!fnic->link_status) +		if (!fnic->link_status) {  			/* DOWN -> DOWN */  			spin_unlock_irqrestore(&fnic->fnic_lock, flags); -		else { +			fnic_fc_trace_set_data(fnic->lport->host->host_no, +				FNIC_FC_LE, "Link Status: DOWN->DOWN", +				strlen("Link Status: DOWN->DOWN")); +		} else {  			if (old_link_down_cnt != fnic->link_down_cnt) {  				/* UP -> DOWN -> UP */  				fnic->lport->host_stats.link_failure_count++;  				spin_unlock_irqrestore(&fnic->fnic_lock, flags); +				fnic_fc_trace_set_data( +					fnic->lport->host->host_no, +					FNIC_FC_LE, +					"Link Status:UP_DOWN_UP", +					strlen("Link_Status:UP_DOWN_UP") +					);  				FNIC_FCS_DBG(KERN_DEBUG, fnic->lport->host,  					     "link down\n");  				fcoe_ctlr_link_down(&fnic->ctlr);  				if (fnic->config.flags & VFCF_FIP_CAPABLE) {  					/* start FCoE VLAN discovery */ +					fnic_fc_trace_set_data( +						fnic->lport->host->host_no, +						FNIC_FC_LE, +						"Link Status: UP_DOWN_UP_VLAN", +						strlen( +						"Link Status: UP_DOWN_UP_VLAN") +						);  					fnic_fcoe_send_vlan_req(fnic);  					return;  				} @@ -88,22 +104,36 @@ void fnic_handle_link(struct work_struct *work)  			} else  				/* UP -> UP */  				spin_unlock_irqrestore(&fnic->fnic_lock, flags); +				fnic_fc_trace_set_data( +					fnic->lport->host->host_no, FNIC_FC_LE, +					"Link Status: UP_UP", +					strlen("Link Status: UP_UP"));  		}  	} else if (fnic->link_status) {  		/* DOWN -> UP */  		spin_unlock_irqrestore(&fnic->fnic_lock, flags);  		if (fnic->config.flags & VFCF_FIP_CAPABLE) {  			/* start FCoE VLAN discovery */ +				fnic_fc_trace_set_data( +				fnic->lport->host->host_no, +				FNIC_FC_LE, "Link Status: DOWN_UP_VLAN", +				strlen("Link Status: DOWN_UP_VLAN"));  			fnic_fcoe_send_vlan_req(fnic);  			return;  		}  		FNIC_FCS_DBG(KERN_DEBUG, fnic->lport->host, "link up\n"); +		fnic_fc_trace_set_data(fnic->lport->host->host_no, FNIC_FC_LE, +			"Link Status: DOWN_UP", strlen("Link Status: DOWN_UP"));  		fcoe_ctlr_link_up(&fnic->ctlr);  	} else {  		/* UP -> DOWN */  		fnic->lport->host_stats.link_failure_count++;  		spin_unlock_irqrestore(&fnic->fnic_lock, flags);  		FNIC_FCS_DBG(KERN_DEBUG, fnic->lport->host, "link down\n"); +		fnic_fc_trace_set_data( +			fnic->lport->host->host_no, FNIC_FC_LE, +			"Link Status: UP_DOWN", +			strlen("Link Status: UP_DOWN"));  		fcoe_ctlr_link_down(&fnic->ctlr);  	} @@ -267,11 +297,6 @@ static inline int is_fnic_fip_flogi_reject(struct fcoe_ctlr *fip,  	if (desc->fip_dtype == FIP_DT_FLOGI) { -		shost_printk(KERN_DEBUG, lport->host, -			  " FIP TYPE FLOGI: fab name:%llx " -			  "vfid:%d map:%x\n", -			  fip->sel_fcf->fabric_name, fip->sel_fcf->vfid, -			  fip->sel_fcf->fc_map);  		if (dlen < sizeof(*els) + sizeof(*fh) + 1)  			return 0; @@ -302,6 +327,7 @@ static inline int is_fnic_fip_flogi_reject(struct fcoe_ctlr *fip,  static void fnic_fcoe_send_vlan_req(struct fnic *fnic)  {  	struct fcoe_ctlr *fip = &fnic->ctlr; +	struct fnic_stats *fnic_stats = &fnic->fnic_stats;  	struct sk_buff *skb;  	char *eth_fr;  	int fr_len; @@ -337,6 +363,7 @@ static void fnic_fcoe_send_vlan_req(struct fnic *fnic)  	vlan->desc.wwnn.fd_desc.fip_dtype = FIP_DT_NAME;  	vlan->desc.wwnn.fd_desc.fip_dlen = sizeof(vlan->desc.wwnn) / FIP_BPW;  	put_unaligned_be64(fip->lp->wwnn, &vlan->desc.wwnn.fd_wwn); +	atomic64_inc(&fnic_stats->vlan_stats.vlan_disc_reqs);  	skb_put(skb, sizeof(*vlan));  	skb->protocol = htons(ETH_P_FIP); @@ -354,6 +381,7 @@ static void fnic_fcoe_process_vlan_resp(struct fnic *fnic, struct sk_buff *skb)  	struct fcoe_ctlr *fip = &fnic->ctlr;  	struct fip_header *fiph;  	struct fip_desc *desc; +	struct fnic_stats *fnic_stats = &fnic->fnic_stats;  	u16 vid;  	size_t rlen;  	size_t dlen; @@ -402,6 +430,7 @@ static void fnic_fcoe_process_vlan_resp(struct fnic *fnic, struct sk_buff *skb)  	/* any VLAN descriptors present ? */  	if (list_empty(&fnic->vlans)) {  		/* retry from timer */ +		atomic64_inc(&fnic_stats->vlan_stats.resp_withno_vlanID);  		FNIC_FCS_DBG(KERN_INFO, fnic->lport->host,  			  "No VLAN descriptors in FIP VLAN response\n");  		spin_unlock_irqrestore(&fnic->vlans_lock, flags); @@ -533,6 +562,7 @@ drop:  void fnic_handle_fip_frame(struct work_struct *work)  {  	struct fnic *fnic = container_of(work, struct fnic, fip_frame_work); +	struct fnic_stats *fnic_stats = &fnic->fnic_stats;  	unsigned long flags;  	struct sk_buff *skb;  	struct ethhdr *eh; @@ -567,6 +597,8 @@ void fnic_handle_fip_frame(struct work_struct *work)  			 * fcf's & restart from scratch  			 */  			if (is_fnic_fip_flogi_reject(&fnic->ctlr, skb)) { +				atomic64_inc( +					&fnic_stats->vlan_stats.flogi_rejects);  				shost_printk(KERN_INFO, fnic->lport->host,  					  "Trigger a Link down - VLAN Disc\n");  				fcoe_ctlr_link_down(&fnic->ctlr); @@ -609,6 +641,10 @@ static inline int fnic_import_rq_eth_pkt(struct fnic *fnic, struct sk_buff *skb)  					"using UCSM\n");  			goto drop;  		} +		if ((fnic_fc_trace_set_data(fnic->lport->host->host_no, +			FNIC_FC_RECV|0x80, (char *)skb->data, skb->len)) != 0) { +			printk(KERN_ERR "fnic ctlr frame trace error!!!"); +		}  		skb_queue_tail(&fnic->fip_frame_queue, skb);  		queue_work(fnic_fip_queue, &fnic->fip_frame_work);  		return 1;		/* let caller know packet was used */ @@ -651,13 +687,13 @@ void fnic_update_mac_locked(struct fnic *fnic, u8 *new)  	if (is_zero_ether_addr(new))  		new = ctl; -	if (!compare_ether_addr(data, new)) +	if (ether_addr_equal(data, new))  		return;  	FNIC_FCS_DBG(KERN_DEBUG, fnic->lport->host, "update_mac %pM\n", new); -	if (!is_zero_ether_addr(data) && compare_ether_addr(data, ctl)) +	if (!is_zero_ether_addr(data) && !ether_addr_equal(data, ctl))  		vnic_dev_del_addr(fnic->vdev, data);  	memcpy(data, new, ETH_ALEN); -	if (compare_ether_addr(new, ctl)) +	if (!ether_addr_equal(new, ctl))  		vnic_dev_add_addr(fnic->vdev, new);  } @@ -753,6 +789,7 @@ static void fnic_rq_cmpl_frame_recv(struct vnic_rq *rq, struct cq_desc  	struct fnic *fnic = vnic_dev_priv(rq->vdev);  	struct sk_buff *skb;  	struct fc_frame *fp; +	struct fnic_stats *fnic_stats = &fnic->fnic_stats;  	unsigned int eth_hdrs_stripped;  	u8 type, color, eop, sop, ingress_port, vlan_stripped;  	u8 fcoe = 0, fcoe_sof, fcoe_eof; @@ -803,6 +840,7 @@ static void fnic_rq_cmpl_frame_recv(struct vnic_rq *rq, struct cq_desc  		eth_hdrs_stripped = 0;  		skb_trim(skb, bytes_written);  		if (!fcs_ok) { +			atomic64_inc(&fnic_stats->misc_stats.frame_errors);  			FNIC_FCS_DBG(KERN_DEBUG, fnic->lport->host,  				     "fcs error.  dropping packet.\n");  			goto drop; @@ -818,6 +856,7 @@ static void fnic_rq_cmpl_frame_recv(struct vnic_rq *rq, struct cq_desc  	}  	if (!fcs_ok || packet_error || !fcoe_fc_crc_ok || fcoe_enc_error) { +		atomic64_inc(&fnic_stats->misc_stats.frame_errors);  		FNIC_FCS_DBG(KERN_DEBUG, fnic->lport->host,  			     "fnic rq_cmpl fcoe x%x fcsok x%x"  			     " pkterr x%x fcoe_fc_crc_ok x%x, fcoe_enc_err" @@ -834,6 +873,10 @@ static void fnic_rq_cmpl_frame_recv(struct vnic_rq *rq, struct cq_desc  	}  	fr_dev(fp) = fnic->lport;  	spin_unlock_irqrestore(&fnic->fnic_lock, flags); +	if ((fnic_fc_trace_set_data(fnic->lport->host->host_no, FNIC_FC_RECV, +					(char *)skb->data, skb->len)) != 0) { +		printk(KERN_ERR "fnic ctlr frame trace error!!!"); +	}  	skb_queue_tail(&fnic->frame_queue, skb);  	queue_work(fnic_event_queue, &fnic->frame_work); @@ -941,6 +984,15 @@ void fnic_eth_send(struct fcoe_ctlr *fip, struct sk_buff *skb)  		vlan_hdr->h_vlan_proto = htons(ETH_P_8021Q);  		vlan_hdr->h_vlan_encapsulated_proto = eth_hdr->h_proto;  		vlan_hdr->h_vlan_TCI = htons(fnic->vlan_id); +		if ((fnic_fc_trace_set_data(fnic->lport->host->host_no, +			FNIC_FC_SEND|0x80, (char *)eth_hdr, skb->len)) != 0) { +			printk(KERN_ERR "fnic ctlr frame trace error!!!"); +		} +	} else { +		if ((fnic_fc_trace_set_data(fnic->lport->host->host_no, +			FNIC_FC_SEND|0x80, (char *)skb->data, skb->len)) != 0) { +			printk(KERN_ERR "fnic ctlr frame trace error!!!"); +		}  	}  	pa = pci_map_single(fnic->pdev, skb->data, skb->len, PCI_DMA_TODEVICE); @@ -1013,6 +1065,11 @@ static int fnic_send_frame(struct fnic *fnic, struct fc_frame *fp)  	pa = pci_map_single(fnic->pdev, eth_hdr, tot_len, PCI_DMA_TODEVICE); +	if ((fnic_fc_trace_set_data(fnic->lport->host->host_no, FNIC_FC_SEND, +				(char *)eth_hdr, tot_len)) != 0) { +		printk(KERN_ERR "fnic ctlr frame trace error!!!"); +	} +  	spin_lock_irqsave(&fnic->wq_lock[0], flags);  	if (!vnic_wq_desc_avail(wq)) { @@ -1205,6 +1262,7 @@ void fnic_handle_fip_timer(struct fnic *fnic)  {  	unsigned long flags;  	struct fcoe_vlan *vlan; +	struct fnic_stats *fnic_stats = &fnic->fnic_stats;  	u64 sol_time;  	spin_lock_irqsave(&fnic->fnic_lock, flags); @@ -1273,6 +1331,7 @@ void fnic_handle_fip_timer(struct fnic *fnic)  			vlan->state = FIP_VLAN_SENT; /* sent now */  		}  		spin_unlock_irqrestore(&fnic->vlans_lock, flags); +		atomic64_inc(&fnic_stats->vlan_stats.sol_expiry_count);  		vlan->sol_count++;  		sol_time = jiffies + msecs_to_jiffies  					(FCOE_CTLR_START_DELAY);  | 
