ring.h 3.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119
  1. /*
  2. * Applied Micro X-Gene SoC Ethernet v2 Driver
  3. *
  4. * Copyright (c) 2017, Applied Micro Circuits Corporation
  5. * Author(s): Iyappan Subramanian <isubramanian@apm.com>
  6. * Keyur Chudgar <kchudgar@apm.com>
  7. *
  8. * This program is free software; you can redistribute it and/or modify it
  9. * under the terms of the GNU General Public License as published by the
  10. * Free Software Foundation; either version 2 of the License, or (at your
  11. * option) any later version.
  12. *
  13. * This program is distributed in the hope that it will be useful,
  14. * but WITHOUT ANY WARRANTY; without even the implied warranty of
  15. * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
  16. * GNU General Public License for more details.
  17. *
  18. * You should have received a copy of the GNU General Public License
  19. * along with this program. If not, see <http://www.gnu.org/licenses/>.
  20. */
  21. #ifndef __XGENE_ENET_V2_RING_H__
  22. #define __XGENE_ENET_V2_RING_H__
  23. #define XGENE_ENET_DESC_SIZE 64
  24. #define XGENE_ENET_NUM_DESC 256
  25. #define NUM_BUFS 8
  26. #define SLOT_EMPTY 0xfff
  27. #define DMATXCTRL 0xa180
  28. #define DMATXDESCL 0xa184
  29. #define DMATXDESCH 0xa1a0
  30. #define DMATXSTATUS 0xa188
  31. #define DMARXCTRL 0xa18c
  32. #define DMARXDESCL 0xa190
  33. #define DMARXDESCH 0xa1a4
  34. #define DMARXSTATUS 0xa194
  35. #define DMAINTRMASK 0xa198
  36. #define DMAINTERRUPT 0xa19c
  37. #define D_POS 62
  38. #define D_LEN 2
  39. #define E_POS 63
  40. #define E_LEN 1
  41. #define PKT_ADDRL_POS 0
  42. #define PKT_ADDRL_LEN 32
  43. #define PKT_ADDRH_POS 32
  44. #define PKT_ADDRH_LEN 10
  45. #define PKT_SIZE_POS 32
  46. #define PKT_SIZE_LEN 12
  47. #define NEXT_DESC_ADDRL_POS 0
  48. #define NEXT_DESC_ADDRL_LEN 32
  49. #define NEXT_DESC_ADDRH_POS 48
  50. #define NEXT_DESC_ADDRH_LEN 10
  51. #define TXPKTCOUNT_POS 16
  52. #define TXPKTCOUNT_LEN 8
  53. #define RXPKTCOUNT_POS 16
  54. #define RXPKTCOUNT_LEN 8
  55. #define TX_PKT_SENT BIT(0)
  56. #define TX_BUS_ERROR BIT(3)
  57. #define RX_PKT_RCVD BIT(4)
  58. #define RX_BUS_ERROR BIT(7)
  59. #define RXSTATUS_RXPKTRCVD BIT(0)
  60. struct xge_raw_desc {
  61. __le64 m0;
  62. __le64 m1;
  63. __le64 m2;
  64. __le64 m3;
  65. __le64 m4;
  66. __le64 m5;
  67. __le64 m6;
  68. __le64 m7;
  69. };
  70. struct pkt_info {
  71. struct sk_buff *skb;
  72. dma_addr_t dma_addr;
  73. void *pkt_buf;
  74. };
  75. /* software context of a descriptor ring */
  76. struct xge_desc_ring {
  77. struct net_device *ndev;
  78. dma_addr_t dma_addr;
  79. u8 head;
  80. u8 tail;
  81. union {
  82. void *desc_addr;
  83. struct xge_raw_desc *raw_desc;
  84. };
  85. struct pkt_info (*pkt_info);
  86. };
  87. static inline u64 xge_set_desc_bits(int pos, int len, u64 val)
  88. {
  89. return (val & ((1ULL << len) - 1)) << pos;
  90. }
  91. static inline u64 xge_get_desc_bits(int pos, int len, u64 src)
  92. {
  93. return (src >> pos) & ((1ULL << len) - 1);
  94. }
  95. #define SET_BITS(field, val) \
  96. xge_set_desc_bits(field ## _POS, field ## _LEN, val)
  97. #define GET_BITS(field, src) \
  98. xge_get_desc_bits(field ## _POS, field ## _LEN, src)
  99. void xge_setup_desc(struct xge_desc_ring *ring);
  100. void xge_update_tx_desc_addr(struct xge_pdata *pdata);
  101. void xge_update_rx_desc_addr(struct xge_pdata *pdata);
  102. void xge_intr_enable(struct xge_pdata *pdata);
  103. void xge_intr_disable(struct xge_pdata *pdata);
  104. #endif /* __XGENE_ENET_V2_RING_H__ */