support different wifi bt chip auto compatible
[firefly-linux-kernel-4.4.55.git] / drivers / net / wireless / rockchip_wlan / rda5990 / rda_wlan / rda5890_txrx.c
1 #include <linux/module.h>
2 #include <linux/dcache.h>
3 #include <linux/debugfs.h>
4 #include <linux/delay.h>
5 #include <linux/mm.h>
6 #include <linux/string.h>
7 #include <linux/etherdevice.h>
8 #include <net/iw_handler.h>
9
10 #include "rda5890_defs.h"
11 #include "rda5890_dev.h"
12 #include "rda5890_wid.h"
13 #include "rda5890_wext.h"
14
15 void rda5890_data_rx(struct rda5890_private *priv, 
16                 char *data, unsigned short data_len)
17 {
18         struct sk_buff *skb;
19         char *pkt_data;
20
21         RDA5890_DBGLAP(RDA5890_DA_TXRX, RDA5890_DL_DEBUG,
22                 "%s >>>\n", __func__);
23
24         skb = dev_alloc_skb(data_len + NET_IP_ALIGN);
25         if (!skb) {
26                 priv->stats.rx_dropped++;
27                 return;
28         }
29         skb_reserve(skb, NET_IP_ALIGN);
30         pkt_data = skb_put(skb, data_len);
31         memcpy(pkt_data, data, data_len);
32         skb->dev = priv->dev;
33         skb->protocol = eth_type_trans(skb, priv->dev);
34         skb->ip_summed = CHECKSUM_NONE;
35
36         RDA5890_DBGLAP(RDA5890_DA_TXRX, RDA5890_DL_TRACE,
37                 "netif rx, len %d\n", skb->len);
38         RDA5890_DBGLAP(RDA5890_DA_TXRX, RDA5890_DL_TRACE,
39                 "%02x %02x %02x %02x ... ... %02x %02x %02x %02x\n",
40                 skb->data[0], skb->data[1], skb->data[2], skb->data[3], 
41                 skb->data[skb->len - 4], skb->data[skb->len - 3],
42                 skb->data[skb->len - 2], skb->data[skb->len - 1]);
43
44         priv->stats.rx_packets++;
45         priv->stats.rx_bytes += data_len;
46
47         if (in_interrupt())
48                 netif_rx(skb);
49         else
50                 netif_rx_ni(skb);
51
52         RDA5890_DBGLAP(RDA5890_DA_TXRX, RDA5890_DL_DEBUG,
53                 "%s <<<\n", __func__);
54 }
55
56
57 int rda5890_host_to_card(struct rda5890_private *priv, 
58                 char *packet, unsigned short packet_len, unsigned char packet_type)
59 {
60         int ret = 0;
61
62         RDA5890_DBGLAP(RDA5890_DA_WID, RDA5890_DL_DEBUG,
63                 "%s <<< \n", __func__);
64
65         ret = priv->hw_host_to_card(priv, packet, packet_len, packet_type);
66
67         RDA5890_DBGLAP(RDA5890_DA_WID, RDA5890_DL_DEBUG,
68                 "%s >>> \n", __func__);
69
70         return ret;
71 }
72
73
74 int rda5890_data_tx(struct rda5890_private *priv, 
75                 struct sk_buff *skb, struct net_device *dev)
76 {
77         int ret;
78         char *pkt_data;
79         uint16_t pkt_len;
80         char buf[ETH_FRAME_LEN + 2];
81         uint16_t data_len;
82
83         RDA5890_DBGLAP(RDA5890_DA_TXRX, RDA5890_DL_DEBUG,
84                 "%s <<< \n", __func__);
85
86         ret = NETDEV_TX_OK;
87
88         if (!skb->len || (skb->len > ETH_FRAME_LEN)) {
89                 priv->stats.tx_dropped++;
90                 priv->stats.tx_errors++;
91                 goto free;
92         }
93
94         pkt_data = skb->data;
95         pkt_len = skb->len;
96
97         RDA5890_DBGLAP(RDA5890_DA_TXRX, RDA5890_DL_TRACE,
98                 "netif tx len %d\n", pkt_len);
99         RDA5890_DBGLAP(RDA5890_DA_TXRX, RDA5890_DL_TRACE,
100                 "%02x %02x %02x %02x ... ... %02x %02x %02x %02x\n",
101                 skb->data[0], skb->data[1], skb->data[2], skb->data[3], 
102                 skb->data[skb->len - 4], skb->data[skb->len - 3],
103                 skb->data[skb->len - 2], skb->data[skb->len - 1]);
104
105         /* FIXME: we can save this memcpy by adding header inside the sdio driver */
106         memcpy(buf + 2, pkt_data, pkt_len);
107         data_len = pkt_len + 2;
108         buf[0] = (char)(data_len&0xFF);
109         buf[1] = (char)((data_len>>8)&0x0F);
110         buf[1] |= 0x10;  // for DataOut 0x1
111
112         //RDA5890_DBGLAP(RDA5890_DA_ETHER, RDA5890_DL_NORM,
113         //      "sdio tx len %d\n", data_len);
114         //RDA5890_DBGLAP(RDA5890_DA_ETHER, RDA5890_DL_NORM,
115         //      "%02x %02x %02x %02x ... ... %02x %02x %02x %02x\n",
116         //      buf[0], buf[1], buf[2], buf[3], 
117         //      buf[data_len - 4], buf[data_len - 3],
118         //      buf[data_len - 2], buf[data_len - 1]);
119
120         ret = rda5890_host_to_card(priv, buf, data_len, DATA_REQUEST_PACKET);
121         if (ret) {
122                 RDA5890_ERRP("host_to_card send failed, ret = %d\n", ret);
123                 goto free;
124         }
125
126         priv->stats.tx_packets++;
127         priv->stats.tx_bytes += skb->len;
128
129         dev->trans_start = jiffies;
130
131  free:
132         /* free right away, since we do copy */
133         dev_kfree_skb_any(skb);
134
135         RDA5890_DBGLAP(RDA5890_DA_TXRX, RDA5890_DL_DEBUG,
136                 "%s >>> \n", __func__);
137         return ret;
138 }
139