diff options
author | Pratik Pujar <pratik.pujar@qlogic.com> | 2013-10-18 12:22:29 -0400 |
---|---|---|
committer | David S. Miller <davem@davemloft.net> | 2013-10-18 13:42:19 -0400 |
commit | 710a1a498f22e10dc86c520dd04fb83a19b08771 (patch) | |
tree | dff8aae7aa43c0c15355263cd05fe7dcfbe03a41 | |
parent | 9e630955ec01b1a3a5425ede9a17df2f8c8b223b (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.c | 8 | ||||
-rw-r--r-- | drivers/net/ethernet/qlogic/qlcnic/qlcnic_ethtool.c | 54 |
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 | ||
3270 | int qlcnic_83xx_get_regs_len(struct qlcnic_adapter *adapter) | 3270 | inline 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 | ||
3278 | int qlcnic_83xx_get_registers(struct qlcnic_adapter *adapter, u32 *regs_buff) | 3278 | int 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 | ||
194 | static const u32 diag_registers[] = { | 194 | static 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 | |||
224 | static 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 | ||
224 | static int qlcnic_get_regs_len(struct net_device *dev) | 232 | static 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 | ||
237 | static int qlcnic_get_eeprom_len(struct net_device *dev) | 247 | static 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 | ||