Commit 3edc1cff authored by Arend van Spriel's avatar Arend van Spriel Committed by John W. Linville

brcmfmac: enable tx status signalling

Enabling the tx status signalling, which requires packet tagging
before sending to the firmware and handling the tx status signal.
Reviewed-by: default avatarPieter-Paul Giesberts <pieterpg@broadcom.com>
Reviewed-by: default avatarHante Meuleman <meuleman@broadcom.com>
Reviewed-by: default avatarPiotr Haber <phaber@broadcom.com>
Signed-off-by: default avatarArend van Spriel <arend@broadcom.com>
Signed-off-by: default avatarJohn W. Linville <linville@tuxdriver.com>
parent c7f34a69
...@@ -142,12 +142,30 @@ ssize_t brcmf_debugfs_fws_stats_read(struct file *f, char __user *data, ...@@ -142,12 +142,30 @@ ssize_t brcmf_debugfs_fws_stats_read(struct file *f, char __user *data,
"header_only_pkt: %u\n" "header_only_pkt: %u\n"
"tlv_parse_failed: %u\n" "tlv_parse_failed: %u\n"
"tlv_invalid_type: %u\n" "tlv_invalid_type: %u\n"
"mac_update_fails: %u\n", "mac_update_fails: %u\n"
"pkt2bus: %u\n"
"generic_error: %u\n"
"txs_indicate: %u\n"
"txs_discard: %u\n"
"txs_suppr_core: %u\n"
"txs_suppr_ps: %u\n"
"txs_tossed: %u\n"
"send_pkts: BK:%u BE:%u VO:%u VI:%u BCMC:%u\n",
fwstats->header_pulls, fwstats->header_pulls,
fwstats->header_only_pkt, fwstats->header_only_pkt,
fwstats->tlv_parse_failed, fwstats->tlv_parse_failed,
fwstats->tlv_invalid_type, fwstats->tlv_invalid_type,
fwstats->mac_update_failed); fwstats->mac_update_failed,
fwstats->pkt2bus,
fwstats->generic_error,
fwstats->txs_indicate,
fwstats->txs_discard,
fwstats->txs_supp_core,
fwstats->txs_supp_ps,
fwstats->txs_tossed,
fwstats->send_pkts[0], fwstats->send_pkts[1],
fwstats->send_pkts[2], fwstats->send_pkts[3],
fwstats->send_pkts[4]);
return simple_read_from_buffer(data, count, ppos, buf, res); return simple_read_from_buffer(data, count, ppos, buf, res);
} }
......
...@@ -137,7 +137,15 @@ struct brcmf_fws_stats { ...@@ -137,7 +137,15 @@ struct brcmf_fws_stats {
u32 tlv_invalid_type; u32 tlv_invalid_type;
u32 header_only_pkt; u32 header_only_pkt;
u32 header_pulls; u32 header_pulls;
u32 pkt2bus;
u32 send_pkts[5];
u32 generic_error;
u32 mac_update_failed; u32 mac_update_failed;
u32 txs_indicate;
u32 txs_discard;
u32 txs_supp_core;
u32 txs_supp_ps;
u32 txs_tossed;
}; };
struct brcmf_pub; struct brcmf_pub;
......
...@@ -223,18 +223,7 @@ static netdev_tx_t brcmf_netdev_start_xmit(struct sk_buff *skb, ...@@ -223,18 +223,7 @@ static netdev_tx_t brcmf_netdev_start_xmit(struct sk_buff *skb,
goto done; goto done;
} }
/* handle ethernet header */ ret = brcmf_fws_process_skb(ifp, skb);
eh = (struct ethhdr *)(skb->data);
if (is_multicast_ether_addr(eh->h_dest))
drvr->tx_multicast++;
if (ntohs(eh->h_proto) == ETH_P_PAE)
atomic_inc(&ifp->pend_8021x_cnt);
/* If the protocol uses a data header, apply it */
brcmf_proto_hdrpush(drvr, ifp->ifidx, 0, skb);
/* Use bus module to send data frame */
ret = brcmf_bus_txdata(drvr->bus_if, skb);
done: done:
if (ret) { if (ret) {
...@@ -376,7 +365,7 @@ void brcmf_txfinalize(struct brcmf_pub *drvr, struct sk_buff *txp, ...@@ -376,7 +365,7 @@ void brcmf_txfinalize(struct brcmf_pub *drvr, struct sk_buff *txp,
ifp = drvr->iflist[ifidx]; ifp = drvr->iflist[ifidx];
if (!ifp) if (!ifp)
return; goto done;
if (res == 0) { if (res == 0) {
eh = (struct ethhdr *)(txp->data); eh = (struct ethhdr *)(txp->data);
...@@ -390,6 +379,8 @@ void brcmf_txfinalize(struct brcmf_pub *drvr, struct sk_buff *txp, ...@@ -390,6 +379,8 @@ void brcmf_txfinalize(struct brcmf_pub *drvr, struct sk_buff *txp,
} }
if (!success) if (!success)
ifp->stats.tx_errors++; ifp->stats.tx_errors++;
done:
brcmu_pkt_buf_free_skb(txp);
} }
void brcmf_txcomplete(struct device *dev, struct sk_buff *txp, bool success) void brcmf_txcomplete(struct device *dev, struct sk_buff *txp, bool success)
...@@ -402,7 +393,6 @@ void brcmf_txcomplete(struct device *dev, struct sk_buff *txp, bool success) ...@@ -402,7 +393,6 @@ void brcmf_txcomplete(struct device *dev, struct sk_buff *txp, bool success)
return; return;
brcmf_txfinalize(drvr, txp, success); brcmf_txfinalize(drvr, txp, success);
brcmu_pkt_buf_free_skb(txp);
} }
static struct net_device_stats *brcmf_netdev_get_stats(struct net_device *ndev) static struct net_device_stats *brcmf_netdev_get_stats(struct net_device *ndev)
......
...@@ -23,6 +23,7 @@ void brcmf_fws_deinit(struct brcmf_pub *drvr); ...@@ -23,6 +23,7 @@ void brcmf_fws_deinit(struct brcmf_pub *drvr);
bool brcmf_fws_fc_active(struct brcmf_fws_info *fws); bool brcmf_fws_fc_active(struct brcmf_fws_info *fws);
int brcmf_fws_hdrpull(struct brcmf_pub *drvr, int ifidx, s16 signal_len, int brcmf_fws_hdrpull(struct brcmf_pub *drvr, int ifidx, s16 signal_len,
struct sk_buff *skb); struct sk_buff *skb);
int brcmf_fws_process_skb(struct brcmf_if *ifp, struct sk_buff *skb);
void brcmf_fws_reset_interface(struct brcmf_if *ifp); void brcmf_fws_reset_interface(struct brcmf_if *ifp);
void brcmf_fws_add_interface(struct brcmf_if *ifp); void brcmf_fws_add_interface(struct brcmf_if *ifp);
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment