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

brcmfmac: destination mac closed when interface is closed

Firmware signals a destination is closed as well as an interface. A
destination is associated with an interface. When an interface is
closed consequently the destination should be considered closed as
well.
Reviewed-by: default avatarHante Meuleman <meuleman@broadcom.com>
Reviewed-by: default avatarPieter-Paul Giesberts <pieterpg@broadcom.com>
Signed-off-by: default avatarArend van Spriel <arend@broadcom.com>
Signed-off-by: default avatarJohn W. Linville <linville@tuxdriver.com>
parent 130e380b
...@@ -714,11 +714,21 @@ brcmf_fws_find_mac_desc(struct brcmf_fws_info *fws, struct brcmf_if *ifp, ...@@ -714,11 +714,21 @@ brcmf_fws_find_mac_desc(struct brcmf_fws_info *fws, struct brcmf_if *ifp,
return entry; return entry;
} }
static bool brcmf_fws_mac_desc_closed(struct brcmf_fws_mac_descriptor *entry, static bool brcmf_fws_mac_desc_closed(struct brcmf_fws_info *fws,
struct brcmf_fws_mac_descriptor *entry,
int fifo) int fifo)
{ {
struct brcmf_fws_mac_descriptor *if_entry;
bool closed; bool closed;
/* for unique destination entries the related interface
* may be closed.
*/
if (entry->mac_handle) {
if_entry = &fws->desc.iface[entry->interface_id];
if (if_entry->state == BRCMF_FWS_STATE_CLOSE)
return true;
}
/* an entry is closed when the state is closed and /* an entry is closed when the state is closed and
* the firmware did not request anything. * the firmware did not request anything.
*/ */
...@@ -1079,7 +1089,8 @@ static struct sk_buff *brcmf_fws_deq(struct brcmf_fws_info *fws, int fifo) ...@@ -1079,7 +1089,8 @@ static struct sk_buff *brcmf_fws_deq(struct brcmf_fws_info *fws, int fifo)
for (i = 0; i < num_nodes; i++) { for (i = 0; i < num_nodes; i++) {
entry = &table[(node_pos + i) % num_nodes]; entry = &table[(node_pos + i) % num_nodes];
if (!entry->occupied || brcmf_fws_mac_desc_closed(entry, fifo)) if (!entry->occupied ||
brcmf_fws_mac_desc_closed(fws, entry, fifo))
continue; continue;
if (entry->suppressed) if (entry->suppressed)
...@@ -1753,7 +1764,7 @@ int brcmf_fws_process_skb(struct brcmf_if *ifp, struct sk_buff *skb) ...@@ -1753,7 +1764,7 @@ int brcmf_fws_process_skb(struct brcmf_if *ifp, struct sk_buff *skb)
brcmf_fws_lock(drvr, flags); brcmf_fws_lock(drvr, flags);
if (skcb->mac->suppressed || if (skcb->mac->suppressed ||
brcmf_fws_mac_desc_closed(skcb->mac, fifo) || brcmf_fws_mac_desc_closed(drvr->fws, skcb->mac, fifo) ||
brcmu_pktq_mlen(&skcb->mac->psq, 3 << (fifo * 2)) || brcmu_pktq_mlen(&skcb->mac->psq, 3 << (fifo * 2)) ||
(!multicast && (!multicast &&
brcmf_fws_consume_credit(drvr->fws, fifo, skb) < 0)) { brcmf_fws_consume_credit(drvr->fws, fifo, skb) < 0)) {
......
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