#ifdef DHDENABLE_TAILPAD
void *pad_pkt;
#endif /* DHDENABLE_TAILPAD */
+ uint txglomframes; /* Number of tx glom frames (superframes) */
+ uint txglompkts; /* Number of packets from tx glom frames */
} dhd_bus_t;
/* clkstate */
(bus->sih->chip == BCM4354_CHIP_ID) ||
(bus->sih->chip == BCM4356_CHIP_ID) ||
(bus->sih->chip == BCM4358_CHIP_ID) ||
+ (bus->sih->chip == BCM4371_CHIP_ID) ||
(BCM4349_CHIP(bus->sih->chip)) ||
(bus->sih->chip == BCM4350_CHIP_ID)) {
core_capext = TRUE;
(bus->sih->chip == BCM4354_CHIP_ID) ||
(bus->sih->chip == BCM4356_CHIP_ID) ||
(bus->sih->chip == BCM4358_CHIP_ID) ||
+ (bus->sih->chip == BCM4371_CHIP_ID) ||
(bus->sih->chip == BCM4350_CHIP_ID)) {
uint32 enabval = 0;
addr = SI_ENUM_BASE + OFFSETOF(chipcregs_t, chipcontrol_addr);
(bus->sih->chip == BCM4345_CHIP_ID) ||
(bus->sih->chip == BCM4354_CHIP_ID) ||
(bus->sih->chip == BCM4356_CHIP_ID) ||
- (bus->sih->chip == BCM4358_CHIP_ID))
+ (bus->sih->chip == BCM4358_CHIP_ID) ||
+ (bus->sih->chip == BCM4371_CHIP_ID))
enabval &= CC_CHIPCTRL3_SR_ENG_ENABLE;
if (enabval)
break;
if (dhdsdio_txpkt(bus, SDPCM_DATA_CHANNEL, pkts, i, TRUE) != BCME_OK)
dhd->tx_errors++;
- else
+ else {
dhd->dstats.tx_bytes += datalen;
+ bus->txglomframes++;
+ bus->txglompkts += num_pkt;
+ }
cnt += i;
/* In poll mode, need to check for other events */
#endif /* DHD_DEBUG */
bcm_bprintf(strbuf, "clkstate %d activity %d idletime %d idlecount %d sleeping %d\n",
bus->clkstate, bus->activity, bus->idletime, bus->idlecount, bus->sleeping);
+ dhd_dump_pct(strbuf, "Tx: glom pct", (100 * bus->txglompkts), bus->dhd->tx_packets);
+ dhd_dump_pct(strbuf, ", pkts/glom", bus->txglompkts, bus->txglomframes);
+ bcm_bprintf(strbuf, "\n");
+ bcm_bprintf(strbuf, "txglomframes %u, txglompkts %u\n", bus->txglomframes, bus->txglompkts);
+ bcm_bprintf(strbuf, "\n");
}
void
bus->tx_sderrs = bus->fc_rcvd = bus->fc_xoff = bus->fc_xon = 0;
bus->rxglomfail = bus->rxglomframes = bus->rxglompkts = 0;
bus->f2rxhdrs = bus->f2rxdata = bus->f2txdata = bus->f1regdata = 0;
+ bus->txglomframes = bus->txglompkts = 0;
}
#ifdef SDTEST
} else
#endif /* BCMSDIOH_TXGLOM */
bus->txglom_enable = FALSE;
- printk("%s: enable %d\n", __FUNCTION__, bus->txglom_enable);
+ printf("%s: enable %d\n", __FUNCTION__, bus->txglom_enable);
}
int
dhd_os_sdunlock(bus->dhd);
dhd_rx_frame(bus->dhd, ifidx, pkt, pkt_count, chan);
dhd_os_sdlock(bus->dhd);
+#if defined(SDIO_ISR_THREAD)
+ /* terence 20150615: fix for below error due to bussleep in watchdog after dhd_os_sdunlock here,
+ * so call BUS_WAKE to wake up bus again
+ * dhd_bcmsdh_recv_buf: Device asleep
+ * dhdsdio_readframes: RXHEADER FAILED: -40
+ * dhdsdio_rxfail: abort command, terminate frame, send NAK
+ */
+ BUS_WAKE(bus);
+#endif
}
rxcount = maxframes - rxleft;
#ifdef DHD_DEBUG
#if defined(SDIO_ISR_THREAD)
DHD_TRACE(("Calling dhdsdio_dpc() from %s\n", __FUNCTION__));
DHD_OS_WAKE_LOCK(bus->dhd);
- /* terence 20150209: dpc should be scheded again if dpc_sched is TRUE or dhd_bus_txdata can
+ /* terence 20150209: dpc should be scheded again if dpc_sched is TRUE or dhd_bus_txdata can
not schedule anymore because dpc_sched is TRUE now.
*/
if (dhdsdio_dpc(bus)) {
return TRUE;
if (chipid == BCM4358_CHIP_ID)
return TRUE;
+ if (chipid == BCM4371_CHIP_ID)
+ return TRUE;
if (chipid == BCM43430_CHIP_ID)
return TRUE;
if (BCM4349_CHIP(chipid))
case BCM4354_CHIP_ID:
case BCM4356_CHIP_ID:
case BCM4358_CHIP_ID:
+ case BCM4371_CHIP_ID:
bus->dongle_ram_base = CR4_4350_RAM_BASE;
break;
case BCM4360_CHIP_ID:
dhd_conf_set_fw_name_by_mac(bus->dhd, bus->sdh, bus->fw_path);
dhd_conf_set_nv_name_by_mac(bus->dhd, bus->sdh, bus->nv_path);
- printk("Final fw_path=%s\n", bus->fw_path);
- printk("Final nv_path=%s\n", bus->nv_path);
- printk("Final conf_path=%s\n", bus->dhd->conf_path);
+ printf("Final fw_path=%s\n", bus->fw_path);
+ printf("Final nv_path=%s\n", bus->nv_path);
+ printf("Final conf_path=%s\n", bus->dhd->conf_path);
ret = _dhdsdio_download_firmware(bus);
image = dhd_os_open_image(pfw_path);
if (image == NULL) {
- printk("%s: Open firmware file failed %s\n", __FUNCTION__, pfw_path);
+ printf("%s: Open firmware file failed %s\n", __FUNCTION__, pfw_path);
goto err;
}
if (nvram_file_exists) {
image = dhd_os_open_image(pnv_path);
if (image == NULL) {
- printk("%s: Open nvram file failed %s\n", __FUNCTION__, pnv_path);
+ printf("%s: Open nvram file failed %s\n", __FUNCTION__, pnv_path);
goto err;
}
}
dhd_txglom_enable(dhdp, FALSE);
dhd_os_sdunlock(dhdp);
- printk("%s: WLAN OFF DONE\n", __FUNCTION__);
+ printf("%s: WLAN OFF DONE\n", __FUNCTION__);
/* App can now remove power from device */
} else
bcmerror = BCME_SDIO_ERROR;
} else {
/* App must have restored power to device before calling */
- printk("\n\n%s: == WLAN ON ==\n", __FUNCTION__);
+ printf("\n\n%s: == WLAN ON ==\n", __FUNCTION__);
if (bus->dhd->dongle_reset) {
/* Turn on WLAN */
dhd_os_sdunlock(dhdp);
} else {
bcmerror = BCME_SDIO_ERROR;
- printk("%s called when dongle is not in reset\n",
+ printf("%s called when dongle is not in reset\n",
__FUNCTION__);
- printk("Will call dhd_bus_start instead\n");
+ printf("Will call dhd_bus_start instead\n");
dhd_bus_resume(dhdp, 1);
#if defined(HW_OOB)
dhd_conf_set_hw_oob_intr(bus->sdh, bus->sih->chip); // terence 20120615: fix for OOB initial issue