Commit acf8ac41 authored by Arend Van Spriel's avatar Arend Van Spriel Committed by Kalle Valo

brcmfmac: remove reference to fwsignal data from struct brcmf_pub

The fwsignal module is part of the bcdc protocol and as such does
its instance data is not needed in core structure. Moving it into
struct brcmf_bcdc instead.
Reviewed-by: default avatarHante Meuleman <hante.meuleman@broadcom.com>
Reviewed-by: default avatarPieter-Paul Giesberts <pieter-paul.giesberts@broadcom.com>
Reviewed-by: default avatarFranky Lin <franky.lin@broadcom.com>
Signed-off-by: default avatarArend van Spriel <arend.vanspriel@broadcom.com>
Signed-off-by: default avatarKalle Valo <kvalo@codeaurora.org>
parent fc0471e3
...@@ -103,9 +103,17 @@ struct brcmf_bcdc { ...@@ -103,9 +103,17 @@ struct brcmf_bcdc {
u8 bus_header[BUS_HEADER_LEN]; u8 bus_header[BUS_HEADER_LEN];
struct brcmf_proto_bcdc_dcmd msg; struct brcmf_proto_bcdc_dcmd msg;
unsigned char buf[BRCMF_DCMD_MAXLEN]; unsigned char buf[BRCMF_DCMD_MAXLEN];
struct brcmf_fws_info *fws;
}; };
struct brcmf_fws_info *drvr_to_fws(struct brcmf_pub *drvr)
{
struct brcmf_bcdc *bcdc = drvr->proto->pd;
return bcdc->fws;
}
static int static int
brcmf_proto_bcdc_msg(struct brcmf_pub *drvr, int ifidx, uint cmd, void *buf, brcmf_proto_bcdc_msg(struct brcmf_pub *drvr, int ifidx, uint cmd, void *buf,
uint len, bool set) uint len, bool set)
...@@ -330,8 +338,9 @@ static int brcmf_proto_bcdc_tx_queue_data(struct brcmf_pub *drvr, int ifidx, ...@@ -330,8 +338,9 @@ static int brcmf_proto_bcdc_tx_queue_data(struct brcmf_pub *drvr, int ifidx,
struct sk_buff *skb) struct sk_buff *skb)
{ {
struct brcmf_if *ifp = brcmf_get_ifp(drvr, ifidx); struct brcmf_if *ifp = brcmf_get_ifp(drvr, ifidx);
struct brcmf_bcdc *bcdc = drvr->proto->pd;
if (!brcmf_fws_queue_skbs(drvr->fws)) if (!brcmf_fws_queue_skbs(bcdc->fws))
return brcmf_proto_txdata(drvr, ifidx, 0, skb); return brcmf_proto_txdata(drvr, ifidx, 0, skb);
return brcmf_fws_process_skb(ifp, skb); return brcmf_fws_process_skb(ifp, skb);
...@@ -360,15 +369,15 @@ brcmf_proto_bcdc_txcomplete(struct device *dev, struct sk_buff *txp, ...@@ -360,15 +369,15 @@ brcmf_proto_bcdc_txcomplete(struct device *dev, struct sk_buff *txp,
bool success) bool success)
{ {
struct brcmf_bus *bus_if = dev_get_drvdata(dev); struct brcmf_bus *bus_if = dev_get_drvdata(dev);
struct brcmf_pub *drvr = bus_if->drvr; struct brcmf_bcdc *bcdc = bus_if->drvr->proto->pd;
struct brcmf_if *ifp; struct brcmf_if *ifp;
/* await txstatus signal for firmware if active */ /* await txstatus signal for firmware if active */
if (brcmf_fws_fc_active(drvr->fws)) { if (brcmf_fws_fc_active(bcdc->fws)) {
if (!success) if (!success)
brcmf_fws_bustxfail(drvr->fws, txp); brcmf_fws_bustxfail(bcdc->fws, txp);
} else { } else {
if (brcmf_proto_bcdc_hdrpull(drvr, false, txp, &ifp)) if (brcmf_proto_bcdc_hdrpull(bus_if->drvr, false, txp, &ifp))
brcmu_pkt_buf_free_skb(txp); brcmu_pkt_buf_free_skb(txp);
else else
brcmf_txfinalize(ifp, txp, success); brcmf_txfinalize(ifp, txp, success);
...@@ -420,7 +429,15 @@ brcmf_proto_bcdc_reset_if(struct brcmf_if *ifp) ...@@ -420,7 +429,15 @@ brcmf_proto_bcdc_reset_if(struct brcmf_if *ifp)
static int static int
brcmf_proto_bcdc_init_done(struct brcmf_pub *drvr) brcmf_proto_bcdc_init_done(struct brcmf_pub *drvr)
{ {
return brcmf_fws_attach(drvr); struct brcmf_bcdc *bcdc = drvr->proto->pd;
struct brcmf_fws_info *fws;
fws = brcmf_fws_attach(drvr);
if (IS_ERR(fws))
return PTR_ERR(fws);
bcdc->fws = fws;
return 0;
} }
int brcmf_proto_bcdc_attach(struct brcmf_pub *drvr) int brcmf_proto_bcdc_attach(struct brcmf_pub *drvr)
...@@ -464,7 +481,9 @@ int brcmf_proto_bcdc_attach(struct brcmf_pub *drvr) ...@@ -464,7 +481,9 @@ int brcmf_proto_bcdc_attach(struct brcmf_pub *drvr)
void brcmf_proto_bcdc_detach(struct brcmf_pub *drvr) void brcmf_proto_bcdc_detach(struct brcmf_pub *drvr)
{ {
brcmf_fws_detach(drvr); struct brcmf_bcdc *bcdc = drvr->proto->pd;
kfree(drvr->proto->pd);
drvr->proto->pd = NULL; drvr->proto->pd = NULL;
brcmf_fws_detach(bcdc->fws);
kfree(bcdc);
} }
...@@ -22,6 +22,7 @@ void brcmf_proto_bcdc_detach(struct brcmf_pub *drvr); ...@@ -22,6 +22,7 @@ void brcmf_proto_bcdc_detach(struct brcmf_pub *drvr);
void brcmf_proto_bcdc_txflowblock(struct device *dev, bool state); void brcmf_proto_bcdc_txflowblock(struct device *dev, bool state);
void brcmf_proto_bcdc_txcomplete(struct device *dev, struct sk_buff *txp, void brcmf_proto_bcdc_txcomplete(struct device *dev, struct sk_buff *txp,
bool success); bool success);
struct brcmf_fws_info *drvr_to_fws(struct brcmf_pub *drvr);
#else #else
static inline int brcmf_proto_bcdc_attach(struct brcmf_pub *drvr) { return 0; } static inline int brcmf_proto_bcdc_attach(struct brcmf_pub *drvr) { return 0; }
static inline void brcmf_proto_bcdc_detach(struct brcmf_pub *drvr) {} static inline void brcmf_proto_bcdc_detach(struct brcmf_pub *drvr) {}
......
...@@ -127,8 +127,6 @@ struct brcmf_pub { ...@@ -127,8 +127,6 @@ struct brcmf_pub {
struct brcmf_fweh_info fweh; struct brcmf_fweh_info fweh;
struct brcmf_fws_info *fws;
struct brcmf_ampdu_rx_reorder struct brcmf_ampdu_rx_reorder
*reorder_flows[BRCMF_AMPDU_RX_REORDER_MAXFLOWS]; *reorder_flows[BRCMF_AMPDU_RX_REORDER_MAXFLOWS];
......
...@@ -36,6 +36,7 @@ ...@@ -36,6 +36,7 @@
#include "p2p.h" #include "p2p.h"
#include "cfg80211.h" #include "cfg80211.h"
#include "proto.h" #include "proto.h"
#include "bcdc.h"
#include "common.h" #include "common.h"
/** /**
...@@ -1586,7 +1587,7 @@ static int brcmf_fws_notify_credit_map(struct brcmf_if *ifp, ...@@ -1586,7 +1587,7 @@ static int brcmf_fws_notify_credit_map(struct brcmf_if *ifp,
const struct brcmf_event_msg *e, const struct brcmf_event_msg *e,
void *data) void *data)
{ {
struct brcmf_fws_info *fws = ifp->drvr->fws; struct brcmf_fws_info *fws = drvr_to_fws(ifp->drvr);
int i; int i;
u8 *credits = data; u8 *credits = data;
...@@ -1617,7 +1618,7 @@ static int brcmf_fws_notify_bcmc_credit_support(struct brcmf_if *ifp, ...@@ -1617,7 +1618,7 @@ static int brcmf_fws_notify_bcmc_credit_support(struct brcmf_if *ifp,
const struct brcmf_event_msg *e, const struct brcmf_event_msg *e,
void *data) void *data)
{ {
struct brcmf_fws_info *fws = ifp->drvr->fws; struct brcmf_fws_info *fws = drvr_to_fws(ifp->drvr);
if (fws) { if (fws) {
brcmf_fws_lock(fws); brcmf_fws_lock(fws);
...@@ -1826,7 +1827,7 @@ void brcmf_fws_rxreorder(struct brcmf_if *ifp, struct sk_buff *pkt) ...@@ -1826,7 +1827,7 @@ void brcmf_fws_rxreorder(struct brcmf_if *ifp, struct sk_buff *pkt)
void brcmf_fws_hdrpull(struct brcmf_if *ifp, s16 siglen, struct sk_buff *skb) void brcmf_fws_hdrpull(struct brcmf_if *ifp, s16 siglen, struct sk_buff *skb)
{ {
struct brcmf_skb_reorder_data *rd; struct brcmf_skb_reorder_data *rd;
struct brcmf_fws_info *fws = ifp->drvr->fws; struct brcmf_fws_info *fws = drvr_to_fws(ifp->drvr);
u8 *signal_data; u8 *signal_data;
s16 data_len; s16 data_len;
u8 type; u8 type;
...@@ -2091,8 +2092,7 @@ static int brcmf_fws_assign_htod(struct brcmf_fws_info *fws, struct sk_buff *p, ...@@ -2091,8 +2092,7 @@ static int brcmf_fws_assign_htod(struct brcmf_fws_info *fws, struct sk_buff *p,
int brcmf_fws_process_skb(struct brcmf_if *ifp, struct sk_buff *skb) int brcmf_fws_process_skb(struct brcmf_if *ifp, struct sk_buff *skb)
{ {
struct brcmf_pub *drvr = ifp->drvr; struct brcmf_fws_info *fws = drvr_to_fws(ifp->drvr);
struct brcmf_fws_info *fws = drvr->fws;
struct brcmf_skbuff_cb *skcb = brcmf_skbcb(skb); struct brcmf_skbuff_cb *skcb = brcmf_skbcb(skb);
struct ethhdr *eh = (struct ethhdr *)(skb->data); struct ethhdr *eh = (struct ethhdr *)(skb->data);
int fifo = BRCMF_FWS_FIFO_BCMC; int fifo = BRCMF_FWS_FIFO_BCMC;
...@@ -2142,7 +2142,7 @@ void brcmf_fws_reset_interface(struct brcmf_if *ifp) ...@@ -2142,7 +2142,7 @@ 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)
{ {
struct brcmf_fws_info *fws = ifp->drvr->fws; struct brcmf_fws_info *fws = drvr_to_fws(ifp->drvr);
struct brcmf_fws_mac_descriptor *entry; struct brcmf_fws_mac_descriptor *entry;
if (!ifp->ndev || fws->fcmode == BRCMF_FWS_FCMODE_NONE) if (!ifp->ndev || fws->fcmode == BRCMF_FWS_FCMODE_NONE)
...@@ -2160,16 +2160,17 @@ void brcmf_fws_add_interface(struct brcmf_if *ifp) ...@@ -2160,16 +2160,17 @@ void brcmf_fws_add_interface(struct brcmf_if *ifp)
void brcmf_fws_del_interface(struct brcmf_if *ifp) void brcmf_fws_del_interface(struct brcmf_if *ifp)
{ {
struct brcmf_fws_mac_descriptor *entry = ifp->fws_desc; struct brcmf_fws_mac_descriptor *entry = ifp->fws_desc;
struct brcmf_fws_info *fws = drvr_to_fws(ifp->drvr);
if (!entry) if (!entry)
return; return;
brcmf_fws_lock(ifp->drvr->fws); brcmf_fws_lock(fws);
ifp->fws_desc = NULL; ifp->fws_desc = NULL;
brcmf_dbg(TRACE, "deleting %s\n", entry->name); brcmf_dbg(TRACE, "deleting %s\n", entry->name);
brcmf_fws_macdesc_deinit(entry); brcmf_fws_macdesc_deinit(entry);
brcmf_fws_cleanup(ifp->drvr->fws, ifp->ifidx); brcmf_fws_cleanup(fws, ifp->ifidx);
brcmf_fws_unlock(ifp->drvr->fws); brcmf_fws_unlock(fws);
} }
static void brcmf_fws_dequeue_worker(struct work_struct *worker) static void brcmf_fws_dequeue_worker(struct work_struct *worker)
...@@ -2243,7 +2244,7 @@ static void brcmf_fws_dequeue_worker(struct work_struct *worker) ...@@ -2243,7 +2244,7 @@ static void brcmf_fws_dequeue_worker(struct work_struct *worker)
static int brcmf_debugfs_fws_stats_read(struct seq_file *seq, void *data) static int brcmf_debugfs_fws_stats_read(struct seq_file *seq, void *data)
{ {
struct brcmf_bus *bus_if = dev_get_drvdata(seq->private); struct brcmf_bus *bus_if = dev_get_drvdata(seq->private);
struct brcmf_fws_stats *fwstats = &bus_if->drvr->fws->stats; struct brcmf_fws_stats *fwstats = &(drvr_to_fws(bus_if->drvr)->stats);
seq_printf(seq, seq_printf(seq,
"header_pulls: %u\n" "header_pulls: %u\n"
...@@ -2308,7 +2309,7 @@ static int brcmf_debugfs_fws_stats_read(struct seq_file *seq, void *data) ...@@ -2308,7 +2309,7 @@ static int brcmf_debugfs_fws_stats_read(struct seq_file *seq, void *data)
} }
#endif #endif
int brcmf_fws_attach(struct brcmf_pub *drvr) struct brcmf_fws_info *brcmf_fws_attach(struct brcmf_pub *drvr)
{ {
struct brcmf_fws_info *fws; struct brcmf_fws_info *fws;
struct brcmf_if *ifp; struct brcmf_if *ifp;
...@@ -2316,17 +2317,15 @@ int brcmf_fws_attach(struct brcmf_pub *drvr) ...@@ -2316,17 +2317,15 @@ int brcmf_fws_attach(struct brcmf_pub *drvr)
int rc; int rc;
u32 mode; u32 mode;
drvr->fws = kzalloc(sizeof(*(drvr->fws)), GFP_KERNEL); fws = kzalloc(sizeof(*fws), GFP_KERNEL);
if (!drvr->fws) { if (!fws) {
rc = -ENOMEM; rc = -ENOMEM;
goto fail; goto fail;
} }
fws = drvr->fws;
spin_lock_init(&fws->spinlock); spin_lock_init(&fws->spinlock);
/* set linkage back */ /* store drvr reference */
fws->drvr = drvr; fws->drvr = drvr;
fws->fcmode = drvr->settings->fcmode; fws->fcmode = drvr->settings->fcmode;
...@@ -2334,7 +2333,7 @@ int brcmf_fws_attach(struct brcmf_pub *drvr) ...@@ -2334,7 +2333,7 @@ int brcmf_fws_attach(struct brcmf_pub *drvr)
(fws->fcmode == BRCMF_FWS_FCMODE_NONE)) { (fws->fcmode == BRCMF_FWS_FCMODE_NONE)) {
fws->avoid_queueing = true; fws->avoid_queueing = true;
brcmf_dbg(INFO, "FWS queueing will be avoided\n"); brcmf_dbg(INFO, "FWS queueing will be avoided\n");
return 0; return fws;
} }
fws->fws_wq = create_singlethread_workqueue("brcmf_fws_wq"); fws->fws_wq = create_singlethread_workqueue("brcmf_fws_wq");
...@@ -2396,6 +2395,7 @@ int brcmf_fws_attach(struct brcmf_pub *drvr) ...@@ -2396,6 +2395,7 @@ int brcmf_fws_attach(struct brcmf_pub *drvr)
brcmf_fws_hanger_init(&fws->hanger); brcmf_fws_hanger_init(&fws->hanger);
brcmf_fws_macdesc_init(&fws->desc.other, NULL, 0); brcmf_fws_macdesc_init(&fws->desc.other, NULL, 0);
brcmf_fws_macdesc_set_name(fws, &fws->desc.other); brcmf_fws_macdesc_set_name(fws, &fws->desc.other);
brcmf_dbg(INFO, "added %s\n", fws->desc.other.name);
brcmu_pktq_init(&fws->desc.other.psq, BRCMF_FWS_PSQ_PREC_COUNT, brcmu_pktq_init(&fws->desc.other.psq, BRCMF_FWS_PSQ_PREC_COUNT,
BRCMF_FWS_PSQ_LEN); BRCMF_FWS_PSQ_LEN);
...@@ -2405,27 +2405,24 @@ int brcmf_fws_attach(struct brcmf_pub *drvr) ...@@ -2405,27 +2405,24 @@ int brcmf_fws_attach(struct brcmf_pub *drvr)
brcmf_dbg(INFO, "%s bdcv2 tlv signaling [%x]\n", brcmf_dbg(INFO, "%s bdcv2 tlv signaling [%x]\n",
fws->fw_signals ? "enabled" : "disabled", tlv); fws->fw_signals ? "enabled" : "disabled", tlv);
return 0; return fws;
fail: fail:
brcmf_fws_detach(drvr); brcmf_fws_detach(fws);
return rc; return ERR_PTR(rc);
} }
void brcmf_fws_detach(struct brcmf_pub *drvr) void brcmf_fws_detach(struct brcmf_fws_info *fws)
{ {
struct brcmf_fws_info *fws = drvr->fws;
if (!fws) if (!fws)
return; return;
if (drvr->fws->fws_wq) if (fws->fws_wq)
destroy_workqueue(drvr->fws->fws_wq); destroy_workqueue(fws->fws_wq);
/* cleanup */ /* cleanup */
brcmf_fws_lock(fws); brcmf_fws_lock(fws);
brcmf_fws_cleanup(fws, -1); brcmf_fws_cleanup(fws, -1);
drvr->fws = NULL;
brcmf_fws_unlock(fws); brcmf_fws_unlock(fws);
/* free top structure */ /* free top structure */
...@@ -2461,7 +2458,7 @@ void brcmf_fws_bustxfail(struct brcmf_fws_info *fws, struct sk_buff *skb) ...@@ -2461,7 +2458,7 @@ void brcmf_fws_bustxfail(struct brcmf_fws_info *fws, struct sk_buff *skb)
void brcmf_fws_bus_blocked(struct brcmf_pub *drvr, bool flow_blocked) void brcmf_fws_bus_blocked(struct brcmf_pub *drvr, bool flow_blocked)
{ {
struct brcmf_fws_info *fws = drvr->fws; struct brcmf_fws_info *fws = drvr_to_fws(drvr);
struct brcmf_if *ifp; struct brcmf_if *ifp;
int i; int i;
......
...@@ -18,8 +18,8 @@ ...@@ -18,8 +18,8 @@
#ifndef FWSIGNAL_H_ #ifndef FWSIGNAL_H_
#define FWSIGNAL_H_ #define FWSIGNAL_H_
int brcmf_fws_attach(struct brcmf_pub *drvr); struct brcmf_fws_info *brcmf_fws_attach(struct brcmf_pub *drvr);
void brcmf_fws_detach(struct brcmf_pub *drvr); void brcmf_fws_detach(struct brcmf_fws_info *fws);
bool brcmf_fws_queue_skbs(struct brcmf_fws_info *fws); bool brcmf_fws_queue_skbs(struct brcmf_fws_info *fws);
bool brcmf_fws_fc_active(struct brcmf_fws_info *fws); bool brcmf_fws_fc_active(struct brcmf_fws_info *fws);
void brcmf_fws_hdrpull(struct brcmf_if *ifp, s16 siglen, struct sk_buff *skb); void brcmf_fws_hdrpull(struct brcmf_if *ifp, s16 siglen, struct sk_buff *skb);
......
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