1 #include <linux/module.h>
2 #include <linux/dcache.h>
3 #include <linux/debugfs.h>
4 #include <linux/delay.h>
6 #include <linux/string.h>
7 #include <linux/etherdevice.h>
8 #include <net/iw_handler.h>
10 #include "rda5890_defs.h"
11 #include "rda5890_dev.h"
12 #include "rda5890_wid.h"
13 #include "rda5890_wext.h"
15 void rda5890_data_rx(struct rda5890_private *priv,
16 char *data, unsigned short data_len)
21 RDA5890_DBGLAP(RDA5890_DA_TXRX, RDA5890_DL_DEBUG,
22 "%s >>>\n", __func__);
24 skb = dev_alloc_skb(data_len + NET_IP_ALIGN);
26 priv->stats.rx_dropped++;
29 skb_reserve(skb, NET_IP_ALIGN);
30 pkt_data = skb_put(skb, data_len);
31 memcpy(pkt_data, data, data_len);
33 skb->protocol = eth_type_trans(skb, priv->dev);
34 skb->ip_summed = CHECKSUM_NONE;
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]);
44 priv->stats.rx_packets++;
45 priv->stats.rx_bytes += data_len;
52 RDA5890_DBGLAP(RDA5890_DA_TXRX, RDA5890_DL_DEBUG,
53 "%s <<<\n", __func__);
57 int rda5890_host_to_card(struct rda5890_private *priv,
58 char *packet, unsigned short packet_len, unsigned char packet_type)
62 RDA5890_DBGLAP(RDA5890_DA_WID, RDA5890_DL_DEBUG,
63 "%s <<< \n", __func__);
65 ret = priv->hw_host_to_card(priv, packet, packet_len, packet_type);
67 RDA5890_DBGLAP(RDA5890_DA_WID, RDA5890_DL_DEBUG,
68 "%s >>> \n", __func__);
74 int rda5890_data_tx(struct rda5890_private *priv,
75 struct sk_buff *skb, struct net_device *dev)
80 char buf[ETH_FRAME_LEN + 2];
83 RDA5890_DBGLAP(RDA5890_DA_TXRX, RDA5890_DL_DEBUG,
84 "%s <<< \n", __func__);
88 if (!skb->len || (skb->len > ETH_FRAME_LEN)) {
89 priv->stats.tx_dropped++;
90 priv->stats.tx_errors++;
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]);
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
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]);
120 ret = rda5890_host_to_card(priv, buf, data_len, DATA_REQUEST_PACKET);
122 RDA5890_ERRP("host_to_card send failed, ret = %d\n", ret);
126 priv->stats.tx_packets++;
127 priv->stats.tx_bytes += skb->len;
129 dev->trans_start = jiffies;
132 /* free right away, since we do copy */
133 dev_kfree_skb_any(skb);
135 RDA5890_DBGLAP(RDA5890_DA_TXRX, RDA5890_DL_DEBUG,
136 "%s >>> \n", __func__);