Commit 31dee692 authored by Amit Kumar Salecha's avatar Amit Kumar Salecha Committed by David S. Miller

qlcnic: fix internal loopback test

o Loop 10 times with delay of 1 ms to rcv packet.
o Print garbage packet.
o Try send/receive MAX(16) packet, instead of exit from test,
  if a packet is not received.
Signed-off-by: default avatarAmit Kumar Salecha <amit.salecha@qlogic.com>
Signed-off-by: default avatarDavid S. Miller <davem@davemloft.net>
parent 21a180cd
...@@ -636,6 +636,8 @@ static int qlcnic_get_sset_count(struct net_device *dev, int sset) ...@@ -636,6 +636,8 @@ static int qlcnic_get_sset_count(struct net_device *dev, int sset)
} }
#define QLC_ILB_PKT_SIZE 64 #define QLC_ILB_PKT_SIZE 64
#define QLC_NUM_ILB_PKT 16
#define QLC_ILB_MAX_RCV_LOOP 10
static void qlcnic_create_loopback_buff(unsigned char *data) static void qlcnic_create_loopback_buff(unsigned char *data)
{ {
...@@ -657,24 +659,34 @@ static int qlcnic_do_ilb_test(struct qlcnic_adapter *adapter) ...@@ -657,24 +659,34 @@ static int qlcnic_do_ilb_test(struct qlcnic_adapter *adapter)
struct qlcnic_recv_context *recv_ctx = &adapter->recv_ctx; struct qlcnic_recv_context *recv_ctx = &adapter->recv_ctx;
struct qlcnic_host_sds_ring *sds_ring = &recv_ctx->sds_rings[0]; struct qlcnic_host_sds_ring *sds_ring = &recv_ctx->sds_rings[0];
struct sk_buff *skb; struct sk_buff *skb;
int i; int i, loop, cnt = 0;
for (i = 0; i < 16; i++) { for (i = 0; i < QLC_NUM_ILB_PKT; i++) {
skb = dev_alloc_skb(QLC_ILB_PKT_SIZE); skb = dev_alloc_skb(QLC_ILB_PKT_SIZE);
qlcnic_create_loopback_buff(skb->data); qlcnic_create_loopback_buff(skb->data);
skb_put(skb, QLC_ILB_PKT_SIZE); skb_put(skb, QLC_ILB_PKT_SIZE);
adapter->diag_cnt = 0; adapter->diag_cnt = 0;
qlcnic_xmit_frame(skb, adapter->netdev); qlcnic_xmit_frame(skb, adapter->netdev);
msleep(5); loop = 0;
do {
qlcnic_process_rcv_ring_diag(sds_ring); msleep(1);
qlcnic_process_rcv_ring_diag(sds_ring);
} while (loop++ < QLC_ILB_MAX_RCV_LOOP &&
!adapter->diag_cnt);
dev_kfree_skb_any(skb); dev_kfree_skb_any(skb);
if (!adapter->diag_cnt) if (!adapter->diag_cnt)
return -1; dev_warn(&adapter->pdev->dev, "ILB Test: %dth packet"
" not recevied\n", i + 1);
else
cnt++;
}
if (cnt != i) {
dev_warn(&adapter->pdev->dev, "ILB Test failed\n");
return -1;
} }
return 0; return 0;
} }
......
...@@ -1693,6 +1693,18 @@ qlcnic_post_rx_buffers_nodb(struct qlcnic_adapter *adapter, ...@@ -1693,6 +1693,18 @@ qlcnic_post_rx_buffers_nodb(struct qlcnic_adapter *adapter,
spin_unlock(&rds_ring->lock); spin_unlock(&rds_ring->lock);
} }
static void dump_skb(struct sk_buff *skb)
{
int i;
unsigned char *data = skb->data;
for (i = 0; i < skb->len; i++) {
printk("%02x ", data[i]);
if ((i & 0x0f) == 8)
printk("\n");
}
}
static struct qlcnic_rx_buffer * static struct qlcnic_rx_buffer *
qlcnic_process_rcv_diag(struct qlcnic_adapter *adapter, qlcnic_process_rcv_diag(struct qlcnic_adapter *adapter,
struct qlcnic_host_sds_ring *sds_ring, struct qlcnic_host_sds_ring *sds_ring,
...@@ -1723,13 +1735,18 @@ qlcnic_process_rcv_diag(struct qlcnic_adapter *adapter, ...@@ -1723,13 +1735,18 @@ qlcnic_process_rcv_diag(struct qlcnic_adapter *adapter,
if (!skb) if (!skb)
return buffer; return buffer;
skb_put(skb, rds_ring->skb_size); if (length > rds_ring->skb_size)
skb_put(skb, rds_ring->skb_size);
else
skb_put(skb, length);
if (pkt_offset) if (pkt_offset)
skb_pull(skb, pkt_offset); skb_pull(skb, pkt_offset);
if (!qlcnic_check_loopback_buff(skb->data)) if (!qlcnic_check_loopback_buff(skb->data))
adapter->diag_cnt++; adapter->diag_cnt++;
else
dump_skb(skb);
dev_kfree_skb_any(skb); dev_kfree_skb_any(skb);
adapter->stats.rx_pkts++; adapter->stats.rx_pkts++;
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment