ccmni.h 4.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148
  1. #ifndef __CCCI_CCMNI_H__
  2. #define __CCCI_CCMNI_H__
  3. #include <linux/kernel.h>
  4. #include <linux/module.h>
  5. #include <linux/device.h>
  6. #include <linux/netdevice.h>
  7. #include <linux/etherdevice.h>
  8. #include <linux/skbuff.h>
  9. #include <linux/bitops.h>
  10. #include <linux/wakelock.h>
  11. #include <linux/spinlock.h>
  12. #include <linux/interrupt.h>
  13. #include <linux/delay.h>
  14. #include <linux/wait.h>
  15. #include <linux/dma-mapping.h>
  16. #include <linux/timer.h>
  17. #include <linux/if_ether.h>
  18. #include <linux/bitops.h>
  19. #include <linux/dma-mapping.h>
  20. #include <mt-plat/mt_ccci_common.h>
  21. #define CCMNI_MTU 1500
  22. #define CCMNI_TX_QUEUE 1000
  23. #define CCMNI_NETDEV_WDT_TO (1*HZ)
  24. #define IPV4_VERSION 0x40
  25. #define IPV6_VERSION 0x60
  26. #define SIOCSTXQSTATE (SIOCDEVPRIVATE + 0) /* stop/start tx queue */
  27. #define SIOCCCMNICFG (SIOCDEVPRIVATE + 1) /* configure ccmni/md remapping */
  28. typedef struct ccmni_ctl_block ccmni_ctl_block_t;
  29. struct ccmni_ch {
  30. int rx;
  31. int rx_ack;
  32. int tx;
  33. int tx_ack;
  34. };
  35. typedef struct ccmni_instance {
  36. int index;
  37. int md_id;
  38. struct ccmni_ch ch;
  39. int net_if_off;
  40. atomic_t usage;
  41. struct timer_list timer;
  42. struct net_device *dev;
  43. struct napi_struct napi;
  44. unsigned int rx_seq_num;
  45. unsigned int tx_seq_num[2];
  46. unsigned int flags;
  47. spinlock_t spinlock;
  48. ccmni_ctl_block_t *ctlb;
  49. unsigned long tx_busy_cnt;
  50. void *priv_data;
  51. } ccmni_instance_t;
  52. typedef struct ccmni_ccci_ops {
  53. int ccmni_ver; /* CCMNI_DRV_VER */
  54. int ccmni_num;
  55. unsigned char name[16]; /* "ccmni" or "cc2mni" or "ccemni" */
  56. unsigned int md_ability;
  57. unsigned int irat_md_id; /* with which md on iRAT */
  58. unsigned int napi_poll_weigh;
  59. int (*send_pkt)(int md_id, int tx_ch, void *data);
  60. int (*napi_poll)(int md_id, int rx_ch, struct napi_struct *napi , int weight);
  61. int (*get_ccmni_ch)(int md_id, int ccmni_idx, struct ccmni_ch *channel);
  62. } ccmni_ccci_ops_t;
  63. typedef struct ccmni_ctl_block {
  64. ccmni_ccci_ops_t *ccci_ops;
  65. ccmni_instance_t *ccmni_inst[16];
  66. unsigned int md_sta;
  67. struct wake_lock ccmni_wakelock;
  68. char wakelock_name[16];
  69. } ccmni_ctl_block_t;
  70. struct ccmni_dev_ops {
  71. /* must-have */
  72. int skb_alloc_size;
  73. int (*init)(int md_id, ccmni_ccci_ops_t *ccci_info);
  74. int (*rx_callback)(int md_id, int rx_ch, struct sk_buff *skb, void *priv_data);
  75. void (*md_state_callback)(int md_id, int rx_ch, MD_STATE state);
  76. void (*exit)(int md_id);
  77. void (*dump)(int md_id, int rx_ch, unsigned int flag);
  78. void (*dump_rx_status)(int md_id, int rx_ch, unsigned long long *status);
  79. };
  80. typedef enum {
  81. CCMNI_DRV_V0 = 0, /* for eemcs/eccci */
  82. CCMNI_DRV_V1 = 1, /* for dual_ccci ccmni_v1 */
  83. CCMNI_DRV_V2 = 2, /* for dual_ccci ccmni_v2 */
  84. } CCMNI_DRV_VER;
  85. typedef enum {
  86. CCMNI_RX_CH = 0,
  87. CCMNI_RX_ACK_CH = 1,
  88. CCMNI_TX_CH = 2,
  89. CCMNI_TX_ACK_CH = 3,
  90. } CCMNI_CH;
  91. typedef enum {
  92. CCMNI_ERR_TX_OK = 0, /* ccci send pkt success */
  93. CCMNI_ERR_TX_BUSY = -1, /* ccci tx packet buffer full and tx fail */
  94. CCMNI_ERR_MD_NO_READY = -2, /* modem not ready and tx fail */
  95. CCMNI_ERR_TX_INVAL = -3, /* ccmni parameter error */
  96. } CCMNI_ERRNO;
  97. typedef enum {
  98. CCMNI_DBG_LEVEL_1 = (1<<0),
  99. CCMNI_DBG_LEVEL_TX = (1<<1),
  100. CCMNI_DBG_LEVEL_RX = (1<<2),
  101. CCMNI_DBG_LEVEL_ACK_SKB = (1<<3),
  102. CCMNI_DBG_LEVEL_TX_SKB = (1<<4),
  103. CCMNI_DBG_LEVEL_RX_SKB = (1<<5),
  104. } CCMNI_DBG_LEVEL;
  105. typedef enum {
  106. CCMNI_TXQ_NORMAL = 0,
  107. CCMNI_TXQ_FAST = 1,
  108. CCMNI_TXQ_NUM,
  109. CCMNI_TXQ_END = CCMNI_TXQ_NUM
  110. } CCMNI_TXQ_NO;
  111. /*****************************extern function************************************/
  112. /* int ccmni_init(int md_id, ccmni_ccci_ops_t *ccci_info); */
  113. /* void ccmni_exit(int md_id); */
  114. /* int ccmni_rx_callback(int md_id, struct sk_buff *skb, void *priv_data); */
  115. /* void ccmni_md_state_callback(int md_id, int rx_ch, MD_STATE state); */
  116. /*****************************ccmni debug function*******************************/
  117. extern unsigned int ccmni_debug_level;
  118. #define CCMNI_DBG_MSG(idx, fmt, args...) \
  119. do { \
  120. if (ccmni_debug_level&CCMNI_DBG_LEVEL_1) \
  121. pr_debug("[ccci%d/net]" fmt, (idx+1), ##args); \
  122. } while (0)
  123. #define CCMNI_INF_MSG(idx, fmt, args...) pr_debug("[ccci%d/net]" fmt, (idx+1), ##args)
  124. #define CCMNI_ERR_MSG(idx, fmt, args...) pr_err("[ccci%d/net][Error:%d]%s:" fmt, (idx+1), __LINE__, __func__, ##args)
  125. #endif /* __CCCI_CCMNI_H__ */