aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/net/wireless
diff options
context:
space:
mode:
authorArend van Spriel <arend@broadcom.com>2013-04-05 04:57:41 -0400
committerJohn W. Linville <linville@tuxdriver.com>2013-04-08 15:28:41 -0400
commit5f38b6836083b96613ebe8a0a43cde3400dd4a1b (patch)
tree0bda3438824c5b403171d3bed127799d2a7568a4 /drivers/net/wireless
parent33753d47d390624f09ee57dbb2bc611b15a10e8f (diff)
brcmfmac: handle firmware signals requesting for packets
The firmware can request the host driver for packets, by sending either the MAC_REQUEST_CREDIT or the MAC_REQUEST_PACKET primitive. This patch adds handling of these primitives. Reviewed-by: Pieter-Paul Giesberts <pieterpg@broadcom.com> Reviewed-by: Hante Meuleman <meuleman@broadcom.com> Signed-off-by: Arend van Spriel <arend@broadcom.com> Signed-off-by: John W. Linville <linville@tuxdriver.com>
Diffstat (limited to 'drivers/net/wireless')
-rw-r--r--drivers/net/wireless/brcm80211/brcmfmac/dhd_dbg.h2
-rw-r--r--drivers/net/wireless/brcm80211/brcmfmac/fwsignal.c29
2 files changed, 29 insertions, 2 deletions
diff --git a/drivers/net/wireless/brcm80211/brcmfmac/dhd_dbg.h b/drivers/net/wireless/brcm80211/brcmfmac/dhd_dbg.h
index e1058892dccc..d259ae5d2237 100644
--- a/drivers/net/wireless/brcm80211/brcmfmac/dhd_dbg.h
+++ b/drivers/net/wireless/brcm80211/brcmfmac/dhd_dbg.h
@@ -146,6 +146,8 @@ struct brcmf_fws_stats {
146 u32 mac_update_failed; 146 u32 mac_update_failed;
147 u32 mac_ps_update_failed; 147 u32 mac_ps_update_failed;
148 u32 if_update_failed; 148 u32 if_update_failed;
149 u32 packet_request_failed;
150 u32 credit_request_failed;
149 u32 rollback_success; 151 u32 rollback_success;
150 u32 rollback_failed; 152 u32 rollback_failed;
151 u32 delayq_full_error; 153 u32 delayq_full_error;
diff --git a/drivers/net/wireless/brcm80211/brcmfmac/fwsignal.c b/drivers/net/wireless/brcm80211/brcmfmac/fwsignal.c
index 57cbfb661d58..619fff34c218 100644
--- a/drivers/net/wireless/brcm80211/brcmfmac/fwsignal.c
+++ b/drivers/net/wireless/brcm80211/brcmfmac/fwsignal.c
@@ -959,6 +959,29 @@ fail:
959 return ret; 959 return ret;
960} 960}
961 961
962static int brcmf_fws_request_indicate(struct brcmf_fws_info *fws, u8 type,
963 u8 *data)
964{
965 struct brcmf_fws_mac_descriptor *entry;
966
967 entry = &fws->desc.nodes[data[1] & 0x1F];
968 if (!entry->occupied) {
969 if (type == BRCMF_FWS_TYPE_MAC_REQUEST_CREDIT)
970 fws->stats.credit_request_failed++;
971 else
972 fws->stats.packet_request_failed++;
973 return -ESRCH;
974 }
975
976 if (type == BRCMF_FWS_TYPE_MAC_REQUEST_CREDIT)
977 entry->requested_credit = data[0];
978 else
979 entry->requested_packet = data[0];
980
981 entry->ac_bitmap = data[2];
982 return 0;
983}
984
962static void brcmf_fws_return_credits(struct brcmf_fws_info *fws, 985static void brcmf_fws_return_credits(struct brcmf_fws_info *fws,
963 u8 fifo, u8 credits) 986 u8 fifo, u8 credits)
964{ 987{
@@ -1366,8 +1389,6 @@ int brcmf_fws_hdrpull(struct brcmf_pub *drvr, int ifidx, s16 signal_len,
1366 break; 1389 break;
1367 1390
1368 switch (type) { 1391 switch (type) {
1369 case BRCMF_FWS_TYPE_MAC_REQUEST_CREDIT:
1370 case BRCMF_FWS_TYPE_MAC_REQUEST_PACKET:
1371 case BRCMF_FWS_TYPE_HOST_REORDER_RXPKTS: 1392 case BRCMF_FWS_TYPE_HOST_REORDER_RXPKTS:
1372 case BRCMF_FWS_TYPE_COMP_TXSTATUS: 1393 case BRCMF_FWS_TYPE_COMP_TXSTATUS:
1373 break; 1394 break;
@@ -1383,6 +1404,10 @@ int brcmf_fws_hdrpull(struct brcmf_pub *drvr, int ifidx, s16 signal_len,
1383 case BRCMF_FWS_TYPE_INTERFACE_CLOSE: 1404 case BRCMF_FWS_TYPE_INTERFACE_CLOSE:
1384 brcmf_fws_interface_state_indicate(fws, type, data); 1405 brcmf_fws_interface_state_indicate(fws, type, data);
1385 break; 1406 break;
1407 case BRCMF_FWS_TYPE_MAC_REQUEST_CREDIT:
1408 case BRCMF_FWS_TYPE_MAC_REQUEST_PACKET:
1409 brcmf_fws_request_indicate(fws, type, data);
1410 break;
1386 case BRCMF_FWS_TYPE_TXSTATUS: 1411 case BRCMF_FWS_TYPE_TXSTATUS:
1387 brcmf_fws_txstatus_indicate(fws, data); 1412 brcmf_fws_txstatus_indicate(fws, data);
1388 break; 1413 break;