2 * This file contains the handling of TX in wlan driver.
4 #include <linux/netdevice.h>
5 #include <linux/etherdevice.h>
15 * @brief This function converts Tx/Rx rates from IEEE80211_RADIOTAP_RATE
16 * units (500 Kb/s) into Marvell WLAN format (see Table 8 in Section 3.2.1)
18 * @param rate Input rate
19 * @return Output Rate (0 if invalid)
21 static u32
convert_radiotap_rate_to_mv(u8 rate
)
28 case 11: /* 5.5 Mbps */
30 case 22: /* 11 Mbps */
36 case 24: /* 12 Mbps */
38 case 36: /* 18 Mbps */
40 case 48: /* 24 Mbps */
42 case 72: /* 36 Mbps */
44 case 96: /* 48 Mbps */
46 case 108: /* 54 Mbps */
53 * @brief This function checks the conditions and sends packet to IF
54 * layer if everything is ok.
56 * @param priv A pointer to struct lbs_private structure
57 * @param skb A pointer to skb which includes TX packet
60 int lbs_hard_start_xmit(struct sk_buff
*skb
, struct net_device
*dev
)
63 struct lbs_private
*priv
= dev
->priv
;
69 lbs_deb_enter(LBS_DEB_TX
);
73 /* We need to protect against the queues being restarted before
74 we get round to stopping them */
75 spin_lock_irqsave(&priv
->driver_lock
, flags
);
77 if (priv
->surpriseremoved
)
80 if (!skb
->len
|| (skb
->len
> MRVDRV_ETH_TX_PACKET_BUFFER_SIZE
)) {
81 lbs_deb_tx("tx err: skb length %d 0 or > %zd\n",
82 skb
->len
, MRVDRV_ETH_TX_PACKET_BUFFER_SIZE
);
83 /* We'll never manage to send this one; drop it and return 'OK' */
85 priv
->stats
.tx_dropped
++;
86 priv
->stats
.tx_errors
++;
91 netif_stop_queue(priv
->dev
);
93 netif_stop_queue(priv
->mesh_dev
);
95 if (priv
->tx_pending_len
) {
96 /* This can happen if packets come in on the mesh and eth
97 device simultaneously -- there's no mutual exclusion on
98 hard_start_xmit() calls between devices. */
99 lbs_deb_tx("Packet on %s while busy\n", dev
->name
);
100 ret
= NETDEV_TX_BUSY
;
104 priv
->tx_pending_len
= -1;
105 spin_unlock_irqrestore(&priv
->driver_lock
, flags
);
107 lbs_deb_hex(LBS_DEB_TX
, "TX Data", skb
->data
, min_t(unsigned int, skb
->len
, 100));
109 txpd
= (void *)priv
->tx_pending_buf
;
110 memset(txpd
, 0, sizeof(struct txpd
));
112 p802x_hdr
= skb
->data
;
115 if (dev
== priv
->rtap_net_dev
) {
116 struct tx_radiotap_hdr
*rtap_hdr
= (void *)skb
->data
;
118 /* set txpd fields from the radiotap header */
119 txpd
->tx_control
= cpu_to_le32(convert_radiotap_rate_to_mv(rtap_hdr
->rate
));
121 /* skip the radiotap header */
122 p802x_hdr
+= sizeof(*rtap_hdr
);
123 pkt_len
-= sizeof(*rtap_hdr
);
125 /* copy destination address from 802.11 header */
126 memcpy(txpd
->tx_dest_addr_high
, p802x_hdr
+ 4, ETH_ALEN
);
128 /* copy destination address from 802.3 header */
129 memcpy(txpd
->tx_dest_addr_high
, p802x_hdr
, ETH_ALEN
);
132 txpd
->tx_packet_length
= cpu_to_le16(pkt_len
);
133 txpd
->tx_packet_location
= cpu_to_le32(sizeof(struct txpd
));
135 if (dev
== priv
->mesh_dev
)
136 txpd
->tx_control
|= cpu_to_le32(TxPD_MESH_FRAME
);
138 lbs_deb_hex(LBS_DEB_TX
, "txpd", (u8
*) &txpd
, sizeof(struct txpd
));
140 lbs_deb_hex(LBS_DEB_TX
, "Tx Data", (u8
*) p802x_hdr
, le16_to_cpu(txpd
->tx_packet_length
));
142 memcpy(&txpd
[1], p802x_hdr
, le16_to_cpu(txpd
->tx_packet_length
));
144 spin_lock_irqsave(&priv
->driver_lock
, flags
);
145 priv
->tx_pending_len
= pkt_len
+ sizeof(struct txpd
);
147 lbs_deb_tx("%s lined up packet\n", __func__
);
149 priv
->stats
.tx_packets
++;
150 priv
->stats
.tx_bytes
+= skb
->len
;
152 dev
->trans_start
= jiffies
;
154 if (priv
->monitormode
!= LBS_MONITOR_OFF
) {
155 /* Keep the skb to echo it back once Tx feedback is
159 /* Keep the skb around for when we get feedback */
160 priv
->currenttxskb
= skb
;
163 dev_kfree_skb_any(skb
);
166 spin_unlock_irqrestore(&priv
->driver_lock
, flags
);
167 wake_up(&priv
->waitq
);
169 lbs_deb_leave_args(LBS_DEB_TX
, "ret %d", ret
);
174 * @brief This function sends to the host the last transmitted packet,
175 * filling the radiotap headers with transmission information.
177 * @param priv A pointer to struct lbs_private structure
178 * @param status A 32 bit value containing transmission status.
182 void lbs_send_tx_feedback(struct lbs_private
*priv
)
184 struct tx_radiotap_hdr
*radiotap_hdr
;
185 u32 status
= priv
->eventcause
;
189 if (priv
->monitormode
== LBS_MONITOR_OFF
||
190 priv
->currenttxskb
== NULL
)
193 radiotap_hdr
= (struct tx_radiotap_hdr
*)priv
->currenttxskb
->data
;
195 txfail
= (status
>> 24);
198 /* The version of roofnet that we've tested does not use this yet
199 * But it may be used in the future.
202 radiotap_hdr
->flags
&= IEEE80211_RADIOTAP_F_TX_FAIL
;
204 try_count
= (status
>> 16) & 0xff;
205 radiotap_hdr
->data_retries
= (try_count
) ?
206 (1 + priv
->txretrycount
- try_count
) : 0;
209 priv
->currenttxskb
->protocol
= eth_type_trans(priv
->currenttxskb
,
211 netif_rx(priv
->currenttxskb
);
213 priv
->currenttxskb
= NULL
;
215 if (priv
->connect_status
== LBS_CONNECTED
)
216 netif_wake_queue(priv
->dev
);
218 if (priv
->mesh_dev
&& (priv
->mesh_connect_status
== LBS_CONNECTED
))
219 netif_wake_queue(priv
->mesh_dev
);
221 EXPORT_SYMBOL_GPL(lbs_send_tx_feedback
);