int wl1271_acx_init_mem_config(struct wl1271 *wl) { int ret; ret = wl1271_acx_mem_cfg(wl); if (ret < 0) return ret; wl->target_mem_map = kzalloc(sizeof(struct wl1271_acx_mem_map), GFP_KERNEL); if (!wl->target_mem_map) { wl1271_error("couldn't allocate target memory map"); return -ENOMEM; } /* we now ask for the firmware built memory map */ ret = wl1271_acx_mem_map(wl, (void *)wl->target_mem_map, sizeof(struct wl1271_acx_mem_map)); if (ret < 0) { wl1271_error("couldn't retrieve firmware memory map"); kfree(wl->target_mem_map); wl->target_mem_map = NULL; return ret; } /* initialize TX block book keeping */ wl->tx_blocks_available = le32_to_cpu(wl->target_mem_map->num_tx_mem_blocks); wl1271_debug(DEBUG_TX, "available tx blocks: %d", wl->tx_blocks_available); return 0; }
static int wl1271_sta_hw_init(struct wl1271 *wl) { int ret; if (wl->chip.id != CHIP_ID_1283_PG20) { ret = wl1271_cmd_ext_radio_parms(wl); if (ret < 0) return ret; } /* PS config */ ret = wl1271_acx_config_ps(wl); if (ret < 0) return ret; ret = wl1271_sta_init_templates_config(wl); if (ret < 0) return ret; ret = wl1271_acx_group_address_tbl(wl, true, NULL, 0); if (ret < 0) return ret; /* Initialize connection monitoring thresholds */ ret = wl1271_acx_conn_monit_params(wl, false); if (ret < 0) return ret; /* Beacon filtering */ ret = wl1271_init_beacon_filter(wl); if (ret < 0) return ret; /* FM WLAN coexistence */ ret = wl1271_acx_fm_coex(wl); if (ret < 0) return ret; /* Beacons and broadcast settings */ ret = wl1271_init_beacon_broadcast(wl); if (ret < 0) return ret; /* Configure for ELP power saving */ ret = wl1271_acx_sleep_auth(wl, WL1271_PSM_ELP); if (ret < 0) return ret; /* Configure rssi/snr averaging weights */ ret = wl1271_acx_rssi_snr_avg_weights(wl); if (ret < 0) return ret; ret = wl1271_acx_sta_rate_policies(wl); if (ret < 0) return ret; ret = wl1271_acx_mem_cfg(wl); if (ret < 0) return ret; /* Configure the FW logger */ ret = wl12xx_init_fwlog(wl); if (ret < 0) return ret; return 0; }