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: Amit Kumar Salecha <amit.salecha@qlogic.com> Signed-off-by: David S. Miller <davem@davemloft.net>
This commit is contained in:
committed by
David S. Miller
parent
21a180cda0
commit
31dee692e2
@@ -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)
|
|||||||
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,
|
|||||||
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,
|
|||||||
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++;
|
||||||
|
Reference in New Issue
Block a user