Merge tag 'wireless-drivers-next-for-davem-2016-11-25' of git://git.kernel.org/pub/scm/linux/kernel/git/kvalo/wireless-drivers-next
Kalle Valo says: ==================== wireless-drivers-next patches for 4.10 Major changes: iwlwifi * finalize and enable dynamic queue allocation * use dev_coredumpmsg() to prevent locking the driver * small fix to pass the AID to the FW * use FW PS decisions with multi-queue ath9k * add device tree bindings * switch to use mac80211 intermediate software queues to reduce latency and fix bufferbloat wl18xx * allow scanning in AP mode ==================== Signed-off-by: David S. Miller <davem@davemloft.net>
This commit is contained in:
@@ -326,6 +326,17 @@ brcmf_proto_bcdc_hdrpull(struct brcmf_pub *drvr, bool do_fws,
|
||||
return 0;
|
||||
}
|
||||
|
||||
static int brcmf_proto_bcdc_tx_queue_data(struct brcmf_pub *drvr, int ifidx,
|
||||
struct sk_buff *skb)
|
||||
{
|
||||
struct brcmf_if *ifp = brcmf_get_ifp(drvr, ifidx);
|
||||
|
||||
if (!brcmf_fws_queue_skbs(drvr->fws))
|
||||
return brcmf_proto_txdata(drvr, ifidx, 0, skb);
|
||||
|
||||
return brcmf_fws_process_skb(ifp, skb);
|
||||
}
|
||||
|
||||
static int
|
||||
brcmf_proto_bcdc_txdata(struct brcmf_pub *drvr, int ifidx, u8 offset,
|
||||
struct sk_buff *pktbuf)
|
||||
@@ -375,6 +386,7 @@ int brcmf_proto_bcdc_attach(struct brcmf_pub *drvr)
|
||||
drvr->proto->hdrpull = brcmf_proto_bcdc_hdrpull;
|
||||
drvr->proto->query_dcmd = brcmf_proto_bcdc_query_dcmd;
|
||||
drvr->proto->set_dcmd = brcmf_proto_bcdc_set_dcmd;
|
||||
drvr->proto->tx_queue_data = brcmf_proto_bcdc_tx_queue_data;
|
||||
drvr->proto->txdata = brcmf_proto_bcdc_txdata;
|
||||
drvr->proto->configure_addr_mode = brcmf_proto_bcdc_configure_addr_mode;
|
||||
drvr->proto->delete_peer = brcmf_proto_bcdc_delete_peer;
|
||||
|
@@ -4580,8 +4580,6 @@ brcmf_cfg80211_start_ap(struct wiphy *wiphy, struct net_device *ndev,
|
||||
brcmf_configure_opensecurity(ifp);
|
||||
}
|
||||
|
||||
brcmf_config_ap_mgmt_ie(ifp->vif, &settings->beacon);
|
||||
|
||||
/* Parameters shared by all radio interfaces */
|
||||
if (!mbss) {
|
||||
if ((supports_11d) && (is_11d != ifp->vif->is_11d)) {
|
||||
@@ -4710,6 +4708,7 @@ brcmf_cfg80211_start_ap(struct wiphy *wiphy, struct net_device *ndev,
|
||||
WARN_ON(1);
|
||||
}
|
||||
|
||||
brcmf_config_ap_mgmt_ie(ifp->vif, &settings->beacon);
|
||||
set_bit(BRCMF_VIF_STATUS_AP_CREATED, &ifp->vif->sme_state);
|
||||
brcmf_net_setcarrier(ifp, true);
|
||||
|
||||
@@ -4766,6 +4765,8 @@ static int brcmf_cfg80211_stop_ap(struct wiphy *wiphy, struct net_device *ndev)
|
||||
err = brcmf_fil_cmd_int_set(ifp, BRCMF_C_UP, 1);
|
||||
if (err < 0)
|
||||
brcmf_err("BRCMF_C_UP error %d\n", err);
|
||||
|
||||
brcmf_vif_clear_mgmt_ies(ifp->vif);
|
||||
} else {
|
||||
bss_enable.bsscfgidx = cpu_to_le32(ifp->bsscfgidx);
|
||||
bss_enable.enable = cpu_to_le32(0);
|
||||
@@ -5508,7 +5509,8 @@ brcmf_notify_connect_status_ap(struct brcmf_cfg80211_info *cfg,
|
||||
u32 reason = e->reason;
|
||||
struct station_info sinfo;
|
||||
|
||||
brcmf_dbg(CONN, "event %d, reason %d\n", event, reason);
|
||||
brcmf_dbg(CONN, "event %s (%u), reason %d\n",
|
||||
brcmf_fweh_event_name(event), event, reason);
|
||||
if (event == BRCMF_E_LINK && reason == BRCMF_E_REASON_LINK_BSSCFG_DIS &&
|
||||
ndev != cfg_to_ndev(cfg)) {
|
||||
brcmf_dbg(CONN, "AP mode link down\n");
|
||||
|
@@ -239,7 +239,13 @@ static netdev_tx_t brcmf_netdev_start_xmit(struct sk_buff *skb,
|
||||
if (eh->h_proto == htons(ETH_P_PAE))
|
||||
atomic_inc(&ifp->pend_8021x_cnt);
|
||||
|
||||
ret = brcmf_fws_process_skb(ifp, skb);
|
||||
/* determine the priority */
|
||||
if ((skb->priority == 0) || (skb->priority > 7))
|
||||
skb->priority = cfg80211_classify8021d(skb, NULL);
|
||||
|
||||
ret = brcmf_proto_tx_queue_data(drvr, ifp->ifidx, skb);
|
||||
if (ret < 0)
|
||||
brcmf_txfinalize(ifp, skb, false);
|
||||
|
||||
done:
|
||||
if (ret) {
|
||||
|
@@ -69,7 +69,7 @@ static struct brcmf_fweh_event_name fweh_event_names[] = {
|
||||
*
|
||||
* @code: code to lookup.
|
||||
*/
|
||||
static const char *brcmf_fweh_event_name(enum brcmf_fweh_event_code code)
|
||||
const char *brcmf_fweh_event_name(enum brcmf_fweh_event_code code)
|
||||
{
|
||||
int i;
|
||||
for (i = 0; i < ARRAY_SIZE(fweh_event_names); i++) {
|
||||
@@ -79,7 +79,7 @@ static const char *brcmf_fweh_event_name(enum brcmf_fweh_event_code code)
|
||||
return "unknown";
|
||||
}
|
||||
#else
|
||||
static const char *brcmf_fweh_event_name(enum brcmf_fweh_event_code code)
|
||||
const char *brcmf_fweh_event_name(enum brcmf_fweh_event_code code)
|
||||
{
|
||||
return "nodebug";
|
||||
}
|
||||
|
@@ -287,6 +287,8 @@ struct brcmf_fweh_info {
|
||||
void *data);
|
||||
};
|
||||
|
||||
const char *brcmf_fweh_event_name(enum brcmf_fweh_event_code code);
|
||||
|
||||
void brcmf_fweh_attach(struct brcmf_pub *drvr);
|
||||
void brcmf_fweh_detach(struct brcmf_pub *drvr);
|
||||
int brcmf_fweh_register(struct brcmf_pub *drvr, enum brcmf_fweh_event_code code,
|
||||
|
@@ -2100,16 +2100,6 @@ int brcmf_fws_process_skb(struct brcmf_if *ifp, struct sk_buff *skb)
|
||||
int rc = 0;
|
||||
|
||||
brcmf_dbg(DATA, "tx proto=0x%X\n", ntohs(eh->h_proto));
|
||||
/* determine the priority */
|
||||
if ((skb->priority == 0) || (skb->priority > 7))
|
||||
skb->priority = cfg80211_classify8021d(skb, NULL);
|
||||
|
||||
if (fws->avoid_queueing) {
|
||||
rc = brcmf_proto_txdata(drvr, ifp->ifidx, 0, skb);
|
||||
if (rc < 0)
|
||||
brcmf_txfinalize(ifp, skb, false);
|
||||
return rc;
|
||||
}
|
||||
|
||||
/* set control buffer information */
|
||||
skcb->if_flags = 0;
|
||||
@@ -2442,6 +2432,11 @@ void brcmf_fws_deinit(struct brcmf_pub *drvr)
|
||||
kfree(fws);
|
||||
}
|
||||
|
||||
bool brcmf_fws_queue_skbs(struct brcmf_fws_info *fws)
|
||||
{
|
||||
return !fws->avoid_queueing;
|
||||
}
|
||||
|
||||
bool brcmf_fws_fc_active(struct brcmf_fws_info *fws)
|
||||
{
|
||||
if (!fws->creditmap_received)
|
||||
|
@@ -20,6 +20,7 @@
|
||||
|
||||
int brcmf_fws_init(struct brcmf_pub *drvr);
|
||||
void brcmf_fws_deinit(struct brcmf_pub *drvr);
|
||||
bool brcmf_fws_queue_skbs(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);
|
||||
int brcmf_fws_process_skb(struct brcmf_if *ifp, struct sk_buff *skb);
|
||||
|
@@ -782,8 +782,8 @@ static int brcmf_msgbuf_schedule_txdata(struct brcmf_msgbuf *msgbuf, u32 flowid,
|
||||
}
|
||||
|
||||
|
||||
static int brcmf_msgbuf_txdata(struct brcmf_pub *drvr, int ifidx,
|
||||
u8 offset, struct sk_buff *skb)
|
||||
static int brcmf_msgbuf_tx_queue_data(struct brcmf_pub *drvr, int ifidx,
|
||||
struct sk_buff *skb)
|
||||
{
|
||||
struct brcmf_msgbuf *msgbuf = (struct brcmf_msgbuf *)drvr->proto->pd;
|
||||
struct brcmf_flowring *flow = msgbuf->flow;
|
||||
@@ -1467,7 +1467,7 @@ int brcmf_proto_msgbuf_attach(struct brcmf_pub *drvr)
|
||||
drvr->proto->hdrpull = brcmf_msgbuf_hdrpull;
|
||||
drvr->proto->query_dcmd = brcmf_msgbuf_query_dcmd;
|
||||
drvr->proto->set_dcmd = brcmf_msgbuf_set_dcmd;
|
||||
drvr->proto->txdata = brcmf_msgbuf_txdata;
|
||||
drvr->proto->tx_queue_data = brcmf_msgbuf_tx_queue_data;
|
||||
drvr->proto->configure_addr_mode = brcmf_msgbuf_configure_addr_mode;
|
||||
drvr->proto->delete_peer = brcmf_msgbuf_delete_peer;
|
||||
drvr->proto->add_tdls_peer = brcmf_msgbuf_add_tdls_peer;
|
||||
|
@@ -51,7 +51,7 @@ int brcmf_proto_attach(struct brcmf_pub *drvr)
|
||||
drvr->bus_if->proto_type);
|
||||
goto fail;
|
||||
}
|
||||
if ((proto->txdata == NULL) || (proto->hdrpull == NULL) ||
|
||||
if (!proto->tx_queue_data || (proto->hdrpull == NULL) ||
|
||||
(proto->query_dcmd == NULL) || (proto->set_dcmd == NULL) ||
|
||||
(proto->configure_addr_mode == NULL) ||
|
||||
(proto->delete_peer == NULL) || (proto->add_tdls_peer == NULL)) {
|
||||
|
@@ -33,6 +33,8 @@ struct brcmf_proto {
|
||||
void *buf, uint len);
|
||||
int (*set_dcmd)(struct brcmf_pub *drvr, int ifidx, uint cmd, void *buf,
|
||||
uint len);
|
||||
int (*tx_queue_data)(struct brcmf_pub *drvr, int ifidx,
|
||||
struct sk_buff *skb);
|
||||
int (*txdata)(struct brcmf_pub *drvr, int ifidx, u8 offset,
|
||||
struct sk_buff *skb);
|
||||
void (*configure_addr_mode)(struct brcmf_pub *drvr, int ifidx,
|
||||
@@ -74,6 +76,13 @@ static inline int brcmf_proto_set_dcmd(struct brcmf_pub *drvr, int ifidx,
|
||||
{
|
||||
return drvr->proto->set_dcmd(drvr, ifidx, cmd, buf, len);
|
||||
}
|
||||
|
||||
static inline int brcmf_proto_tx_queue_data(struct brcmf_pub *drvr, int ifidx,
|
||||
struct sk_buff *skb)
|
||||
{
|
||||
return drvr->proto->tx_queue_data(drvr, ifidx, skb);
|
||||
}
|
||||
|
||||
static inline int brcmf_proto_txdata(struct brcmf_pub *drvr, int ifidx,
|
||||
u8 offset, struct sk_buff *skb)
|
||||
{
|
||||
|
Reference in New Issue
Block a user