aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/net/wireless/brcm80211/brcmsmac/main.c
diff options
context:
space:
mode:
Diffstat (limited to 'drivers/net/wireless/brcm80211/brcmsmac/main.c')
-rw-r--r--drivers/net/wireless/brcm80211/brcmsmac/main.c194
1 files changed, 90 insertions, 104 deletions
diff --git a/drivers/net/wireless/brcm80211/brcmsmac/main.c b/drivers/net/wireless/brcm80211/brcmsmac/main.c
index f6affc6fd12a..fb712cac9157 100644
--- a/drivers/net/wireless/brcm80211/brcmsmac/main.c
+++ b/drivers/net/wireless/brcm80211/brcmsmac/main.c
@@ -14,6 +14,8 @@
14 * CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. 14 * CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
15 */ 15 */
16 16
17#define pr_fmt(fmt) KBUILD_MODNAME ": " fmt
18
17#include <linux/pci_ids.h> 19#include <linux/pci_ids.h>
18#include <linux/if_ether.h> 20#include <linux/if_ether.h>
19#include <net/mac80211.h> 21#include <net/mac80211.h>
@@ -293,11 +295,11 @@ const u8 prio2fifo[NUMPRIO] = {
293 295
294/* debug/trace */ 296/* debug/trace */
295uint brcm_msg_level = 297uint brcm_msg_level =
296#if defined(BCMDBG) 298#if defined(DEBUG)
297 LOG_ERROR_VAL; 299 LOG_ERROR_VAL;
298#else 300#else
299 0; 301 0;
300#endif /* BCMDBG */ 302#endif /* DEBUG */
301 303
302/* TX FIFO number to WME/802.1E Access Category */ 304/* TX FIFO number to WME/802.1E Access Category */
303static const u8 wme_fifo2ac[] = { 305static const u8 wme_fifo2ac[] = {
@@ -342,14 +344,14 @@ static const u16 xmtfifo_sz[][NFIFO] = {
342 {9, 58, 22, 14, 14, 5}, 344 {9, 58, 22, 14, 14, 5},
343}; 345};
344 346
345#ifdef BCMDBG 347#ifdef DEBUG
346static const char * const fifo_names[] = { 348static const char * const fifo_names[] = {
347 "AC_BK", "AC_BE", "AC_VI", "AC_VO", "BCMC", "ATIM" }; 349 "AC_BK", "AC_BE", "AC_VI", "AC_VO", "BCMC", "ATIM" };
348#else 350#else
349static const char fifo_names[6][0]; 351static const char fifo_names[6][0];
350#endif 352#endif
351 353
352#ifdef BCMDBG 354#ifdef DEBUG
353/* pointer to most recently allocated wl/wlc */ 355/* pointer to most recently allocated wl/wlc */
354static struct brcms_c_info *wlc_info_dbg = (struct brcms_c_info *) (NULL); 356static struct brcms_c_info *wlc_info_dbg = (struct brcms_c_info *) (NULL);
355#endif 357#endif
@@ -3075,30 +3077,30 @@ static void brcms_c_statsupd(struct brcms_c_info *wlc)
3075{ 3077{
3076 int i; 3078 int i;
3077 struct macstat macstats; 3079 struct macstat macstats;
3078#ifdef BCMDBG 3080#ifdef DEBUG
3079 u16 delta; 3081 u16 delta;
3080 u16 rxf0ovfl; 3082 u16 rxf0ovfl;
3081 u16 txfunfl[NFIFO]; 3083 u16 txfunfl[NFIFO];
3082#endif /* BCMDBG */ 3084#endif /* DEBUG */
3083 3085
3084 /* if driver down, make no sense to update stats */ 3086 /* if driver down, make no sense to update stats */
3085 if (!wlc->pub->up) 3087 if (!wlc->pub->up)
3086 return; 3088 return;
3087 3089
3088#ifdef BCMDBG 3090#ifdef DEBUG
3089 /* save last rx fifo 0 overflow count */ 3091 /* save last rx fifo 0 overflow count */
3090 rxf0ovfl = wlc->core->macstat_snapshot->rxf0ovfl; 3092 rxf0ovfl = wlc->core->macstat_snapshot->rxf0ovfl;
3091 3093
3092 /* save last tx fifo underflow count */ 3094 /* save last tx fifo underflow count */
3093 for (i = 0; i < NFIFO; i++) 3095 for (i = 0; i < NFIFO; i++)
3094 txfunfl[i] = wlc->core->macstat_snapshot->txfunfl[i]; 3096 txfunfl[i] = wlc->core->macstat_snapshot->txfunfl[i];
3095#endif /* BCMDBG */ 3097#endif /* DEBUG */
3096 3098
3097 /* Read mac stats from contiguous shared memory */ 3099 /* Read mac stats from contiguous shared memory */
3098 brcms_b_copyfrom_objmem(wlc->hw, M_UCODE_MACSTAT, &macstats, 3100 brcms_b_copyfrom_objmem(wlc->hw, M_UCODE_MACSTAT, &macstats,
3099 sizeof(struct macstat), OBJADDR_SHM_SEL); 3101 sizeof(struct macstat), OBJADDR_SHM_SEL);
3100 3102
3101#ifdef BCMDBG 3103#ifdef DEBUG
3102 /* check for rx fifo 0 overflow */ 3104 /* check for rx fifo 0 overflow */
3103 delta = (u16) (wlc->core->macstat_snapshot->rxf0ovfl - rxf0ovfl); 3105 delta = (u16) (wlc->core->macstat_snapshot->rxf0ovfl - rxf0ovfl);
3104 if (delta) 3106 if (delta)
@@ -3114,7 +3116,7 @@ static void brcms_c_statsupd(struct brcms_c_info *wlc)
3114 wiphy_err(wlc->wiphy, "wl%d: %u tx fifo %d underflows!" 3116 wiphy_err(wlc->wiphy, "wl%d: %u tx fifo %d underflows!"
3115 "\n", wlc->pub->unit, delta, i); 3117 "\n", wlc->pub->unit, delta, i);
3116 } 3118 }
3117#endif /* BCMDBG */ 3119#endif /* DEBUG */
3118 3120
3119 /* merge counters from dma module */ 3121 /* merge counters from dma module */
3120 for (i = 0; i < NFIFO; i++) { 3122 for (i = 0; i < NFIFO; i++) {
@@ -5765,62 +5767,49 @@ int brcms_c_module_unregister(struct brcms_pub *pub, const char *name,
5765 return -ENODATA; 5767 return -ENODATA;
5766} 5768}
5767 5769
5768#ifdef BCMDBG
5769static const char * const supr_reason[] = {
5770 "None", "PMQ Entry", "Flush request",
5771 "Previous frag failure", "Channel mismatch",
5772 "Lifetime Expiry", "Underflow"
5773};
5774
5775static void brcms_c_print_txs_status(u16 s)
5776{
5777 printk(KERN_DEBUG "[15:12] %d frame attempts\n",
5778 (s & TX_STATUS_FRM_RTX_MASK) >> TX_STATUS_FRM_RTX_SHIFT);
5779 printk(KERN_DEBUG " [11:8] %d rts attempts\n",
5780 (s & TX_STATUS_RTS_RTX_MASK) >> TX_STATUS_RTS_RTX_SHIFT);
5781 printk(KERN_DEBUG " [7] %d PM mode indicated\n",
5782 ((s & TX_STATUS_PMINDCTD) ? 1 : 0));
5783 printk(KERN_DEBUG " [6] %d intermediate status\n",
5784 ((s & TX_STATUS_INTERMEDIATE) ? 1 : 0));
5785 printk(KERN_DEBUG " [5] %d AMPDU\n",
5786 (s & TX_STATUS_AMPDU) ? 1 : 0);
5787 printk(KERN_DEBUG " [4:2] %d Frame Suppressed Reason (%s)\n",
5788 ((s & TX_STATUS_SUPR_MASK) >> TX_STATUS_SUPR_SHIFT),
5789 supr_reason[(s & TX_STATUS_SUPR_MASK) >> TX_STATUS_SUPR_SHIFT]);
5790 printk(KERN_DEBUG " [1] %d acked\n",
5791 ((s & TX_STATUS_ACK_RCV) ? 1 : 0));
5792}
5793#endif /* BCMDBG */
5794
5795void brcms_c_print_txstatus(struct tx_status *txs) 5770void brcms_c_print_txstatus(struct tx_status *txs)
5796{ 5771{
5797#if defined(BCMDBG) 5772 pr_debug("\ntxpkt (MPDU) Complete\n");
5798 u16 s = txs->status; 5773
5799 u16 ackphyrxsh = txs->ackphyrxsh; 5774 pr_debug("FrameID: %04x TxStatus: %04x\n", txs->frameid, txs->status);
5800 5775
5801 printk(KERN_DEBUG "\ntxpkt (MPDU) Complete\n"); 5776 pr_debug("[15:12] %d frame attempts\n",
5802 5777 (txs->status & TX_STATUS_FRM_RTX_MASK) >>
5803 printk(KERN_DEBUG "FrameID: %04x ", txs->frameid); 5778 TX_STATUS_FRM_RTX_SHIFT);
5804 printk(KERN_DEBUG "TxStatus: %04x", s); 5779 pr_debug(" [11:8] %d rts attempts\n",
5805 printk(KERN_DEBUG "\n"); 5780 (txs->status & TX_STATUS_RTS_RTX_MASK) >>
5806 5781 TX_STATUS_RTS_RTX_SHIFT);
5807 brcms_c_print_txs_status(s); 5782 pr_debug(" [7] %d PM mode indicated\n",
5808 5783 txs->status & TX_STATUS_PMINDCTD ? 1 : 0);
5809 printk(KERN_DEBUG "LastTxTime: %04x ", txs->lasttxtime); 5784 pr_debug(" [6] %d intermediate status\n",
5810 printk(KERN_DEBUG "Seq: %04x ", txs->sequence); 5785 txs->status & TX_STATUS_INTERMEDIATE ? 1 : 0);
5811 printk(KERN_DEBUG "PHYTxStatus: %04x ", txs->phyerr); 5786 pr_debug(" [5] %d AMPDU\n",
5812 printk(KERN_DEBUG "RxAckRSSI: %04x ", 5787 txs->status & TX_STATUS_AMPDU ? 1 : 0);
5813 (ackphyrxsh & PRXS1_JSSI_MASK) >> PRXS1_JSSI_SHIFT); 5788 pr_debug(" [4:2] %d Frame Suppressed Reason (%s)\n",
5814 printk(KERN_DEBUG "RxAckSQ: %04x", 5789 (txs->status & TX_STATUS_SUPR_MASK) >> TX_STATUS_SUPR_SHIFT,
5815 (ackphyrxsh & PRXS1_SQ_MASK) >> PRXS1_SQ_SHIFT); 5790 (const char *[]) {
5816 printk(KERN_DEBUG "\n"); 5791 "None",
5817#endif /* defined(BCMDBG) */ 5792 "PMQ Entry",
5793 "Flush request",
5794 "Previous frag failure",
5795 "Channel mismatch",
5796 "Lifetime Expiry",
5797 "Underflow"
5798 } [(txs->status & TX_STATUS_SUPR_MASK) >>
5799 TX_STATUS_SUPR_SHIFT]);
5800 pr_debug(" [1] %d acked\n",
5801 txs->status & TX_STATUS_ACK_RCV ? 1 : 0);
5802
5803 pr_debug("LastTxTime: %04x Seq: %04x PHYTxStatus: %04x RxAckRSSI: %04x RxAckSQ: %04x\n",
5804 txs->lasttxtime, txs->sequence, txs->phyerr,
5805 (txs->ackphyrxsh & PRXS1_JSSI_MASK) >> PRXS1_JSSI_SHIFT,
5806 (txs->ackphyrxsh & PRXS1_SQ_MASK) >> PRXS1_SQ_SHIFT);
5818} 5807}
5819 5808
5820bool brcms_c_chipmatch(u16 vendor, u16 device) 5809bool brcms_c_chipmatch(u16 vendor, u16 device)
5821{ 5810{
5822 if (vendor != PCI_VENDOR_ID_BROADCOM) { 5811 if (vendor != PCI_VENDOR_ID_BROADCOM) {
5823 pr_err("chipmatch: unknown vendor id %04x\n", vendor); 5812 pr_err("unknown vendor id %04x\n", vendor);
5824 return false; 5813 return false;
5825 } 5814 }
5826 5815
@@ -5833,11 +5822,11 @@ bool brcms_c_chipmatch(u16 vendor, u16 device)
5833 if ((device == BCM43236_D11N_ID) || (device == BCM43236_D11N2G_ID)) 5822 if ((device == BCM43236_D11N_ID) || (device == BCM43236_D11N2G_ID))
5834 return true; 5823 return true;
5835 5824
5836 pr_err("chipmatch: unknown device id %04x\n", device); 5825 pr_err("unknown device id %04x\n", device);
5837 return false; 5826 return false;
5838} 5827}
5839 5828
5840#if defined(BCMDBG) 5829#if defined(DEBUG)
5841void brcms_c_print_txdesc(struct d11txh *txh) 5830void brcms_c_print_txdesc(struct d11txh *txh)
5842{ 5831{
5843 u16 mtcl = le16_to_cpu(txh->MacTxControlLow); 5832 u16 mtcl = le16_to_cpu(txh->MacTxControlLow);
@@ -5871,57 +5860,56 @@ void brcms_c_print_txdesc(struct d11txh *txh)
5871 struct ieee80211_rts rts = txh->rts_frame; 5860 struct ieee80211_rts rts = txh->rts_frame;
5872 5861
5873 /* add plcp header along with txh descriptor */ 5862 /* add plcp header along with txh descriptor */
5874 printk(KERN_DEBUG "Raw TxDesc + plcp header:\n"); 5863 brcmu_dbg_hex_dump(txh, sizeof(struct d11txh) + 48,
5875 print_hex_dump_bytes("", DUMP_PREFIX_OFFSET, 5864 "Raw TxDesc + plcp header:\n");
5876 txh, sizeof(struct d11txh) + 48); 5865
5877 5866 pr_debug("TxCtlLow: %04x ", mtcl);
5878 printk(KERN_DEBUG "TxCtlLow: %04x ", mtcl); 5867 pr_debug("TxCtlHigh: %04x ", mtch);
5879 printk(KERN_DEBUG "TxCtlHigh: %04x ", mtch); 5868 pr_debug("FC: %04x ", mfc);
5880 printk(KERN_DEBUG "FC: %04x ", mfc); 5869 pr_debug("FES Time: %04x\n", tfest);
5881 printk(KERN_DEBUG "FES Time: %04x\n", tfest); 5870 pr_debug("PhyCtl: %04x%s ", ptcw,
5882 printk(KERN_DEBUG "PhyCtl: %04x%s ", ptcw,
5883 (ptcw & PHY_TXC_SHORT_HDR) ? " short" : ""); 5871 (ptcw & PHY_TXC_SHORT_HDR) ? " short" : "");
5884 printk(KERN_DEBUG "PhyCtl_1: %04x ", ptcw_1); 5872 pr_debug("PhyCtl_1: %04x ", ptcw_1);
5885 printk(KERN_DEBUG "PhyCtl_1_Fbr: %04x\n", ptcw_1_Fbr); 5873 pr_debug("PhyCtl_1_Fbr: %04x\n", ptcw_1_Fbr);
5886 printk(KERN_DEBUG "PhyCtl_1_Rts: %04x ", ptcw_1_Rts); 5874 pr_debug("PhyCtl_1_Rts: %04x ", ptcw_1_Rts);
5887 printk(KERN_DEBUG "PhyCtl_1_Fbr_Rts: %04x\n", ptcw_1_FbrRts); 5875 pr_debug("PhyCtl_1_Fbr_Rts: %04x\n", ptcw_1_FbrRts);
5888 printk(KERN_DEBUG "MainRates: %04x ", mainrates); 5876 pr_debug("MainRates: %04x ", mainrates);
5889 printk(KERN_DEBUG "XtraFrameTypes: %04x ", xtraft); 5877 pr_debug("XtraFrameTypes: %04x ", xtraft);
5890 printk(KERN_DEBUG "\n"); 5878 pr_debug("\n");
5891 5879
5892 print_hex_dump_bytes("SecIV:", DUMP_PREFIX_OFFSET, iv, sizeof(txh->IV)); 5880 print_hex_dump_bytes("SecIV:", DUMP_PREFIX_OFFSET, iv, sizeof(txh->IV));
5893 print_hex_dump_bytes("RA:", DUMP_PREFIX_OFFSET, 5881 print_hex_dump_bytes("RA:", DUMP_PREFIX_OFFSET,
5894 ra, sizeof(txh->TxFrameRA)); 5882 ra, sizeof(txh->TxFrameRA));
5895 5883
5896 printk(KERN_DEBUG "Fb FES Time: %04x ", tfestfb); 5884 pr_debug("Fb FES Time: %04x ", tfestfb);
5897 print_hex_dump_bytes("Fb RTS PLCP:", DUMP_PREFIX_OFFSET, 5885 print_hex_dump_bytes("Fb RTS PLCP:", DUMP_PREFIX_OFFSET,
5898 rtspfb, sizeof(txh->RTSPLCPFallback)); 5886 rtspfb, sizeof(txh->RTSPLCPFallback));
5899 printk(KERN_DEBUG "RTS DUR: %04x ", rtsdfb); 5887 pr_debug("RTS DUR: %04x ", rtsdfb);
5900 print_hex_dump_bytes("PLCP:", DUMP_PREFIX_OFFSET, 5888 print_hex_dump_bytes("PLCP:", DUMP_PREFIX_OFFSET,
5901 fragpfb, sizeof(txh->FragPLCPFallback)); 5889 fragpfb, sizeof(txh->FragPLCPFallback));
5902 printk(KERN_DEBUG "DUR: %04x", fragdfb); 5890 pr_debug("DUR: %04x", fragdfb);
5903 printk(KERN_DEBUG "\n"); 5891 pr_debug("\n");
5904 5892
5905 printk(KERN_DEBUG "MModeLen: %04x ", mmodelen); 5893 pr_debug("MModeLen: %04x ", mmodelen);
5906 printk(KERN_DEBUG "MModeFbrLen: %04x\n", mmodefbrlen); 5894 pr_debug("MModeFbrLen: %04x\n", mmodefbrlen);
5907 5895
5908 printk(KERN_DEBUG "FrameID: %04x\n", tfid); 5896 pr_debug("FrameID: %04x\n", tfid);
5909 printk(KERN_DEBUG "TxStatus: %04x\n", txs); 5897 pr_debug("TxStatus: %04x\n", txs);
5910 5898
5911 printk(KERN_DEBUG "MaxNumMpdu: %04x\n", mnmpdu); 5899 pr_debug("MaxNumMpdu: %04x\n", mnmpdu);
5912 printk(KERN_DEBUG "MaxAggbyte: %04x\n", mabyte); 5900 pr_debug("MaxAggbyte: %04x\n", mabyte);
5913 printk(KERN_DEBUG "MaxAggbyte_fb: %04x\n", mabyte_f); 5901 pr_debug("MaxAggbyte_fb: %04x\n", mabyte_f);
5914 printk(KERN_DEBUG "MinByte: %04x\n", mmbyte); 5902 pr_debug("MinByte: %04x\n", mmbyte);
5915 5903
5916 print_hex_dump_bytes("RTS PLCP:", DUMP_PREFIX_OFFSET, 5904 print_hex_dump_bytes("RTS PLCP:", DUMP_PREFIX_OFFSET,
5917 rtsph, sizeof(txh->RTSPhyHeader)); 5905 rtsph, sizeof(txh->RTSPhyHeader));
5918 print_hex_dump_bytes("RTS Frame:", DUMP_PREFIX_OFFSET, 5906 print_hex_dump_bytes("RTS Frame:", DUMP_PREFIX_OFFSET,
5919 (u8 *)&rts, sizeof(txh->rts_frame)); 5907 (u8 *)&rts, sizeof(txh->rts_frame));
5920 printk(KERN_DEBUG "\n"); 5908 pr_debug("\n");
5921} 5909}
5922#endif /* defined(BCMDBG) */ 5910#endif /* defined(DEBUG) */
5923 5911
5924#if defined(BCMDBG) 5912#if defined(DEBUG)
5925static int 5913static int
5926brcms_c_format_flags(const struct brcms_c_bit_desc *bd, u32 flags, char *buf, 5914brcms_c_format_flags(const struct brcms_c_bit_desc *bd, u32 flags, char *buf,
5927 int len) 5915 int len)
@@ -5975,9 +5963,9 @@ brcms_c_format_flags(const struct brcms_c_bit_desc *bd, u32 flags, char *buf,
5975 5963
5976 return (int)(p - buf); 5964 return (int)(p - buf);
5977} 5965}
5978#endif /* defined(BCMDBG) */ 5966#endif /* defined(DEBUG) */
5979 5967
5980#if defined(BCMDBG) 5968#if defined(DEBUG)
5981void brcms_c_print_rxh(struct d11rxhdr *rxh) 5969void brcms_c_print_rxh(struct d11rxhdr *rxh)
5982{ 5970{
5983 u16 len = rxh->RxFrameSize; 5971 u16 len = rxh->RxFrameSize;
@@ -5999,24 +5987,22 @@ void brcms_c_print_rxh(struct d11rxhdr *rxh)
5999 {0, NULL} 5987 {0, NULL}
6000 }; 5988 };
6001 5989
6002 printk(KERN_DEBUG "Raw RxDesc:\n"); 5990 brcmu_dbg_hex_dump(rxh, sizeof(struct d11rxhdr), "Raw RxDesc:\n");
6003 print_hex_dump_bytes("", DUMP_PREFIX_OFFSET, rxh,
6004 sizeof(struct d11rxhdr));
6005 5991
6006 brcms_c_format_flags(macstat_flags, macstatus1, flagstr, 64); 5992 brcms_c_format_flags(macstat_flags, macstatus1, flagstr, 64);
6007 5993
6008 snprintf(lenbuf, sizeof(lenbuf), "0x%x", len); 5994 snprintf(lenbuf, sizeof(lenbuf), "0x%x", len);
6009 5995
6010 printk(KERN_DEBUG "RxFrameSize: %6s (%d)%s\n", lenbuf, len, 5996 pr_debug("RxFrameSize: %6s (%d)%s\n", lenbuf, len,
6011 (rxh->PhyRxStatus_0 & PRXS0_SHORTH) ? " short preamble" : ""); 5997 (rxh->PhyRxStatus_0 & PRXS0_SHORTH) ? " short preamble" : "");
6012 printk(KERN_DEBUG "RxPHYStatus: %04x %04x %04x %04x\n", 5998 pr_debug("RxPHYStatus: %04x %04x %04x %04x\n",
6013 phystatus_0, phystatus_1, phystatus_2, phystatus_3); 5999 phystatus_0, phystatus_1, phystatus_2, phystatus_3);
6014 printk(KERN_DEBUG "RxMACStatus: %x %s\n", macstatus1, flagstr); 6000 pr_debug("RxMACStatus: %x %s\n", macstatus1, flagstr);
6015 printk(KERN_DEBUG "RXMACaggtype: %x\n", 6001 pr_debug("RXMACaggtype: %x\n",
6016 (macstatus2 & RXS_AGGTYPE_MASK)); 6002 (macstatus2 & RXS_AGGTYPE_MASK));
6017 printk(KERN_DEBUG "RxTSFTime: %04x\n", rxh->RxTSFTime); 6003 pr_debug("RxTSFTime: %04x\n", rxh->RxTSFTime);
6018} 6004}
6019#endif /* defined(BCMDBG) */ 6005#endif /* defined(DEBUG) */
6020 6006
6021u16 brcms_b_rate_shm_offset(struct brcms_hardware *wlc_hw, u8 rate) 6007u16 brcms_b_rate_shm_offset(struct brcms_hardware *wlc_hw, u8 rate)
6022{ 6008{
@@ -8354,7 +8340,7 @@ brcms_c_attach(struct brcms_info *wl, struct bcma_device *core, uint unit,
8354 wlc->wiphy = wl->wiphy; 8340 wlc->wiphy = wl->wiphy;
8355 pub = wlc->pub; 8341 pub = wlc->pub;
8356 8342
8357#if defined(BCMDBG) 8343#if defined(DEBUG)
8358 wlc_info_dbg = wlc; 8344 wlc_info_dbg = wlc;
8359#endif 8345#endif
8360 8346