aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorPratik Pujar <pratik.pujar@qlogic.com>2013-10-18 12:22:29 -0400
committerDavid S. Miller <davem@davemloft.net>2013-10-18 13:42:19 -0400
commit710a1a498f22e10dc86c520dd04fb83a19b08771 (patch)
treedff8aae7aa43c0c15355263cd05fe7dcfbe03a41
parent9e630955ec01b1a3a5425ede9a17df2f8c8b223b (diff)
qlcnic: Enhance ethtool to display ring indices and interrupt mask
o Updated ethtool -d <ethX> option to display ring indices for Transmit(Tx), Receive(Rx), and Status(St) rings. o Updated ethtool -d <ethX> option to display ring interrupt mask for Transmit(Tx), and Status(St) rings. Signed-off-by: Pratik Pujar <pratik.pujar@qlogic.com> Signed-off-by: Himanshu Madhani <himanshu.madhani@qlogic.com> Signed-off-by: David S. Miller <davem@davemloft.net>
-rw-r--r--drivers/net/ethernet/qlogic/qlcnic/qlcnic_83xx_hw.c8
-rw-r--r--drivers/net/ethernet/qlogic/qlcnic/qlcnic_ethtool.c54
2 files changed, 44 insertions, 18 deletions
diff --git a/drivers/net/ethernet/qlogic/qlcnic/qlcnic_83xx_hw.c b/drivers/net/ethernet/qlogic/qlcnic/qlcnic_83xx_hw.c
index 66e94dc845f9..c2df4cea524d 100644
--- a/drivers/net/ethernet/qlogic/qlcnic/qlcnic_83xx_hw.c
+++ b/drivers/net/ethernet/qlogic/qlcnic/qlcnic_83xx_hw.c
@@ -3267,12 +3267,12 @@ int qlcnic_83xx_reg_test(struct qlcnic_adapter *adapter)
3267 return 0; 3267 return 0;
3268} 3268}
3269 3269
3270int qlcnic_83xx_get_regs_len(struct qlcnic_adapter *adapter) 3270inline int qlcnic_83xx_get_regs_len(struct qlcnic_adapter *adapter)
3271{ 3271{
3272 return (ARRAY_SIZE(qlcnic_83xx_ext_reg_tbl) * 3272 return (ARRAY_SIZE(qlcnic_83xx_ext_reg_tbl) *
3273 sizeof(adapter->ahw->ext_reg_tbl)) + 3273 sizeof(*adapter->ahw->ext_reg_tbl)) +
3274 (ARRAY_SIZE(qlcnic_83xx_reg_tbl) + 3274 (ARRAY_SIZE(qlcnic_83xx_reg_tbl) *
3275 sizeof(adapter->ahw->reg_tbl)); 3275 sizeof(*adapter->ahw->reg_tbl));
3276} 3276}
3277 3277
3278int qlcnic_83xx_get_registers(struct qlcnic_adapter *adapter, u32 *regs_buff) 3278int qlcnic_83xx_get_registers(struct qlcnic_adapter *adapter, u32 *regs_buff)
diff --git a/drivers/net/ethernet/qlogic/qlcnic/qlcnic_ethtool.c b/drivers/net/ethernet/qlogic/qlcnic/qlcnic_ethtool.c
index ebe4c86e5230..66355b72818c 100644
--- a/drivers/net/ethernet/qlogic/qlcnic/qlcnic_ethtool.c
+++ b/drivers/net/ethernet/qlogic/qlcnic/qlcnic_ethtool.c
@@ -187,8 +187,8 @@ static int qlcnic_dev_statistics_len(struct qlcnic_adapter *adapter)
187 return -1; 187 return -1;
188} 188}
189 189
190#define QLCNIC_RING_REGS_COUNT 20 190#define QLCNIC_TX_INTR_NOT_CONFIGURED 0X78563412
191#define QLCNIC_RING_REGS_LEN (QLCNIC_RING_REGS_COUNT * sizeof(u32)) 191
192#define QLCNIC_MAX_EEPROM_LEN 1024 192#define QLCNIC_MAX_EEPROM_LEN 1024
193 193
194static const u32 diag_registers[] = { 194static const u32 diag_registers[] = {
@@ -219,7 +219,15 @@ static const u32 ext_diag_registers[] = {
219}; 219};
220 220
221#define QLCNIC_MGMT_API_VERSION 2 221#define QLCNIC_MGMT_API_VERSION 2
222#define QLCNIC_ETHTOOL_REGS_VER 3 222#define QLCNIC_ETHTOOL_REGS_VER 4
223
224static inline int qlcnic_get_ring_regs_len(struct qlcnic_adapter *adapter)
225{
226 int ring_regs_cnt = (adapter->max_drv_tx_rings * 5) +
227 (adapter->max_rds_rings * 2) +
228 (adapter->max_sds_rings * 3) + 5;
229 return ring_regs_cnt * sizeof(u32);
230}
223 231
224static int qlcnic_get_regs_len(struct net_device *dev) 232static int qlcnic_get_regs_len(struct net_device *dev)
225{ 233{
@@ -231,7 +239,9 @@ static int qlcnic_get_regs_len(struct net_device *dev)
231 else 239 else
232 len = sizeof(ext_diag_registers) + sizeof(diag_registers); 240 len = sizeof(ext_diag_registers) + sizeof(diag_registers);
233 241
234 return QLCNIC_RING_REGS_LEN + len + QLCNIC_DEV_INFO_SIZE + 1; 242 len += ((QLCNIC_DEV_INFO_SIZE + 2) * sizeof(u32));
243 len += qlcnic_get_ring_regs_len(adapter);
244 return len;
235} 245}
236 246
237static int qlcnic_get_eeprom_len(struct net_device *dev) 247static int qlcnic_get_eeprom_len(struct net_device *dev)
@@ -493,6 +503,8 @@ qlcnic_get_regs(struct net_device *dev, struct ethtool_regs *regs, void *p)
493 struct qlcnic_adapter *adapter = netdev_priv(dev); 503 struct qlcnic_adapter *adapter = netdev_priv(dev);
494 struct qlcnic_recv_context *recv_ctx = adapter->recv_ctx; 504 struct qlcnic_recv_context *recv_ctx = adapter->recv_ctx;
495 struct qlcnic_host_sds_ring *sds_ring; 505 struct qlcnic_host_sds_ring *sds_ring;
506 struct qlcnic_host_rds_ring *rds_rings;
507 struct qlcnic_host_tx_ring *tx_ring;
496 u32 *regs_buff = p; 508 u32 *regs_buff = p;
497 int ring, i = 0; 509 int ring, i = 0;
498 510
@@ -512,21 +524,35 @@ qlcnic_get_regs(struct net_device *dev, struct ethtool_regs *regs, void *p)
512 if (!test_bit(__QLCNIC_DEV_UP, &adapter->state)) 524 if (!test_bit(__QLCNIC_DEV_UP, &adapter->state))
513 return; 525 return;
514 526
515 regs_buff[i++] = 0xFFEFCDAB; /* Marker btw regs and ring count*/ 527 /* Marker btw regs and TX ring count */
516 528 regs_buff[i++] = 0xFFEFCDAB;
517 regs_buff[i++] = 1; /* No. of tx ring */ 529
518 regs_buff[i++] = le32_to_cpu(*(adapter->tx_ring->hw_consumer)); 530 regs_buff[i++] = adapter->max_drv_tx_rings; /* No. of TX ring */
519 regs_buff[i++] = readl(adapter->tx_ring->crb_cmd_producer); 531 for (ring = 0; ring < adapter->max_drv_tx_rings; ring++) {
520 532 tx_ring = &adapter->tx_ring[ring];
521 regs_buff[i++] = 2; /* No. of rx ring */ 533 regs_buff[i++] = le32_to_cpu(*(tx_ring->hw_consumer));
522 regs_buff[i++] = readl(recv_ctx->rds_rings[0].crb_rcv_producer); 534 regs_buff[i++] = tx_ring->sw_consumer;
523 regs_buff[i++] = readl(recv_ctx->rds_rings[1].crb_rcv_producer); 535 regs_buff[i++] = readl(tx_ring->crb_cmd_producer);
536 regs_buff[i++] = tx_ring->producer;
537 if (tx_ring->crb_intr_mask)
538 regs_buff[i++] = readl(tx_ring->crb_intr_mask);
539 else
540 regs_buff[i++] = QLCNIC_TX_INTR_NOT_CONFIGURED;
541 }
524 542
525 regs_buff[i++] = adapter->max_sds_rings; 543 regs_buff[i++] = adapter->max_rds_rings; /* No. of RX ring */
544 for (ring = 0; ring < adapter->max_rds_rings; ring++) {
545 rds_rings = &recv_ctx->rds_rings[ring];
546 regs_buff[i++] = readl(rds_rings->crb_rcv_producer);
547 regs_buff[i++] = rds_rings->producer;
548 }
526 549
550 regs_buff[i++] = adapter->max_sds_rings; /* No. of SDS ring */
527 for (ring = 0; ring < adapter->max_sds_rings; ring++) { 551 for (ring = 0; ring < adapter->max_sds_rings; ring++) {
528 sds_ring = &(recv_ctx->sds_rings[ring]); 552 sds_ring = &(recv_ctx->sds_rings[ring]);
529 regs_buff[i++] = readl(sds_ring->crb_sts_consumer); 553 regs_buff[i++] = readl(sds_ring->crb_sts_consumer);
554 regs_buff[i++] = sds_ring->consumer;
555 regs_buff[i++] = readl(sds_ring->crb_intr_mask);
530 } 556 }
531} 557}
532 558