diff --git a/drivers/net/wireless/realtek/rtw88/sdio.c b/drivers/net/wireless/realtek/rtw88/sdio.c index 2c1fb2dabd40..0bb872ef1296 100644 --- a/drivers/net/wireless/realtek/rtw88/sdio.c +++ b/drivers/net/wireless/realtek/rtw88/sdio.c @@ -654,23 +654,35 @@ static void rtw_sdio_init(struct rtw_dev *rtwdev) static void rtw_sdio_enable_rx_aggregation(struct rtw_dev *rtwdev) { - u8 size, timeout; + struct rtw_sdio *rtwsdio = (struct rtw_sdio *)rtwdev->priv; + struct mmc_host *host = rtwsdio->sdio_func->card->host; + unsigned int host_max_pages; + u8 chip_max_pages, timeout; if (rtw_chip_wcpu_11n(rtwdev)) { - size = 0x6; + chip_max_pages = 0x6; timeout = 0x6; } else { - size = 0xff; + chip_max_pages = 0xff; timeout = 0x1; } + host_max_pages = host->max_req_size / SZ_1K; + + rtw_err(rtwdev, "Max RX pages - chip aggregation limit: %u, host controller limit: %u\n", chip_max_pages, host_max_pages);// HACK + rtw_dbg(rtwdev, RTW_DBG_SDIO, + "Max RX pages - chip aggregation limit: %u, host controller limit: %u\n", + chip_max_pages, host_max_pages); + /* Make the firmware honor the size limit configured below */ rtw_write32_set(rtwdev, REG_RXDMA_AGG_PG_TH, BIT_EN_PRE_CALC); rtw_write8_set(rtwdev, REG_TXDMA_PQ_MAP, BIT_RXDMA_AGG_EN); rtw_write16(rtwdev, REG_RXDMA_AGG_PG_TH, - FIELD_PREP(BIT_RXDMA_AGG_PG_TH, size) | + FIELD_PREP(BIT_RXDMA_AGG_PG_TH, min_t(unsigned int, + chip_max_pages, + host_max_pages)) | FIELD_PREP(BIT_DMA_AGG_TO_V1, timeout)); rtw_write8_set(rtwdev, REG_RXDMA_MODE, BIT_DMA_MODE); @@ -936,6 +948,7 @@ static void rtw_sdio_rxfifo_recv(struct rtw_dev *rtwdev, u32 rx_len) { struct rtw_sdio *rtwsdio = (struct rtw_sdio *)rtwdev->priv; const struct rtw_chip_info *chip = rtwdev->chip; + unsigned int num_pkt = 0, orig_rx_len = rx_len; u32 pkt_desc_sz = chip->rx_pkt_desc_sz; struct ieee80211_rx_status rx_status; struct rtw_rx_pkt_stat pkt_stat; @@ -974,6 +987,7 @@ static void rtw_sdio_rxfifo_recv(struct rtw_dev *rtwdev, u32 rx_len) */ rtw_sdio_rx_skb(rtwdev, skb, pkt_offset, &pkt_stat, &rx_status); + num_pkt++; break; } @@ -981,6 +995,7 @@ static void rtw_sdio_rxfifo_recv(struct rtw_dev *rtwdev, u32 rx_len) if (!split_skb) { rtw_sdio_rx_skb(rtwdev, skb, pkt_offset, &pkt_stat, &rx_status); + num_pkt++; break; } @@ -989,11 +1004,14 @@ static void rtw_sdio_rxfifo_recv(struct rtw_dev *rtwdev, u32 rx_len) rtw_sdio_rx_skb(rtwdev, split_skb, pkt_offset, &pkt_stat, &rx_status); + num_pkt++; /* Move to the start of the next RX descriptor */ skb_reserve(skb, curr_pkt_len); rx_len -= curr_pkt_len; } + + pr_err("%s(%u) - number of packets: %u\n", __func__, orig_rx_len, num_pkt);// HACK } static void rtw_sdio_rx_isr(struct rtw_dev *rtwdev)