Merge tag 'wireless-drivers-next-for-davem-2017-04-07' of git://git.kernel.org/pub/scm/linux/kernel/git/kvalo/wireless-drivers-next
Kalle Valo says: ==================== wireless-drivers-next patches for 4.12 Lots of bugfixes as usual but also some new features. Major changes: ath10k * improve firmware download time for QCA6174 and QCA9377, especially helps resume time ath9k_htc * add support AirTies 1eda:2315 AR9271 device rt2x00 * add support MT7620 mwifiex * enable auto deep sleep mode for USB chipsets brcmfmac * add support for network namespaces (WIPHY_FLAG_NETNS_OK) ==================== Signed-off-by: David S. Miller <davem@davemloft.net>
This commit is contained in:
@@ -18,14 +18,14 @@ config BRCMSMAC
|
||||
module, the driver will be called brcmsmac.ko.
|
||||
|
||||
config BRCMFMAC
|
||||
tristate "Broadcom IEEE802.11n embedded FullMAC WLAN driver"
|
||||
tristate "Broadcom FullMAC WLAN driver"
|
||||
depends on CFG80211
|
||||
select BRCMUTIL
|
||||
---help---
|
||||
This module adds support for embedded wireless adapters based on
|
||||
Broadcom IEEE802.11n FullMAC chipsets. It has to work with at least
|
||||
one of the bus interface support. If you choose to build a module,
|
||||
it'll be called brcmfmac.ko.
|
||||
This module adds support for wireless adapters based on Broadcom
|
||||
FullMAC chipsets. It has to work with at least one of the bus
|
||||
interface support. If you choose to build a module, it'll be called
|
||||
brcmfmac.ko.
|
||||
|
||||
config BRCMFMAC_PROTO_BCDC
|
||||
bool
|
||||
|
@@ -345,6 +345,36 @@ brcmf_proto_bcdc_txdata(struct brcmf_pub *drvr, int ifidx, u8 offset,
|
||||
return brcmf_bus_txdata(drvr->bus_if, pktbuf);
|
||||
}
|
||||
|
||||
void brcmf_proto_bcdc_txflowblock(struct device *dev, bool state)
|
||||
{
|
||||
struct brcmf_bus *bus_if = dev_get_drvdata(dev);
|
||||
struct brcmf_pub *drvr = bus_if->drvr;
|
||||
|
||||
brcmf_dbg(TRACE, "Enter\n");
|
||||
|
||||
brcmf_fws_bus_blocked(drvr, state);
|
||||
}
|
||||
|
||||
void
|
||||
brcmf_proto_bcdc_txcomplete(struct device *dev, struct sk_buff *txp,
|
||||
bool success)
|
||||
{
|
||||
struct brcmf_bus *bus_if = dev_get_drvdata(dev);
|
||||
struct brcmf_pub *drvr = bus_if->drvr;
|
||||
struct brcmf_if *ifp;
|
||||
|
||||
/* await txstatus signal for firmware if active */
|
||||
if (brcmf_fws_fc_active(drvr->fws)) {
|
||||
if (!success)
|
||||
brcmf_fws_bustxfail(drvr->fws, txp);
|
||||
} else {
|
||||
if (brcmf_proto_bcdc_hdrpull(drvr, false, txp, &ifp))
|
||||
brcmu_pkt_buf_free_skb(txp);
|
||||
else
|
||||
brcmf_txfinalize(ifp, txp, success);
|
||||
}
|
||||
}
|
||||
|
||||
static void
|
||||
brcmf_proto_bcdc_configure_addr_mode(struct brcmf_pub *drvr, int ifidx,
|
||||
enum proto_addr_mode addr_mode)
|
||||
@@ -369,6 +399,30 @@ static void brcmf_proto_bcdc_rxreorder(struct brcmf_if *ifp,
|
||||
brcmf_fws_rxreorder(ifp, skb);
|
||||
}
|
||||
|
||||
static void
|
||||
brcmf_proto_bcdc_add_if(struct brcmf_if *ifp)
|
||||
{
|
||||
brcmf_fws_add_interface(ifp);
|
||||
}
|
||||
|
||||
static void
|
||||
brcmf_proto_bcdc_del_if(struct brcmf_if *ifp)
|
||||
{
|
||||
brcmf_fws_del_interface(ifp);
|
||||
}
|
||||
|
||||
static void
|
||||
brcmf_proto_bcdc_reset_if(struct brcmf_if *ifp)
|
||||
{
|
||||
brcmf_fws_reset_interface(ifp);
|
||||
}
|
||||
|
||||
static int
|
||||
brcmf_proto_bcdc_init_done(struct brcmf_pub *drvr)
|
||||
{
|
||||
return brcmf_fws_init(drvr);
|
||||
}
|
||||
|
||||
int brcmf_proto_bcdc_attach(struct brcmf_pub *drvr)
|
||||
{
|
||||
struct brcmf_bcdc *bcdc;
|
||||
@@ -392,6 +446,10 @@ int brcmf_proto_bcdc_attach(struct brcmf_pub *drvr)
|
||||
drvr->proto->delete_peer = brcmf_proto_bcdc_delete_peer;
|
||||
drvr->proto->add_tdls_peer = brcmf_proto_bcdc_add_tdls_peer;
|
||||
drvr->proto->rxreorder = brcmf_proto_bcdc_rxreorder;
|
||||
drvr->proto->add_if = brcmf_proto_bcdc_add_if;
|
||||
drvr->proto->del_if = brcmf_proto_bcdc_del_if;
|
||||
drvr->proto->reset_if = brcmf_proto_bcdc_reset_if;
|
||||
drvr->proto->init_done = brcmf_proto_bcdc_init_done;
|
||||
drvr->proto->pd = bcdc;
|
||||
|
||||
drvr->hdrlen += BCDC_HEADER_LEN + BRCMF_PROT_FW_SIGNAL_MAX_TXBYTES;
|
||||
@@ -406,6 +464,7 @@ fail:
|
||||
|
||||
void brcmf_proto_bcdc_detach(struct brcmf_pub *drvr)
|
||||
{
|
||||
brcmf_fws_deinit(drvr);
|
||||
kfree(drvr->proto->pd);
|
||||
drvr->proto->pd = NULL;
|
||||
}
|
||||
|
@@ -19,6 +19,9 @@
|
||||
#ifdef CONFIG_BRCMFMAC_PROTO_BCDC
|
||||
int brcmf_proto_bcdc_attach(struct brcmf_pub *drvr);
|
||||
void brcmf_proto_bcdc_detach(struct brcmf_pub *drvr);
|
||||
void brcmf_proto_bcdc_txflowblock(struct device *dev, bool state);
|
||||
void brcmf_proto_bcdc_txcomplete(struct device *dev, struct sk_buff *txp,
|
||||
bool success);
|
||||
#else
|
||||
static inline int brcmf_proto_bcdc_attach(struct brcmf_pub *drvr) { return 0; }
|
||||
static inline void brcmf_proto_bcdc_detach(struct brcmf_pub *drvr) {}
|
||||
|
@@ -229,11 +229,6 @@ int brcmf_attach(struct device *dev, struct brcmf_mp_device *settings);
|
||||
void brcmf_detach(struct device *dev);
|
||||
/* Indication from bus module that dongle should be reset */
|
||||
void brcmf_dev_reset(struct device *dev);
|
||||
/* Indication from bus module to change flow-control state */
|
||||
void brcmf_txflowblock(struct device *dev, bool state);
|
||||
|
||||
/* Notify the bus has transferred the tx packet to firmware */
|
||||
void brcmf_txcomplete(struct device *dev, struct sk_buff *txp, bool success);
|
||||
|
||||
/* Configure the "global" bus state used by upper layers */
|
||||
void brcmf_bus_change_state(struct brcmf_bus *bus, enum brcmf_bus_state state);
|
||||
|
@@ -3097,6 +3097,9 @@ brcmf_cfg80211_escan_handler(struct brcmf_if *ifp,
|
||||
|
||||
status = e->status;
|
||||
|
||||
if (status == BRCMF_E_STATUS_ABORT)
|
||||
goto exit;
|
||||
|
||||
if (!test_bit(BRCMF_SCAN_STATUS_BUSY, &cfg->scan_status)) {
|
||||
brcmf_err("scan not ready, bsscfgidx=%d\n", ifp->bsscfgidx);
|
||||
return -EPERM;
|
||||
@@ -6450,7 +6453,8 @@ static int brcmf_setup_wiphy(struct wiphy *wiphy, struct brcmf_if *ifp)
|
||||
BIT(NL80211_BSS_SELECT_ATTR_BAND_PREF) |
|
||||
BIT(NL80211_BSS_SELECT_ATTR_RSSI_ADJUST);
|
||||
|
||||
wiphy->flags |= WIPHY_FLAG_PS_ON_BY_DEFAULT |
|
||||
wiphy->flags |= WIPHY_FLAG_NETNS_OK |
|
||||
WIPHY_FLAG_PS_ON_BY_DEFAULT |
|
||||
WIPHY_FLAG_OFFCHAN_TX |
|
||||
WIPHY_FLAG_HAS_REMAIN_ON_CHANNEL;
|
||||
if (brcmf_feat_is_enabled(ifp, BRCMF_FEAT_TDLS))
|
||||
@@ -6736,6 +6740,10 @@ static void brcmf_cfg80211_reg_notifier(struct wiphy *wiphy,
|
||||
s32 err;
|
||||
int i;
|
||||
|
||||
/* The country code gets set to "00" by default at boot, ignore */
|
||||
if (req->alpha2[0] == '0' && req->alpha2[1] == '0')
|
||||
return;
|
||||
|
||||
/* ignore non-ISO3166 country codes */
|
||||
for (i = 0; i < sizeof(req->alpha2); i++)
|
||||
if (req->alpha2[i] < 'A' || req->alpha2[i] > 'Z') {
|
||||
|
@@ -161,7 +161,7 @@ int brcmf_c_preinit_dcmds(struct brcmf_if *ifp)
|
||||
strsep(&ptr, "\n");
|
||||
|
||||
/* Print fw version info */
|
||||
brcmf_err("Firmware version = %s\n", buf);
|
||||
brcmf_info("Firmware version = %s\n", buf);
|
||||
|
||||
/* locate firmware version number for ethtool */
|
||||
ptr = strrchr(buf, ' ') + 1;
|
||||
|
@@ -32,7 +32,6 @@
|
||||
#include "p2p.h"
|
||||
#include "cfg80211.h"
|
||||
#include "fwil.h"
|
||||
#include "fwsignal.h"
|
||||
#include "feature.h"
|
||||
#include "proto.h"
|
||||
#include "pcie.h"
|
||||
@@ -283,16 +282,6 @@ void brcmf_txflowblock_if(struct brcmf_if *ifp,
|
||||
spin_unlock_irqrestore(&ifp->netif_stop_lock, flags);
|
||||
}
|
||||
|
||||
void brcmf_txflowblock(struct device *dev, bool state)
|
||||
{
|
||||
struct brcmf_bus *bus_if = dev_get_drvdata(dev);
|
||||
struct brcmf_pub *drvr = bus_if->drvr;
|
||||
|
||||
brcmf_dbg(TRACE, "Enter\n");
|
||||
|
||||
brcmf_fws_bus_blocked(drvr, state);
|
||||
}
|
||||
|
||||
void brcmf_netif_rx(struct brcmf_if *ifp, struct sk_buff *skb)
|
||||
{
|
||||
if (skb->pkt_type == PACKET_MULTICAST)
|
||||
@@ -393,24 +382,6 @@ void brcmf_txfinalize(struct brcmf_if *ifp, struct sk_buff *txp, bool success)
|
||||
brcmu_pkt_buf_free_skb(txp);
|
||||
}
|
||||
|
||||
void brcmf_txcomplete(struct device *dev, struct sk_buff *txp, bool success)
|
||||
{
|
||||
struct brcmf_bus *bus_if = dev_get_drvdata(dev);
|
||||
struct brcmf_pub *drvr = bus_if->drvr;
|
||||
struct brcmf_if *ifp;
|
||||
|
||||
/* await txstatus signal for firmware if active */
|
||||
if (brcmf_fws_fc_active(drvr->fws)) {
|
||||
if (!success)
|
||||
brcmf_fws_bustxfail(drvr->fws, txp);
|
||||
} else {
|
||||
if (brcmf_proto_hdrpull(drvr, false, txp, &ifp))
|
||||
brcmu_pkt_buf_free_skb(txp);
|
||||
else
|
||||
brcmf_txfinalize(ifp, txp, success);
|
||||
}
|
||||
}
|
||||
|
||||
static void brcmf_ethtool_get_drvinfo(struct net_device *ndev,
|
||||
struct ethtool_drvinfo *info)
|
||||
{
|
||||
@@ -504,8 +475,9 @@ int brcmf_net_attach(struct brcmf_if *ifp, bool rtnl_locked)
|
||||
ndev->needed_headroom += drvr->hdrlen;
|
||||
ndev->ethtool_ops = &brcmf_ethtool_ops;
|
||||
|
||||
/* set the mac address */
|
||||
/* set the mac address & netns */
|
||||
memcpy(ndev->dev_addr, ifp->mac_addr, ETH_ALEN);
|
||||
dev_net_set(ndev, wiphy_net(cfg_to_wiphy(drvr->config)));
|
||||
|
||||
INIT_WORK(&ifp->multicast_work, _brcmf_set_multicast_list);
|
||||
INIT_WORK(&ifp->ndoffload_work, _brcmf_update_ndtable);
|
||||
@@ -734,10 +706,28 @@ void brcmf_remove_interface(struct brcmf_if *ifp, bool rtnl_locked)
|
||||
return;
|
||||
brcmf_dbg(TRACE, "Enter, bsscfgidx=%d, ifidx=%d\n", ifp->bsscfgidx,
|
||||
ifp->ifidx);
|
||||
brcmf_fws_del_interface(ifp);
|
||||
brcmf_proto_del_if(ifp->drvr, ifp);
|
||||
brcmf_del_if(ifp->drvr, ifp->bsscfgidx, rtnl_locked);
|
||||
}
|
||||
|
||||
static int brcmf_psm_watchdog_notify(struct brcmf_if *ifp,
|
||||
const struct brcmf_event_msg *evtmsg,
|
||||
void *data)
|
||||
{
|
||||
int err;
|
||||
|
||||
brcmf_dbg(TRACE, "enter: bsscfgidx=%d\n", ifp->bsscfgidx);
|
||||
|
||||
brcmf_err("PSM's watchdog has fired!\n");
|
||||
|
||||
err = brcmf_debug_create_memdump(ifp->drvr->bus_if, data,
|
||||
evtmsg->datalen);
|
||||
if (err)
|
||||
brcmf_err("Failed to get memory dump, %d\n", err);
|
||||
|
||||
return err;
|
||||
}
|
||||
|
||||
#ifdef CONFIG_INET
|
||||
#define ARPOL_MAX_ENTRIES 8
|
||||
static int brcmf_inetaddr_changed(struct notifier_block *nb,
|
||||
@@ -917,6 +907,10 @@ int brcmf_attach(struct device *dev, struct brcmf_mp_device *settings)
|
||||
goto fail;
|
||||
}
|
||||
|
||||
/* Attach to events important for core code */
|
||||
brcmf_fweh_register(drvr, BRCMF_E_PSM_WATCHDOG,
|
||||
brcmf_psm_watchdog_notify);
|
||||
|
||||
/* attach firmware event handler */
|
||||
brcmf_fweh_attach(drvr);
|
||||
|
||||
@@ -992,11 +986,11 @@ int brcmf_bus_started(struct device *dev)
|
||||
}
|
||||
brcmf_feat_attach(drvr);
|
||||
|
||||
ret = brcmf_fws_init(drvr);
|
||||
ret = brcmf_proto_init_done(drvr);
|
||||
if (ret < 0)
|
||||
goto fail;
|
||||
|
||||
brcmf_fws_add_interface(ifp);
|
||||
brcmf_proto_add_if(drvr, ifp);
|
||||
|
||||
drvr->config = brcmf_cfg80211_attach(drvr, bus_if->dev,
|
||||
drvr->settings->p2p_enable);
|
||||
@@ -1040,10 +1034,6 @@ fail:
|
||||
brcmf_cfg80211_detach(drvr->config);
|
||||
drvr->config = NULL;
|
||||
}
|
||||
if (drvr->fws) {
|
||||
brcmf_fws_del_interface(ifp);
|
||||
brcmf_fws_deinit(drvr);
|
||||
}
|
||||
brcmf_net_detach(ifp->ndev, false);
|
||||
if (p2p_ifp)
|
||||
brcmf_net_detach(p2p_ifp->ndev, false);
|
||||
@@ -1109,8 +1099,6 @@ void brcmf_detach(struct device *dev)
|
||||
|
||||
brcmf_cfg80211_detach(drvr->config);
|
||||
|
||||
brcmf_fws_deinit(drvr);
|
||||
|
||||
brcmf_bus_stop(drvr->bus_if);
|
||||
|
||||
brcmf_proto_detach(drvr);
|
||||
|
@@ -27,8 +27,8 @@
|
||||
|
||||
static struct dentry *root_folder;
|
||||
|
||||
static int brcmf_debug_create_memdump(struct brcmf_bus *bus, const void *data,
|
||||
size_t len)
|
||||
int brcmf_debug_create_memdump(struct brcmf_bus *bus, const void *data,
|
||||
size_t len)
|
||||
{
|
||||
void *dump;
|
||||
size_t ramsize;
|
||||
@@ -54,24 +54,6 @@ static int brcmf_debug_create_memdump(struct brcmf_bus *bus, const void *data,
|
||||
return 0;
|
||||
}
|
||||
|
||||
static int brcmf_debug_psm_watchdog_notify(struct brcmf_if *ifp,
|
||||
const struct brcmf_event_msg *evtmsg,
|
||||
void *data)
|
||||
{
|
||||
int err;
|
||||
|
||||
brcmf_dbg(TRACE, "enter: bsscfgidx=%d\n", ifp->bsscfgidx);
|
||||
|
||||
brcmf_err("PSM's watchdog has fired!\n");
|
||||
|
||||
err = brcmf_debug_create_memdump(ifp->drvr->bus_if, data,
|
||||
evtmsg->datalen);
|
||||
if (err)
|
||||
brcmf_err("Failed to get memory dump, %d\n", err);
|
||||
|
||||
return err;
|
||||
}
|
||||
|
||||
void brcmf_debugfs_init(void)
|
||||
{
|
||||
root_folder = debugfs_create_dir(KBUILD_MODNAME, NULL);
|
||||
@@ -99,9 +81,7 @@ int brcmf_debug_attach(struct brcmf_pub *drvr)
|
||||
if (IS_ERR(drvr->dbgfs_dir))
|
||||
return PTR_ERR(drvr->dbgfs_dir);
|
||||
|
||||
|
||||
return brcmf_fweh_register(drvr, BRCMF_E_PSM_WATCHDOG,
|
||||
brcmf_debug_psm_watchdog_notify);
|
||||
return 0;
|
||||
}
|
||||
|
||||
void brcmf_debug_detach(struct brcmf_pub *drvr)
|
||||
|
@@ -59,6 +59,10 @@ void __brcmf_err(const char *func, const char *fmt, ...);
|
||||
} while (0)
|
||||
|
||||
#if defined(DEBUG) || defined(CONFIG_BRCM_TRACING)
|
||||
|
||||
/* For debug/tracing purposes treat info messages as errors */
|
||||
#define brcmf_info brcmf_err
|
||||
|
||||
__printf(3, 4)
|
||||
void __brcmf_dbg(u32 level, const char *func, const char *fmt, ...);
|
||||
#define brcmf_dbg(level, fmt, ...) \
|
||||
@@ -77,6 +81,11 @@ do { \
|
||||
|
||||
#else /* defined(DEBUG) || defined(CONFIG_BRCM_TRACING) */
|
||||
|
||||
#define brcmf_info(fmt, ...) \
|
||||
do { \
|
||||
pr_info("%s: " fmt, __func__, ##__VA_ARGS__); \
|
||||
} while (0)
|
||||
|
||||
#define brcmf_dbg(level, fmt, ...) no_printk(fmt, ##__VA_ARGS__)
|
||||
|
||||
#define BRCMF_DATA_ON() 0
|
||||
@@ -99,6 +108,7 @@ do { \
|
||||
|
||||
extern int brcmf_msg_level;
|
||||
|
||||
struct brcmf_bus;
|
||||
struct brcmf_pub;
|
||||
#ifdef DEBUG
|
||||
void brcmf_debugfs_init(void);
|
||||
@@ -108,6 +118,8 @@ void brcmf_debug_detach(struct brcmf_pub *drvr);
|
||||
struct dentry *brcmf_debugfs_get_devdir(struct brcmf_pub *drvr);
|
||||
int brcmf_debugfs_add_entry(struct brcmf_pub *drvr, const char *fn,
|
||||
int (*read_fn)(struct seq_file *seq, void *data));
|
||||
int brcmf_debug_create_memdump(struct brcmf_bus *bus, const void *data,
|
||||
size_t len);
|
||||
#else
|
||||
static inline void brcmf_debugfs_init(void)
|
||||
{
|
||||
@@ -128,6 +140,12 @@ int brcmf_debugfs_add_entry(struct brcmf_pub *drvr, const char *fn,
|
||||
{
|
||||
return 0;
|
||||
}
|
||||
static inline
|
||||
int brcmf_debug_create_memdump(struct brcmf_bus *bus, const void *data,
|
||||
size_t len)
|
||||
{
|
||||
return 0;
|
||||
}
|
||||
#endif
|
||||
|
||||
#endif /* BRCMFMAC_DEBUG_H */
|
||||
|
@@ -22,9 +22,9 @@
|
||||
#include "core.h"
|
||||
#include "debug.h"
|
||||
#include "tracepoint.h"
|
||||
#include "fwsignal.h"
|
||||
#include "fweh.h"
|
||||
#include "fwil.h"
|
||||
#include "proto.h"
|
||||
|
||||
/**
|
||||
* struct brcmf_fweh_queue_item - event item on event queue.
|
||||
@@ -172,14 +172,14 @@ static void brcmf_fweh_handle_if_event(struct brcmf_pub *drvr,
|
||||
if (IS_ERR(ifp))
|
||||
return;
|
||||
if (!is_p2pdev)
|
||||
brcmf_fws_add_interface(ifp);
|
||||
brcmf_proto_add_if(drvr, ifp);
|
||||
if (!drvr->fweh.evt_handler[BRCMF_E_IF])
|
||||
if (brcmf_net_attach(ifp, false) < 0)
|
||||
return;
|
||||
}
|
||||
|
||||
if (ifp && ifevent->action == BRCMF_E_IF_CHANGE)
|
||||
brcmf_fws_reset_interface(ifp);
|
||||
brcmf_proto_reset_if(drvr, ifp);
|
||||
|
||||
err = brcmf_fweh_call_event_handler(ifp, emsg->event_code, emsg, data);
|
||||
|
||||
|
@@ -1877,6 +1877,7 @@ static int brcmf_pcie_pm_enter_D3(struct device *dev)
|
||||
BRCMF_PCIE_MBDATA_TIMEOUT);
|
||||
if (!devinfo->mbdata_completed) {
|
||||
brcmf_err("Timeout on response for entering D3 substate\n");
|
||||
brcmf_bus_change_state(bus, BRCMF_BUS_UP);
|
||||
return -EIO;
|
||||
}
|
||||
|
||||
|
@@ -182,7 +182,6 @@ int brcmf_pno_clean(struct brcmf_if *ifp)
|
||||
int brcmf_pno_start_sched_scan(struct brcmf_if *ifp,
|
||||
struct cfg80211_sched_scan_request *req)
|
||||
{
|
||||
struct brcmu_d11inf *d11inf;
|
||||
struct brcmf_pno_config_le pno_cfg;
|
||||
struct cfg80211_ssid *ssid;
|
||||
u16 chan;
|
||||
@@ -209,7 +208,6 @@ int brcmf_pno_start_sched_scan(struct brcmf_if *ifp,
|
||||
}
|
||||
|
||||
/* configure channels to use */
|
||||
d11inf = &ifp->drvr->config->d11inf;
|
||||
for (i = 0; i < req->n_channels; i++) {
|
||||
chan = req->channels[i]->hw_value;
|
||||
pno_cfg.channel_list[i] = cpu_to_le16(chan);
|
||||
|
@@ -44,6 +44,10 @@ struct brcmf_proto {
|
||||
void (*add_tdls_peer)(struct brcmf_pub *drvr, int ifidx,
|
||||
u8 peer[ETH_ALEN]);
|
||||
void (*rxreorder)(struct brcmf_if *ifp, struct sk_buff *skb);
|
||||
void (*add_if)(struct brcmf_if *ifp);
|
||||
void (*del_if)(struct brcmf_if *ifp);
|
||||
void (*reset_if)(struct brcmf_if *ifp);
|
||||
int (*init_done)(struct brcmf_pub *drvr);
|
||||
void *pd;
|
||||
};
|
||||
|
||||
@@ -118,4 +122,36 @@ brcmf_proto_rxreorder(struct brcmf_if *ifp, struct sk_buff *skb)
|
||||
ifp->drvr->proto->rxreorder(ifp, skb);
|
||||
}
|
||||
|
||||
static inline void
|
||||
brcmf_proto_add_if(struct brcmf_pub *drvr, struct brcmf_if *ifp)
|
||||
{
|
||||
if (!drvr->proto->add_if)
|
||||
return;
|
||||
drvr->proto->add_if(ifp);
|
||||
}
|
||||
|
||||
static inline void
|
||||
brcmf_proto_del_if(struct brcmf_pub *drvr, struct brcmf_if *ifp)
|
||||
{
|
||||
if (!drvr->proto->del_if)
|
||||
return;
|
||||
drvr->proto->del_if(ifp);
|
||||
}
|
||||
|
||||
static inline void
|
||||
brcmf_proto_reset_if(struct brcmf_pub *drvr, struct brcmf_if *ifp)
|
||||
{
|
||||
if (!drvr->proto->reset_if)
|
||||
return;
|
||||
drvr->proto->reset_if(ifp);
|
||||
}
|
||||
|
||||
static inline int
|
||||
brcmf_proto_init_done(struct brcmf_pub *drvr)
|
||||
{
|
||||
if (!drvr->proto->init_done)
|
||||
return 0;
|
||||
return drvr->proto->init_done(drvr);
|
||||
}
|
||||
|
||||
#endif /* BRCMFMAC_PROTO_H */
|
||||
|
@@ -44,6 +44,7 @@
|
||||
#include "firmware.h"
|
||||
#include "core.h"
|
||||
#include "common.h"
|
||||
#include "bcdc.h"
|
||||
|
||||
#define DCMD_RESP_TIMEOUT msecs_to_jiffies(2500)
|
||||
#define CTL_DONE_TIMEOUT msecs_to_jiffies(2500)
|
||||
@@ -2265,7 +2266,8 @@ done:
|
||||
bus->tx_seq = (bus->tx_seq + pktq->qlen) % SDPCM_SEQ_WRAP;
|
||||
skb_queue_walk_safe(pktq, pkt_next, tmp) {
|
||||
__skb_unlink(pkt_next, pktq);
|
||||
brcmf_txcomplete(bus->sdiodev->dev, pkt_next, ret == 0);
|
||||
brcmf_proto_bcdc_txcomplete(bus->sdiodev->dev, pkt_next,
|
||||
ret == 0);
|
||||
}
|
||||
return ret;
|
||||
}
|
||||
@@ -2328,7 +2330,7 @@ static uint brcmf_sdio_sendfromq(struct brcmf_sdio *bus, uint maxframes)
|
||||
if ((bus->sdiodev->state == BRCMF_SDIOD_DATA) &&
|
||||
bus->txoff && (pktq_len(&bus->txq) < TXLOW)) {
|
||||
bus->txoff = false;
|
||||
brcmf_txflowblock(bus->sdiodev->dev, false);
|
||||
brcmf_proto_bcdc_txflowblock(bus->sdiodev->dev, false);
|
||||
}
|
||||
|
||||
return cnt;
|
||||
@@ -2753,7 +2755,7 @@ static int brcmf_sdio_bus_txdata(struct device *dev, struct sk_buff *pkt)
|
||||
|
||||
if (pktq_len(&bus->txq) >= TXHI) {
|
||||
bus->txoff = true;
|
||||
brcmf_txflowblock(dev, true);
|
||||
brcmf_proto_bcdc_txflowblock(dev, true);
|
||||
}
|
||||
spin_unlock_bh(&bus->txq_lock);
|
||||
|
||||
|
@@ -29,6 +29,7 @@
|
||||
#include "usb.h"
|
||||
#include "core.h"
|
||||
#include "common.h"
|
||||
#include "bcdc.h"
|
||||
|
||||
|
||||
#define IOCTL_RESP_TIMEOUT msecs_to_jiffies(2000)
|
||||
@@ -482,13 +483,13 @@ static void brcmf_usb_tx_complete(struct urb *urb)
|
||||
req->skb);
|
||||
brcmf_usb_del_fromq(devinfo, req);
|
||||
|
||||
brcmf_txcomplete(devinfo->dev, req->skb, urb->status == 0);
|
||||
brcmf_proto_bcdc_txcomplete(devinfo->dev, req->skb, urb->status == 0);
|
||||
req->skb = NULL;
|
||||
brcmf_usb_enq(devinfo, &devinfo->tx_freeq, req, &devinfo->tx_freecount);
|
||||
spin_lock_irqsave(&devinfo->tx_flowblock_lock, flags);
|
||||
if (devinfo->tx_freecount > devinfo->tx_high_watermark &&
|
||||
devinfo->tx_flowblock) {
|
||||
brcmf_txflowblock(devinfo->dev, false);
|
||||
brcmf_proto_bcdc_txflowblock(devinfo->dev, false);
|
||||
devinfo->tx_flowblock = false;
|
||||
}
|
||||
spin_unlock_irqrestore(&devinfo->tx_flowblock_lock, flags);
|
||||
@@ -635,7 +636,7 @@ static int brcmf_usb_tx(struct device *dev, struct sk_buff *skb)
|
||||
spin_lock_irqsave(&devinfo->tx_flowblock_lock, flags);
|
||||
if (devinfo->tx_freecount < devinfo->tx_low_watermark &&
|
||||
!devinfo->tx_flowblock) {
|
||||
brcmf_txflowblock(dev, true);
|
||||
brcmf_proto_bcdc_txflowblock(dev, true);
|
||||
devinfo->tx_flowblock = true;
|
||||
}
|
||||
spin_unlock_irqrestore(&devinfo->tx_flowblock_lock, flags);
|
||||
|
Reference in New Issue
Block a user