common.c 4.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168
  1. /*
  2. * Copyright (c) 2010 Broadcom Corporation
  3. *
  4. * Permission to use, copy, modify, and/or distribute this software for any
  5. * purpose with or without fee is hereby granted, provided that the above
  6. * copyright notice and this permission notice appear in all copies.
  7. *
  8. * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
  9. * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
  10. * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY
  11. * SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
  12. * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION
  13. * OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN
  14. * CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
  15. */
  16. #include <linux/kernel.h>
  17. #include <linux/string.h>
  18. #include <linux/netdevice.h>
  19. #include <brcmu_wifi.h>
  20. #include <brcmu_utils.h>
  21. #include "core.h"
  22. #include "bus.h"
  23. #include "debug.h"
  24. #include "fwil.h"
  25. #include "fwil_types.h"
  26. #include "tracepoint.h"
  27. #define BRCMF_DEFAULT_BCN_TIMEOUT 3
  28. #define BRCMF_DEFAULT_SCAN_CHANNEL_TIME 40
  29. #define BRCMF_DEFAULT_SCAN_UNASSOC_TIME 40
  30. /* boost value for RSSI_DELTA in preferred join selection */
  31. #define BRCMF_JOIN_PREF_RSSI_BOOST 8
  32. int brcmf_c_preinit_dcmds(struct brcmf_if *ifp)
  33. {
  34. s8 eventmask[BRCMF_EVENTING_MASK_LEN];
  35. u8 buf[BRCMF_DCMD_SMLEN];
  36. struct brcmf_join_pref_params join_pref_params[2];
  37. char *ptr;
  38. s32 err;
  39. /* retreive mac address */
  40. err = brcmf_fil_iovar_data_get(ifp, "cur_etheraddr", ifp->mac_addr,
  41. sizeof(ifp->mac_addr));
  42. if (err < 0) {
  43. brcmf_err("Retreiving cur_etheraddr failed, %d\n",
  44. err);
  45. goto done;
  46. }
  47. memcpy(ifp->drvr->mac, ifp->mac_addr, sizeof(ifp->drvr->mac));
  48. /* query for 'ver' to get version info from firmware */
  49. memset(buf, 0, sizeof(buf));
  50. strcpy(buf, "ver");
  51. err = brcmf_fil_iovar_data_get(ifp, "ver", buf, sizeof(buf));
  52. if (err < 0) {
  53. brcmf_err("Retreiving version information failed, %d\n",
  54. err);
  55. goto done;
  56. }
  57. ptr = (char *)buf;
  58. strsep(&ptr, "\n");
  59. /* Print fw version info */
  60. brcmf_err("Firmware version = %s\n", buf);
  61. /* locate firmware version number for ethtool */
  62. ptr = strrchr(buf, ' ') + 1;
  63. strlcpy(ifp->drvr->fwver, ptr, sizeof(ifp->drvr->fwver));
  64. /* set mpc */
  65. err = brcmf_fil_iovar_int_set(ifp, "mpc", 1);
  66. if (err) {
  67. brcmf_err("failed setting mpc\n");
  68. goto done;
  69. }
  70. /*
  71. * Setup timeout if Beacons are lost and roam is off to report
  72. * link down
  73. */
  74. err = brcmf_fil_iovar_int_set(ifp, "bcn_timeout",
  75. BRCMF_DEFAULT_BCN_TIMEOUT);
  76. if (err) {
  77. brcmf_err("bcn_timeout error (%d)\n", err);
  78. goto done;
  79. }
  80. /* Enable/Disable build-in roaming to allowed ext supplicant to take
  81. * of romaing
  82. */
  83. err = brcmf_fil_iovar_int_set(ifp, "roam_off", 1);
  84. if (err) {
  85. brcmf_err("roam_off error (%d)\n", err);
  86. goto done;
  87. }
  88. /* Setup join_pref to select target by RSSI(with boost on 5GHz) */
  89. join_pref_params[0].type = BRCMF_JOIN_PREF_RSSI_DELTA;
  90. join_pref_params[0].len = 2;
  91. join_pref_params[0].rssi_gain = BRCMF_JOIN_PREF_RSSI_BOOST;
  92. join_pref_params[0].band = WLC_BAND_5G;
  93. join_pref_params[1].type = BRCMF_JOIN_PREF_RSSI;
  94. join_pref_params[1].len = 2;
  95. join_pref_params[1].rssi_gain = 0;
  96. join_pref_params[1].band = 0;
  97. err = brcmf_fil_iovar_data_set(ifp, "join_pref", join_pref_params,
  98. sizeof(join_pref_params));
  99. if (err)
  100. brcmf_err("Set join_pref error (%d)\n", err);
  101. /* Setup event_msgs, enable E_IF */
  102. err = brcmf_fil_iovar_data_get(ifp, "event_msgs", eventmask,
  103. BRCMF_EVENTING_MASK_LEN);
  104. if (err) {
  105. brcmf_err("Get event_msgs error (%d)\n", err);
  106. goto done;
  107. }
  108. setbit(eventmask, BRCMF_E_IF);
  109. err = brcmf_fil_iovar_data_set(ifp, "event_msgs", eventmask,
  110. BRCMF_EVENTING_MASK_LEN);
  111. if (err) {
  112. brcmf_err("Set event_msgs error (%d)\n", err);
  113. goto done;
  114. }
  115. /* Setup default scan channel time */
  116. err = brcmf_fil_cmd_int_set(ifp, BRCMF_C_SET_SCAN_CHANNEL_TIME,
  117. BRCMF_DEFAULT_SCAN_CHANNEL_TIME);
  118. if (err) {
  119. brcmf_err("BRCMF_C_SET_SCAN_CHANNEL_TIME error (%d)\n",
  120. err);
  121. goto done;
  122. }
  123. /* Setup default scan unassoc time */
  124. err = brcmf_fil_cmd_int_set(ifp, BRCMF_C_SET_SCAN_UNASSOC_TIME,
  125. BRCMF_DEFAULT_SCAN_UNASSOC_TIME);
  126. if (err) {
  127. brcmf_err("BRCMF_C_SET_SCAN_UNASSOC_TIME error (%d)\n",
  128. err);
  129. goto done;
  130. }
  131. /* do bus specific preinit here */
  132. err = brcmf_bus_preinit(ifp->drvr->bus_if);
  133. done:
  134. return err;
  135. }
  136. #if defined(CONFIG_BRCM_TRACING) || defined(CONFIG_BRCMDBG)
  137. void __brcmf_dbg(u32 level, const char *func, const char *fmt, ...)
  138. {
  139. struct va_format vaf = {
  140. .fmt = fmt,
  141. };
  142. va_list args;
  143. va_start(args, fmt);
  144. vaf.va = &args;
  145. if (brcmf_msg_level & level)
  146. pr_debug("%s %pV", func, &vaf);
  147. trace_brcmf_dbg(level, func, &vaf);
  148. va_end(args);
  149. }
  150. #endif